diff -Naurbd slashem-0.0.8E0/Files slashem-0.0.8E1/Files --- slashem-0.0.8E0/Files 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/Files 2006-05-15 12:08:59.000000000 +0100 @@ -24,7 +24,7 @@ opthelp oracle.des oracles.txt pet_mark.pbm quest.txt rats.des rumors.fal rumors.tru sea.des sokoban.des spiders.des stor-1.des stor-2.des stor-3.des template.des -tomb.des tower.des wizhelp yendor.des +tomb.des tower.des wizhelp yendor.des lethe.des doc: (files for all versions) diff -Naurbd slashem-0.0.8E0/configure slashem-0.0.8E1/configure --- slashem-0.0.8E0/configure 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/configure 2006-05-15 12:08:59.000000000 +0100 @@ -1,5 +1,4 @@ #! /bin/sh -# From configure.ac Revision: . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for SLASHEM 0.0.8. # @@ -912,6 +911,8 @@ --enable-autopickup-exceptions Exceptions to autopickup (experimental) (default=yes) + --enable-wizmode=USER enable wizard mode for the specified user + (default=wizard) Some influential environment variables: CC C compiler @@ -1373,7 +1374,7 @@ - +# $Revision: 1.7.2.1 $ ac_aux_dir= for ac_dir in sys/autoconf $srcdir/sys/autoconf; do if test -f $ac_dir/install-sh; then @@ -5172,51 +5173,75 @@ fi +echo "$as_me:$LINENO: checking whether to enable wizmode" >&5 +echo $ECHO_N "checking whether to enable wizmode... $ECHO_C" >&6 +# Check whether --enable-wizmode or --disable-wizmode was given. +if test "${enable_wizmode+set}" = set; then + enableval="$enable_wizmode" + if test "$enableval" != no; then enable_wizmode=yes; wizard=$enableval; + else enable_wizmode=no; fi +else + enable_wizmode=yes; wizard="wizard" +fi; +if test "$enable_wizmode" != "no" ; then + echo "$as_me:$LINENO: result: yes (user $wizard)" >&5 +echo "${ECHO_T}yes (user $wizard)" >&6 + +cat >>confdefs.h <<_ACEOF +#define WIZARD "$wizard" +_ACEOF + +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + NETHACK_LINKS= if test ${srcdir}/include/file.h -nt include/file.h ; then - NETHACK_LINKS="${LINKS_LIST} include/file.h:include/file.h" + NETHACK_LINKS="${NETHACK_LINKS} include/file.h:include/file.h" fi if test ${srcdir}/dat/data.base -nt dat/data.base ; then - NETHACK_LINKS="${LINKS_LIST} dat/data.base:dat/data.base" + NETHACK_LINKS="${NETHACK_LINKS} dat/data.base:dat/data.base" fi -if test ${srcdir}/dat/rumors.tru:dat/rumors.tru -nt dat/rumors.tru:dat/rumors.tru ; then - NETHACK_LINKS="${LINKS_LIST} dat/rumors.tru:dat/rumors.tru:dat/rumors.tru:dat/rumors.tru" +if test ${srcdir}/dat/rumors.tru -nt dat/rumors.tru ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/rumors.tru:dat/rumors.tru" fi -if test ${srcdir}/dat/rumors.fal:dat/rumors.fal -nt dat/rumors.fal:dat/rumors.fal ; then - NETHACK_LINKS="${LINKS_LIST} dat/rumors.fal:dat/rumors.fal:dat/rumors.fal:dat/rumors.fal" +if test ${srcdir}/dat/rumors.fal -nt dat/rumors.fal ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/rumors.fal:dat/rumors.fal" fi -if test ${srcdir}/dat/quest.txt:dat/quest.txt -nt dat/quest.txt:dat/quest.txt ; then - NETHACK_LINKS="${LINKS_LIST} dat/quest.txt:dat/quest.txt:dat/quest.txt:dat/quest.txt" +if test ${srcdir}/dat/quest.txt -nt dat/quest.txt ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/quest.txt:dat/quest.txt" fi -if test ${srcdir}/dat/oracles.txt:dat/oracles.txt -nt dat/oracles.txt:dat/oracles.txt ; then - NETHACK_LINKS="${LINKS_LIST} dat/oracles.txt:dat/oracles.txt:dat/oracles.txt:dat/oracles.txt" +if test ${srcdir}/dat/oracles.txt -nt dat/oracles.txt ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/oracles.txt:dat/oracles.txt" fi -if test ${srcdir}/dat/dungeon.def:dat/dungeon.def -nt dat/dungeon.def:dat/dungeon.def ; then - NETHACK_LINKS="${LINKS_LIST} dat/dungeon.def:dat/dungeon.def:dat/dungeon.def:dat/dungeon.def" +if test ${srcdir}/dat/dungeon.def -nt dat/dungeon.def ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/dungeon.def:dat/dungeon.def" fi -if test ${srcdir}/dat/help:dat/help -nt dat/help:dat/help ; then - NETHACK_LINKS="${LINKS_LIST} dat/help:dat/help:dat/help:dat/help" +if test ${srcdir}/dat/help -nt dat/help ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/help:dat/help" fi -if test ${srcdir}/dat/hh:dat/hh -nt dat/hh:dat/hh ; then - NETHACK_LINKS="${LINKS_LIST} dat/hh:dat/hh:dat/hh:dat/hh" +if test ${srcdir}/dat/hh -nt dat/hh ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/hh:dat/hh" fi -if test ${srcdir}/dat/cmdhelp:dat/cmdhelp -nt dat/cmdhelp:dat/cmdhelp ; then - NETHACK_LINKS="${LINKS_LIST} dat/cmdhelp:dat/cmdhelp:dat/cmdhelp:dat/cmdhelp" +if test ${srcdir}/dat/cmdhelp -nt dat/cmdhelp ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/cmdhelp:dat/cmdhelp" fi -if test ${srcdir}/dat/history:dat/history -nt dat/history:dat/history ; then - NETHACK_LINKS="${LINKS_LIST} dat/history:dat/history:dat/history:dat/history" +if test ${srcdir}/dat/history -nt dat/history ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/history:dat/history" fi -if test ${srcdir}/dat/opthelp:dat/opthelp -nt dat/opthelp:dat/opthelp ; then - NETHACK_LINKS="${LINKS_LIST} dat/opthelp:dat/opthelp:dat/opthelp:dat/opthelp" +if test ${srcdir}/dat/opthelp -nt dat/opthelp ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/opthelp:dat/opthelp" fi -if test ${srcdir}/dat/wizhelp:dat/wizhelp -nt dat/wizhelp:dat/wizhelp ; then - NETHACK_LINKS="${LINKS_LIST} dat/wizhelp:dat/wizhelp:dat/wizhelp:dat/wizhelp" +if test ${srcdir}/dat/wizhelp -nt dat/wizhelp ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/wizhelp:dat/wizhelp" fi -if test ${srcdir}/dat/gypsy.txt:dat/gypsy.txt -nt dat/gypsy.txt:dat/gypsy.txt ; then - NETHACK_LINKS="${LINKS_LIST} dat/gypsy.txt:dat/gypsy.txt:dat/gypsy.txt:dat/gypsy.txt" +if test ${srcdir}/dat/gypsy.txt -nt dat/gypsy.txt ; then + NETHACK_LINKS="${NETHACK_LINKS} dat/gypsy.txt:dat/gypsy.txt" fi -if test ${srcdir}/win/share/tile_t.h:win/share/tile_t.h -nt win/share/tile_t.h:win/share/tile_t.h ; then - NETHACK_LINKS="${LINKS_LIST} win/share/tile_t.h:win/share/tile_t.h:win/share/tile_t.h:win/share/tile_t.h" +if test ${srcdir}/win/share/tile_t.h -nt win/share/tile_t.h ; then + NETHACK_LINKS="${NETHACK_LINKS} win/share/tile_t.h:win/share/tile_t.h" fi ac_config_links="$ac_config_links ${NETHACK_LINKS}" @@ -6347,8 +6372,9 @@ fi # Run the commands associated with the file. case $ac_file in - include/autoconf.h ) sed 's,^/\* \(#undef .*\) \*/,\1,' < include/autoconf.h \ - > include/autoconf.new + include/autoconf.h ) sed -e 's,^/\* \(#undef .*\) \*/,\1,' \ + -e 's,#define \([^ ]*\),#undef \1\n&,' \ + < include/autoconf.h > include/autoconf.new mv include/autoconf.new \ include/autoconf.h ;; esac diff -Naurbd slashem-0.0.8E0/dat/data.base slashem-0.0.8E1/dat/data.base --- slashem-0.0.8E0/dat/data.base 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/data.base 2006-05-15 12:08:59.000000000 +0100 @@ -1,5 +1,5 @@ # SCCS Id: @(#)data.base 3.4 2003/07/23 -# $Id: data.base,v 1.14 2003/12/11 09:49:05 j_ali Exp $ +# $Id: data.base,v 1.14.4.1 2005/07/09 18:54:38 j_ali Exp $ # Copyright (c) 1994, 1995, 1996 by the NetHack Development Team # Copyright (c) 1994 by Boudewijn Wayers # Copyright (c) 2002 by the Slash'EM Development Team @@ -1176,6 +1176,11 @@ them difficult to deal with, even on the rare occasions when they are friendly. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] +demonology + The study of demons, including the knowledge of the foul and + unspeakable acts necessary to summon one. If you do summon + one, you'd best hope your contract with it is good, for it will + attack you if it is not. *deva Devas are the descendants of plane-touched aasimon. They have feathery wings that may be vestigial or functional. @@ -1409,6 +1414,9 @@ water, and earth. Some mystics have postulated the necessity for a fifth type, the spirit elemental, but none have ever been encountered, at least on this plane of existence. +elementalism + The study of the elements and elemental beings, including the + risky art of summoning and binding such dangerous entities. ~elf ??m* ~elf* cl* *elf* diff -Naurbd slashem-0.0.8E0/dat/dungeon.def slashem-0.0.8E1/dat/dungeon.def --- slashem-0.0.8E0/dat/dungeon.def 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/dungeon.def 2006-05-15 12:08:59.000000000 +0100 @@ -1,9 +1,8 @@ -# SCCS Id: @(#)dungeon.def 3.3 96/03/10 -# Copyright (c) 1990-92 by M. Stephenson +# SCCS Id: @(#)dungeon.def 3.4 1996/03/10 +# Copyright (c) 1990-95 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The dungeon description file for Slash'em. -# Modified by KMH for the balance patch. # # Note: The order of the definition of dungeons in this file # reflects in their order of creation in the real dungeon. @@ -13,6 +12,47 @@ # If two dungeons have overlapping ranges for their entry # points, then you should list the dungeon with the _least_ # number of choices for its branch level _first_. +# +# Bones IDs allocated: +# +# Dngn Level Allocation +# D 4-47 Normal levels in the Dungeons of Doom +# D B Big room +# D K Kobolds +# D N Nymphs +# D O Oracle +# D R Rats, Rogue (CONFLICT) +# D T The mall +# G G Geryon +# G J Juiblex +# G K nkai-a +# G L nkai-b +# G O Orcus +# G P Pleasant valley +# G V Valley of the Dead +# G X Wizard tower middle level +# G Y Yeenoghu +# G Z nkai-z +# E F Elysian fields +# E G Guild of disgruntled adventurers +# Q * Various quest levels +# L A Asmodeus +# L S leth-a +# L B Baalzebub +# L T lethe-b +# L U leth-c +# L D Dispater +# L V leth-d +# L E Demogorgon +# L W lethe-e +# L X lethe-f +# L Y lethe-g +# L Z lethe-z +# M 4-15 Normal levels in the Gnomish Mines +# M E Mineend +# M M Mine King +# M T Minetown +# T * Various levels in Vlad's tower ### The Dungeons of Doom ### # The main dungeon is from 42 to 47 levels deep... @@ -31,6 +71,12 @@ # the entrance to levels 2 to 4. BRANCH: "The Gnomish Mines" @ (2, 3) +# This is the escape route to the surface. We use the "dummy" level +# of the elemental planes for this purpose because in doing so we +# assign the correct depth to the planes. It's not actually possible +# to get to the planes via this route. +BRANCH: "The Elemental Planes" @ (1, 0) no_down up -1 + # # New mall is on levels 5 to 6, 75% chance. # There shouldn't be any other special levels down to the Oracle. @@ -81,11 +127,6 @@ # And the levels... LEVEL: "nymph" "N" @ (23, 2) 45 RNDLEVEL: "bigrm" "B" @ (20, 7) 15 5 -# Storage room (treasure) on levels 19-26, 66% of the time -# "Unused 'cause they suck"? -RNDLEVEL: "stor" "S" @ (19, 8) 66 3 -# Rounding out the bottom levels -LEVEL: "guild" "G" @ (26, 6) 50 # The famous Fort Ludios... @@ -98,11 +139,6 @@ LEVEL: "castle" "none" @ (-1, 0) CHAINBRANCH: "Gehennom" "castle" + (0, 0) no_down - -# Branch to the endgame... -BRANCH: "The Elemental Planes" @ (1, 0) no_down up -2 - - ### Gehennom ### # # Now re-worked for 3.1, hell is hopefully going to be a little @@ -118,37 +154,29 @@ # Note: Gehennom *must* be the second dungeon defined so that # monsters can properly migrate here under certain # circumstances. -# -# [Tom] tried to remove most of the non-unique levels (i.e. lame mazes) -# also tried to organize it a little -- demons before the wizard, devils -# after. -DUNGEON: "Gehennom" "G" (17, 0) +DUNGEON: "Gehennom" "G" (13, 0) DESCRIPTION: mazelike DESCRIPTION: hellish ALIGNMENT: noalign LEVEL: "valley" "V" @ (1, 0) -LEVEL: "sanctum" "none" @ (-1, 0) -# Tower before wiz, please -BRANCH: "Vlad's Tower" @ (3, 10) up -1 -# Dr. Frankenstein's Lab -BRANCH: "Frankenstein's Lab" @ (3, 10) up -# The demon levels -LEVEL: "juiblex" "J" @ (2, 5) -LEVEL: "yeenoghu" "E" @ (2, 5) -LEVEL: "orcus" "O" @ (2, 5) -LEVEL: "demogorg" "D" @ (2, 5) -# Half-way down -LEVEL: "wizard1" "none" @ (7, 0) +LEVEL: "wizard1" "none" @ (4, 4) CHAINLEVEL: "wizard2" "X" "wizard1" + (1, 0) CHAINLEVEL: "wizard3" "Y" "wizard1" + (2, 0) -# The devil levels -LEVEL: "baalz" "B" @ (10, 6) -LEVEL: "geryon" "R" @ (10, 6) -LEVEL: "dispater" "S" @ (10, 6) -LEVEL: "asmodeus" "A" @ (10, 6) -LEVEL: "fakewiz1" "F" @ (10, 6) -LEVEL: "fakewiz2" "G" @ (10, 6) +# Tower before wiz, please +CHAINBRANCH: "Vlad's Tower" "wizard1" + (-2, 2) up -1 +# Dr. Frankenstein's Lab +CHAINBRANCH: "Frankenstein's Lab" "wizard1" + (-2, 2) up +LEVEL: "pvalley" "P" @ (2, 8) +LEVEL: "juiblex" "J" @ (2, 8) +LEVEL: "orcus" "O" @ (2, 8) +LEVEL: "geryon" "G" @ (2, 8) +LEVEL: "yeenoghu" "Y" @ (2, 8) +RNDLEVEL: "nkai-a" "K" @ (10, 0) 2 +LEVEL: "nkai-b" "L" @ (11, 0) +LEVEL: "nkai-c" "M" @ (12, 0) +LEVEL: "nkai-z" "Z" @ (13, 0) +BRANCH: "The Lethe Gorge" @ (13, 0) down -1 ### Gnomish Mines ### @@ -162,7 +190,6 @@ RNDLEVEL: "minend" "E" @ (-2, 0) 3 LEVEL: "mineking" "M" @ (-1, 0) - ### The Quest Dungeon ### # This is a proto-dungeon. The level file names will be prepended with # the role code (eg, Arc, Val) during initialization. @@ -273,6 +300,60 @@ DESCRIPTION: mazelike LEVEL: "frnknstn" "none" @ (1, 0) +# +# The Wizards Tower +# +# It has been removed from Gehennom, and it is surrounded by stone. +# Must not allow bones files for its top level. +# +#DUNGEON: "Wizards Tower" "W" (3, 0) +#DESCRIPTION: mazelike +#ALIGNMENT: chaotic +#LEVEL: "wizard1" "none" @ (1, 0) +#LEVEL: "wizard2" "X" @ (2, 0) +#LEVEL: "wizard3" "Y" @ (3, 0) + +# +# The Lethe Gorge. +# +DUNGEON: "The Lethe Gorge" "L" (13, 0) +ALIGNMENT: unaligned +DESCRIPTION: mazelike +RNDLEVEL: "leth-a" "S" @ (1, 0) 2 +BRANCH: "The Labyrinth" @ (2, 0) stair up -1 +LEVEL: "asmodeus" "A" @ (2, 10) +LEVEL: "baalz" "B" @ (2, 10) +LEVEL: "dispater" "D" @ (2, 10) +LEVEL: "lethe-b" "T" @ (2, 10) +LEVEL: "demogorg" "E" @ (2, 10) +RNDLEVEL: "leth-c" "U" @ (2, 10) 2 +RNDLEVEL: "leth-d" "V" @ (2, 10) 2 +LEVEL: "lethe-e" "W" @ (2, 10) +LEVEL: "lethe-f" "X" @ (2, 10) +LEVEL: "lethe-g" "Y" @ (2, 10) +LEVEL: "lethe-z" "Z" @ (12, 0) +LEVEL: "sanctum" "none" @ (13, 0) + +# +# The Labyrinth +# +DUNGEON: "The Labyrinth" "S" (4, 0) +ALIGNMENT: unaligned +RNDLEVEL: "stor" "none" @ (1, 0) 3 +BRANCH: "Elysium" @ (2, 0) stair up -1 +LEVEL: "laby-a" "none" @ (2, 0) +LEVEL: "laby-b" "none" @ (3, 0) +LEVEL: "laby-c" "none" @ (4, 0) + +# +# Elysium +# +DUNGEON: "Elysium" "E" (4, 0) +ALIGNMENT: unaligned +LEVEL: "olympus" "none" @ (1, 0) +LEVEL: "elysian" "F" @ (2, 0) +LEVEL: "guild" "G" @ (3, 0) +LEVEL: "minos" "none" @ (4, 0) ### The Endgame levels ### # diff -Naurbd slashem-0.0.8E0/dat/elysium.des slashem-0.0.8E1/dat/elysium.des --- slashem-0.0.8E0/dat/elysium.des 1970-01-01 01:00:00.000000000 +0100 +++ slashem-0.0.8E1/dat/elysium.des 2006-05-15 12:08:59.000000000 +0100 @@ -0,0 +1,274 @@ +# $Id $ +# Copyright (c) 2005 by J. Ali Harlow +# NetHack may be freely redistributed. See license for details. +# +# Mount Olympus: gateway to the elemental planes. +# +MAZE: "olympus",' ' +FLAGS: noteleport +GEOMETRY:center,center +MAP + ... II} ...... . .. ... .... }}} + .T ...II }} }}}...T...... .... ... }}} }} + .. .. ....III....}}} }}.}}}....... ........ }} + .. . ..PP.. ...T II T.....}}}.}}}T...PPP...T.........}} + .T. .PPPPPP... T. II ......}}}}..TPP.......}}}T}} + .PPPP .II .....TT...T}........}}}}}T}}} ..... + . II II I . ..T..T..T..}}....}}}}}...... ........ + . . I III I I . ..T.TT....T.}}...}}}......... ......... + . . I -----I II . .....T..T..T..}}.}}........... ......... + . . I |CCC|I I . .. .T..T..T..T..}}}............. ...... + . I ICC.CC|I I . . ..T...T.T...................... + . I I |CCC|I I . T.T.TT..T............................ + . . II I-----I II . ...T..T......T...................... + . .II . IIIII I . . .................T......TT......... + .. II .. I I . TT.T. ... ........T.................T........ + .T III . I . T..T.T.. ......T.................T.T..T...... + . II . II. ... .T.T..T. .........T......... ............. + ...}}. . II .T .T.TT.T .... ............... .T.T... ... + ...}}... II .. .... ... ...... ....... .. + .}}... II ... .... ... ... . +ENDMAP +# Random Monsters +RANDOM_MONSTERS: '@', 'h' +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +# Portal to endgame +PORTAL:(20,10,20,10),(0,0,0,0),"earth" +# Stairs +STAIR:(70,7),down +# Boulders fallen from the mountain +OBJECT:'`',"boulder",(19,16) + +# +# The Elysian fields: Final resting place of worthy mortals. +# +# References: +# Virgil's Aeneid 6.637ff +# Homer's Odyssey 4.563-569 +MAZE: "elysian",' ' +FLAGS: noteleport +GEOMETRY:center,center +MAP + ..T.....T....T .T..T.. + T....T....T.... .. ... ...T..T..T + .T.T...T......T. ..... ... ... .........T...T..T.. + ...T.....T....T.T.... .. ..... ..T...T. ..... ..T..T..T...T + .T....T....T....... .... .. T...T...T... T....T...T + ....T...T.....T.T .. .. ....T....T.... .T..T..T. + .T...T.....T...T .........T....T. ... + T..T...T..T...T .... T..T..T.T. .. + .T..T...T..T. .. .T...T.. .. + ..T..T..T. .. ...... .. + ..T..T. .. ... .. + .. .. .. .. + .. ..... .. .. .T..T. .. + ...T.T...T.T ... .. .T..T...T .. + .T....T....T ... .....T..T...T.. .. + ..T.T...T...T.... .....T...T...T ... + T....T.T..T..... T....T..T...... + .T.....T. ... .T.T..T..T.... + .... ...T..T.. + +ENDMAP +# Random Monsters +RANDOM_MONSTERS: '@', 'h' +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +# Stairs +STAIR:(00,00,75,19),(0,0,0,0),down +STAIR:(00,00,75,19),(0,0,0,0),up +# Armour, etc., of the great line of Teucer +OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +MONSTER:'u',"warhorse",random,peaceful +MONSTER:'u',"warhorse",random,peaceful +MONSTER:'u',"warhorse",random,peaceful +MONSTER:'u',"warhorse",random,peaceful +MONSTER:'u',"horse",random,peaceful +MONSTER:'u',"horse",random,peaceful +# Flavour +MONSTER:' ',"ghost",random,"Orpheus",peaceful +MONSTER:' ',"ghost",random,"Musaeus",peaceful +MONSTER:' ',"ghost",random,"Anchises",peaceful + +# +# Minos' castle: Judge of the Underworld +# +# References: +# Dante's Inferno canto 5.1-12 +# Virgil's Aeneid 6.432-433 +# Ovidius' Metamorphoses 9.436-440 +MAZE: "minos",' ' +FLAGS: noteleport +GEOMETRY:center,center +MAP +............................................................................ +............................................................................ +............................................................................ +.............|----|.......................................|----|............ +.............|....|---------------------------------------|....|............ +.............|--+-|.......................................|-+--|............ +...............|...............-------+-------...............|.............. +...............|...............|.............|...............|.............. +...............|...............|.............|...............|.............. +...............|...............|.............|...............|.............. +...............+...............|......\......|...............+.............. +...............|...............---------------...............|.............. +...............|...............|....|...|....|...............|.............. +...............|...............+....|...|....+...............|.............. +...............|...............-------S------|...............|.............. +.............|--+-|.......................................|-+--|............ +.............|....|---------------------------------------|....|............ +.............|----|.......................................|----|............ +............................................................................ +............................................................................ +ENDMAP +# Random Monsters +RANDOM_MONSTERS: '@', 'h' +# The king on his throne +MONSTER:'S',"king cobra",(38,10),"Minos" +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +# Stairs +BRANCH:(38,12,38,12),(0,0,0,0) +STAIR:(38,2),up + +# +# Labyrinth: Home to the minotaur +# +# References: +# Virgil's Aeneid 6.14-33 +# Ovidius' Metamorphoses 8.152-174 +MAZE: "laby-a",' ' +FLAGS: noteleport, nommap +GEOMETRY:center,center +MAP + ## + ## # # + ## # # # + # # # # + # # ## + ## ## # # + # # # # # # + ## # # ## # ## ### ## + # ## ## # # # # # ## + # # ## # ## ### # # ## + # ## # ## # ##### # # # # + # # # # ### # # # # + # # # ## # ## # # # ## + # ## # # ## ## # # # + # # # # # ### ## # + # # # # ## ### ## # # # # + # # # # ## # ## # # ## ## # # ## ## + # ## #### # ## # # # # # # # ## # + # ## # # # ## # ## # # # + ## #### ## # ## + +ENDMAP +NON_DIGGABLE:(00,00,75,20) +NON_PASSWALL:(00,00,75,20) +STAIR:(8,1),down +STAIR:(7,10),down +STAIR:(21,10),down +STAIR:(24,12),down +STAIR:(34,12),down +STAIR:(56,6),up +STAIR:(63,16),down +BRANCH:(38,10,38,10),(0,0,0,0) + +MAZE: "laby-b",' ' +FLAGS: noteleport, nommap +GEOMETRY:center,center +MAP + # ## # ## # + #### # ## # # ### ### # # + # ## # # # # # + # ### # ### # # ## ## # # + # # # # ## # # # ## # + # ## # ## ## # ## # # ## + # # # # # # # # # # ## ## + # # # # # # ## ## # # # # # + # # ### # ## # ## # # # # ## ## + # # # # # # # # # # # ## + ## # ## ## # # # # # # ### ## # ## + ### # # # # # # # # #### ### # + # ### ## # ## # # # #### # + ### ## # # # ## ## ### # + ## # ## # ## #### ### #### # # + # ## # # # ## ### ## ##### ## # # # # + # # ### # ## ### #### # ### # # + ### # # ## ## # ## ## ## # #### + # ## ## #### ### # #### # # + ##### ## ### + +ENDMAP +NON_DIGGABLE:(00,00,75,20) +NON_PASSWALL:(00,00,75,20) +STAIR:(14,2),down +STAIR:(19,5),down +STAIR:(30,3),down +STAIR:(44,3),down +STAIR:(64,6),down +STAIR:(20,8),down +STAIR:(57,10),down +STAIR:(51,13),down +STAIR:(12,15),down +STAIR:(32,17),down +STAIR:(43,17),down +STAIR:(8,1),up +STAIR:(7,10),up +STAIR:(20,10),up +STAIR:(24,12),up +STAIR:(32,12),up +STAIR:(64,16),up + +MAZE: "laby-c",' ' +FLAGS: noteleport, nommap +GEOMETRY:center,center +MAP + #### ## + # ### # + # ## # + # # # # # + # # # # # ## + # # ### # # # # ### + # # # # # # # # # # + # ## ## ### ### ## # ## # + # # # # # ### # + # #### ## # # ### + # ###### # ### ## # + # #### ### ## + # # # # + # ## ### ### ## ### + # # # # # + ## # # + # # + # # + + + +ENDMAP +NON_DIGGABLE:(00,00,75,20) +NON_PASSWALL:(00,00,75,20) +STAIR:(15,2),up +STAIR:(31,3),up +STAIR:(44,3),up +STAIR:(20,5),up +STAIR:(64,6),up +STAIR:(20,8),up +STAIR:(56,10),up +STAIR:(50,13),up +STAIR:(11,15),up +STAIR:(31,17),up +STAIR:(44,17),up +BRANCH:(37,10,37,10),(0,0,0,0) +MONSTER:'H',"minotaur",(38,10) +OBJECT:')',"battle-axe",(38,10) + diff -Naurbd slashem-0.0.8E0/dat/gehennom.des slashem-0.0.8E1/dat/gehennom.des --- slashem-0.0.8E0/dat/gehennom.des 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/gehennom.des 2006-05-15 12:08:59.000000000 +0100 @@ -3,51 +3,75 @@ # Copyright (c) 1992 by M. Stephenson and Izchak Miller # NetHack may be freely redistributed. See license for details. # +# The design of the gehennom dungeon has many sources of inspiration. +# The major ones are as follows: +# +# Judaism +# The name Gehennom comes from the hebrew Ge Hinnom (Valley of Hinnom) +# which was located just outside Jerusalem and used as a place of +# child sacrifice. Refs: 2 Chronicles 33:6, 2 Kings 23:10. +# +# Homer +# Describes a River of Flaming Fire (ie., Phlegethon) and a rocky +# pinnacle where Odysseus built an altar. Ref: The Odyssey 10.500ff +# +# Dante +# Dante's seventh circle of hell provides many ideas. +# Ref: Inferno cantos 12-17. +# +# Lovecraft +# Lovercraft describes N'kai as lightless openings in the ground +# containing great worlds of unknown life. +# Refs: The Whisper in Darkness, The Mound. MAZE: "valley", ' ' -FLAGS: hardfloor +FLAGS: noteleport,hardfloor,nommap,phlegethon GEOMETRY:center,center MAP ----------------------------------------------------------------------------- -|...S.|..|.....| |.....-| |................| |...............| |...| -|---|.|.--.---.| |......--- ----..........-----.-----....---........---.-.| -| |.|.|..| |.| --........| |.............| |.......---| |-...........--| -| |...S..| |.| |.......-----.......------| |--------..---......------- | -|----------- |.| |-......| |....|...-- |...-----................---- | -|.....S....---.| |.......| |....|...| |..............----------- | -|.....|.|......| |.....--- |......--- |....---.......| | -|.....|.|------| |....-- --....-- |-------- ----....--------------- | -|.....|--......---BBB-| |...-- |.......| |..................| | -|..........||........-| --...| |.......| |...||.............| | -|.....|...-||-........------....| |.......---- |...||.............-- | -|.....|--......---...........--------..........| |.......---------...-- | -|.....| |------| |--.......--| |..B......----- -----....| |.| |....--- | -|.....| |......--| ------..| |----..B......| |.--------.-- |-.....---| -|------ |........| |.|....| |.....----BBBB---------...........---.........| -| |........| |...|..| |.....| |-.............--------...........---| -| --.....-----------.| |....-----.....---------- |.........---- | -| |..|..B...........| |.|..........|.| |.|........| | ----------------------------------------------------------------------------- +----------------------------------------------RRRR-------------------------- +|...| |...............| |................| RRRR |-.....| |.....|..|.S...| +|.-.---........---....-----.-----..........--RRRR |......| |.---.--.|.|---| +|--...........-| |---.......| |.............RRRR|......-- |.| |..|.|.| | +| -------......---..--------| |------.......RRRR---.....| |.| |..S...| | +| ---- ----................-----...| --...|...RRRRF.....-| |.| -----------| +|---..---- -----------..............| |...|...RRRR--.....| |.---....S.....| +|........------ -FF---..---....| ---......RRRR|.....| |......|.|.....| +|.............--------..------ --BB----| --.....RRRR--....| |------|.|.....| +|---.....................-- |.......| --...| RRRR|-BBB---......--|.....| +| ----..............||...| |.......| |...--RRRR|.....|...||....S.....| +| --.............||...| ----.......| |.....RRRR|.....S..-||-...|.....| +| --...----.----.......| |..........--------.RRRR......---......--|.....| +| ---....| |.| ----..---------..........|..RRR.RRR..|...---------| |.....| +|---.....-| --.---..----.......---........RRRRRRR.R------.B.|......| |.....| +RRRRRRRR..---...........RRRRRR..BBBBB--RRRRRRRRRRR...|.|---........| ------| +RRRRRRRRRRRRRRR.....RRRRRRRRRRRRRRRRRRRRRRRRRRRRR..|...| |........| | +RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR|..-----------.....-- | +| RRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRR... |.........B....|..| | +-----------RRRRRRRRRRRR----------------------------------------------------- ENDMAP # Dungeon Description # The shrine to Moloch. -REGION:(01,06,05,14),lit,"temple" +REGION:(70,06,74,14),lit,"temple" # The Morgues -REGION:(19,01,24,08),unlit,"morgue",filled,true -REGION:(09,14,16,18),unlit,"morgue",filled,true -REGION:(37,09,43,14),unlit,"morgue",filled,true +REGION:(52,01,57,08),unlit,"morgue",filled,true +REGION:(59,14,66,18),unlit,"morgue",filled,true +REGION:(32,09,42,14),unlit,"morgue",filled,true # Stairs -STAIR:(01,01),down +STAIR:(74,01),down # Branch location -BRANCH:(66,17,66,17),(0,0,0,0) +BRANCH:(05,09,05,09),(0,0,0,0) +ENGRAVING:(06,09),engrave,"You won't get it up the steps" +TELEPORT_REGION:(01,06,20,11),(0,0,0,0),down # Secret Doors -DOOR:locked,(04,01) -DOOR:locked,(08,04) -DOOR:locked,(06,06) +DOOR:locked,(71,01) +DOOR:locked,(67,04) +DOOR:locked,(69,06) +DOOR:locked,(69,10) +DOOR:locked,(59,11) # The altar of Moloch. -ALTAR:(03,10),noalign,shrine +ALTAR:(72,10),noalign,shrine # Non diggable walls - everywhere! NON_DIGGABLE:(00,00,75,19) @@ -85,15 +109,15 @@ OBJECT:'[',random,random OBJECT:'[',random,random OBJECT:'[',random,random -OBJECT:'[',random,random -OBJECT:')',random,random +OBJECT[50%]:'[',random,random OBJECT:')',random,random OBJECT:')',random,random OBJECT:')',random,random +OBJECT[50%]:')',random,random # # Some random loot. # -OBJECT:'*',"ruby",random +OBJECT[50%]:'*',"ruby",random OBJECT:'*',random,random OBJECT:'*',random,random OBJECT:'!',random,random @@ -113,13 +137,13 @@ OBJECT:'(',random,random # (Not so) Random traps. -TRAP:"spiked pit", (05,02) -TRAP:"spiked pit", (14,05) -TRAP:"sleep gas", (03,01) -TRAP:"board", (21,12) +TRAP[25%]:"spiked pit", (70,02) +TRAP[25%]:"spiked pit", (61,05) +TRAP[25%]:"sleep gas", (72,01) +TRAP:"board", (56,12) TRAP:"board", random -TRAP:"dart", (60,01) -TRAP:"dart", (26,17) +TRAP:"dart", (15,01) +TRAP:"dart", (49,17) TRAP:"anti magic", random TRAP:"anti magic", random TRAP:"magic", random @@ -142,15 +166,16 @@ # Some undead nasties for good measure MONSTER:'V',random,random MONSTER:'V',random,random -MONSTER:'V',random,random -MONSTER:'Z',random,random +MONSTER[50%]:'V',random,random MONSTER:'Z',random,random MONSTER:'Z',random,random MONSTER:'Z',random,random +MONSTER[50%]:'Z',random,random MONSTER:'M',random,random MONSTER:'M',random,random MONSTER:'M',random,random -MONSTER:'M',random,random +MONSTER[50%]:'M',random,random + # # The Juiblex level # @@ -239,6 +264,7 @@ MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random +MONSTER:'P',"shoggoth",random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random @@ -268,95 +294,84 @@ TRAP:"anti magic",random TRAP:"magic",random TRAP:"magic",random + # -# The Orcus Level +# The New Orcus Level # MAZE:"orcus",random -FLAGS: noteleport,shortsighted -GEOMETRY:right,center +FLAGS: noteleport,shortsighted,phlegethon,hardfloor +GEOMETRY:center,center # A ghost town MAP -.|....|....|....|..............|....|........ -.|....|....|....|..............|....|........ -.|....|....|....|--...-+-------|............. -.|....|....|....|..............+............. -.|.........|....|..............|....|........ -.--+-...-+----+--....-------...--------.+---- -.....................|.....|................. -.....................|.....|................. -.--+----....-+---....|.....|...----------+--- -.|....|....|....|....---+---...|......|...... -.|.........|....|..............|......|...... -.----...---------.....-----....+......|...... -.|........................|....|......|...... -.----------+-...--+--|....|....----------+--- -.|....|..............|....+....|............. -.|....+.......|......|....|....|............. -.|....|.......|......|....|....|............. + ----- -------------------- + |...|.. .............. |.......|.....|....| |..........---------- + |...|...........----------.. |.......|.....|....|.....|..........|........| + |...+...........|........|...|.......|--+-----+--.....B..........|........| + -----..---+---..|........+...----+----.............{..B..........+......\.| + |...+..|.....|..|........|.................------.....B..........|........| + |...|..|.....|..----------..RRRRRRR........+....|.....|..........|........| + |...|..--...--.........RRRRRRRRRRRRRRRRR...|....|.....|..........------S--- + -----RRRR.R.RRRR...RRRRRRRRRRRRRRRRRRRRRRRR------.....---------+-- |...| +RRRRRRRRRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.............. |...| +RRRRRRRRRR.R.RRRRRRRRRRRRRRR-----------RRRRRRRRRRRRRRRRR............ ----- +RRRRRRRR--...--RRRRRRRR.....|.........|..RRRRRRRRRRRRRRRRRRRRR....... +RRRR....|.....|.............|.........+......RRRRRRRRRRRRRRRRRRRRRRRRRRR +-------.|.....|..----B----..|.........|................RRRRRRRRRRRRRRRRRRRRR +|.....|.---+---..|.......|..-----------..-----+----..............RRRRRRRRRRR +|.....|..........B.......B...............|........|..-------...........RRRRR +|--+--|...----+---.......-----+----------|........|..|.....-----...--+----- + ...... |......|.......|........|......+........|..+.....|...+.. |......| + |......|.......|........|......|........| |.....|...| |......| + ----------------------------------------- ----------- -------- ENDMAP -MAZEWALK:(00,06),west # Entire main area -REGION:(01,00,44,16),unlit,"ordinary" -STAIR:(33,15),down -STAIR:levregion(01,00,12,20),levregion(20,01,70,20),up -BRANCH:levregion(01,00,12,20),levregion(20,01,70,20) -TELEPORT_REGION:levregion(01,00,12,20),levregion(20,01,70,20) -# Wall "ruins" -OBJECT:'`',"boulder",(19,02) -OBJECT:'`',"boulder",(20,02) -OBJECT:'`',"boulder",(21,02) -OBJECT:'`',"boulder",(36,02) -OBJECT:'`',"boulder",(36,03) -OBJECT:'`',"boulder",(06,04) -OBJECT:'`',"boulder",(05,05) -OBJECT:'`',"boulder",(06,05) -OBJECT:'`',"boulder",(07,05) -OBJECT:'`',"boulder",(39,05) -OBJECT:'`',"boulder",(08,08) -OBJECT:'`',"boulder",(09,08) -OBJECT:'`',"boulder",(10,08) -OBJECT:'`',"boulder",(11,08) -OBJECT:'`',"boulder",(06,10) -OBJECT:'`',"boulder",(05,11) -OBJECT:'`',"boulder",(06,11) -OBJECT:'`',"boulder",(07,11) -OBJECT:'`',"boulder",(21,11) -OBJECT:'`',"boulder",(21,12) -OBJECT:'`',"boulder",(13,13) -OBJECT:'`',"boulder",(14,13) -OBJECT:'`',"boulder",(15,13) -OBJECT:'`',"boulder",(14,14) +REGION:(01,00,75,19),unlit,"ordinary" +STAIR:(71,04),down +STAIR:(61,18),up +BRANCH:(39,01,48,02),(00,00,00,00) +TELEPORT_REGION:(26,17,40,18),(00,00,00,00) # Doors -DOOR:closed,(23,02) -DOOR:open,(31,03) -DOOR:nodoor,(03,05) -DOOR:closed,(09,05) -DOOR:closed,(14,05) -DOOR:closed,(40,05) -DOOR:open,(03,08) -DOOR:nodoor,(13,08) -DOOR:open,(41,08) -DOOR:closed,(24,09) -DOOR:closed,(31,11) -DOOR:open,(11,13) -DOOR:closed,(18,13) -DOOR:closed,(41,13) -DOOR:open,(26,14) -DOOR:closed,(06,15) +DOOR:random,(69,16) +DOOR:random,(63,17) +DOOR:random,(53,17) +DOOR:random,(46,14) +DOOR:locked,(41,17) +DOOR:closed,(38,12) +DOOR:random,(30,16) +DOOR:random,(14,16) +DOOR:closed,(11,14) +DOOR:random,(03,16) +DOOR:random,(05,05) +DOOR:random,(05,03) +DOOR:locked,(11,04) +DOOR:nodoor,(26,04) +DOOR:random,(34,04) +DOOR:random,(41,03) +DOOR:random,(44,06) +DOOR:closed,(66,04) +DOOR:locked,(64,08) +DOOR:locked,(72,07) # Special rooms -ALTAR:(24,07),noalign,sanctum -REGION:(22,12,25,16),unlit,"morgue" -REGION:(32,09,37,12),lit,"shop" -REGION:(12,00,15,04),lit,"shop" +ALTAR:(31,12),noalign,sanctum +REGION:(18,14,24,18),unlit,"morgue" +REGION:(56,01,65,07),unlit,"morgue" +REGION:(01,14,05,15),unlit,"shop" +REGION:(39,01,43,02),unlit,"shop" +REGION:(18,03,25,05),unlit,"temple" +ALTAR:(20,04),noncoaligned,altar +OBJECT:'%',"corpse",(23,03),"priest",0 # Some traps. TRAP:"spiked pit", random TRAP:"sleep gas", random TRAP:"anti magic", random +TRAP:"anti magic", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"magic", random TRAP:"magic", random +TRAP:"magic", random +TRAP:"rust", random # Some random objects OBJECT:random,random,random OBJECT:random,random,random @@ -368,258 +383,438 @@ OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random +OBJECT:random,random,random +OBJECT[50%]:random,random,random # The resident nasty -MONSTER:'&',"Orcus",(33,15) +MONSTER:'&',"Orcus",(71,04) # And its preferred companions -MONSTER:'Z',"human zombie",(32,15) -MONSTER:' ',"shade",(32,14) -MONSTER:' ',"shade",(32,16) -MONSTER:'V',"vampire",(35,16) -MONSTER:'V',"vampire",(35,14) -MONSTER:'V',"vampire lord",(36,14) -MONSTER:'V',"vampire lord",(36,15) +MONSTER:'Z',"human zombie",(69,03) +MONSTER:' ',"shade",(67,06) +MONSTER:' ',"shade",(73,02) +MONSTER:'V',"vampire",(73,05) +MONSTER:'V',"vampire",(69,04) +MONSTER:'V',"vampire lord",(70,05) +MONSTER:'V',"vampire lord",(72,06) +# Some loot... +CONTAINER:'(',"chest",(71,09) +OBJECT:'!',"amnesia",contained +OBJECT:'?',"demonology",contained +CONTAINER:'(',"chest",(72,09) +OBJECT:'!',"sickness",contained +OBJECT:'"',"amulet of strangulation",contained +CONTAINER:'(',"chest",(73,09) +OBJECT:'!',"blindness",contained +OBJECT:'?',"create monster",contained +# ...and a guardian +MONSTER:'P',"green slime",(71,08) +MONSTER:'P',"green slime",(73,08) +# ...and one final trap +TRAP:"sleep gas",(72,08) # Randomly placed companions MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random -MONSTER:'Z',"skeleton",random +MONSTER[66%]:'Z',"skeleton",random +MONSTER[33%]:'Z',"skeleton",random MONSTER:' ',"shade",random MONSTER:' ',"shade",random MONSTER:' ',"shade",random MONSTER:' ',"shade",random +MONSTER[50%]:' ',"shade",random MONSTER:'Z',"giant zombie",random MONSTER:'Z',"giant zombie",random MONSTER:'Z',"giant zombie",random +MONSTER[50%]:'Z',"giant zombie",random MONSTER:'Z',"ettin zombie",random MONSTER:'Z',"ettin zombie",random MONSTER:'Z',"ettin zombie",random +MONSTER[50%]:'Z',"ettin zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random +MONSTER[50%]:'Z',"human zombie",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random +MONSTER[66%]:'V',"vampire",random +MONSTER[33%]:'V',"vampire",random MONSTER:'V',"vampire lord",random MONSTER:'V',"vampire lord",random +MONSTER[50%]:'V',"vampire lord",random # A few more for the party MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random -MONSTER:random,random,random -MONSTER:random,random,random +MONSTER[50%]:random,random,random + # -# The Asmodeus Level +# The New Asmodeus Level # MAZE:"asmodeus",random -FLAGS: noteleport +FLAGS: noteleport,lethe,hardfloor # First part GEOMETRY:half-left,center MAP ---------------------- -|.............|.....| -|.............S.....| -|---+------------...| -|.....|.........|-+-- -|..---|.........|.... -|..|..S.........|.... -|..|..|.........|.... -|..|..|.........|-+-- -|..|..-----------...| -|..S..........|.....| ---------------------- + RRRR ---- +-------------------- ------- |RRRR-- |..| +|............S.....| |.....|------ --RRRR-------------- #####+..| +|---+-----------...| |.....|.....|------RRRR|...........| # |..| +|.....|........|-+------|.....|.....|.....FRRRRF...........| ---+--- ---- +|..---|........|........|.....|.....|.....|RRRR|..{..{..{..| |.....| +|..|..S........|..........................|R.|R............+##H#S.....S# +|..|..|........|........|.....|.....|.....|RRRR|..{..{..{..| |.....| +|..|..|........|-+------|.....|.....|.....FRRRRF...........| ---+--- +|..|..-----S----...| |.....|.....|------RRRR|...........| H +|..S.....|...|.....| |.....|------ |RRRR-------------- H +---------|...|------ ------- --RRRR| -------- H + |...| ### |RRRR----|......| # + |...| # ### RRRR| |.+......+########### + -----+++----- #### # # RRRR |.+......+########### + |...........| # ###### ---- RRRR --|......| # + |...........S##### # # |..| RRRR -------- ---+--- + |...........| # # ###+..| RRRR |.....| + |.....\.....| ####### |..| RRRR |.....| + ------------- ---- RRRR ------- ENDMAP -STAIR:levregion(01,00,6,20),levregion(6,1,70,16),up -BRANCH:levregion(01,00,6,20),levregion(6,1,70,16) -TELEPORT_REGION:levregion(01,00,6,20),levregion(6,1,70,16) - +STAIR:(65,17),up +STAIR:(11,16),down +BRANCH:(73,01,74,03),(00,00,00,00) +TELEPORT_REGION:(60,12,65,14),(00,00,00,00) # Doors -DOOR:closed,(04,03) -DOOR:locked,(18,04) -DOOR:closed,(18,08) -# -STAIR:(13,07),down +DOOR:locked,(67,16) +DOOR:locked,(56,14) +DOOR:locked,(56,13) +DOOR:locked,(49,14) +DOOR:locked,(49,13) +DOOR:locked,(67,08) +DOOR:locked,(67,04) +DOOR:locked,(72,02) +DOOR:locked,(64,06) +DOOR:locked,(70,06) +DOOR:locked,(17,08) +DOOR:locked,(17,04) +DOOR:locked,(13,02) +DOOR:locked,(04,03) +DOOR:locked,(03,10) +DOOR:locked,(06,06) +DOOR:locked,(11,09) +DOOR:closed,(10,14) +DOOR:closed,(11,14) +DOOR:closed,(12,14) +DOOR:locked,(17,16) +DOOR:locked,(36,17) +# Drawbridges +DRAWBRIDGE:(46,06),west,closed +DRAWBRIDGE:(43,06),west,closed # Non diggable walls -NON_DIGGABLE:(00,00,20,11) -# Entire main area -REGION:(01,01,20,10),unlit,"ordinary" +NON_DIGGABLE:(00,00,75,19) +# Regions of light and dark +REGION:(00,00,75,19),unlit,"ordinary" +REGION:(25,02,29,05),unlit,"lemurepit" +REGION:(31,03,35,05),unlit,"lemurepit" +REGION:(37,04,41,05),unlit,"lemurepit" +REGION:(37,07,41,08),unlit,"lemurepit" +REGION:(31,07,35,09),unlit,"lemurepit" +REGION:(25,07,29,10),unlit,"lemurepit" +REGION:(48,03,58,09),lit,"ordinary" +REGION:(06,15,16,18),lit,"ordinary" # The fellow in residence -MONSTER:'&',"Asmodeus",(12,07) +MONSTER:'&',"Asmodeus",(11,16) +# His close friends +MONSTER:'&',"marilith",(08,16),asleep +MONSTER:'&',"marilith",(09,17),asleep +MONSTER:'&',"succubus",(14,16),asleep +MONSTER:'&',"succubus",(13,17),asleep +MONSTER:'&',"incubus",(11,18),asleep +MONSTER:'&',"barbed devil",(10,13),asleep +MONSTER:'&',"barbed devil",(12,13),asleep +# A few traps on the way in +TRAP:"board",(10,12) +TRAP:"board",(11,12) +TRAP:"board",(12,12) +TRAP:"fire",(11,11) +TRAP:"fire",(10,10) +TRAP:"fire",(12,10) +# The 'fake' throne room +MONSTER:'&',random,(07,04) +MONSTER:'&',random,(14,04) +MONSTER:'&',random,(07,08) +MONSTER:'&',random,(14,08) +OBJECT:'!',"invisibility",(07,04) +OBJECT:'!',"invisibility",(14,04) +OBJECT:'!',"invisibility",(07,08) +OBJECT:'!',"invisibility",(14,08) +MONSTER:'m',"giant mimic", (11,06), m_feature "staircase down" +TRAP:"magic",(09,06) +TRAP:"magic",(13,06) +TRAP:"magic",(11,05) +TRAP:"magic",(11,07) # Some random weapons and armor. OBJECT:'[',random,random OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:')',random,random +OBJECT:')',random,random OBJECT:')',random,random OBJECT:')',random,random -OBJECT:'*',random,random OBJECT:'!',random,random OBJECT:'!',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'?',random,random -# Some traps. -TRAP:"spiked pit", (05,02) -TRAP:"fire", (08,06) -TRAP:"sleep gas", random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random -TRAP:"magic", random -# Random monsters. -MONSTER:' ',"ghost",(11,07) -MONSTER:'&',"horned devil",(10,05) -MONSTER:'L',random,random -# Some Vampires for good measure -MONSTER:'V',random,random -MONSTER:'V',random,random -MONSTER:'V',random,random -# Second part -GEOMETRY:half-right,center -MAP ---------------------------------- -................................| -................................+ -................................| ---------------------------------- -ENDMAP -MAZEWALK:(32,02),east -# Non diggable walls -NON_DIGGABLE:(00,00,32,04) -DOOR:closed,(32,02) -MONSTER:'&',random,random -MONSTER:'&',random,random -MONSTER:'&',random,random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random +# Traps in the outer chambers +TRAP:"spiked pit",(02,08) +TRAP:"anti magic",(21,06) +TRAP:"sleep gas",(19,05) +TRAP:"fire",(56,06) +TRAP:"rust",(53,06) +TRAP:"spiked pit",(50,03) +TRAP:"polymorph",(69,02) +# Teleport scrolls are kept in a closet +OBJECT:'?',"teleportation",(63,06) +# Traps in the inner spiral +TRAP:"magic",(22,14) +TRAP:"anti magic",(26,18) +TRAP:"fire",(28,13) +TRAP:"spiked pit",(32,13) +# Treasure room +GOLD:500,(38,16) +GOLD:500,(38,17) +GOLD:500,(38,18) +OBJECT:'"',"amulet of change",(37,16) +OBJECT:'=',"hunger",(37,18),cursed,0 +OBJECT:'*',"diamond",(38,16),cursed,0,"The Tears of Koth" +OBJECT:'*',"ruby",(38,17),cursed,0,"The Heart of Cassanova" +OBJECT:'*',"emerald",(38,18),cursed,0,"The Eye of Hera" +MONSTER:'&',random,(38,16) +MONSTER:'&',random,(38,17) +MONSTER:'&',random,(38,18) +# Outer Trap Room +GOLD:1,(48,13) +GOLD:1,(48,14) +OBJECT:'?',"fire",(48,13),cursed,0 +OBJECT:'?',"earth",(48,14),cursed,0 +TRAP:"magic",(48,13) +TRAP:"land mine",(48,14) +GOLD:1,(51,12) +GOLD:1,(50,14) +GOLD:1,(52,15) +GOLD:1,(53,13) +TRAP:"fire",(54,13) +TRAP:"fire",(54,14) +TRAP:"magic",(52,12) +TRAP:"magic",(52,15) +TRAP:"spiked pit",(51,13) +TRAP:"anti magic",(50,14) +OBJECT:'!',"polymorph",(50,13) +OBJECT:'?',"demonology",(50,12),cursed,0 +OBJECT:'?',"elementalism",(50,12),cursed,0 +# Guardians in the fountain room +MONSTER:'&',random,(49,04) +MONSTER:'&',random,(49,08) +MONSTER:'&',random,(52,04) +MONSTER:'&',random,(52,08) +MONSTER:'V',random,(55,04) +MONSTER:'V',random,(55,08) +# Guardians in the outer chamber +MONSTER:'d',"hell hound",(67,06) +MONSTER:'d',"hell hound",(69,06) +MONSTER:'d',"hell hound",(68,05) +MONSTER:'d',"hell hound",(68,07) +# Guardian in the branch chamber +MONSTER:'j',"blue jelly",(73,02) +# Greeting in the outer chamber +MONSTER:'i',"imp",(69,17) +OBJECT:'[',"helm of opposite alignment",(65,17),cursed,-2 +OBJECT:'*',"loadstone",(65,18),cursed,0 +OBJECT:'"',"amulet of strangulation",(65,18),cursed,0 # -# The Baalzebub level +# The New Baalzebub level # MAZE:"baalz",random -FLAGS: noteleport -GEOMETRY:right,center +FLAGS: noteleport,lethe,hardfloor +GEOMETRY:center,center MAP -------------------------------------------------- -| --- ---- -| ---- | ------------ | -| ------ | --------|..........|--- -| |....| -------|...........-------------- ----....|--|..................S............|---- -....--....S..----------------|............S...| ----....|--|..................|............|---- -| |....| -------|...........-----S-------- -| ------ | --------|..........|--- -| ---- | ------------ | -| --- ---- -------------------------------------------------- + RR RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR + ..RR...R ...RR....RRRR.....RR...RR.R..R.R.R....RR.R RR.RR... ..... + .RR..RRR..RRR...RRR....RR.F...RRR..R.RR.R.R..F.R..R.RRR... RR. #....... + R.. RRRRRRRR.F.RRRRRRRRFFFRRRRRRRRRRRRRRRFFFFRRRR.R....RR.R... # ...... + .RRRRRRRRRRRRRFFFFRRRRRRFRRR------------RRFRRRRRRRR.RR.R..... R.# + .RRRFFFFFFRRRRRRFRR--------|..........|FFFRRRRRRRRRR.....RRR... .R... + .RRRRF....FRR-------|...........--------------RRRRRRRRRR..... R... .R.R + R.R---....|--|..................S............|----RRRRR...R.R ...R...... + ..R|...--....S..----------------|..........\.S...|RRRRRRR.....RR... R..R + .RR---....|--|..................|............|----RRRRRRRRR.....RR.....R. + .RRRF....FRR-------|...........-----S--------RRRRRRRRR.....RR.....R R.. + .R.RRFFFFFFRRRRRRFRR--------|..........|FFFRRRRRRRR R....R..RR.. ....RR + R.R.RRRRRRRRRRFFFFRRRRRFRRRR------------RRFRRRRRRR ..RR...R...R... R. + RR.R.RRRRRRRR.F.RRRRRRRFFFRRRRRRRRRRRRRRRRFFFFRR... R...R.....RR.RR ...R + . R..RRRRRR...RRRRRRRR.F.RRRRR....RRRRRRRR.F....R...R...R....R...R ...R + RR. . ..RRRRRRR.RRRR...R...RR...RR....RRRRRR...RR..R....R...R...RR...R + R..R.R.R.. .R.R.R...R..RR...RR...RRR...RR...R.....R.R..R...RR..R .R.. + RR..R.R.R.. R.R.R.R..R.R.RR....RRR...RRR....RR...RR......RR... .RR ..... + RR.RR..RR..RRR...R...RR....RRRRRRRR....RR......R....RRR..RR.R...... + RRR RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRR ENDMAP -STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up -BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) -TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) -NON_DIGGABLE:(00,00,46,12) -MAZEWALK:(00,06),west -STAIR:(44,06),down +# Regions +REGION:(00,00,75,19),unlit,"ordinary" +REGION:(68,01,72,03),lit,"ordinary" +# Stairs +STAIR:(69,02),up +STAIR:(48,08),down +BRANCH:(16,15,75,19),(00,00,00,00) +TELEPORT_REGION:(16,15,75,19),(00,00,00,00) +# Non diggable walls +NON_DIGGABLE:(00,00,75,19) +# Doors +DOOR:locked,(14,08) +DOOR:locked,(38,10) +DOOR:locked,(33,07) +DOOR:locked,(46,08) +# Drawbridges +DRAWBRIDGE:(03,08),east,closed # The fellow in residence -MONSTER:'&',"Baalzebub",(35,06) +MONSTER:'&',"Baalzebub",(44,08) # Some random weapons and armor. OBJECT:'[',random,random OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:')',random,random OBJECT:')',random,random OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random OBJECT:'*',random,random OBJECT:'!',random,random OBJECT:'!',random,random +OBJECT:'!',random,random +OBJECT:'!',random,random +OBJECT:'?',random,random +OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'?',random,random # Some traps. TRAP:"spiked pit", random +TRAP:"spiked pit", random TRAP:"fire", random +TRAP:"fire", random +TRAP:"sleep gas", random TRAP:"sleep gas", random TRAP:"anti magic", random -TRAP:"fire", random +TRAP:"anti magic", random +TRAP:"rust", random +TRAP:"rust", random +TRAP:"rust", random +TRAP:"magic", random +TRAP:"magic", random TRAP:"magic", random TRAP:"magic", random # Random monsters. -MONSTER:' ',"ghost",(37,07) -MONSTER:'&',"horned devil",(32,05) -MONSTER:'&',"barbed devil",(38,07) +MONSTER:' ',"ghost",(39,08) +MONSTER:'&',"horned devil",(29,06) +MONSTER:'&',"barbed devil",(29,10) MONSTER:'L',random,random +MONSTER:' ',"ghost",random +MONSTER:' ',"ghost",random +MONSTER:' ',"shade",random +MONSTER[50%]:' ',"shade",random +MONSTER:'&',random,random +MONSTER:'&',random,random +MONSTER:'&',"horned devil",random +MONSTER:'&',"horned devil",random +MONSTER:'&',"horned devil",random +MONSTER[50%]:'&',"horned devil",random +MONSTER:'i',"lemure",random +MONSTER:'i',"lemure",random +MONSTER:'i',"lemure",random +MONSTER:'i',"lemure",random +MONSTER[50%]:'i',"lemure",random # Some Vampires for good measure MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'V',random,random +# And a few blobby things, borrowed from Big J. +MONSTER:'F',random,random +MONSTER:'F',random,random +MONSTER:'F',random,random +MONSTER:'P',"green slime",random +MONSTER:'P',random,random +MONSTER:'P',random,random +MONSTER[50%]:'P',random,random -# [Tom] +# # The Yeenoghu level # +# Authors: +# Tom Proudfoot +# Mik Clarke +# +# Yeenoghu is the demon lord of the Gnolls, a secretive, silent +# race of mountain dwelling creatures. +# MAZE:"yeenoghu",random -FLAGS: noteleport -GEOMETRY:right,center +FLAGS: noteleport,hardfloor,phlegethon +GEOMETRY:center,center MAP -------------------------------------------------- -| ---------| |----------| -| |....S...|--|......|...------------ -| |....|...| |......-...S..........| -| |....|-------..........|...------S------- ----....|--|..............|...|............|---- -..........S..............|---|.....\......S...| ----....|--|..............|...|............|---- -| |....|-------..........|...-------------- -| |....|...| |......-...S..........| -| |....S...|--|......|...------------ -| ---------| |----------| -------------------------------------------------- + RRRR ..... .. ----------- ------------ ... + .... RRRR ... H .... .|....|....| |......S...-------------- ..P... + ...... RRRR H .H......H..|....|....| |FFFFFF|...S..........+.| ... . + .... RRRR ...H.. ..... |....|S--S---..........|...-------------- . + . H RRRR ..... ... ---....|..F.......{......|S--|............|--S- + H ..RRRRH......H.. ..H........|..F......{.{.....F...+.........\..S...| + ... RRRR .... ... ---....|..F.......{......|---|............|---- +...... RRRR ..... ..H.|....|---S---..........|...-------------- . +.......FRRRR .. ... ... .|....|....| |FFFFFF|...S..........+.| .. ... + ......FFFFF.....H.. ....H.|....S....| |......S...-------------- ...... + .. RRRRF. .. .....H.. .. ----------- ------------... .... ..H.. .. + . RRRR .. . ... H .. ..... ...H.....H. H .H. ... H .H. + H RRRR . . . .H.. .H. ..... ... ... ... ... . + .. RRRR H H .. ... ... ...... .....H. .H........ H ..... .. + ..... RRRR .... .H. .... .. .H....... H .. ... ...... .H. ..H.... ... + ....H..R.R.H...... .. ... H ......H. .. .... ... .H... + .... R.R. .... .. ...H... ..... .H...... ......H.H..... .. + RRRR .H.. .....H... ... .... ... ENDMAP -STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up -BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) -TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) -NON_DIGGABLE:(00,00,46,12) -MAZEWALK:(00,06),west -STAIR:(44,06),down -# The fellow in residence -MONSTER:'&',"Yeenoghu",(35,06) -# Some random weapons and armor. -OBJECT:'[',random,random -OBJECT:'[',random,random -OBJECT:')',random,random -OBJECT:')',random,random -OBJECT:'*',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -# Some traps. -TRAP:"fire", random -TRAP:"fire", random -TRAP:"magic", random -TRAP:"magic", random -TRAP:"magic", random -TRAP:"magic", random -# Random monsters. -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghoul",random -MONSTER:'Z',"ghast",random -MONSTER:'Z',"ghast",random -MONSTER:'Z',"ghast",random -MONSTER:'Z',"ghast",random -MONSTER:'Z',"ghast",random -MONSTER:'Z',"ghast",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random -MONSTER:'G',"gnoll",random +# +# Regions +REGION:(00,00,67,17),unlit,"ordinary" +REGION:(68,00,75,17),unlit,"ordinary" +REGION:(59,04,70,06),lit,"ordinary" + +# Branch and teleport points +BRANCH:(00,11,75,17),(00,00,00,00) +TELEPORT_REGION:(00,11,75,17),(00,00,00,00) + +# Protect the walls +NON_DIGGABLE:(00,00,75,17) + +# Stairs up and down +STAIR:(69,13),up +STAIR:(73,05),down + +# Doors +DOOR:locked,(36,09) +DOOR:locked,(37,03) +DOOR:locked,(40,03) +DOOR:locked,(40,07) +DOOR:locked,(50,01) +DOOR:locked,(50,09) +DOOR:locked,(54,08) +DOOR:locked,(54,02) +DOOR:locked,(55,04) +DOOR:locked,(58,05) +DOOR:locked,(65,02) +DOOR:locked,(65,08) +DOOR:locked,(71,05) +DOOR:locked,(74,04) + +# A few random citizens MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random @@ -629,399 +824,2057 @@ MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random +MONSTER:'G',"gnoll chieftain",random +MONSTER:'G',"gnoll chieftain",random +MONSTER:'G',"gnoll shaman",random -# [Tom] -# The Geryon level +# A few random hazards +MONSTER:'e',random,random +MONSTER:'e',random,random +MONSTER:'e',random,random +MONSTER:'e',random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random + +# Some random junk +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:')',random,random,cursed,-1 +OBJECT:')',random,random,cursed,-1 +OBJECT:')',random,random,cursed,-1 +OBJECT:'[',random,random,cursed,-1 +OBJECT:'[',random,random,cursed,-1 +OBJECT:'[',random,random,cursed,-1 +OBJECT:'%',random,random,cursed,+0 +OBJECT:'%',random,random,cursed,+0 +OBJECT:'%',random,random,cursed,+0 + +# Fishies in the river +MONSTER:';',random,(10,02) +MONSTER:';',random,(09,05) +MONSTER:';',random,(09,08) +MONSTER:';',random,(08,10) +MONSTER:';',random,(10,13) +MONSTER:';',random,(08,16) + +# Flying things +MONSTER:'B',random,(12,02) +MONSTER:'B',random,(06,11) +MONSTER:'a',random,(11,07) +MONSTER:'a',random,(11,13) + +# The first camp... +MONSTER:'G',"gnoll",(54,13) +MONSTER:'G',"gnoll",(57,15) +MONSTER:'G',"gnoll",(56,17) +MONSTER:'G',"gnoll chieftain",(55,14) + +# The second camp... +MONSTER:'G',"gnoll",(41,14) +MONSTER:'G',"gnoll",(41,16) +MONSTER:'G',"gnoll",(38,17) +MONSTER:'G',"gnoll",(36,13) +MONSTER:'G',"gnoll chieftain",(38,14) +MONSTER:'G',"gnoll warrior",(39,12) +MONSTER:'G',"gnoll shaman",(37,12) +OBJECT:'(',"chest",(35,11) + +# Third camp +MONSTER:'G',"gnoll",(25,13) +MONSTER:'G',"gnoll",(26,15) + +# Fourth camp +MONSTER:'G',"gnoll warrior",(15,14) +MONSTER:'G',"gnoll",(17,14) +MONSTER:'G',"gnoll",(18,16) +MONSTER:'G',"gnoll warrior",(15,16) + +# Fifth camp +MONSTER:'G',"gnoll warrior",(04,16) +MONSTER:'G',"gnoll warrior",(05,14) +MONSTER:'G',"gnoll warrior",(03,14) + +# Sixth Camp +MONSTER:'G',"gnoll warrior",(02,10) +MONSTER:'G',"gnoll warrior",(02,06) +MONSTER:'G',"gnoll",(01,07) +MONSTER:'G',"gnoll",(01,09) +MONSTER:'G',"gnoll",(05,08) +MONSTER:'G',"gnoll chieftain",(02,08) +MONSTER:'G',"gnoll shaman",(06,09) +OBJECT:'(',"chest",(00,08) + +# Seventh Camp +MONSTER:'G',"gnoll warrior",(04,03) +MONSTER:'G',"gnoll warrior",(02,03) +MONSTER:'G',"gnoll warrior",(06,02) +MONSTER:'G',"gnoll warrior",(03,01) + +# Eighth Camp +MONSTER:'G',"gnoll warrior",(13,04) +MONSTER:'G',"gnoll warrior",(13,06) +MONSTER:'G',"gnoll warrior",(15,03) +MONSTER:'G',"gnoll warrior",(17,04) +MONSTER:'G',"gnoll chieftain",(15,06) +# Loot +OBJECT:'%',random,(20,07) +OBJECT:'%',random,(21,08) +OBJECT:'%',random,(22,08) +OBJECT:'%',random,(23,08) +OBJECT:'*',random,(24,07) +OBJECT:'*',random,(23,07) +OBJECT:'*',random,(22,06) + +# Nineth Camp +MONSTER:'G',"gnoll warrior",(23,03) +MONSTER:'G',"gnoll warrior",(24,01) +MONSTER:'G',"gnoll warrior",(26,04) +MONSTER:'G',"gnoll warrior",(27,03) +MONSTER:'G',"gnoll chieftain",(27,01) +MONSTER:'G',"gnoll shaman",(25,00) +MONSTER:'G',"gnoll shaman",(26,00) + +# Entrance Chamber +MONSTER:'Z',"skeleton",(32,01),hostile,asleep +MONSTER:'Z',"skeleton",(33,01),hostile,asleep +MONSTER:'Z',"skeleton",(34,01),hostile,asleep +MONSTER:'Z',"skeleton",(35,01),hostile,asleep +MONSTER:'Z',"skeleton",(32,09),hostile,asleep +MONSTER:'Z',"skeleton",(33,09),hostile,asleep +MONSTER:'Z',"skeleton",(34,09),hostile,asleep +MONSTER:'Z',"skeleton",(35,09),hostile,asleep +TRAP:"board",(32,05) +TRAP:"board",(32,06) +TRAP:"magic",(34,05) +TRAP:"magic",(35,05) + +# Southern Antiroom +MONSTER:'G',"gnoll warrior",(37,08),hostile +MONSTER:'G',"gnoll warrior",(40,09),hostile + +# Pool Room +MONSTER:'D',"black dragon",(38,05),hostile +MONSTER:'D',random,(46,01),hostile +MONSTER:'D',random,(46,09),hostile +MONSTER:'h',"master mind flayer",(56,05),hostile +OBJECT:'/',"cancellation",(56,05) +OBJECT:'/',"lightning",(56,05) +OBJECT:'!',"full healing",(56,05) +MONSTER:''',"iron golem",(47,05),hostile,asleep # -MAZE:"geryon",random -FLAGS: noteleport -GEOMETRY:right,center -MAP -------------------------------------------------- -| ------------|----------| -| |....S......|..........|--------------------- -| |....|......S..........S...|......|.........| -| |---S--------..........|...------S-----S-...| ----...........|..........|...S............|--S- -..............|-S--------|---|............|...| ----...........|..........|...|............|---- -| |---------S--..........|...----------S----- -| |....|......|..........S..........|.......| -| |....S......|..........|----------|.......| -| ------------|----------| --------- -------------------------------------------------- -ENDMAP -STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up -BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) -TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) -NON_DIGGABLE:(00,00,46,12) -MAZEWALK:(00,06),west -STAIR:(44,06),down +MONSTER:'G',"gnoll warrior",(41,06),hostile +MONSTER:'G',"gnoll warrior",(42,06),hostile +MONSTER:'G',"gnoll warrior",(41,04),hostile +MONSTER:'G',"gnoll warrior",(42,04),hostile +MONSTER:'G',"gnoll warrior",(51,02),hostile +MONSTER:'G',"gnoll warrior",(53,04),hostile +MONSTER:'G',"gnoll warrior",(53,06),hostile +MONSTER:'G',"gnoll shaman",(48,04),hostile +MONSTER:'G',"gnoll shaman",(48,06) + +# Northern Antiroom +MONSTER:'&',"nalfeshnee",(38,01),hostile +MONSTER:'&',"vrock",(39,02),hostile + +# Southern Entrance +MONSTER:random,random,(56,07),hostile +MONSTER:random,random,(57,08),hostile +MONSTER:random,random,(60,08),hostile +MONSTER:random,random,(63,08),hostile +TRAP:"polymorph",(64,08) +TRAP:"anti magic",(66,08) + +# Northern Entrance +MONSTER:'G',"gnoll warrior",(56,03),hostile +MONSTER:'G',"gnoll warrior",(57,02),hostile +MONSTER:'G',"gnoll shaman",(62,02),hostile +TRAP:"web",(59,02) +TRAP:"pit",(60,02) +TRAP:"anti magic",(64,02) +TRAP:"fire",(66,02) + +# Entrance Hall +TRAP:"board",(57,05) + +# The throne room # The fellow in residence -MONSTER:'&',"Geryon",(35,06) -# Some random weapons and armor. -OBJECT:'[',random,random -OBJECT:'[',random,random -OBJECT:')',random,random -OBJECT:')',random,random -OBJECT:'*',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -# Some traps. -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -# Random monsters. -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'H',"minotaur",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random +MONSTER:'&',"Yeenoghu",(68,05) +# A small hareem +MONSTER:'&',"succubus",(65,04) +MONSTER:'&',"succubus",(65,05) +MONSTER:'&',"succubus",(65,06) +MONSTER:'u',"pony",(64,05) +# Some guards +MONSTER:'G',"gnoll warrior",(59,04),hostile +MONSTER:'G',"gnoll warrior",(59,06),hostile +MONSTER:'&',"bone devil",(60,04) +MONSTER:'&',"bone devil",(60,06) +MONSTER:'&',"hezrou",(63,04) +MONSTER:'&',"hezrou",(63,06) +MONSTER:'&',"balrog",(70,04) +MONSTER:'&',"balrog",(70,06) +# And his advisors +MONSTER:'G',"gnoll shaman",(67,04),hostile +MONSTER:'G',"gnoll shaman",(67,06),hostile +# A little loot +OBJECT:'(',"chest",(70,05) -# [Tom] -# The Demogorgon level +# The stair well +MONSTER:'P',"green slime",(74,05),asleep,hostile + +# The treasure room +MONSTER:'Z',"skeleton",(71,02),asleep,hostile +MONSTER:'Z',"skeleton",(71,00),asleep,hostile +MONSTER:'L',"master lich",(70,01),asleep,hostile +OBJECT:'(',"chest",(69,01) +OBJECT:'*',random,(69,01) +OBJECT:'*',random,(69,01) +OBJECT:'*',random,(69,01) +OBJECT:'*',random,(69,01) + + +# +# A demogorgan level +# +# Don't be fooled by Demogorgons apparently greek name, he was +# created during the 12th century by a transcription error. +# He is very loosly associated with power, might and dark +# underground forces. # MAZE:"demogorg",random -FLAGS: noteleport -GEOMETRY:right,center +FLAGS: noteleport,lethe,hardfloor +GEOMETRY:center,center MAP -------------------------------------------------- -| ------------|------------------ -| |}}}}}}}}}}}|}...}......}}}}}}|-------------- -| |}}}}}}}}}}}|....}}...}...}}}}S...|.........| -| |-----}}-----...}...}.......}}|--S-----S-...| ----....}}}}...|.....}}....}..}}}|...|.....|--S- -.......}}}}...|-S----------------...|.....|...| ----..}}}}}}...|}..| |...S..S...|.....|---- -| |-}}}--------...| |...-------|--S----- -| |}}}}|......S...| |..........S.......| -| |}}}}S......|..}| |----------|.......| -| ------------|---- --------- -------------------------------------------------- + RRRRRRRR RR RRRRR RRRR + .... ....IIIRRRIRR .... .. IIIR RIIIRRRRRRRRRIIR .... + ........IIIRRIIIIRRRRII..+..... ....+.IIRRII IRRRIIIIRRIRRRIIIR.. ..... + .. ...IIIRRIIIIIIRIIRII. ..... .IIRRIIIRRRIIIIIRIIIRIIIRRI.. .... + .IIIRRRRIIIIIIRIIIRRII... R.. IIIRRRIIIIRRIIIIRIIIIIRRIRRII.. # + ...IIIIIIRRIIIIRRRIIIIRRRIII RR RRRRRRIIRIIIIIRRIIIIRRIIIIRII..### + ...RIIIIIIIIRRIIRRIRRRRIIIRRRR RRIIIRRRRRRRRRIIIIRRIIIIRRRII. # + ..IRIIIIIIIRRRRRIIIRRIIRRIIIIRRI -----RIIIIRRIIIRRRRIIRRRRIIIIRRRI ## + ..IIRIIIIIRRRIIIIIRRIIIIIRRIIIRII |...|RIIIIIRRIIIRRRRRIIIRRRRRIIRR # + IIIIRRIIIIRRIIIIRRIIIIIRRRRIRRRII |...| RRIIIIRIIIIRRIIIIRRRIIIIRR # + IIIIRRRIRIIRIIIIRRIIIIIRRRRIRRRIR--+-- IRRIIRRIIIIIRIIIIRRRIIIIRR. .. + RIIIIIIRIIIIRRRRIIRRRIIIRRRRRRIIRR|.| IIRRRIIIIIRRRIIRRRIRIIIIRR. ... + IIRIIIIIRIIIIIRIIIIIRRRRRIRRRRRRIRRF.| IIIRRRRIIIIRRRRIIIRRIIRRR.#... + IIIRRIIIRRRIIIIIRIIIIIRIIIIIRRRIIRR |.| IIIRIIRRRRRIIIRRIIRRIIIRI .. + IIIIRRIIRIIRIIIRRRRIIIRRIIIIRIIIRR---S---- IIIRIIIIRRIIIIIRRRIIRIIRRR # + .IIIIIRRIIIIRRRRRRRRIIIRRIIIIRRIR |......| RRRIIIIRRIIIIIRRRRIRRR # + ...IIIIRRRIIIIRRRIIIRIIIRIIIIIRR |.\....| .IIIIRRIIIIIRRRIIIRR. .... + ....IIIIRRRRIIRRIIIIRRIIRIIIII |......S## ##..IIIIRRIIIRRRIIIRR. ...... + ....IIIIRRRRRR RRRIIII -------- ### ....IIIRRRRRRRIIR..#..... + RRRR RRRR RRRRRRRRRRR ENDMAP -STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up -BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) -TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) -NON_DIGGABLE:(00,00,46,12) -MAZEWALK:(00,06),west -STAIR:(44,06),down +# Regions +REGION:(00,00,34,19),unlit,"ordinary" +REGION:(40,00,75,19),unlit,"ordinary" +REGION:(24,00,39,05),unlit,"ordinary" +REGION:(36,15,41,17),lit,"ordinary" +REGION:(38,10,38,12),unlit,"ordinary" +REGION:(37,08,39,09),lit,"ordinary" +# Stairs +STAIR:(02,17),up +STAIR:(37,08),down +BRANCH:(67,01,75,19),(00,00,00,00) +TELEPORT_REGION:(67,01,75,19),(00,00,00,00) +# Non diggable walls +NON_DIGGABLE:(00,00,75,19) +# Doors +DOOR:locked,(27,02) +DOOR:locked,(38,02) +DOOR:locked,(42,17) +DOOR:locked,(38,14) +DOOR:locked,(38,10) +# The master +MONSTER:'&',"Demogorgon",(37,16) +OBJECT:'(',"frost horn",(37,16) +# His court +MONSTER:'&',"ice devil",(38,15) +MONSTER:'&',"ice devil",(38,17) +MONSTER:'&',"bone devil",(40,15) +MONSTER:'&',"bone devil",(40,17) +MONSTER:'&',"succubus",(36,15) +MONSTER:'&',"succubus",(36,17) +MONSTER:'b',"gelatinous cube",(41,15) +MONSTER:'b',"gelatinous cube",(41,17) +# His doorbell +TRAP:"board",(43,17) +# The final guardians +MONSTER:'j',"blue jelly",(37,08) +MONSTER:'j',"blue jelly",(37,09) +MONSTER:'j',"blue jelly",(38,08) +MONSTER:'j',"blue jelly",(38,09) +MONSTER:'j',"blue jelly",(39,08) +MONSTER:'j',"blue jelly",(39,09) +# A family of Ice Trolls +MONSTER:'T',"ice troll",(02,01) +MONSTER[90%]:'T',"ice troll",(02,02) +MONSTER[80%]:'T',"ice troll",(02,03) +MONSTER[70%]:'T',"ice troll",(03,01) +MONSTER[50%]:'T',"ice troll",(03,02) +MONSTER[30%]:'T',"ice troll",(04,01) +MONSTER[10%]:'T',"ice troll",(06,02) +# This is fun with all that ice around here... +OBJECT[50%]:'/',"fire",(03,02) +# A few Yetis +MONSTER:'Y',"yeti",(33,03) +MONSTER:'Y',"yeti",(30,01) +MONSTER:'Y',"yeti",(36,02) +MONSTER[75%]:'Y',"yeti",(28,02) +MONSTER[75%]:'Y',"yeti",(37,02) +MONSTER[50%]:'Y',"yeti",(30,02) +MONSTER[50%]:'Y',"yeti",(37,02) +MONSTER[50%]:'Y',"yeti",(33,04) +# Stray Frost giants +MONSTER:'H',"frost giant",(20,13) +MONSTER:'H',"frost giant",(20,12) +MONSTER:'H',"frost giant",(20,14) +MONSTER:'H',"frost giant",(21,14) +# Dragons +MONSTER:'D',"white dragon",(71,02),asleep +OBJECT:'(',"chest",(69,02) +GOLD:random,(73,01) +MONSTER:'D',"silver dragon",(73,11),asleep +OBJECT:'(',"chest",(74,11) +GOLD:random,(74,12) +MONSTER:'D',"gray dragon",(71,17),asleep +OBJECT:'(',"chest",(74,17) +GOLD:random,(70,16) +# Finally some wolves +MONSTER:'d',"winter wolf",(57,10) +MONSTER[90%]:'d',"winter wolf",(58,08) +MONSTER[60%]:'d',"winter wolf",(53,10) +MONSTER[30%]:'d',"winter wolf",(57,05) + +# +# The Geryon level +# +# Authors: +# Tom Proudfoot +# Mik Clarke +# +# Geryon was a three-bodied giant in the Labour of Hercules +# and the personification of Fraud in the Inferno. He appears +# at the inner edge of the seventh circle and carries Dante +# down the great barrier to the eight circle. +# +MAZE:"geryon",random +FLAGS: noteleport,hardfloor,phlegethon +GEOMETRY:center,center +MAP + RRRR ...... LLL .LLLL LLL + .. ......LLL RRRR ..... . LLLLLL .LLLLLLLLLLLLLLLL + .... .....LLLL..... RRRR ... ..LLLLLLLLLLLLL .LLLLL LLLLL. + .... ...L ... RRRR .----- ...LLL LLL ..LL LLL. + .. . .... RRRR..|...|------------FFF- .... + . .... . ..RRRR..S...|...S...........|----------S--- + .. ...... ..... ....RRRR.---+-FF.|....RRR....S...|L...L|...| + ......LL... .. ... .....RRRR..L|...F.|....RRR....|--S|..\..S...| + .. ...LLL.... ...... ....RRRR..L|...F.|...........|...|.....|--+- + .. ...... ...L.. ....RRRR...L|FFFF.|------------...|.....|...| + ..... ... ....LL.... .....RRRR....L|.....| |...S..S...|L...L|---- + .... . ...... ... ..RRRR....---+----- . |..-------|---S---- + .. ... .. .RRRR.....S...| LLL |.........|.......| + .. .. . .. RRRR.....|...| LL |--FFF----|.......| + . ... ..... ...L RRRR....---S- LLL LLL ----S---- + ....L.. .... .....LL RRRR . LLL LLLLL LL.LL + ...LL...... ...LLLLL LLLLRRR .. LLLLLLLLLLLLLL LLLL.LL + ...... .LLL LLLL RRRR ....LLLLL.....LLLLLL...LL + RRRR ......LLLLL......LLLL +ENDMAP + +# Regions +REGION:(00,00,75,18),unlit,"ordinary" + +# Branch and teleport points +BRANCH:(00,00,24,18),(00,00,00,00) +TELEPORT_REGION:(00,00,24,18),(00,00,00,00) + +# Protect the walls +NON_DIGGABLE:(35,00,75,18) + +# Stairs up and down +STAIR:(02,03),up +STAIR:(41,01),down + +# Doors +DOOR:locked,(39,05) +DOOR:locked,(39,12) +DOOR:locked,(42,06) +DOOR:locked,(42,11) +DOOR:locked,(42,14) +DOOR:locked,(47,05) +DOOR:locked,(59,06) +DOOR:locked,(62,07) +DOOR:locked,(59,10) +DOOR:locked,(56,10) +DOOR:locked,(65,14) +DOOR:locked,(65,11) +DOOR:locked,(69,07) +DOOR:locked,(72,08) +DOOR:locked,(70,05) + +DRAWBRIDGE:(40,08),east,closed + +# A few random demons + +MONSTER:'&',random,random +MONSTER:'&',random,random +MONSTER:'&',random,random +MONSTER:'&',random,random + +# A few random traps + +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random + +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random + +TRAP:"anti magic",random +TRAP:"anti magic",random + +# Outer defences + +MONSTER:'X',"xorn",(10,05),asleep,hostile +MONSTER:'X',"xorn",(02,10),asleep,hostile +MONSTER:'X',"xorn",(11,09),asleep,hostile +MONSTER:'X',"xorn",(16,01),asleep,hostile +MONSTER:'X',"xorn",(22,08),asleep,hostile + +MONSTER:'H',"fire giant",(03,15),asleep,hostile +MONSTER:'H',"fire giant",(04,17),asleep,hostile +MONSTER:'H',"fire giant",(06,14),asleep,hostile +MONSTER:'H',"fire giant",(06,17),asleep,hostile +MONSTER:'H',"fire giant",(08,16),asleep,hostile + +MONSTER:'E',"fire elemental",(11,08),asleep,hostile +MONSTER:'E',"fire elemental",(05,16),asleep,hostile +MONSTER:'E',"fire elemental",(17,02),asleep,hostile +MONSTER:'E',"fire elemental",(20,10),asleep,hostile +MONSTER:'E',"fire elemental",(22,17),asleep,hostile +MONSTER:'E',"fire elemental",(24,15),asleep,hostile + +MONSTER:'d',"hell hound",(21,08),asleep,hostile +MONSTER:'d',"hell hound",(19,10),asleep,hostile +MONSTER:'d',"hell hound",(23,09),asleep,hostile +MONSTER:'d',"hell hound",(21,11),asleep,hostile + +MONSTER:'D',"red dragon",(21,15),asleep,hostile + +TRAP:"board",(06,07) +TRAP:"board",(01,14) +TRAP:"board",(09,11) +TRAP:"board",(12,04) +TRAP:"board",(18,06) +TRAP:"board",(19,05) +TRAP:"board",(11,16) +TRAP:"board",(17,13) +TRAP:"board",(19,15) + +# Guardians at the crossing + +MONSTER:'B',random,(32,05),asleep,hostile +MONSTER:'B',random,(35,06),asleep,hostile +MONSTER:'B',random,(30,12),asleep,hostile +MONSTER:'B',random,(34,11),asleep,hostile + +MONSTER:'&',"hezrou",(31,08),asleep,hostile +MONSTER:'&',"hezrou",(29,12),asleep,hostile +MONSTER:'&',"hezrou",(33,08),asleep,hostile +MONSTER:'&',"hezrou",(31,07),asleep,hostile + +MONSTER:'&',"nalfeshnee",(37,09),asleep,hostile +MONSTER:'&',"nalfeshnee",(35,12),asleep,hostile +MONSTER:'&',"nalfeshnee",(39,10),asleep,hostile + +MONSTER:'E',"fire elemental",(35,04),asleep,hostile +MONSTER:'E',"fire elemental",(32,14),asleep,hostile + +TRAP:"board",(28,10) +TRAP:"board",(32,07) + +# The cage trap + +MONSTER:'D',"black dragon",(43,09) + +MONSTER:'&',"pit fiend",(41,05) + +MONSTER:'&',"pit fiend",(41,12) + +MONSTER:'&',"nalfeshnee",(46,10) +MONSTER:'&',"bone devil",(46,08) +MONSTER:'&',"bone devil",(44,05) +MONSTER:'&',"bone devil",(46,05) + +# The water room + +MONSTER:'&',"water demon",(50,06) +MONSTER:'&',"water demon",(51,08) +MONSTER:'&',"water demon",(55,08) +MONSTER:'&',"water demon",(56,05) + +MONSTER:'n',"water nymph",(48,06) +MONSTER:'n',"water nymph",(49,08) +MONSTER:'n',"water nymph",(56,08) +MONSTER:'n',"water nymph",(58,06) +MONSTER:'n',"water nymph",(53,05) +MONSTER:'n',"water nymph",(53,08) + +MONSTER:'&',"nalfeshnee",(58,08) + +MONSTER:'g',"gremlin",(48,08) + +# Secret rooms and passages are empty + +# Gallery + +MONSTER:'L',"arch-lich",(56,12),asleep,hostile + +MONSTER:'&',"nalfeshnee",(55,12) +MONSTER:'&',"nalfeshnee",(54,12) +MONSTER:'D',"blue dragon",(59,12) + +TRAP:"board",(54,10) + +# Southern Lava Walk + +MONSTER:'E',"fire elemental",(48,16) +MONSTER:'E',"fire elemental",(55,17) +MONSTER:'E',"fire elemental",(63,16) + +MONSTER:':',"salamander",(52,17) +MONSTER:':',"salamander",(62,18) + +MONSTER:'V',"fire vampire",(68,16) + +MONSTER:'D',"red dragon",(49,11) +OBJECT:'(',"chest",(49,11) +OBJECT:'*',"ruby",(49,11) +OBJECT:'*',"ruby",(49,11) +OBJECT:'*',random,(49,11) +OBJECT:'*',random,(49,11) +OBJECT:'*',random,(49,11) +OBJECT:'*',random,(49,11) +OBJECT:'*',random,(49,11) +OBJECT:'*',random,(49,11) +GOLD:random,(49,11) + +# Antichamber and throne room + +MONSTER:''',random,(65,12),asleep,hostile +MONSTER:''',random,(64,12),asleep,hostile +MONSTER:''',random,(66,12),asleep,hostile + +MONSTER:'&',"nalfeshnee",(62,13) +MONSTER:'&',"nalfeshnee",(68,13) + +TRAP:"board",(65,13) +TRAP:"magic",(64,13) +TRAP:"magic",(66,13) + # The fellow in residence -MONSTER:'&',"Demogorgon",(06,06) -# Some random weapons and armor. -OBJECT:'*',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -# Random monsters. -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'P',random,random -MONSTER:'j',random,random -MONSTER:'j',random,random -MONSTER:'j',random,random -MONSTER:'j',random,random -MONSTER:'j',random,random -MONSTER:'j',random,random -MONSTER:'j',random,random -MONSTER:'F',random,random -MONSTER:'F',random,random -MONSTER:'F',random,random -MONSTER:'F',random,random -MONSTER:'F',random,random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"hezrou",random -MONSTER:'&',"vrock",random -MONSTER:'&',"vrock",random -MONSTER:'&',"vrock",random -MONSTER:'&',"vrock",random -MONSTER:'&',"vrock",random -MONSTER:'&',"vrock",random -# [Tom] +MONSTER:'&',"Geryon",(66,07) + +MONSTER:'&',"pit fiend",(65,08) +MONSTER:'&',"balrog",(67,08) +MONSTER:'&',"marilith",(64,09) +MONSTER:'&',"nalfeshnee",(68,09) +MONSTER:'&',"succubus",(67,07) +MONSTER:'&',"succubus",(65,07) + +MONSTER:'V',"fire vampire",(66,18) + +OBJECT:'(',"chest",(66,06) +OBJECT:'(',"chest",(64,08) +OBJECT:'(',"chest",(68,08) + +# Fake stairs + +MONSTER:'m',"giant mimic",(71,09),m_feature "staircase down" + +# Northern Lava Walk + +MONSTER:'E',"fire elemental",(64,02) +MONSTER:'E',"fire elemental",(57,02) +MONSTER:'E',"fire elemental",(50,01) + +MONSTER:':',"salamander",(54,02) +MONSTER:':',"salamander",(67,01) + +MONSTER:'V',"fire vampire",(57,00) + +# Exit chamber + +MONSTER:'&',"pit fiend",(42,01),asleep,hostile + +TRAP:"board",(45,01) + +# # The Dispater level # +# Authors: +# Tom Proudfoot +# Mik Clarke +# +# Dispaters origins are in the Roman god of the underworld. +# originally Dis Pater (rich father) he is associated with +# wealth (naturally found underground). +# MAZE:"dispater",random -FLAGS: noteleport +FLAGS: noteleport,hardfloor,lethe GEOMETRY:right,center MAP -------------------------------------------------- -| ----------------------------------------|-- -| |.....|.....................|...|...|...S.| -| |.--|.|.-------------------.|.|.|.|.|.|.|.| -| |...|.|...................|.|.|.|.|.|.|.|.| -----|.|.|-----------------|.|.|.|.|.|.|.|.|S--- -....|.|.|.................|.|.|.|.|.|.|.|.|...| ----.|.|.|.|--------------.|.|.|.|.|.|.|.|.|---- -| |.|.|.|.|...............|.|.|.|.|.|.|.|.| | -| |.|.|.|.|.--------------|.|.|.|.|.|.|.|.| | -| |...|...|.................|...|...|...|.| | -| ------------------------------------------- -------------------------------------------------- + RRRR +--------- RRRR .. .... ------ +|...|.S.| ..RRRR. ..... .......----|.S..| +|.|S|.|S| ..RRRR.. .... .. .... |...----.| +|.|...|.| .RRRR.. .. .. |...S..|.| +|.-------.. .RRRR. ........ ----S----.|.| +|.|.....|......RRRR.......... -----|.....|.S.|.| +|.|.--|.|.......RRRR...... . |....+.....|.|.|.| +|.|...|S| ... RRRR..... .|---+-----S---|.|.S.| +-S-S|.|.|.... RRRR ... ..+............ |S---.| +....|S--|S|....RRRR ...... | .........\..F...|.| +-S-S|...|.|.....RRRR.... ..+............ |----S| +|.|.|.|.|S| ... RRRR..... .|---+-----S---|..S..| +|.|.|.|.|.| .. RRRR ..... .. |....+.....|-----| +|.|...|...| ..RRRR.... .. .. -----|.....S....| +|.--------- .RRRR... .. .. -------....| +|.....| .. RRRR... ..... ... .... .+....| +|----.| ....RRRR .. .. ...... .... ....------ +|.S...| .RRRR... ..... ..... +------- RRRR ENDMAP -STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up -BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) -TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) -NON_DIGGABLE:(00,00,46,12) -MAZEWALK:(00,06),west -STAIR:(44,06),down -# The fellow in residence -MONSTER:'&',"Dispater",(18,06) -# Some random weapons and armor. -OBJECT:'[',random,random -OBJECT:'[',random,random -OBJECT:')',random,random -OBJECT:')',random,random + +# Regions +REGION:(00,00,48,19),unlit,"ordinary" + +# Branch and Teleport points +BRANCH:levregion(01,00,74,19),levregion(26,00,74,19) +TELEPORT_REGION:levregion(01,00,74,19),levregion(26,00,74,19) + +# Protect the walls +NON_DIGGABLE:(00,00,48,19) + +# Maze the rest of the level +MAZEWALK:(00,10),west + +# Stairs +STAIR:levregion(01,00,74,19),levregion(26,00,74,19),up +STAIR:(43,12),down + +# Doors +DOOR:locked,(01,09) +DOOR:locked,(03,09) +DOOR:locked,(01,11) +DOOR:locked,(03,11) +DOOR:locked,(05,10) +DOOR:locked,(07,08) +DOOR:locked,(09,10) +DOOR:locked,(09,12) +DOOR:locked,(02,18) +DOOR:locked,(03,03) +DOOR:locked,(06,02) +DOOR:locked,(07,03) + +DOOR:locked,(28,09) +DOOR:locked,(28,11) +DOOR:locked,(32,08) +DOOR:locked,(32,12) +DOOR:locked,(38,08) +DOOR:locked,(38,12) +DOOR:locked,(36,07) +DOOR:locked,(36,13) +DOOR:locked,(40,05) +DOOR:locked,(43,04) +DOOR:locked,(45,02) +DOOR:locked,(44,06) +DOOR:locked,(46,08) +DOOR:locked,(43,09) +DOOR:locked,(47,11) +DOOR:locked,(45,12) +DOOR:locked,(42,14) +DOOR:locked,(42,16) + +# Some random money +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random +GOLD:random,random + +# Some random gems OBJECT:'*',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -# Some traps. -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -# Random monsters. -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"lemure",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"imp",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'i',"nupperibo",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"horned devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"barbed devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random -MONSTER:'&',"bone devil",random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random + +# Some random traps +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random +TRAP:"fire",random + +# Gold in the outer vaults +MONSTER:''',"gold golem",(07,04) +OBJECT:'*',random,(07,04) + +MONSTER:''',"gold golem",(07,02) +OBJECT:'*',random,(07,02) + +MONSTER:''',"gold golem",(03,04) +OBJECT:'*',random,(03,04) + +MONSTER:''',"gold golem",(07,09) +OBJECT:'*',random,(07,09) + +MONSTER:''',"gold golem",(01,18) +OBJECT:'*',random,(01,18) + +MONSTER:''',"gold golem",(09,11) +OBJECT:'*',random,(09,11) + +# A river of gold? + +GOLD:random,(15,02) +GOLD:random,(14,03) +GOLD:random,(13,05) +GOLD:random,(14,06) +GOLD:random,(15,07) +GOLD:random,(14,10) +GOLD:random,(15,11) +GOLD:random,(14,14) +GOLD:random,(13,15) +GOLD:random,(14,17) +GOLD:random,(13,18) + +GOLD:random,(20,02) +GOLD:random,(19,03) +GOLD:random,(18,04) +GOLD:random,(19,06) +GOLD:random,(20,07) +GOLD:random,(21,08) +GOLD:random,(20,11) +GOLD:random,(20,12) +GOLD:random,(19,14) +GOLD:random,(18,15) +GOLD:random,(19,16) +GOLD:random,(18,18) + +# Outer Guardians +MONSTER:''',"crystal golem",(11,06) +MONSTER:''',"ruby golem",(12,11) +MONSTER:''',"sapphire golem",(13,04) +MONSTER:''',"diamond golem",(13,15) + +# Fishies in the river +MONSTER:';',random,(17,02) +MONSTER:';',random,(15,05) +MONSTER:';',random,(18,08) +MONSTER:';',random,(17,11) +MONSTER:';',random,(16,14) +MONSTER:';',random,(17,17) + +# Nearside Guardians +MONSTER:''',"ruby golem",(26,04) +MONSTER:''',"ruby golem",(25,15) +MONSTER:''',"sapphire golem",(29,05) +MONSTER:''',"sapphire golem",(27,13) +MONSTER:''',"diamond golem",(25,10) + +# The fellow in residence +MONSTER:'&',"Dispater",(39,10) + +# His court +MONSTER:'&',"nalfeshnee",(38,09),asleep,hostile +MONSTER:'&',"nalfeshnee",(38,11),asleep,hostile + +MONSTER:'&',"succubus",(39,09),asleep,hostile +MONSTER:'&',"incubus",(39,11),asleep,hostile + +MONSTER:''',"diamond golem",(35,09),asleep,hostile +MONSTER:''',"diamond golem",(35,11),asleep,hostile + +# His guards +MONSTER:'&',"ice devil",(31,09),asleep,hostile +MONSTER:'&',"ice devil",(33,09),asleep,hostile +MONSTER:'&',"ice devil",(31,11),asleep,hostile +MONSTER:'&',"ice devil",(31,11),asleep,hostile +MONSTER:'&',"ice devil",(30,10),asleep,hostile + +# Some doorbells +TRAP:"board",(27,09) +TRAP:"board",(27,11) +TRAP:"board",(29,09) +TRAP:"board",(29,09) +TRAP:"board",(32,09) +TRAP:"board",(32,11) + +# Traps for the unwary +TRAP:"anti magic",(32,07) +TRAP:"anti magic",(32,13) +TRAP:"magic",(33,07) +TRAP:"magic",(33,13) +TRAP:"polymorph",(34,07) +TRAP:"polymorph",(34,13) +TRAP:"magic",(35,07) +TRAP:"magic",(35,13) +TRAP:"fire",(37,07) +TRAP:"fire",(37,13) + +# Northern antichamber +MONSTER:'&',random,(40,07) +MONSTER:'&',random,(38,06) +OBJECT:'(',"chest",(41,06) +OBJECT:'(',"chest",(41,07) + +# Southern antichamber +MONSTER:'&',random,(40,13) +MONSTER:'&',random,(38,14) +OBJECT:'(',"chest",(41,14) +OBJECT:'(',"chest",(41,13) + +# Escape Room +TRAP:"polymorph",(44,15) +TRAP:"magic",(45,15) +MONSTER:''',"diamond golem",(43,15),asleep,hostile + +# Northern Vault +TRAP:"board",(40,04) +GOLD:random,(40,03) +OBJECT:'*',random,(40,03) +OBJECT:'*',random,(40,03) +GOLD:random,(41,03) +OBJECT:'*',random,(41,03) +OBJECT:'*',random,(41,03) +GOLD:random,(42,03) +OBJECT:'*',random,(42,03) +OBJECT:'*',random,(42,03) +GOLD:random,(40,04) +OBJECT:'*',random,(40,04) +OBJECT:'*',random,(40,04) +GOLD:random,(41,04) +OBJECT:'*',random,(41,04) +OBJECT:'*',random,(41,04) +GOLD:random,(42,04) +OBJECT:'*',random,(42,04) +OBJECT:'*',random,(42,04) +MONSTER:'m',"giant mimic",(42,04) + +# Animate Gold +MONSTER:''',"gold golem",(43,07) +MONSTER:''',"gold golem",(45,06) +MONSTER:''',"gold golem",(47,04) +MONSTER:''',"gold golem",(47,12) + +# Exit chamber (and ref to old TV show - Saphire and Steel) +MONSTER:''',"sapphire golem",(44,12) +MONSTER:''',"steel golem",(43,12) +GOLD:random,(43,12) +GOLD:random,(44,12) +GOLD:random,(46,12) +GOLD:random,(47,12) + +# Barred Vault +MONSTER:''',"sapphire golem",(43,10) +MONSTER:''',"sapphire golem",(44,10) +MONSTER:''',"sapphire golem",(45,10) +GOLD:random,(43,10) +GOLD:random,(44,10) +GOLD:random,(45,10) +OBJECT:'*',"diamond",(43,10) +OBJECT:'*',"ruby",(43,10) +OBJECT:'*',"loadstone",(43,10) +OBJECT:'*',"emerald",(43,10) +OBJECT:'*',"sapphire",(43,10) +OBJECT:'*',"amethyst",(44,10) +OBJECT:'*',"jade",(44,10) +OBJECT:'*',"opal",(44,10) +OBJECT:'*',"luckstone",(44,10) +OBJECT:'*',"jacinth",(44,10) +OBJECT:'*',"aquamarine",(45,10) +OBJECT:'*',"fluorite",(45,10) +OBJECT:'*',"loadstone",(45,10) +OBJECT:'*',"jasper",(45,10) +OBJECT:'*',"citrine",(45,10) # -# The Sanctum Level +# Pleaseant Valley. # -MAZE:"sanctum", ' ' -FLAGS: noteleport,hardfloor +# Green hills, trees, sheep, nymphs and people. +# Oh, and some of Vlad's minions. +# +MAZE: "pvalley",' ' +FLAGS: hardfloor,phlegethon GEOMETRY:center,center MAP ----------------------------------------------------------------------------- -| -------------- | -| |............| ------- | -| -------............----- |.....| | -| |......................| --.....| --------- | -| ----......................---------|......---- |.......| | -| |........---------..........|......+.........| ------+---..| | -| ---........|.......|..........--S----|.........| |........|..| | -| |..........|.......|.............| |.........-------..---------- | -| |..........|.......|..........---- |..........|....|..|......| | -| |..........|.......|..........| --.......----+---S---S--..| | -| |..........---------..........| |.......|.............|..| | -| ---...........................| -----+-------S---------S--- | -| |...........................| |...| |......| |....|-- | -| ----.....................---- |...---....--- ---......| | -| |.....................| |..........| |.....---- | -| -------...........----- --...------- |.....| | -| |...........| |...| |.....| | -| ------------- ----- ------- | ----------------------------------------------------------------------------- + ----------------- + .... ...T..T. |...|...|...|...| .... + ...... T....T..T......T. .T....--.---.---.---.--. ##..{.. + ... .....T.......T......T............................T. ### ... + # . T....T..T.....T....T.......T.........T............. # + ## .T....T.....T...T..T........T...............T............ .. + # ....T.....T.....T......T...........T..............T........... + ....##. ....T......T...T..T....................T.............T.......|---| + .... .. T.. ...RRRRRRRRRRRRRR.....T......T.......................T.....| + ...... RRRRRRRRRRRRRRRRRRRRRRR.................T................|---| +RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR........................T..........| +RRRRRRRRRRRRRRRRRRR..........RRRRRRRRRRRRRR.R....T.......T.............|---| +RRRRRRRRRRRRRRR.................RRRRRRRRRR.R.R.R.R..................T......| + ---------------....................RRRR.R.R.R.RR.R.............T.....|---| + |.......|.....|........................R.R.RRRR.R.R.R....T...............| + |.......+.....+..........................R.R.R.R.R.RR................|---| + |.......|.....|----.......................R.R.R.R.R..T......T............| + |.......------|...|....................... RRRRRRRR ............T...|---| + |...\...S.....S...|. ........... RRRRRR ............ + ------------------- RRRR ENDMAP -REGION:(15,07,21,10),lit,"temple" -ALTAR:(18,08),noalign,sanctum -REGION:(41,06,48,11),unlit,"morgue",filled,true +# Randomize some monsters +RANDOM_MONSTERS:'V','S','E','H','M','O','R','T','&','Z' +# Regions +# Entry Caves +REGION:(01,01,06,03),unlit,"ordinary" +REGION:(01,07,04,08),unlit,"ordinary" +# The wild wood +REGION:(07,01,31,09),lit,"ordinary" +# North Eastern Fields +REGION:(32,02,70,18),lit,"ordinary" +# Fountain +REGION:(66,01,74,05),unlit,"ordinary" +# South Western Fields +REGION:(01,10,32,18),lit,"ordinary" +# Northern huts +REGION:(40,01,42,01),unlit,"ordinary" +REGION:(44,01,46,01),unlit,"ordinary" +REGION:(48,01,50,01),unlit,"ordinary" +REGION:(52,01,54,01),unlit,"ordinary" +# Eastern Huts +REGION:(72,08,74,08),unlit,"ordinary" +REGION:(72,10,74,10),unlit,"ordinary" +REGION:(72,12,74,12),unlit,"ordinary" +REGION:(72,14,74,14),unlit,"ordinary" +REGION:(72,16,74,16),unlit,"ordinary" +# Tower +REGION:(11,14,15,16),unlit,"ordinary" +REGION:(03,14,09,17),unlit,"ordinary" +REGION:(11,18,15,18),unlit,"ordinary" +REGION:(17,17,19,18),unlit,"ordinary" +# Stairs and Branch +STAIR:(13,18),down +STAIR:(03,02),up +BRANCH:(18,17,18,17),(00,00,00,00) +# Doors +DOOR:locked,(16,15) +DOOR:locked,(10,15) +DOOR:locked,(10,18) +DOOR:locked,(16,18) +# Sea monsters for the river +MONSTER:';',random,(03,11) +MONSTER:';',random,(11,11) +MONSTER:';',random,(21,09) +MONSTER:';',random,(30,10) +MONSTER:';',random,(36,11) +MONSTER:';',random,(42,13) +MONSTER:';',random,(47,14) +MONSTER:';',random,(49,17) +# An assortment of nymphs +MONSTER:'n',random,(37,04) +MONSTER:'n',random,(42,07) +MONSTER:'n',random,(41,09) +MONSTER:'n',random,(47,13) +MONSTER:'n',random,(51,16) +MONSTER:'n',random,(31,06) +MONSTER:'n',random,(54,13) +MONSTER:'n',random,(31,07) +MONSTER:'n',random,(25,03) +MONSTER:'n',random,(20,02) +MONSTER:'n',random,(18,06) +MONSTER:'n',random,(13,04) +# A few people +MONSTER:'@',"healer",(41,01),peaceful +MONSTER:'@',"rogue",(46,01),peaceful +MONSTER:'@',"barbarian",(49,01),peaceful +MONSTER:'@',"ranger",(53,01),peaceful +MONSTER:'@',"wizard",(73,08),peaceful +MONSTER:'@',"samurai",(73,10),peaceful +MONSTER:'@',"knight",(73,14),peaceful +MONSTER:'@',"valkyrie",(73,16),peaceful +# A few sheep and and a couple of goats +MONSTER:'q',"sheep",(47,05),peaceful +MONSTER:'q',"lamb",(48,06),peaceful +MONSTER:'q',"sheep",(48,04),peaceful +MONSTER:'q',"sheep",(55,06),peaceful +MONSTER:'q',"lamb",(54,05),peaceful +MONSTER:'q',"sheep",(57,04),peaceful +MONSTER:'q',"sheep",(58,05),peaceful +MONSTER:'q',"sheep",(56,06),peaceful +MONSTER:'q',"lamb",(58,08),peaceful +MONSTER:'q',"goat",(60,17),peaceful +MONSTER:'q',"goat",(64,16),peaceful +MONSTER:'c',"chicken",(63,12),peaceful +MONSTER:'c',"chicken",(65,11),peaceful +MONSTER:'c',"chicken",(64,09),peaceful +# Watch Dogs +MONSTER:'d',"winter wolf",(12,14),asleep,hostile +MONSTER:'d',"winter wolf",(14,15),asleep,hostile +MONSTER:'d',"winter wolf",(12,16),asleep,hostile +MONSTER:'@',"werewolf",(11,15),asleep,hostile +# Monsters in the Throne Room +MONSTER:monster[0],random,(03,14),asleep +MONSTER:monster[1],random,(03,15),asleep +MONSTER:monster[2],random,(03,16),asleep +MONSTER:monster[3],random,(03,17),asleep +MONSTER:monster[4],random,(04,14),asleep +MONSTER:monster[5],random,(04,15),asleep +MONSTER:monster[6],random,(04,16),asleep +MONSTER:monster[7],random,(04,17),asleep +MONSTER:monster[8],random,(05,14),asleep +MONSTER:monster[9],random,(05,15),asleep +MONSTER:monster[0],random,(05,16),asleep +MONSTER:monster[1],random,(05,17),asleep +MONSTER:monster[2],random,(06,14),asleep +MONSTER:monster[3],random,(06,15),asleep +MONSTER:monster[4],random,(06,16),asleep +MONSTER:monster[5],random,(06,17),asleep +MONSTER:monster[6],random,(07,14),asleep +MONSTER:monster[7],random,(07,15),asleep +MONSTER:monster[8],random,(07,16),asleep +MONSTER:monster[9],random,(07,17),asleep +MONSTER:monster[0],random,(08,14),asleep +MONSTER:monster[1],random,(08,15),asleep +MONSTER:monster[2],random,(08,16),asleep +MONSTER:monster[3],random,(08,17),asleep +MONSTER:monster[4],random,(09,14),asleep +MONSTER:monster[5],random,(09,15),asleep +MONSTER:monster[6],random,(09,16),asleep +MONSTER:monster[7],random,(09,17),asleep +# Custodians +MONSTER:'L',"master lich",(06,18),asleep,hostile +OBJECT:'?',"demonology",(06,18) +OBJECT:'=',"free action",(06,18) +MONSTER:'V',"vampire lord",(04,18),asleep,hostile +OBJECT:'!',random,(04,18) +MONSTER:'V',"vampire lord",(08,18),asleep,hostile +OBJECT:'!',random,(08,18) +MONSTER:''',"iron golem",(14,18),asleep,hostile +MONSTER:''',"iron golem",(19,18),asleep,hostile +# Musicians (should only be present on Sundays) +MONSTER:'Y',"monkey",(15,02) +OBJECT:'(',"wooden harp",(15,02) +MONSTER:'Y',"monkey",(25,03) +OBJECT:'(',"bugle",(25,03) +MONSTER:'Y',"monkey",(19,06) +OBJECT:'(',"leather drum",(19,06) +MONSTER:'Y',"monkey",(29,04) +OBJECT:'(',"tooled horn",(15,02) +# Loot +OBJECT:'(',"chest",(15,18) +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +# Traps outside the door +TRAP:"spiked pit",(17,14) +TRAP:"spiked pit",(18,14) +TRAP:"spiked pit",(20,15) +TRAP:"magic",(21,14) +TRAP:"magic",(29,16) +TRAP:"magic",(19,12) +TRAP:"magic",(25,13) +TRAP:"magic",(33,15) +TRAP:"magic",(39,16) +TRAP:"magic",(27,17) +TRAP:"anti magic",(15,15) +TRAP:"pit",(26,03) +TRAP:"pit",(21,06) +TRAP:"pit",(30,05) +TRAP:"board",(19,03) + +# Cthulhu's Sanctum +# +# Cthulhu was the high priest of the old ones, the mediator +# between them and their arcane gods. For nethack, it seems +# reasonable to cast him as the great priest of Moloch, to whom +# the amulet has been entrusted for safe keeping. +# +MAZE: "sanctum",' ' +FLAGS: hardfloor,noteleport,nommap +GEOMETRY:center,center +MAP + ......... PP... ----- RRRRRRRRR---------RR + ....... ............... ...PPP.. |...|...RRRRRR..|.......|.R + ....PP...###S................ ...PP. . |...+...RRRRR...+.......+.R + ....... ........... ... . |...|..RRRRRRR..|.......|.R + ....... ... ----- . ----- -----RRRRRRRRR..---------RR + ........ ++ .. |...|-S--|...| |RRRRRRRRRR..RRRRRRRRRRR + ... .. ....... ...... .. |...|....|...| |RRRRRR..............RRR + .................. -S-++--|...|....|...| |RRRR...........-------- + PP... .PP. ... ... .... |......|-+----+---+------|RRR............|PP....| + P.....PPPP............... |..PP..+.................|R..............+......| + P.....PPPP............... |..PP..+.................|R..............+......| + PP... .PP. ... ... .... |......|S--+----+--+-----|RRR............|PP....| + .................. -S-++---.|...|....|..| |RRRR...........-------- + ... .. ....... ...... .. .|...|....|..| |RRRRRR..............RRR + ........ ++ .. .|...|----|..| |RRRRRRRRRR..RRRRRRRRRRR + ....... ... .----- ---------RRRRRRRRR..---------RR + ....... ........... ... . ... |...|..RRRRRRR..|.......|.R + ....PP...###S................ ... ..R.. |...+...RRRRR...+.......+.R + ....... ............... .. ... |...|...RRRRRR..|.......|.R + ......... ----- RRRRRRRRR---------RR +ENDMAP + +# Random Places for Cthulhu to be with the Amulet +RANDOM_PLACES:(04,09),(04,10),(03,02),(03,17),(34,02),(44,17),(16,02),(16,17) + # Non diggable walls -NON_DIGGABLE:(00,00,75,19) +#NON_DIGGABLE:(00,00,75,19) # Invisible barrier separating the left & right halves of the level -NON_PASSWALL:(37,00,39,19) +#NON_PASSWALL:(48,00,49,19) + +# Regions +# +# Temple interior +REGION:(00,00,52,19),unlit,"ordinary" + +# Outer landing +REGION:(53,00,75,19),lit,"ordinary" + +# Outside Chambers +REGION:(66,01,72,03),unlit,"ordinary" +REGION:(69,08,74,11),unlit,"ordinary" +REGION:(66,16,72,18),unlit,"ordinary" + +# Main Temple +ALTAR:(04,09),noalign,sanctum +ALTAR:(04,10),noalign,sanctum +REGION:(01,05,23,14),unlit,"temple" + +# Northern Temple (Inner) +ALTAR:(03,02),noalign,sanctum +REGION:(01,01,09,03),unlit,"temple" + +# Northern Temple (Outer) +ALTAR:(16,02),noalign,sanctum +REGION:(14,00,26,04),unlit,"temple" + +# Souther Temple (Inner) +ALTAR:(03,17),noalign,sanctum +REGION:(01,16,09,18),unlit,"temple" + +# Southern Temple (Outer) +ALTAR:(16,17),noalign,sanctum +REGION:(14,15,26,19),unlit,"temple" + +# North Eastern Temple +ALTAR:(36,01),noalign,sanctum +REGION:(33,00,39,02),unlit,"temple" + +# South Eastern Tample +ALTAR:(44,17),noalign,sanctum +REGION:(40,16,45,18),unlit,"temple" + +# Stairs and Branch +STAIR:(28,09,29,10),(00,00,00,00),up +BRANCH:(73,09,74,10),(00,00,00,00) + +# Drawbridges +DRAWBRIDGE:(53,09),west,closed +DRAWBRIDGE:(53,10),west,closed + # Doors -DOOR:closed,(40,06) -DOOR:locked,(62,06) -DOOR:closed,(46,12) -DOOR:closed,(53,10) -# Surround the temple with fire -TRAP:"fire",(13,05) -TRAP:"fire",(14,05) -TRAP:"fire",(15,05) -TRAP:"fire",(16,05) -TRAP:"fire",(17,05) -TRAP:"fire",(18,05) -TRAP:"fire",(19,05) -TRAP:"fire",(20,05) -TRAP:"fire",(21,05) -TRAP:"fire",(22,05) -TRAP:"fire",(23,05) -TRAP:"fire",(13,12) -TRAP:"fire",(14,12) -TRAP:"fire",(15,12) -TRAP:"fire",(16,12) -TRAP:"fire",(17,12) -TRAP:"fire",(18,12) -TRAP:"fire",(19,12) -TRAP:"fire",(20,12) -TRAP:"fire",(21,12) -TRAP:"fire",(22,12) -TRAP:"fire",(23,12) -TRAP:"fire",(13,06) -TRAP:"fire",(13,07) -TRAP:"fire",(13,08) -TRAP:"fire",(13,09) -TRAP:"fire",(13,10) -TRAP:"fire",(13,11) -TRAP:"fire",(23,06) -TRAP:"fire",(23,07) -TRAP:"fire",(23,08) -TRAP:"fire",(23,09) -TRAP:"fire",(23,10) -TRAP:"fire",(23,11) -# Some traps. -TRAP:"spiked pit", random -TRAP:"fire", random -TRAP:"sleep gas", random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random -# Some random objects -OBJECT:'[',random,random +DOOR:closed,(68,09) +DOOR:closed,(68,10) +DOOR:locked,(65,02) +DOOR:locked,(73,02) +DOOR:locked,(65,17) +DOOR:locked,(73,17) +DOOR:closed,(53,02) +DOOR:closed,(53,17) +DOOR:closed,(36,08) +DOOR:closed,(41,08) +DOOR:closed,(45,08) +DOOR:closed,(38,11) +DOOR:closed,(43,11) +DOOR:closed,(46,11) +DOOR:locked,(35,11) +DOOR:locked,(40,05) +DOOR:locked,(34,09) +DOOR:locked,(34,10) +DOOR:locked,(16,05) +DOOR:locked,(17,05) +DOOR:locked,(16,14) +DOOR:locked,(17,14) +DOOR:locked,(30,07) +DOOR:locked,(31,07) +DOOR:locked,(30,12) +DOOR:locked,(31,12) +DOOR:locked,(13,02) +DOOR:locked,(13,17) +DOOR:locked,(28,07) +DOOR:locked,(28,12) + +# Sea monsters for the river +MONSTER:';',random,(59,01) +MONSTER:';',random,(57,04) +MONSTER:';',random,(54,07) +MONSTER:';',random,(54,13) +MONSTER:';',random,(58,15) +MONSTER:';',random,(60,18) +MONSTER:';',random,(70,05) +MONSTER:';',random,(72,14) + +# Platform Guardians +MONSTER:'L',"master lich",(52,02),asleep,hostile +OBJECT:'/',"lightning",(52,02) +OBJECT:'(',"chest",(51,02) +MONSTER:'B',"nightgaunt",(56,01),asleep,hostile + +MONSTER:'L',"master lich",(52,17),asleep,hostile +OBJECT:'/',"lightning",(52,17) +OBJECT:'(',"chest",(51,17) +MONSTER:'B',"nightgaunt",(56,18),asleep,hostile + +# Landing Guards +MONSTER:'h',"deepest one",(56,08),asleep,hostile +OBJECT:'!',random,(56,08) +MONSTER:'h',"deepest one",(61,08),asleep,hostile +OBJECT:'/',random,(61,08) +MONSTER:'h',"deepest one",(56,11),asleep,hostile +OBJECT:'!',random,(56,11) +MONSTER:'h',"deepest one",(61,13),asleep,hostile +OBJECT:'/',random,(61,13) + +# Northern barracks +MONSTER:'h',"deeper one",(67,01),asleep,hostile +OBJECT:'(',"chest",(68,01) +MONSTER:'h',"deeper one",(69,01),asleep,hostile +OBJECT:'(',"chest",(70,01) +MONSTER:'h',"deeper one",(71,01),asleep,hostile +MONSTER:'h',"deeper one",(67,03),asleep,hostile +OBJECT:'(',"chest",(68,03) +MONSTER:'h',"deeper one",(69,03),asleep,hostile +OBJECT:'(',"chest",(70,03) +MONSTER:'h',"deeper one",(71,03),asleep,hostile + +# Southern barracks +MONSTER:'h',"deeper one",(67,16),asleep,hostile +OBJECT:'(',"chest",(68,16) +MONSTER:'h',"deeper one",(69,16),asleep,hostile +OBJECT:'(',"chest",(70,16) +MONSTER:'h',"deeper one",(71,16),asleep,hostile +MONSTER:'h',"deeper one",(67,18),asleep,hostile +OBJECT:'(',"chest",(68,18) +MONSTER:'h',"deeper one",(69,18),asleep,hostile +OBJECT:'(',"chest",(70,18) +MONSTER:'h',"deeper one",(71,18),asleep,hostile + +# Traps on the landing +TRAP:"board",(65,08) +TRAP:"board",(65,11) +TRAP:"board",(61,08) +TRAP:"board",(61,11) +TRAP:"board",(58,08) +TRAP:"board",(58,11) +TRAP:"board",(63,02) +TRAP:"board",(63,17) +TRAP:"board",(55,02) +TRAP:"board",(55,17) + +# Guardians one the inner temples +MONSTER:'h',"mind flayer",(47,09),asleep,hostile +OBJECT:'/',"striking",(47,09) +MONSTER:'h',"mind flayer",(49,10),asleep,hostile +OBJECT:'/',"striking",(49,10) + +# Priests, in the chambers before the temple +MONSTER:'@',"aligned priest",(35,06),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(37,06),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(39,06),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(42,06),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(44,05),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(46,05),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(37,13),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(39,12),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(41,12),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(44,13),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(46,12),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(47,13),noalign,asleep,hostile + +# Door bell for the inner temple +TRAP:"board",(35,09) +TRAP:"board",(35,10) + +# Guardians one the inner temples +MONSTER:'&',"marilith",(33,08),asleep,hostile +MONSTER:'&',"marilith",(33,11),asleep,hostile +MONSTER:'&',"marilith",(28,08),asleep,hostile +MONSTER:'&',"marilith",(28,08),asleep,hostile +MONSTER:';',"kraken",(29,09),asleep,hostile + +# Main Temple +TRAP:"fire",(15,06) +TRAP:"magic",(16,06) +TRAP:"fire",(17,06) +TRAP:"fire",(15,13) +TRAP:"magic",(16,13) +TRAP:"fire",(17,13) +MONSTER:';',"kraken",(09,10),asleep,hostile +MONSTER:'B',random,(05,07),asleep,hostile +MONSTER:'B',random,(05,10),asleep,hostile +MONSTER:'B',random,(08,14),asleep,hostile +MONSTER:'B',random,(10,08),asleep,hostile +MONSTER:'B',random,(13,06),asleep,hostile +MONSTER:'B',random,(14,09),asleep,hostile +MONSTER:'B',random,(15,12),asleep,hostile +MONSTER:'B',random,(18,10),asleep,hostile +MONSTER:'B',random,(21,08),asleep,hostile +OBJECT:'(',"chest",(02,09) +OBJECT:'(',"chest",(02,10) + +# Northern Temple (Outer) +TRAP:"fire",(25,01) +TRAP:"fire",(25,02) +TRAP:"magic",(26,01) +TRAP:"magic",(26,02) +TRAP:"fire",(27,01) +TRAP:"fire",(27,02) +MONSTER:'@',"aligned priest",(20,01),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(19,03),noalign,asleep,hostile +MONSTER:'@',"wererat",(19,03),noalign,asleep,hostile +OBJECT:'(',"chest",(14,02) + +# Northern Temple (Inner) +TRAP:"board",(09,02) +MONSTER:';',"kraken",(05,02),asleep,hostile +MONSTER:'P',"shoggoth",(04,02),asleep,hostile +OBJECT:'(',"chest",(01,02) + +# Southern Temple (Outer) +TRAP:"fire",(25,17) +TRAP:"fire",(25,18) +TRAP:"magic",(26,17) +TRAP:"magic",(26,18) +TRAP:"fire",(27,17) +TRAP:"fire",(27,18) +MONSTER:'@',"aligned priest",(20,16),noalign,asleep,hostile +MONSTER:'@',"aligned priest",(19,18),noalign,asleep,hostile +MONSTER:'@',"werewolf",(17,17),noalign,asleep,hostile +OBJECT:'(',"chest",(14,17) + +# Southern Temple (Inner) +TRAP:"board",(09,17) +MONSTER:';',"kraken",(05,17),asleep,hostile +MONSTER:'V',"star vampire",(04,17),asleep,hostile +OBJECT:'(',"chest",(01,17) + +# North Eastern Temple +TRAP:"board",(39,01) +MONSTER:';',"kraken",(36,01),asleep,hostile +MONSTER:''',"iron golem",(35,02),asleep,hostile +MONSTER:'P',"green slime",(38,02),asleep,hostile +OBJECT:'(',"chest",(33,01) + +# South Eastern Temple +TRAP:"board",(37,17) +MONSTER:';',"kraken",(43,17),asleep,hostile +MONSTER:'P',"shoggoth",(42,16),asleep,hostile +MONSTER:'P',"green slime",(42,18),asleep,hostile +OBJECT:'(',"chest",(45,17) + +# Cthulhu is in one of the temples (he is generated with the amulet) +MONSTER:'&',"Cthulhu",place[0],asleep,hostile + +# Northern Shuggoth Run +TRAP:"teleport",(28,06) +MONSTER:'P',"shoggoth",(27,06),asleep,hostile +MONSTER:'P',"shoggoth",(25,06),asleep,hostile +MONSTER:'P',"shoggoth",(23,06),asleep,hostile + +# Southern Shuggoth Run +TRAP:"teleport",(28,13) +MONSTER:'P',"shoggoth",(27,13),asleep,hostile +MONSTER:'P',"shoggoth",(25,13),asleep,hostile +MONSTER:'P',"shoggoth",(23,13),asleep,hostile + + + + +# +# The Gulf of N'Kai +# +# A dark, bare place haunted by Night gaunts, Byakhee, Demons +# and Gugs. A suitably dire place for the wizard to hide his +# tower. Beware of the shoggoths. +# +# Unlike most of the other gehennom levels, these are not +# hardfloor, allowing the player to fall through to deeper +# levels of the gulf. +# + +# +# An introductory level... +# +MAZE: "nkai-a-1",' ' +FLAGS: phlegethon +GEOMETRY:center,center +MAP + RRRR + .. ...... .... RRRR .......... ...... ...... .... . + .. ... ... .. .. ... ... ... RRR R ... . .. ... .. .. ... ... ..... ... + .... ... .. .. .. ... .. RR RR R.. ... ... ... .. .. ... + .. .. ... .. .. .. .R RR.R..R.. ... .. .. .. .. .. .. . + .... .. .. .. .. ..R..RR.RR.. .. .... .... ... .... .. + .. .... .. .. .... R..RRR.R .... ... ... .. .. .. .. .. .. + .. ... .. .. .... .. ..R ..RRR.R .... ... .... .... ... ... + .... .. ... .. ... .R. .RR.RR. .. .... .... .... .. .. .... + ..... .... .. .. ... ...R..RR...R... .. ... .. .... .. .. + .... .. ... .... .R.R.R.R.. ... .. . ... .. ... .. + .. ... ... .. .. . R RR.R.R .. ... .... .... .. .. + .. .. .. .. .. .. .. RR.R R .... ... .... .. .. .... ... + .... .. .. .... ... .... .RR R R ...... ... .. .... .... . .... + .... .. ... .. .... ..RR.R R R..... ... .. ... .. .... + .... ... ..... .......R.R.R.R.R... .. .... ... ... .. ... + .... .... ... ... .........R.R.R.R... ... ..... ..... ... + .... ... .... ...... ......R.R.RR.. .... ........ ... .. + ..... ..... ... ... R.RRR. ...... .... ....... + RRRR +ENDMAP +# Regions +# The whole gulf is dark and quiet +REGION:(01,01,75,19),unlit,"morgue",unfilled +# Stairs and Branch +STAIR:(03,08),down +STAIR:(73,14),up +BRANCH:(01,01,74,18),(00,00,00,00) +# Sea monsters for the river +MONSTER:';',random,(34,02) +MONSTER:';',random,(35,08) +MONSTER:';',random,(39,07) +MONSTER:';',random,(37,12) +MONSTER:';',random,(32,14) +MONSTER:';',random,(38,18) +# Some random flappy things +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +# Some not so random flappy things +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +# A few undead +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'W',random,random +MONSTER:'V',random,random +# A couple of slithy things +MONSTER:'P',random,random +MONSTER:'P',random,random +MONSTER:'P',"shoggoth",random +# Some random objects (no potions or food) +OBJECT:'?',random,random +OBJECT:'?',random,random +OBJECT:'+',random,random +OBJECT:'/',random,random +OBJECT:'(',random,random +OBJECT:'(',random,random +OBJECT:')',random,random +OBJECT:')',random,random OBJECT:'[',random,random OBJECT:'[',random,random OBJECT:'[',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +# A few traps +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"board",random +TRAP:"board",random +TRAP:"board",random +# + +# +# An alternate introductory level... +# +MAZE: "nkai-a-2",' ' +FLAGS: phlegethon +GEOMETRY:center,center +MAP + RRRR + ... ..... ... RR..RR .... ..... ..... ... + ... .... .. ... ... ....R.R..R.R ... .......... ... ..... + . ... ... .. ... ..R.R....R.R . ....... ....... .. .. + .... ..... .... .R.R.....R..R .... ... ....... .. + ... .... .. .. .. R..R....R...R. ... ...... .... .... + .. ..... .... .. .. R....R..R...R..... ..... ... ... . ... + .. .. .. .... R.R..R.R..R.R.. .... ........ .... . .. + .. .... ... .. ... .R....RRR..RRR... ... ........... ... . + .. .. .. .... ....R...R.RRRRR.RR ... .... ........ .. .. . + ... .. ... .. ... ...R.R...RRR...R .. .... ... .. ... .. + ... .... ... ..R..R...RRR...R ... .. ... .... ... + ..... .. ... .... RR...RRR...R.. .. .. .. .. .. .. + ... ... .. .. .. .R....RRR...R.. ... .... ... ... .. . + ... ... .... ... ......R....RRR.R. .. .. ... .... ... ... ... + ... ... ... .. ..... ...R....RRR. ... ..... .. .... + ... .... .. ... ...R..RRR. . . ..... .... .. + .... .... ... .... ... R..RRR... .... ... .. ........ ... + ... .... .... ..... .... RRR.R ... .... ... . ...... ... + RRRR +ENDMAP +# Regions +# The whole gulf is dark and quiet +REGION:(01,01,75,19),unlit,"morgue",unfilled +# Stairs and Branch +STAIR:(57,08),down +STAIR:(02,02),up +BRANCH:(01,01,74,18),(45,04,68,15) +# Sea monsters for the river +MONSTER:';',random,(33,02) +MONSTER:';',random,(36,08) +MONSTER:';',random,(39,07) +MONSTER:';',random,(37,12) +MONSTER:';',random,(31,14) +MONSTER:';',random,(37,17) +# Some random flappy things +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +# Some not so random flappy things +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +# A few undead +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'W',random,random +MONSTER:'V',random,random +# A couple of slithy things +MONSTER:'P',random,random +MONSTER:'P',random,random +MONSTER:'P',"shoggoth",random +# Some random objects (no potions or food) +OBJECT:'?',random,random +OBJECT:'?',random,random +OBJECT:'+',random,random +OBJECT:'/',random,random +OBJECT:'(',random,random +OBJECT:'(',random,random OBJECT:')',random,random OBJECT:')',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random OBJECT:'*',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +# A few traps +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"board",random +TRAP:"board",random +TRAP:"board",random +# + +# +# The level with the wizards fortress... +# +MAZE: "nkai-b",' ' +FLAGS: phlegethon +GEOMETRY:center,center +MAP + RRRR + .. .. . .. .... .... ....RRRR..... ... ....... .... + .. . ... . ......... ... .RRRR.R ..... .... .. .. . . . + .... .. . . .... R.RRRR.R .. .. ...... .. + ... ... ... ... R.RRR. R .... ... ... ... ... .. + . .... . ... .........R.R R.RRR ........ ... ... + .. ... .... . .... .....R R.R R...R... ... ... .. ... . + ...... .. ......... ... R R.R.....R. ..... .. .... .. ... + ... .... ........ ... .....RRR... R.. .. ...... .. ... . + .. ... ..... ... .......R.R R. R.R ...... ... .... ... .. + .. . .... ... . .. . R R.R.R R.R ... ... .. ..... ... + ... .. .. .. }} ..R...R.R.R R..... ... .. . ... ... + .... .. .... .}}}}} R.... R.R...R ... ..... .. .. ... . + .... .. . ... .}}---}} R R.. R.R...R. ... .. .. ... .. + .... .. ...... .}}}|.|}}}} R R R.R R.R. ....... .. ...... . + ... ... ... . }---.---}} R.R R.R ...... ..... .. .. + ...... .. .}|.....|}.. RR..RR ... .. .. ... .. .... + ... ....... .. }---.---}}.. ...RRRR ....... ... .. ...... .. . + . ... .. }|.S.|}}} .... RRRR .... .... ..... ... + }-----}} RRRR +ENDMAP +# Regions +# The whole gulf is dark and quiet +REGION:(01,01,75,19),unlit,"morgue",unfilled +# Stairs, Branches and the wizards portal +STAIR:(64,17),down +STAIR:(03,17),up +#BRANCH:(22,18,22,18),(00,00,00,00) +PORTAL:(22,18,22,18),(0,0,0,0),"wizard3" +# The wizard gets a drawbridge... +DRAWBRIDGE:(28,16),west,closed +# One secret door +DOOR:locked,(23,18) +# One sneaky trap +TRAP:"magic",(24,16) +# The Wizard has some guards +MONSTER:''',"iron golem",(22,16),hostile,asleep +MONSTER:'d',"hell hound",(24,14),hostile,asleep +MONSTER:'P',"green slime",(24,18),hostile,asleep +MONSTER:'Z',"skeleton",(26,16),hostile,asleep +# And a door bell... +TRAP:"board",(29,16) +# Sea monsters for the river +MONSTER:';',random,(35,02) +MONSTER:';',random,(35,08) +MONSTER:';',random,(42,07) +MONSTER:';',random,(39,12) +MONSTER:';',random,(31,12) +MONSTER:';',random,(38,17) +MONSTER:';',random,(27,18) +MONSTER:';',"kraken",(28,15) +MONSTER:';',random,(23,12) +# Some random flappy things +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +# Some not so random flappy things +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +# A few undead +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'W',random,random +MONSTER:'V',random,random +# A couple of slithy things +MONSTER:'P',random,random +MONSTER:'P',random,random +MONSTER:'P',"shoggoth",random +MONSTER:'P',"shoggoth",random +# A small tribe of ghouls +MONSTER:'Z',"gug",(43,16),hostile,asleep +MONSTER:'Z',"gug",(44,17),hostile,asleep +MONSTER:'Z',"gug",(45,18),hostile,asleep +MONSTER:'Z',"gug",(43,18),hostile,asleep +MONSTER:'Z',"gug",(45,16),hostile,asleep +# And some toys for them... +OBJECT:'/',"death",(43,16) +OBJECT:'?',"demonology",(44,17),cursed,0 +OBJECT:'?',"create monster",(45,18),cursed,0 +# Some random objects (no potions or food) OBJECT:'?',random,random OBJECT:'?',random,random +OBJECT:'+',random,random +OBJECT:'/',random,random +OBJECT:'(',random,random +OBJECT:'(',random,random +OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +# A few traps +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"magic",(31,17) +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"board",random +TRAP:"board",random +TRAP:"board",random +TRAP:"board",(47,17) +# + +# +# A third gulf level... +# +MAZE: "nkai-c",' ' +FLAGS: phlegethon +GEOMETRY:center,center +MAP + RRRR + ... ... ... RRRR .... . . ..... .... + ... ....... ... ... ...RRRR ....... . ... .. ....... + . .. ... .. ... .....RRRRRR .. .. ...... ... + .... ... . .... ..RRRRRRRRR ...... .... ... + . .. .. .... ... RRRRRRRRRRRR.. .. .. ... .. ... .. + . .. .. .... RRRRRRRRRRRRR... .. ... .. ...... .. .. + .. ... .. RRRRRRR.RRRRRRRR... ..... .. . .... + ... .. .. .RRRRRRRR-.--RRRRR .... .. .. ... + .. .. ..... .......RRRRRR......RRRRRRR. .... ... ... .. + .. .... .. .. . RRRRRRR.|...|RRRRRRR... .... .... .. .. + .. .. .. .. ... RRRRRRR--...RRRRRR.. .. .... ... .. + .. .. .... . RRRRRR...RRRRRRR. .. .... .. ... .. + ...... ... .. ... RRRRRR.RRRRRRR ..... ... .. .. + H .. .. .. .. .. RRRRRRRRRRR. .... .. ... ...... + .. .... .. .. .... RRRRRRRR.... .... ... ..... + .... .. .... .. .. .RRRRRR. ... ...... . ... ...... + ...... .... .. .. .. ....RRRRR. ... ... ... ... .. ...... + .... .... ..... ..RRRR. .... .... .. .... + RRRR +ENDMAP +# Regions +# The whole gulf is dark and quiet +REGION:(01,01,75,19),unlit,"morgue",unfilled +# Stairs and Branch +STAIR:(05,17),down +STAIR:(72,02),up +BRANCH:(01,01,74,18),(30,06,40,14) +# Sea monsters for the river +MONSTER:';',random,(35,02) +MONSTER:';',random,(35,08) +MONSTER:';',random,(42,09) +MONSTER:';',random,(39,12) +MONSTER:';',random,(31,12) +MONSTER:';',random,(38,17) +# Some random flappy things +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +# Some not so random flappy things +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +# A few undead +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'W',random,random +MONSTER:'V',random,random +# A couple of slithy things +MONSTER:'P',random,random +MONSTER:'P',random,random +MONSTER:'P',"shoggoth",random +MONSTER:'P',"shoggoth",random +MONSTER:'P',"shoggoth",random +# Something on the island +MONSTER:'D',"black dragon",(35,09),hostile,asleep +MONSTER:'D',"black dragon",(34,10),hostile,asleep +MONSTER:'D',"black dragon",(36,11),hostile,asleep +MONSTER:'D',"baby black dragon",(34,09),hostile,asleep +MONSTER:'D',"baby black dragon",(35,10),hostile,asleep +MONSTER:'D',"baby black dragon",(36,10),hostile,asleep +MONSTER:'D',"baby black dragon",(37,09),hostile,asleep +# Being black dragon, there's not much loot +GOLD:random,(35,09) +GOLD:random,(34,10) +GOLD:random,(36,10) +# One little door bell +TRAP:"board",(36,09) +# Fungi on the beaches +MONSTER:'F',"shrieker",(30,03) +MONSTER:'F',"shrieker",(25,09) +MONSTER:'F',"shrieker",(32,17) +MONSTER:'F',"shrieker",(43,06) +MONSTER:'F',"shrieker",(45,11) +MONSTER:'F',"shrieker",(41,15) +# Some random objects (no potions or food) OBJECT:'?',random,random OBJECT:'?',random,random -# Some monsters. -MONSTER:'&',"horned devil",(14,12),hostile -MONSTER:'&',"barbed devil",(18,08),hostile -MONSTER:'&',"erinys",(10,04),hostile -MONSTER:'&',"marilith",(15,04),hostile -MONSTER:'&',"nalfeshnee",(27,08),hostile -# Moloch's horde -MONSTER:'@',"aligned priest",(20,03),noalign,hostile -MONSTER:'@',"aligned priest",(15,04),noalign,hostile -MONSTER:'@',"aligned priest",(11,05),noalign,hostile -MONSTER:'@',"aligned priest",(11,07),noalign,hostile -MONSTER:'@',"aligned priest",(11,09),noalign,hostile -MONSTER:'@',"aligned priest",(11,12),noalign,hostile -MONSTER:'@',"aligned priest",(15,13),noalign,hostile -MONSTER:'@',"aligned priest",(17,13),noalign,hostile -MONSTER:'@',"aligned priest",(21,13),noalign,hostile -# A few nasties -MONSTER:'L',random,random -MONSTER:'L',random,random -MONSTER:'V',random,random -MONSTER:'V',random,random +OBJECT:'+',random,random +OBJECT:'/',random,random +OBJECT:'(',random,random +OBJECT:'(',random,random +OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +# A few traps +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"board",random +TRAP:"board",random +TRAP:"board",random + +# +# +# The bottom of the gulf (so look for the vibrating square)... +# +# This level is hardfloor, as it's over the sanctum. Players need to +# be able to dig on this level, as the vibrating square might be hidden +# somewhere inaccessible (without dropping a lot of their kit). +# +MAZE: "nkai-z",' ' +FLAGS: hardfloor,phlegethon +GEOMETRY:center,center +MAP + RRRR + .... ... ........ .... RRR RR . ..... ....... + .. . ...... ... .. RR RR RR . ........ .... .. + ...... .... .. ...RR R..R.RR. . .... ... ... .... + R .... ...... .R.RR.RR.RR.R. ......R... . ..... + ..RR.. ......R.R..R..R. R.R. .......RR... ... ... + .. .RRR.... .. .RR..R R.RR.R R R... .......RRR ..R ...... + ... .RRRRR... ..RRRR...R..R.RR..R R RR.....RRRRR ..RRRR . + ... ..RRRRRR. RR..R..RR.R. R. RRRRR ..RR .... + .. .. ..RRR. ...RR .R RR... R. . RR. ...R..... + .. ...RR. .RR..RRR .R RR .RRR... ...R... .. .... + ... ..R.. ..RR. R. RRRR .R.R ... .R .R .... ...... + .. ... ..R.. . R R. RRRRRR ..R.. . RR. ..... ...... + . ... ..R.. . R. RRRRRR .R.R .... .R .. .. + . .... .... ... R. .RRRRRR . .R .... .R ..... + .. .. .. ..... . RRRR. .. . .....RR...... + ... .. .. .. ..... . ..... . .... .........RRRR...... + ..... ...... .... .... ..... ... .... ....... ....RRR...... + .... ... ... ...... .... ...... ....... + +ENDMAP +# Regions +# The whole gulf is dark and quiet +REGION:(01,01,75,19),unlit,"morgue",unfilled +# Stairs and Branch +STAIR:(17,01),up +#BRANCH:(01,01,74,18),(00,00,00,00) +# Sea monsters for the river +MONSTER:';',random,(34,02) +MONSTER:';',random,(35,08) +MONSTER:';',random,(40,07) +MONSTER:';',random,(34,12) +MONSTER:';',random,(33,14) +MONSTER:';',random,(23,07) +# Some random flappy things +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +# Some not so random flappy things +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"nightgaunt",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +MONSTER:'B',"byakhee",random +# A few undead +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',"gug",random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'W',random,random MONSTER:'V',random,random -STAIR:(63,15),up +# A couple of slithy things +MONSTER:'P',random,random +MONSTER:'P',random,random +MONSTER:'P',"shoggoth",random +MONSTER:'P',"shoggoth",random +MONSTER:'P',"shoggoth",random +MONSTER:'P',"giant shoggoth",random +# Some random objects (no potions or food) +OBJECT:'?',random,random +OBJECT:'?',random,random +OBJECT:'+',random,random +OBJECT:'/',random,random +OBJECT:'(',random,random +OBJECT:'(',random,random +OBJECT:')',random,random +OBJECT:')',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'[',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +OBJECT:'*',random,random +# A few traps +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"anti magic",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"board",random +TRAP:"board",random +TRAP:"board",random +# diff -Naurbd slashem-0.0.8E0/dat/lethe.des slashem-0.0.8E1/dat/lethe.des --- slashem-0.0.8E0/dat/lethe.des 1970-01-01 01:00:00.000000000 +0100 +++ slashem-0.0.8E1/dat/lethe.des 2006-05-15 12:08:59.000000000 +0100 @@ -0,0 +1,1627 @@ +# SCCS Id: @(#)Lethe.des 3.3 97/01/31 +# Copyright (c) 2000 by Michael Clarke +# NetHack may be freely redistributed. See license for details. +# +# The head of the river. +# +# The river starts at the top of the gorge with a big pool. +# There are a few interesting things hidden around the place. +# +MAZE: "leth-a-1",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + + ------- #######H...............##### ... .... + |.....| ## ....... ... #####....... ...... + |..{..+### ## # H H ....... ..... + |.....| ############# #########..... . ## .... ... + ---S--- # ...... ### # .... + # ........ RRRRRRRRRRRRR .... # ## ##.... + ........RRRRRRRRRRRRRRRRRRRRRRRT....# # # .. + #####H.....T.RRRRRRRRRRRRRRRRRRRRRRRRRRRR... ### # + # ...RRRRRRRRRR...........RRRRRRRRRRRRRR # ### + #### .RRRRRRRRRR.....T........RRRRRRRRRRRRR H # + # RRRRRRRRRRR......T...RRRRRRRRRRRRRRR... # + ..... RRRRRRRRRRRRRRRRRRRRRRRRRRRR ## RRRRR..... ..... + ....... RRRRRRRRRRRRRRRRRRRRRRRRRRR...#####..RRRRRR......T.... + ........RRR RRRRRRRRRRRRRRRRRRRRRRRR.... .RRRRRRRRRRRRRRRRR + .........R ..RRRRRR RRRRRRRT..... ..RRRRRRRRRRRRRRR + ....... ###..... ........T .... ..RRRRRRRRRRRRR + .....######## #### # ...... ...........T + ########### .....###H#........ + +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(04,02,08,04),lit,"ordinary" +REGION:(05,12,17,15),unlit,"ordinary" +REGION:(34,01,48,02),unlit,"ordinary" +REGION:(58,01,65,04),unlit,"ordinary" +REGION:(69,01,74,07),unlit,"ordinary" +REGION:(51,16,56,18),unlit,"ordinary" +# Stairs +STAIR:(72,02),down +# Doors +DOOR:locked,(09,03) +DOOR:locked,(06,05) +# Dragons +MONSTER:'D',"red dragon",(10,13),asleep +MONSTER:'D',"red dragon",(11,16),asleep +# The Dragons Hoard +OBJECT:'(',"chest",(05,14) +OBJECT:'%',"egg",(05,15) +OBJECT:'%',"egg",(06,14) +OBJECT:'%',"egg",(06,15) +OBJECT:'%',"egg",(06,16) +OBJECT:'%',"egg",(07,14) +OBJECT:'%',"egg",(07,15) +OBJECT:'/',random,(06,14) +OBJECT:'*',random,(06,14) +OBJECT:'*',random,(06,15) +OBJECT:'*',random,(06,15) +OBJECT:'*',random,(07,13) +OBJECT:'*',"luckstone",(05,15) +GOLD:random,(05,14) +GOLD:random,(05,15) +GOLD:random,(06,14) +GOLD:random,(06,15) +GOLD:random,(06,16) +GOLD:random,(07,13) +GOLD:random,(07,14) +GOLD:random,(07,15) +GOLD:random,(07,16) +GOLD:random,(08,15) +GOLD:random,(08,16) +TRAP:"board",(10,12) +# Sea monsters for the lake +MONSTER:';',random,(63,13) +MONSTER:';',random,(28,07) +MONSTER:';',random,(22,10) +MONSTER:';',random,(59,14) +MONSTER:';',random,(39,06) +MONSTER:';',random,(26,15) +MONSTER:';',"electric eel",(53,08) +MONSTER:';',"electric eel",(45,14) +MONSTER:';',random,(29,12) +MONSTER:';',random,(30,12) +MONSTER:';',random,(28,11) +MONSTER:';',random,(52,10) +MONSTER:';',random,(69,15) +# Gargoles living on the island +MONSTER:'g',"winged gargoyle",(35,10),asleep +MONSTER:'g',"winged gargoyle",(42,10),asleep +MONSTER[75%]:'g',"winged gargoyle",(38,09),asleep +MONSTER[50%]:'g',"winged gargoyle",(40,11),asleep +# And some (empty) decorations +CONTAINER:'`',"statue",(33,10) +CONTAINER:'`',"statue",(35,09) +CONTAINER:'`',"statue",(44,10) +CONTAINER:'`',"statue",(36,11) +# And even some treasure +CONTAINER:'(',"chest",(39,10) +OBJECT[25%]:'(',"magic lamp",contained,cursed,0 +OBJECT:'!',"oil",contained +# +# A few random flapping things +MONSTER:'B',"vampire bat",random +MONSTER:'B',"raven",random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER[50%]:'B',random,random +MONSTER[50%]:'B',random,random +# Random traps +TRAP:"rust",random +TRAP:"rust",random +TRAP:"rust",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:random,random +TRAP:random,random +TRAP:random,random +# Hidden in the corridor +OBJECT[50%]:'[',"leather armor",(47,04),blessed,+2 +OBJECT[50%]:'[',"leather armor",(47,04),cursed,-2 +# The fountain room +MONSTER:''',"clay golem",(04,03),asleep +MONSTER:''',"clay golem",(07,03),asleep +OBJECT:'?',"teleportation",(06,06),cursed,0 +OBJECT:'?',"amnesia",(06,06) +# Second dragon (note; this guy is awake) +MONSTER:'D',random,(55,18) +# Second dragons hoard +GOLD:random,(51,17) +GOLD:random,(52,17) +GOLD:random,(52,16) +GOLD:random,(53,16) +OBJECT:'/',random,(51,17) +OBJECT:'*',random,(51,17) +OBJECT:'*',random,(52,17) +OBJECT:'*',random,(52,16) +OBJECT:'*',random,(53,16) +OBJECT:'?',"enchant weapon",(52,16) +# Monsters in the dark +MONSTER:'t',"trapper",(62,03) +MONSTER:'t',"lurker above",(43,01) + +# +# Alternate river head - Vampires and Byakhee +# +MAZE: "leth-a-2",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + + ------- #######H...............##### ... .... + |.....| ## ....... ... #####....... ...... + |...R.+### ## # H H ....... ..... + |.....| ####H######## #########..... . ## .... ... + ---S--- # # ...... ### # .... + # ## ........ RRRRRRRRRRRRR .... # ## ##.... + H H ........RRRRRRRRRRRRRRRRRRRRRRRT....# # # .. + # #####H.....T.RRRRRRRRRRRRRRRRRRRRRRRRRRRR... ### # + # ...RRRRRRRRRR...........RRRRRRRRRRRRRR # ### + #### .RRRRRRRRRR.....T........RRRRRRRRRRRRR H # + # RRRRRRRRRRR......T...RRRRRRRRRRRRRRR... # + ..... RRRRRRRRRRRRRRRRRRRRRRRRRRRR ## RRRRR..... ..... + ....... RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...#####..RRRRRR......T.... + ........RRRRR RRRRRRRRRRRRRRRRRRRRRRRR.... .RRRRRRRRRRRRRRRRR + .........R ..RRRRRR RRRRRRRT..... ..RRRRRRRRRRRRRRR + ....... ##H..... ........T .... ..RRRRRRRRRRRRR + .....######## #### # ...... ...........T + ########### .....###H#........ + +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(04,02,08,04),lit,"ordinary" +REGION:(05,12,17,15),unlit,"ordinary" +REGION:(34,01,48,02),unlit,"ordinary" +REGION:(58,01,65,04),unlit,"ordinary" +REGION:(69,01,74,07),unlit,"ordinary" +REGION:(51,16,56,18),unlit,"ordinary" +# Stairs +STAIR:(72,02),down +# Doors +DOOR:locked,(09,03) +DOOR:locked,(06,05) +# Sea monsters for the lake +MONSTER:';',random,(63,13) +MONSTER:';',random,(28,07) +MONSTER:';',random,(22,10) +MONSTER:';',random,(59,14) +MONSTER:';',random,(39,06) +MONSTER:';',random,(26,15) +MONSTER:';',"electric eel",(53,08) +MONSTER:';',"electric eel",(45,14) +MONSTER:';',random,(29,12) +MONSTER:';',random,(30,12) +MONSTER:';',random,(28,11) +MONSTER:';',random,(52,10) +MONSTER:';',random,(69,15) +# 'Trices living on the island +MONSTER:'c',"cockatrice",(34,09) +MONSTER:'c',"pyrolisk",(42,10) +MONSTER:'c',random,(38,11) +MONSTER:'c',random,(39,09) +MONSTER:'c',random,(34,10) +MONSTER:'c',random,(43,10) +# And some (empty) decorations +CONTAINER:'`',"statue",(33,10) +CONTAINER:'`',"statue",(35,09) +CONTAINER:'`',"statue",(44,10) +CONTAINER:'`',"statue",(36,11) +# And even some treasure +CONTAINER:'(',"chest",(39,10) +OBJECT[50%]:'(',"magic lamp",contained,cursed,0 +OBJECT:'!',"oil",contained +# Byakhee in the big caves +MONSTER:'B',"byakhee",(09,14),hostile,asleep +MONSTER:'B',"byakhee",(12,15),hostile,asleep +MONSTER:'B',"byakhee",(09,16),hostile,asleep +MONSTER[60%]:'B',"byakhee",(11,12),hostile,asleep +MONSTER[30%]:'B',"byakhee",(14,14),hostile,asleep +# A little loot +OBJECT:'*',"luckstone",(05,15) +OBJECT:'*',random,(05,14) +OBJECT:'*',random,(07,13) +OBJECT:'*',random,(08,16) +OBJECT:random,random,(11,13) +OBJECT:random,random,(12,16) +OBJECT:random,random,(06,15) +OBJECT:random,random,(09,13) +# And a door bell +TRAP:"board",(12,10) +TRAP:"board",(17,17) +# A sweeper upper... +MONSTER:'j',"ochre jelly",(12,16) +MONSTER:'j',"ochre jelly",(08,12) +# A few random flapping things +MONSTER:'B',"vampire bat",random +MONSTER:'B',"raven",random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER[50%]:'B',random,random +MONSTER[50%]:'B',random,random +# Vampire the first +MONSTER:'V',"vampire",(62,03),asleep,hostile +OBJECT:'!',"speed",(62,03) +# Minions +MONSTER:'o',random,(62,04),asleep,hostile +MONSTER:'o',random,(62,02),asleep,hostile +MONSTER:'o',random,(61,03),asleep,hostile +MONSTER:'o',random,(63,03),asleep,hostile +# And his door bells +TRAP:"board",(62,05) +TRAP:"board",(56,02) +# Hidden in the corridor +OBJECT:'[',"leather armor",(47,04),cursed,-2 +# Zombie beyond +MONSTER:'Z',random,(46,01) +MONSTER:'Z',random,(44,01) +MONSTER:'Z',random,(42,01) +MONSTER:'Z',random,(40,01) +MONSTER:'Z',random,(38,01) +MONSTER:'Z',random,(36,01) +# The fountain room +MONSTER:'V',"vampire lord",(05,03),asleep,hostile +OBJECT:'?',"create monster",(06,06),cursed,0 +OBJECT:'!',"full healing",(06,06) +# Slaves +MONSTER:'V',"vampire",(06,03),asleep,hostile +MONSTER:'V',"vampire",(04,03),asleep,hostile +MONSTER:'V',"vampire",(05,02),asleep,hostile +MONSTER:'V',"vampire",(05,04),asleep,hostile +# Door bell +TRAP:"board",(10,03) +# Loot +OBJECT:'?',"teleportation",(06,06),cursed,0 +OBJECT:'?',"amnesia",(06,06) +OBJECT:'!',"sickness",(06,06) +# Real loot +OBJECT:'(',"chest",(06,08) +GOLD:random,(06,08) +# Stray Vampire +MONSTER:'V',"vampire lord",(53,17),asleep,hostile +OBJECT:'/',"fire",(53,17) +OBJECT:'/',"slow monster",(53,17) +# Guardians +MONSTER:'d',"warg",(54,17),asleep,hostile +MONSTER:'d',"warg",(52,18),asleep,hostile +MONSTER:'d',"winter wolf",(53,16),asleep,hostile +MONSTER:'d',"winter wolf",(52,17),asleep,hostile +# Loot +GOLD:random,(51,17) +GOLD:random,(52,16) +OBJECT:'*',random,(52,17) +OBJECT:'*',random,(53,16) +# Random traps +TRAP:"rust",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:random,random +TRAP:random,random +TRAP:random,random + +# +# The entry level for the Lethe branch. +# +# Upstream to the dragons lair, downstream to the castle. +# + +MAZE: "lethe-b",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + + ... ###....... .... .... + ..... ### ........... .......#### ... + .... ##### ...RRRRRRRRRRRRRR ....... ## ....H.... + ... ##H## .TRRRRRRRRRRRRRRRR ..... ## ..... ... + # # ### ..RRRRRRRRRRRRRRRRRR # # ... + #H#### # .RRRR .... RRRR ### .... #### + # ####..RRRR. .. RRRRR..# ...... # + # RRRR.. # RRRRR ........ .......# + . ..RRRRRRRRRRRR.. ..### ...RRRR ..... ....T.... + ....RRRRRRRRRRRR ... ##....TRRRR...### ..RRRRRRRRRRRRRR + ..TRRRRRRRRRRRR .....# .....RRRRR .R.RRRRRRRRRRRRR + ..RRRR .... ... .....RRRR RRR.RRRRRRRRRRRR + ..RRRR H # ...TRRRRRRRRRRRRRRRRR. +RRRRRRRRR ..... ### ##. ...RRRRRRRRRRRRRRR. ... +RRRRRRRR. ........... # # .... # . RRRRRRRRRRRRR. ..... +RRRRRRR. .............## ##..... # # ....T...... ...... + ..... ........... ......##### ### ...... # + ..... ... .... #### ....####H#### + +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(02,01,06,04),unlit,"ordinary" +REGION:(12,14,24,18),unlit,"ordinary" +REGION:(26,07,30,10),unlit,"ordinary" +REGION:(30,15,35,18),unlit,"ordinary" +REGION:(43,01,50,04),unlit,"ordinary" +REGION:(49,06,56,09),unlit,"ordinary" +REGION:(65,14,70,16),unlit,"ordinary" +REGION:(64,03,68,05),unlit,"ordinary" +REGION:(70,02,73,04),unlit,"ordinary" +# Arrival point +#BRANCH:(32,16,33,17),(0,0,0,0) +# Stairs +STAIR:(04,02),up +STAIR:(72,03),down +# Objects +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT[75%]:random,random,random +OBJECT[75%]:random,random,random +OBJECT[50%]:random,random,random +OBJECT[25%]:random,random,random +# Random traps +TRAP:"rust",random +TRAP:"rust",random +TRAP:"rust",random +TRAP:"rust",random +TRAP:random,random +TRAP:random,random +# Random monsters. +MONSTER:'h',"deep one",random +MONSTER:'h',"deep one",random +MONSTER:'h',"deep one",random +MONSTER[66%]:'h',"deep one",random +MONSTER[33%]:'h',"deep one",random +MONSTER:'h',"deeper one",random +MONSTER[50%]:'h',"deeper one",random +MONSTER:';',random,random +MONSTER:';',random,random +MONSTER:';',random,random +MONSTER:';',random,random +MONSTER:';',random,random +MONSTER[50%]:';',random,random +MONSTER:';',"electric eel",random +MONSTER:';',"electric eel",random +MONSTER[50%]:';',"electric eel",random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:'B',random,random +MONSTER:'B',random,random +# Entry chamber +MONSTER:'h',"deep one",(31,16) +MONSTER:'h',"deep one",(31,18) +MONSTER[50%]:'h',"deep one",(33,18) +# North gate +MONSTER:'h',"deep one",(28,12) +# Main chamber +MONSTER:'h',"deep one",(22,16) +MONSTER:'h',"deep one",(20,16) +MONSTER:'h',"deep one",(20,17) +MONSTER[50%]:'h',"deep one",(16,17) +MONSTER:'h',"deeper one",(18,16) +MONSTER[50%]:'h',"deeper one",(18,17) +OBJECT:'(',"chest",(14,18) +# A guard for the bridge +MONSTER:';',"electric eel",(62,13) +# Treasure cave +MONSTER:'T',random,(67,15),asleep +MONSTER:'T',random,(69,16),asleep +OBJECT:'(',"chest",(68,14) +# Hard to reach caves +OBJECT:'!',"water",(43,03),blessed,0 +OBJECT:'!',"gain ability",(49,08) +MONSTER:'p',"iron piercer",(47,03) +MONSTER:'p',random,(52,08) + +# +# The Ogre Stockade for the Lethe branch. +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "leth-c-1",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + R + .. ........RR|....... + ### ##.... ...........R|.......... ...... ....... + H #### ... ..T.........R|................#+#...........#+##....\.. + . ##... ..........RR|................#+#.....{.....#+##....\. + ... ... ...... R T....... ......... ....... + ... .. .... R RR ..... .... + .... ... TRRR RRR ##..## ###..... + ...## ... RRR R.. ### #### # ..... ### ....... + # ....... RT ... #### #### + .......#### ....... + ............ RR .... ....## ##...... .... ..... + ...TRRRRRRRRRRRRR .......... .......... + # + RRRRRRRRRRRRRRRRR ......... ................. + .... + RRRRRRRRRRRRRRRRRRR ...... #+.....T............. #### ..... +RRRRRRRRRRRR T... RRRR .. .......{.....T.....### ##...... +RRRRRRRRR .. H RRRR T.... ........T....... # ..... +RRRRRRRR ..... # RRRRRRRRRRRRRRRR ............. # .... + ......### RRRRRRRRRRRRRRRR + + + + + + ...#### + ... RRRRRRRRRRRRRRRR # # # # # # .... + RRRR +ENDMAP +# Initialize random monsters +RANDOM_MONSTERS:'D','H','q','c','T','R' +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(09,01,12,03),unlit,"ordinary" +REGION:(01,04,04,08),unlit,"ordinary" +REGION:(30,10,36,14),unlit,"ordinary" +REGION:(51,08,58,10),unlit,"ordinary" +REGION:(63,02,70,05),lit,"throne",unfilled +REGION:(67,07,73,10),lit,"temple" +ALTAR:(70,09),random,shrine +REGION:(68,12,73,16),unlit,"ordinary" +REGION:(59,17,62,18),unlit,"ordinary" +# Stairs +STAIR:(59,18),down +STAIR:(02,06),up +# Doors +DOOR:locked,(46,03) +DOOR:locked,(46,04) +DOOR:locked,(60,03) +DOOR:locked,(60,04) +DOOR:locked,(54,11) +DOOR:closed,(48,09) +DOOR:closed,(40,13) +DOOR:closed,(45,17) +DOOR:closed,(47,17) +DOOR:closed,(49,17) +DOOR:closed,(51,17) +DOOR:closed,(53,17) +DOOR:closed,(55,17) +DOOR:closed,(59,12) +# The drawbridge +DRAWBRIDGE:(27,03),east,closed +# Ogre Kings Throne Room +# The King +MONSTER:'O',"ogre king",(66,03) +# The Queen +MONSTER:'O',"ogre king",(66,04) +# An advisor +MONSTER:'O',"ogre mage",(65,04) +# The Guards +MONSTER:'O',"ogre",(65,02) +MONSTER:'O',"ogre",(67,02) +MONSTER:'O',"ogre",(65,04) +MONSTER:'O',"ogre",(67,04) +# A petitioner +MONSTER:'k',"kobold lord",(65,03) +# His treasure +OBJECT:'(',"chest",(70,02) +OBJECT:'(',"chest",(70,05) +# A few ogres +MONSTER:'O',"ogre mage",(39,05) +MONSTER:'O',"ogre",(45,12) +MONSTER:'O',"ogre",(54,14) +MONSTER:'O',"ogre",(54,09) +MONSTER[50%]:'O',"ogre",(70,14) +# Compound guards +MONSTER[50%]:'O',"ogre",(30,01) +MONSTER:'O',"ogre",(30,04) +MONSTER:'O',"ogre",(33,02) +MONSTER:'O',"ogre",(34,02) +OBJECT:'/',"striking",(34,02) +MONSTER:'O',"ogre",(48,03) +MONSTER:'O',"ogre",(48,04) +OBJECT:'/',"fire",(48,04) +# Temple guard +MONSTER:'O',"ogre",(56,09) +OBJECT:'/',"sleep",(56,09) +# A surprise for those being nosy +MONSTER:';',"electric eel",(25,08) +# Some doggies... +MONSTER:'d',random,(39,03) +MONSTER:'d',random,(43,12) +MONSTER:'d',random,(53,15) +MONSTER[50%]:'d',random,(50,11) +# ...and a nasty ratty +MONSTER:'@',"wererat",(61,17) +# Some random pets... +# In the compound +MONSTER:monster[0],random,(31,11) +MONSTER:monster[0],random,(33,13) +MONSTER[50%]:monster[0],random,(34,11) +# Hidden over the river +MONSTER:monster[1],random,(13,17) +MONSTER:monster[1],random,(14,15) +MONSTER:monster[1],random,(15,18) +OBJECT:'*',random,(13,17) +OBJECT:'!',random,(15,16) +OBJECT:'?',random,(14,15) +# Some things in the store room... +OBJECT:'%',random,(69,12) +OBJECT:'%',random,(70,12) +OBJECT:'%',random,(71,12) +OBJECT:'(',random,(72,12) +OBJECT:'%',random,(70,13) +OBJECT:')',random,(71,13) +OBJECT:'%',random,(72,13) +OBJECT:'%',random,(71,14) +OBJECT:'(',random,(72,14) +OBJECT:'%',random,(70,15) +OBJECT:'%',random,(71,15) +OBJECT:'%',random,(72,15) +OBJECT:'(',random,(69,16) +OBJECT:'%',random,(70,16) +OBJECT[50%]:'%',random,(71,16) +OBJECT[50%]:'[',random,(72,16) +MONSTER:'s',"cave spider",(71,14) +MONSTER:'s',"cave spider",(72,13) +MONSTER:'s',"cave spider",(70,16) +MONSTER:'s',"cave spider",(69,12) +MONSTER:'m',"giant mimic",(73,14),m_feature "staircase down" +# A little trap... +TRAP:"level teleport",(51,18) +TRAP:"spiked pit",(24,02) +TRAP:"spiked pit",(22,03) +TRAP:"spiked pit",(19,02) +# Fishes in the river... +MONSTER:';',"electric eel",(09,13) +MONSTER:';',random,(33,17) +MONSTER:';',random,(22,12) +MONSTER:';',random,(17,12) +# A few random monsters to finish things off +MONSTER:'O',"ogre",random +MONSTER:'O',"ogre",random +MONSTER:'O',"ogre",random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +# Essential tools (assume they have a wand of striking) +OBJECT:'?',"earth",(10,03),blessed,0 +# + +# +# The Undead Stockade for the Lethe branch. +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "leth-c-2",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + R + .. ........RR|....... + ##.... ...........R|.......... ...... ....... + H##### ... ..T.........R|................#+#...........#+##....\.. + . ..........RR|................#+#.....{.....#+##....\. + ... ...... R T....... ......... ....... + ... .... R ..... .... + .... ... TRRT ##..## ###..... + ...## ... RR ### #### # ..... ### ....... + # ....... RT #### #### + .......#### ....... + ............ RR ....## ##...... .... ..... + ...TRRRRRRRRRRRRR ....... .......... + # + RRRRRRRRRRRRRRRRR ....... ................. + .... + RRRRRRRRRRRRRRRRRRR ..... #+.....T............. #### ..... +RRRRRRRRRRRR T... RRRR .. .......{.....T.....### ##...... +RRRRRRRRR .. H RRRR T.... ........T....... # ..... +RRRRRRRR ..... # RRRRRRRRRRRRRRRR ............. # .... + ......### RRRRRRRRRRRRRRRR + + + + + + ...#### + ... RRRRRRRRRRRRRRRR # # # # # # .... + RRRR +ENDMAP +# Some random pets... +RANDOM_MONSTERS:'D','Z','M','c','T','R' +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(09,01,12,03),unlit,"ordinary" +REGION:(01,04,04,08),unlit,"ordinary" +REGION:(30,10,36,14),unlit,"ordinary" +REGION:(51,08,58,10),unlit,"ordinary" +REGION:(63,02,70,05),lit,"morgue",unfilled +REGION:(67,07,73,10),lit,"temple" +REGION:(68,12,73,16),unlit,"ordinary" +REGION:(59,17,62,18),unlit,"ordinary" +# Stairs +STAIR:(59,18),down +STAIR:(02,06),up +# Doors +DOOR:locked,(46,03) +DOOR:locked,(46,04) +DOOR:locked,(60,03) +DOOR:locked,(60,04) +DOOR:locked,(54,11) +DOOR:closed,(48,09) +DOOR:closed,(40,13) +DOOR:closed,(45,17) +DOOR:closed,(47,17) +DOOR:closed,(49,17) +DOOR:closed,(51,17) +DOOR:closed,(53,17) +DOOR:closed,(55,17) +DOOR:closed,(59,12) +# The drawbridge +DRAWBRIDGE:(27,03),east,closed +# Lich Kings Throne Room +# The King +MONSTER:'L',"master lich",(66,03) +OBJECT:'/',"death",(66,03) +# The Queen +MONSTER:'L',"lich",(66,04) +OBJECT:'/',"lightning",(66,04) +# The Guards +MONSTER:'M',"ettin mummy",(65,02) +MONSTER:'M',"ettin mummy",(67,02) +MONSTER:'M',"ettin mummy",(65,04) +MONSTER:'M',"ettin mummy",(67,04) +# A petitioner or two +MONSTER:'Z',"ghoul",(65,03) +MONSTER:'Z',"ghoul mage",(65,04) +# His treasure +OBJECT:'(',"chest",(70,02) +OBJECT:'(',"chest",(70,05) +# A few mummies +MONSTER:'M',"human mummy",(39,05) +MONSTER:'M',"human mummy",(45,12) +MONSTER:'M',"elf mummy",(54,14) +MONSTER:'M',"elf mummy",(54,09) +MONSTER:'M',"elf mummy",(70,14) +# Compound guards +MONSTER:'Z',"giant zombie",(30,01) +MONSTER:'Z',"giant zombie",(30,04) +MONSTER:'Z',"giant zombie",(33,02) +MONSTER:'Z',"giant zombie",(34,02) +MONSTER:'Z',"giant zombie",(48,03) +MONSTER:'Z',"giant zombie",(48,04) +# Temple guard +MONSTER:'Z',"skeleton",(56,09) +# A surprise for those being nosy +MONSTER:';',"electric eel",(25,08) +# Some doggies... +MONSTER:'d',"hell hound",(39,03) +MONSTER:'d',"hell hound",(43,12) +MONSTER:'d',"hell hound",(53,15) +MONSTER:'d',"hell hound",(50,11) +# ...and a nasty ratty +MONSTER:'@',"wererat",(61,17) +# In the compound +MONSTER:monster[0],random,(31,11) +MONSTER:monster[0],random,(33,13) +MONSTER:monster[0],random,(34,11) +# Hidden over the river +MONSTER:monster[1],random,(13,17) +MONSTER:monster[1],random,(14,15) +MONSTER:monster[1],random,(15,18) +OBJECT:'*',random,(13,17) +OBJECT:'!',random,(15,16) +OBJECT:'?',random,(14,15) +# Some things in the store room... +OBJECT:'%',random,(69,12) +OBJECT:'%',random,(70,12) +OBJECT:'%',random,(71,12) +OBJECT:'(',random,(72,12) +OBJECT:'%',random,(70,13) +OBJECT:')',random,(71,13) +OBJECT:'%',random,(72,13) +OBJECT:'%',random,(71,14) +OBJECT:'(',random,(72,14) +OBJECT:'%',random,(70,15) +OBJECT:'%',random,(71,15) +OBJECT:'%',random,(72,15) +OBJECT:'(',random,(69,16) +OBJECT:'%',random,(70,16) +OBJECT:'%',random,(71,16) +OBJECT:'[',random,(72,16) +MONSTER:'s',"cave spider",(71,14) +MONSTER:'s',"cave spider",(72,13) +MONSTER:'s',"cave spider",(70,16) +MONSTER:'s',"cave spider",(69,12) +MONSTER:'m',"giant mimic",(73,14) +# A little trap... +TRAP:"level teleport",(51,18) +TRAP:"spiked pit",(24,02) +TRAP:"spiked pit",(22,03) +TRAP:"spiked pit",(19,02) +# Fishes in the river... +MONSTER:';',"giant eel",(09,13) +MONSTER:';',"giant eel",(33,17) +MONSTER:';',"shark",(22,12) +MONSTER:';',"kraken",(17,12) +# A few random monsters to finish things off +MONSTER:'M',"human mummy",random +MONSTER:'M',"human mummy",random +MONSTER:'M',"elf mummy",random +MONSTER:'M',"elf mummy",random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +MONSTER:'Z',random,random +# Essential tools (assume they have a wand of striking) +OBJECT:'?',"earth",(10,03),blessed,+0 + +# +# The Wizards Manse +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "leth-d-1",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + ------------------------------------ RRRR ----- + |.............T...........T........| RRRR |...| + |TTTT..TTTTT..TTT..TTTTT..TTT..TT..| ..RRRR.. |...| + |......T...T...........T..T.....T..| ...RRRR... --+-- .. + |..TTTTTT..T..TTTTTTT..T.....{..T..|...RRRRRR...| ----- # .... + |..........T..T.....TTTT..T.....T..|..RRRRRRRR..| |...| # ##.... + |TTTT..TTTTT..TTTT..T..T..TTT..TT..+..RRRRRRRR..+##S...+#### # .... + |..........T........T.....T........|..RRRRRRRR..| |...| # .. + |.T..RR..T.-----------------------S|...RRRRRR...| ----- ## + |....RR....|.........|..|.|..|.....------------------- .... ## + |....RR....|.........|+--+--+|.....|..........|.|....| ..RRRRRR H + |.T..RR..T.|.........|.......|.....|........\...|....S#.RRRRRRRRRRR .. + |....RR....|.........|.......|.....|..........|.S....| .RRRRRRRRRRRR .... + |....RR....-----+--------+------+---..........-----+-- RRRRRRRRRRRRRRRRRRR + |.T..RR..T.+.......................+.........\..| |.| RRRRRRT.RRRRRRRRRR + |....RR....-----+--------+------+---..........-----+-- .......RRRRRRRR + |....RR....|.........|.......|.....|..........|.S....| # + |.T..RR..T.|.........|.......|.....|........\...|....S########### + |..........|.........|.......|.....|..........|.|....| + ------------------------------------------------------ +ENDMAP +# Dungeon Description +REGION:(02,01,35,07),lit,"ordinary" +REGION:(02,08,11,18),lit,"ordinary" +REGION:(37,01,48,08),lit,"ordinary" +REGION:(53,05,55,07),lit,"ordinary" +REGION:(59,01,61,02),lit,"ordinary" +REGION:(13,09,21,11),lit,"zoo" +REGION:(13,16,21,18),lit,"ordinary" +REGION:(23,11,29,12),unlit,"ordinary" +REGION:(23,09,24,09),unlit,"ordinary" +REGION:(26,09,26,09),unlit,"ordinary" +REGION:(28,09,29,09),unlit,"ordinary" +REGION:(23,16,29,18),lit,"ordinary" +REGION:(31,09,35,12),lit,"ordinary" +REGION:(31,16,35,18),lit,"ordinary" +REGION:(13,14,35,14),lit,"ordinary" +# Throne Room, in two parts +REGION:(38,10,45,13),lit,"throne" +REGION:(38,15,45,18),lit,"throne" +REGION:(48,10,48,12),lit,"ordinary" +REGION:(47,14,48,14),lit,"ordinary" +REGION:(48,16,48,18),lit,"ordinary" +REGION:(50,10,53,12),unlit,"ordinary" +REGION:(50,16,53,18),unlit,"ordinary" +REGION:(52,14,52,14),unlit,"ordinary" +REGION:(56,09,75,15),lit,"ordinary" +REGION:(71,03,74,07),unlit,"ordinary" +# Stairs +STAIR:(73,05),down +STAIR:(60,01),up +# Doors +DOOR:locked,(60,03) +DOOR:locked,(56,06) +DOOR:locked,(52,06) +DOOR:locked,(49,06) +DOOR:locked,(36,06) +DOOR:locked,(35,08) +DOOR:random,(12,14) +DOOR:random,(17,13) +DOOR:random,(17,15) +DOOR:random,(26,13) +DOOR:random,(26,15) +DOOR:random,(23,10) +DOOR:random,(26,10) +DOOR:random,(29,10) +DOOR:locked,(33,13) +DOOR:random,(33,15) +DOOR:locked,(36,14) +DOOR:locked,(49,16) +DOOR:locked,(49,12) +DOOR:locked,(54,11) +DOOR:locked,(54,17) +DOOR:random,(52,13) +DOOR:random,(52,15) +# Monsters in the garden +MONSTER:'a',"killer bee",(03,15) +MONSTER:'a',"killer bee",(04,15) +MONSTER:'a',"killer bee",(03,16) +MONSTER:'a',"killer bee",(04,16) +MONSTER:'u',random,(06,03) +MONSTER:'u',random,(18,07) +MONSTER:'u',random,(30,02) +MONSTER:'u',random,(26,07) +MONSTER:'C',random,(10,13) +MONSTER:'C',random,(10,15) +# Traps +TRAP:"polymorph",(35,09) +TRAP:"board",(35,14) +TRAP:"board",(35,14) +TRAP:"magic",(34,06) +TRAP:"magic",(53,17) +# Fishes in the river... +MONSTER:';',"giant eel",(42,02) +MONSTER:';',"giant eel",(44,06) +MONSTER:';',"shark",(41,07) +MONSTER:';',"giant eel",(59,12) +MONSTER:';',"electric eel",(66,12) +MONSTER:';',"kraken",(71,15) +# Treasure +OBJECT:'(',"chest",(24,09) +OBJECT:'(',"chest",(26,09) +OBJECT:'(',"chest",(28,09) +# Throne Room Extras +MONSTER:'h',"mind flayer",(45,11),asleep +OBJECT:'/',"lightning",(45,11) +OBJECT:'(',"chest",(48,12) +MONSTER:'h',"master mind flayer",(46,14),asleep +OBJECT:'/',"cancellation",(46,14) +TRAP[75%]:"magic",(47,14) +OBJECT:'(',"chest",(48,14) +MONSTER:'h',"mind flayer",(45,17),asleep +OBJECT:'/',"sleep",(45,17) +OBJECT:'(',"chest",(48,16) +# Decorations +CONTAINER:'`',"statue",(47,08) +CONTAINER:'`',"statue",(38,08) +CONTAINER:'`',"statue",(32,04) +CONTAINER:'`',"statue",(06,18) +CONTAINER:'`',"statue",(26,18) +# Monsters +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +# Objects +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +# Random traps +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random + + +# +# The Lichs Manse +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "leth-d-2",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + ------------------------------------ RRRR ----- + |..................................| RRRR |...| + |..................................| ..RRRR.. |...| + |..................................| ...RRRR... --+-- .. + |..................................|...RRRRRR...| ----- # .... + |..................................|..RRRRRRRR..| |...| # ##.... + |..................................+..RRRRRRRR..+##S...+#### # .... + |..................................|..RRRRRRRR..| |...| # .. + |..........-----------------------S|...RRRRRR...| ----- ## + |....RR....|.........|..|.|..|.....------------------- .... ## + |....RR....|.........|+--+--+|.....|..........|.|....| ..RRRRRR H + |....RR....|.........|.......|.....|........\...|....S#.RRRRRRRRRRR .. + |....RR....|.........|.......|.....|..........|.S....| .RRRRRRRRRRRR .... + |....RR....-----+--------+------+---..........-----+-- RRRRRRRRRRRRRRRRRRR + |....RR....+.......................+.........\..| |.| RRRRRR..RRRRRRRRRR + |....RR....-----+--------+------+---..........-----+-- .......RRRRRRRR + |....RR....|.........|.......|.....|..........|.S....| # + |....RR....|.........|.......|.....|........\...|....S########### + |..........|.........|.......|.....|..........|.|....| + ------------------------------------------------------ +ENDMAP +# Dungeon Description +REGION:(02,01,35,07),lit,"ordinary" +REGION:(03,02,10,06),lit,"fungusfarm" +REGION:(13,01,20,03),lit,"fungusfarm" +REGION:(13,05,20,07),lit,"fungusfarm" +REGION:(23,02,26,06),lit,"fungusfarm" +REGION:(29,01,32,02),lit,"fungusfarm" +REGION:(29,04,32,04),lit,"fungusfarm" +REGION:(29,06,32,07),lit,"fungusfarm" +REGION:(02,08,11,18),lit,"ordinary" +REGION:(37,01,48,08),lit,"ordinary" +REGION:(53,05,55,07),lit,"ordinary" +REGION:(59,01,61,02),lit,"ordinary" +REGION:(13,09,21,11),lit,"morgue" +REGION:(13,16,21,18),lit,"ordinary" +REGION:(23,11,29,12),unlit,"ordinary" +REGION:(23,09,24,09),unlit,"ordinary" +REGION:(26,09,26,09),unlit,"ordinary" +REGION:(28,09,29,09),unlit,"ordinary" +REGION:(23,16,29,18),lit,"ordinary" +REGION:(31,09,35,12),lit,"ordinary" +REGION:(31,16,35,18),lit,"ordinary" +REGION:(13,14,35,14),lit,"ordinary" +# Throne Room, in two parts +REGION:(38,10,45,13),lit,"morgue" +REGION:(38,15,45,18),lit,"morgue" +REGION:(48,10,48,12),lit,"ordinary" +REGION:(47,14,48,14),lit,"ordinary" +REGION:(48,16,48,18),lit,"ordinary" +REGION:(50,10,53,12),unlit,"ordinary" +REGION:(50,16,53,18),unlit,"ordinary" +REGION:(52,14,52,14),unlit,"ordinary" +REGION:(56,09,75,15),lit,"ordinary" +REGION:(71,03,74,07),unlit,"ordinary" +# Stairs +STAIR:(73,05),down +STAIR:(60,01),up +# Doors +DOOR:locked,(60,03) +DOOR:locked,(56,06) +DOOR:locked,(52,06) +DOOR:locked,(49,06) +DOOR:locked,(36,06) +DOOR:locked,(35,08) +DOOR:random,(12,14) +DOOR:random,(17,13) +DOOR:random,(17,15) +DOOR:random,(26,13) +DOOR:random,(26,15) +DOOR:random,(23,10) +DOOR:random,(26,10) +DOOR:random,(29,10) +DOOR:locked,(33,13) +DOOR:random,(33,15) +DOOR:locked,(36,14) +DOOR:locked,(49,16) +DOOR:locked,(49,12) +DOOR:locked,(54,11) +DOOR:locked,(54,17) +DOOR:random,(52,13) +DOOR:random,(52,15) +# Monsters in the garden +MONSTER:'a',"killer bee",(03,15) +MONSTER:'a',"killer bee",(04,15) +MONSTER:'a',"killer bee",(03,16) +MONSTER:'a',"killer bee",(04,16) +MONSTER:'M',"giant mummy",(10,13),asleep +MONSTER:'M',"giant mummy",(10,15),asleep +# Replacement 'trees' in the garden +MONSTER:'F',"shrieker",(03,11),asleep +MONSTER:'F',"shrieker",(10,11),asleep +MONSTER:'F',"shrieker",(03,14),asleep +MONSTER:'F',"shrieker",(10,14),asleep +MONSTER:'F',"shrieker",(03,17),asleep +MONSTER:'F',"shrieker",(10,17),asleep +# Traps +TRAP:"polymorph",(35,09) +TRAP:"board",(35,14) +TRAP:"board",(35,14) +TRAP:"magic",(34,06) +TRAP:"magic",(53,17) +# Fishes in the river... +MONSTER:';',"giant eel",(42,02) +MONSTER:';',"giant eel",(44,06) +MONSTER:';',"shark",(41,07) +MONSTER:';',"giant eel",(59,12) +MONSTER:';',"electric eel",(66,12) +MONSTER:';',"kraken",(71,15) +# One security guard +MONSTER:'D',"black dragon",(26,11),asleep +# Treasure +OBJECT:'(',"chest",(24,09) +OBJECT:'(',"chest",(26,09) +OBJECT:'(',"chest",(28,09) +# Throne Room Extras +MONSTER:'L',"lich",(45,11),asleep +OBJECT:'/',"lightning",(45,11) +OBJECT:'(',"chest",(48,12) +MONSTER:'L',"master lich",(46,14),asleep +OBJECT:'/',"cancellation",(46,14) +TRAP[75%]:"magic",(47,14) +OBJECT:'(',"chest",(48,14) +MONSTER:'&',"succubus",(46,13),asleep +MONSTER:'&',"succubus",(46,15),asleep +MONSTER:'L',"lich",(45,17),asleep +OBJECT:'/',"sleep",(45,17) +OBJECT:'(',"chest",(48,16) +# Decorations +CONTAINER:'`',"statue",(47,08) +CONTAINER:'`',"statue",(38,08) +CONTAINER:'`',"statue",(26,18) +# Monsters +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +# Objects +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +# Random traps +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random + +# +# Troll Bridge +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "lethe-e",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + TT###TT RRRR + ... -----###----- RRRR ......... + .... |...|###|...| RRRR ............. + ##.....### |....###....| RRRRR ..............#### + # .... # |....###....| RRRRRR ............ # ... + ... # ... # |...|###|...| RRRRRRR ........ ##... + .....## # -----###----- RRRRRRR. # .. + ... ### TT###TT RRRRRRRRRRR... ## ... + # T.###.T RRRRRRRRRRR.T # ## ....###.... + ......######....###... RRRRRRRRRR ## # ... # ... + ....... .. ### .. RRRRRRRT... #### # # ... + ......... ... ### ..RRRRRRR...# ## ###### ... + .......TRRRRRRRRRRR###RRRRRRRRRR ### ## ### ...... +RRRRRRRRRRR.T...RRRRRRRRRRRR###RRRRRRRRR # ## ..... ##......... +RRRRRRRRRRRRRRRRRRRRRRRRRRRR###RRRRRRRR ###### ....... ........ +RRRRRRRRRRRRRRRRRRRRRR.... ### T... ### H ...... + RRRRRRRRRRRRR ....###.... #### ........ #H.... + .....###.....##### ## ##..........H#### + ....###.... ##### ........ + ### +ENDMAP +# Dungeon Description +REGION:(00,00,51,19),lit,"ordinary" +REGION:(01,05,05,07),unlit,"ordinary" +REGION:(09,01,13,05),unlit,"ordinary" +REGION:(24,02,26,05),unlit,"ordinary" +REGION:(31,02,34,05),unlit,"ordinary" +REGION:(50,16,59,18),unlit,"ordinary" +REGION:(54,13,60,14),unlit,"ordinary" +REGION:(60,14,73,16),lit,"ordinary" +REGION:(53,01,66,05),lit,"ordinary" +REGION:(72,04,74,06),unlit,"ordinary" +REGION:(63,07,66,09),unlit,"ordinary" +REGION:(70,08,73,10),unlit,"ordinary" +# Stairs +STAIR:(73,04),down +STAIR:(03,07),up +# Trolls +MONSTER:'T',"troll",(24,02) +MONSTER:'T',"troll",(26,02) +MONSTER:'T',"troll",(24,05) +MONSTER:'T',"troll",(26,05) +MONSTER:'T',"troll",(32,02) +MONSTER:'T',"troll",(34,02) +MONSTER:'T',"troll",(32,05) +MONSTER:'T',"troll",(34,05) +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER:'T',random,random +MONSTER[50%]:'T',random,random +MONSTER[50%]:'T',random,random +MONSTER[50%]:'T',random,random +# Fishes in the river... +MONSTER:';',random,(04,14) +MONSTER:';',random,(16,15) +MONSTER:';',random,(25,13) +MONSTER:';',random,(35,13) +MONSTER:';',random,(41,09) +MONSTER:';',random,(47,06) +MONSTER[50%]:';',random,(50,01) +# Monsters +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER[50%]:random,random,random +MONSTER[50%]:random,random,random +MONSTER[50%]:random,random,random +# Objects +OBJECT:'!',"full healing",random +OBJECT:'!',"full healing",random +OBJECT:'!',"extra healing",random +OBJECT:'*',"diamond",random +OBJECT:'*',"diamond",random +OBJECT:'*',"diamond",random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +# Random traps +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP[50%]:random,random + +# +# Sylvan Park +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "lethe-f",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + --------- ------ + |.S.....| ......... ###### ......T......|....| + |.|.....|..............H### ####### ##### .......T.....T...+....| + -----+---......T....... ###..... ##.....T.............------ + ..................RRRRRRRRRRRRRRR ..R.. ..T........T....T.... + .................RRRRRRRRRRRRRRRRRRR ... ............T....RRRRRRR + .....T.....T....RRRRRRRRRRRRRRRRRRRRRR ### ....T.........RRRRRRRRR + ....T.........RRRRRRRR ...... RRRRRRRR # .......T...RRRRRRRRRRR + ............RRRRRRRR .. # RRRRRRRRR ##... ...T....RRRRRRRRRRRR + .......T..RRRRRRRR ## RRRRRRRRRR .... .....RRRRRRRRRR + ..T.....RRRRRRRRR. ###.RRR..RRRR.. .... T..RRRRRRRR + .......RRRRRRRRR. .RRR..RRRRR.. # ... RRRRRR ------- + # ....T.RRRRRR.. .RR.T.RRRRR... RRRRR |.....| + ## # ......RRRRR. ..RR..RRR.RRT.. RRRRR --------S--- + ## # RRRR.. ### RR.RRRR..RRRRR.R RRRRR |...{....| + # #H## .... RRRR.##### H ## .R.RRR.R.RRRRR.RRRRR |..{.{...| + ....H# ##..... RRRR. .. . ###..R.R.RRR.RRRRR.RR..####+...{....| + ..... .... RRRR ...... ..R. TRRR.RRRRR.. ---------- + ..... ... RRRR ..... + RRRR +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(02,01,02,02),lit,"ordinary" +REGION:(04,01,08,02),lit,"temple" +ALTAR:(06,01),random,shrine +REGION:(02,16,07,18),unlit,"ordinary" +REGION:(14,15,18,18),unlit,"ordinary" +REGION:(28,16,33,18),unlit,"ordinary" +REGION:(41,03,45,05),unlit,"ordinary" +REGION:(48,08,53,11),unlit,"ordinary" +REGION:(71,01,74,02),lit,"ordinary" +REGION:(64,14,71,16),lit,"ordinary" +REGION:(69,12,73,12),lit,"ordinary" +# Stairs +STAIR:(73,01),down +STAIR:(30,17),up +# Doors +DOOR:closed,(06,03) +DOOR:locked,(03,01) +DOOR:closed,(70,02) +DOOR:locked,(63,16) +DOOR:closed,(71,13) +# Centaurs in the west +MONSTER:'C',random,(13,03) +MONSTER:'C',random,(09,06) +MONSTER:'C',random,(06,09) +MONSTER:'C',random,(13,12) +MONSTER[66%]:'C',random,(22,03) +MONSTER[33%]:'C',random,(02,07) +# Chief Centaur and hareem +MONSTER:'C',"mountain centaur",(16,16) +OBJECT:'(',"chest",(18,15) +OBJECT:')',"bow",(16,16),blessed,+2 +MONSTER:'C',"mountain centaur",(04,17) +MONSTER:'C',"mountain centaur",(05,18) +OBJECT:'(',"chest",(03,18) +# Elves in the east +MONSTER:'@',"Green-elf",(58,03) +MONSTER:'@',"Green-elf",(64,02) +MONSTER:'@',"Green-elf",(65,04) +MONSTER:'@',"Green-elf",(61,05) +MONSTER[50%]:'@',"Green-elf",(61,01) +MONSTER:'@',"Woodland-elf",(55,04) +MONSTER:'@',"Woodland-elf",(53,05) +MONSTER:'@',"Woodland-elf",(56,06) +MONSTER:'@',"Woodland-elf",(57,08) +MONSTER[50%]:'@',"Woodland-elf",(59,10) +# Nymphs in the middle! +MONSTER[50%]:'n',random,(39,10) +MONSTER[50%]:'n',random,(48,13) +MONSTER[50%]:'n',random,(48,16) +MONSTER[50%]:'n',random,(44,16) +MONSTER[50%]:'n',random,(40,14) +MONSTER[50%]:'n',random,(41,17) +MONSTER[50%]:'n',random,(34,10) +MONSTER[50%]:'n',random,(48,12) +MONSTER[50%]:'n',random,(54,16) +MONSTER[50%]:'n',random,(45,10) +# A couple of trolls guarding the door +MONSTER:'T',"troll",(30,16) +MONSTER:'T',"troll",(30,17) +# A monster in the middle darkness... +MONSTER:';',"kraken",(43,04) +MONSTER:'p',random,(49,09) +MONSTER:'p',random,(41,10) +# A couple of extra random monsters... +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER[50%]:random,random,random +# A few statues +CONTAINER:'`',"statue",(05,04),"mountain nymph",1 +CONTAINER:'`',"statue",(07,04),"mountain nymph",1 +CONTAINER:'`',"statue",(69,01),"Death",1 +OBJECT:'/',"death",contained +CONTAINER:'`',"statue",(67,15),"Poseidon",1 +OBJECT:'"',"amulet of magical breathing",contained +OBJECT:'`',"statue",(38,10) +# Deep one servitors for the temple of Poseidon +MONSTER:'h',"deep one",(65,14),asleep +MONSTER[50%]:'h',"deep one",(65,16),asleep +MONSTER:'h',"deeper one",(70,15),asleep +OBJECT:'(',"chest",(69,12) +OBJECT:'(',"chest",(73,12) +OBJECT:'?',"demonology",(70,15),cursed,0 +# A stray amulet +OBJECT:'"',random,(26,08) +# A few random traps +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP:random,random +TRAP[50%]:random,random +# Fishes in the river... +MONSTER:';',random,(23,15) +MONSTER:';',random,(19,11) +MONSTER:';',random,(16,09) +MONSTER:';',random,(21,06) +MONSTER:';',random,(28,05) +MONSTER:';',random,(34,06) +MONSTER:';',"electric eel",(38,08) +MONSTER:';',random,(43,12) +MONSTER:';',random,(50,15) +MONSTER[50%]:';',random,(58,14) +MONSTER[50%]:';',random,(65,09) +MONSTER[50%]:';',random,(72,06) +# A few random objects +OBJECT:'!',random,random +OBJECT:'!',random,random +OBJECT:'!',random,random +OBJECT:'/',random,random +OBJECT:'*',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:'%',random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random + +# +# Honycombe Canyon +# +# Upstream to the entry level, downstream to the castle. +# + +MAZE: "lethe-g",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + --------- --- --- --- --- --- --- --- ------ + |.......|----.-------R--------.--------.------.------.------.-------|....| + |.......+...........RRRRRRRR........................................+....| + |.......|----.-------RR-------.--------.------.------.------.-------|....| + --------- -S- -RRR --- --- -S- --- --- ------ + # ...RRRRRRRR H RRR + ...RRRRRRRRRRRRR ### ....... RRRRRR... + ..RRRRRRRRRRRRRRRR. H ######.......... ..RRRRRRRRR.. + RR.RRRRRRRRRRRRRRRR.... .........H##### ..RRRRRRRRRRRR + RRRRRR.R... RRRRRRRR.... ...... ...RRRRRRRRRRRRRR + RRRRRRRRR.... ..RRRRR.R... # ..RRRRRRRRRRRRRRRR + RRRRRRRRRRR H ...RR.RRRRR H RR.RRRRRRRRRRRRRRR +RRRRRRRRRRR #### ....RRRRRRRRRRR ...... RRRRRRR.RRRRRRRR.... +RRRRRRRRRR ### # RRRRRRRRRRRRRRRRRRRRRRRRRRRR.R.. # +RRRRRRRRR ## ... ## .RRRRRRRRRRRRRRRRRRRRRRRRRR.... ## + RRRR... ### ........ # .RRRRRRRRRRRRRRRRRRRRRR H ## + ....### H ..........H### .RRRRRRRRRRRRRRRRRRRRR ........H# + .. ### #.......... ##..RRRRRRRRRRRRRRRRRRRR ......... .. + #### ... ...H##### ....RRRRRRRRRRRRRRRR .......H#... + RRRRRRRRRRRR +ENDMAP +# Dungeon Description +REGION:(00,00,75,19),lit,"ordinary" +REGION:(03,01,09,03),lit,"ordinary" +REGION:(11,01,69,03),unlit,"ordinary" +REGION:(71,01,74,03),lit,"ordinary" +REGION:(18,14,27,18),unlit,"migohive" +REGION:(44,06,53,09),unlit,"migohive" +REGION:(60,16,68,18),unlit,"migohive" +# Stairs +STAIR:(73,02),down +STAIR:(04,02),up +# Doors +DOOR:locked,(10,02) +DOOR:locked,(15,04) +DOOR:locked,(48,04) +DOOR:locked,(70,02) +# A few statues +CONTAINER:'`',"statue",(04,01),"bone devil",1 +CONTAINER:'`',"statue",(04,03),"bone devil",1 +CONTAINER:'`',"statue",(06,01),"ice devil",1 +CONTAINER:'`',"statue",(06,03),"ice devil",1 +CONTAINER:'`',"statue",(08,01),"balrog",1 +CONTAINER:'`',"statue",(08,03),"balrog",1 +# Long hall +CONTAINER:'`',"statue",(15,01),"knight",1 +CONTAINER:'`',"statue",(15,03),"barbarian",1 +CONTAINER:'`',"statue",(23,01),"fool",1 +CONTAINER:'`',"statue",(23,03),"Rodney",1 +CONTAINER:'`',"statue",(32,01),"wizard",1 +CONTAINER:'`',"statue",(32,03),"priest",1 +CONTAINER:'`',"statue",(41,01),"ranger",1 +CONTAINER:'`',"statue",(41,03),"rogue",1 +CONTAINER:'`',"statue",(48,01),"caveman",1 +CONTAINER:'`',"statue",(48,03),"samurai",1 +CONTAINER:'`',"statue",(55,01),"monk",1 +CONTAINER:'`',"statue",(55,03),"valkyrie",1 +CONTAINER:'`',"statue",(62,01),"healer",1 +CONTAINER:'`',"statue",(62,03),"Pestilence",1 +OBJECT:'(',"unicorn horn",contained,cursed,+3 +# Final Room +CONTAINER:'`',"statue",(72,03),"marilith",1 +CONTAINER:'`',"statue",(72,01),"mariltih",1 +CONTAINER:'`',"statue",(74,02),"Asmodeus",1 +OBJECT:'=',"aggravate monster",contained,cursed,0 +OBJECT:'%',"fortune cookie",(71,02) +# A few traps +TRAP:"pit",(21,02) +TRAP:"pit",(30,02) +TRAP:"board",(19,17) +TRAP:"board",(46,07) +TRAP:"board",(62,14) +TRAP:random,random +TRAP:random,random +TRAP:random,random +# Some random objects +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +OBJECT:random,random,random +# A little incentive for the last hive +OBJECT:'!',"full healing",(73,17) +OBJECT:'!',"full healing",(73,18) +OBJECT:'[',"levitation boots",(73,12),cursed,0 +# A few monsters (other than bees) +MONSTER:'t',random,(18,02) +MONSTER:'t',random,(44,02) +MONSTER:'t',random,(62,02) +MONSTER:'B',random,(06,16) +MONSTER:'B',random,(29,11) +MONSTER:'B',random,(48,12) +MONSTER:'B',random,(73,07) +# A few fishies +MONSTER:';',random,(05,13) +MONSTER:';',random,(13,09) +MONSTER:';',random,(23,07) +MONSTER:';',random,(26,02) +MONSTER:';',random,(31,10) +MONSTER:';',random,(40,14) +MONSTER:';',random,(48,17) +MONSTER:';',random,(57,13) +MONSTER[50%]:';',random,(64,10) +MONSTER[50%]:';',random,(67,07) +# A couple of random monsters to finish +MONSTER:random,random,random +MONSTER:random,random,random +MONSTER:random,random,random + +# +# The gates of Hades. +# +# The river flows through an impressive gates guarded by angels and +# demons and thence into the depths of Hades itself. +# +MAZE: "lethe-z",' ' +FLAGS: hardfloor,lethe +GEOMETRY:center,center +MAP + --------- + ..... |.......| R + .....T... R |.......| RRR + .........T..........T.. . .RR |.......| .RR + ..T........................ ... ...RRR |.......| ...R + ......T.... .T.....T.. ..T.. .....R...|.......|.... +-----........ ------- .........T...... .........--+-+-+--.... +|...|...... |..\..| ..T........-----................... +|...+..... ----|.....--------- .......T..| |................----------- +|...|...T |...+.....+.......| .........-----........R.......|.....|...| +-----.... |...------|.......| T...T...............RRR......+.....S.R.| + .....H###S...+.....|.......+####....................RR.......|.....|...| + .T... |...|\....+.......| ..T.....-----.........R......----------- + ....... ----|.....|.......| T.....T.| |.............RRRRRRRR +RRRRRRRRRRRR --------------- RRRRRRRRR-----RRRRRRRRRRRRRRRRRRRRRRR +RRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR +RRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR + RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR-----RRRRRRRRRRRRRRRRRRRRRRR + RRRRRRRRRRRRRRRRRRRRRRRR | | RRRRRRRR + RRRRRRRRRRRRRRRRRRR ----- +ENDMAP +# Dungeon Description +REGION:(00,00,46,19),lit,"ordinary" +REGION:(47,00,75,19),unlit,"ordinary" +REGION:(01,07,03,09),lit,"ordinary" +REGION:(14,09,16,12),unlit,"ordinary" +REGION:(18,07,22,09),unlit,"ordinary" +REGION:(18,11,22,13),unlit,"ordinary" +REGION:(24,09,29,13),unlit,"barracks" +REGION:(59,01,63,05),unlit,"morgue" +REGION:(66,09,70,11),unlit,"ordinary" +REGION:(72,09,74,11),unlit,"ordinary" +# Stairs +STAIR:(74,10),down +STAIR:(02,08),up +# Doors +DOOR:locked,(04,08) +DOOR:locked,(13,11) +DOOR:closed,(17,09) +DOOR:closed,(17,11) +DOOR:closed,(23,09) +DOOR:closed,(23,12) +DOOR:closed,(31,11) +DOOR:closed,(58,06) +DOOR:closed,(60,06) +DOOR:closed,(62,06) +DOOR:locked,(65,10) +DOOR:locked,(71,10) +# Watch Dog +MONSTER:'d',"Cerberus",(68,10),asleep,hostile +# Sea monsters for the river +MONSTER:';',random,(03,15) +MONSTER:';',random,(09,15) +MONSTER:';',random,(15,17) +MONSTER:';',random,(24,18) +MONSTER:';',random,(33,17) +MONSTER:';',random,(40,15) +MONSTER:';',random,(51,15) +MONSTER:';',random,(59,16) +MONSTER:';',random,(64,14) +MONSTER:';',random,(68,16) +# An assortment of orcs and goblins +MONSTER:'o',random,(07,12) +MONSTER:'o',random,(08,07) +MONSTER:'o',random,(05,04) +MONSTER:'o',random,(16,04) +MONSTER:'o',random,(24,03) +MONSTER[50%]:'o',random,(31,06) +# And a few things for them to use +OBJECT:'!',"amnesia",(20,03) +OBJECT:'!',"amnesia",(04,11) +OBJECT:'/',"fire",(05,04) +OBJECT:'/',"lightning",(13,05) +OBJECT:'?',"demonology",(27,04) +# Guardians for the dark +MONSTER:'d',"hell hound",(67,04),asleep +MONSTER:'d',"hell hound",(68,05),asleep +MONSTER:'&',"horned devil",(53,07),asleep +MONSTER:'&',"horned devil",(54,09),asleep +MONSTER[60%]:'&',"horned devil",(54,11),asleep +MONSTER[60%]:'&',"horned devil",(52,13),asleep +MONSTER[60%]:'&',"horned devil",(50,06),asleep +MONSTER:'&',"barbed devil",(51,09),asleep +MONSTER:'&',"barbed devil",(51,12),asleep +MONSTER[75%]:'&',"marilith",(48,10),asleep +MONSTER[75%]:'&',"hezrou",(48,11),asleep +MONSTER[75%]:'&',"nalfeshnee",(51,10),asleep +# Guardians under the hill +# Knights +MONSTER:'@',"knight",(18,09),asleep +MONSTER:'@',"knight",(19,09),asleep +MONSTER:'@',"knight",(20,09),asleep +MONSTER:'@',"knight",(21,09),asleep +MONSTER:'@',"knight",(22,09),asleep +MONSTER:'@',"knight",(20,07),asleep +OBJECT:')',"long sword",(20,07),blessed,+2,"The Sword of Albion" +# Wizards +MONSTER:'@',"wizard",(19,11),asleep +MONSTER:'@',"wizard",(21,12),asleep +MONSTER:'@',"wizard",(22,13),asleep +MONSTER:'@',"wizard",(19,13),asleep +MONSTER:'@',"wizard",(18,12),asleep +OBJECT:'/',random,(19,11) +OBJECT:'/',random,(21,12) +OBJECT:'/',random,(22,13) +OBJECT:'/',random,(19,13) +OBJECT:'/',"sleep",(18,12) +OBJECT:'/',"lightning",(18,12) +OBJECT:'"',"amulet of life saving",(18,12) +OBJECT:'=',"protection",(18,12),blessed,+3 +# Valkyries +MONSTER:'@',"valkyrie",(15,09),asleep +MONSTER:'@',"valkyrie",(15,10),asleep +MONSTER:'@',"valkyrie",(15,11),asleep +MONSTER:'@',"valkyrie",(15,12),asleep +MONSTER:'@',"valkyrie",(16,10),asleep +# A statue for the entrance area +CONTAINER:'`',"statue",(01,08),"Famine",1 +OBJECT:'=',"slow digestion",contained,cursed,0 +# A little still life +CONTAINER:'`',"statue",(59,10),"knight",1 +OBJECT:')',"long sword",contained,blessed,+2 +CONTAINER:'`',"statue",(58,09),"angel",1 +OBJECT:'!',"full healing",contained,blessed,0 +CONTAINER:'`',"statue",(58,11),"demon",1 +OBJECT:'?',"taming",contained,blessed,0 +# A scattering of corpses +OBJECT:'%',"corpse",(52,08),"knight",0 +OBJECT:'%',"corpse",(61,12),"wizard",0 +OBJECT:'%',"corpse",(65,07),"rogue",0 +OBJECT:'%',"corpse",(62,08),"priest",0 +OBJECT:'%',"corpse",(56,13),"ranger",0 +# A few random flapping things +MONSTER:'B',"vampire bat",random +MONSTER:'B',"vampire bat",random +MONSTER[50%]:'B',"vampire bat",random +MONSTER:'B',"raven",random +MONSTER[50%]:'B',"raven",random +MONSTER:'B',random,random +MONSTER:'B',random,random +MONSTER[66%]:'B',random,random +MONSTER[33%]:'B',random,random +# Random traps +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"rust",random +TRAP:"rust",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"magic",random +TRAP:"board",(60,08) +TRAP:"board",(64,10) +TRAP:"board",(46,10) +TRAP:"board",(46,11) +# An old joke, borrowed from Eric! +ENGRAVING:(15,04),engrave,"I did it for the children" +ENGRAVING:(21,03),engrave,"It'll hurt me more than it will you" +ENGRAVING:(29,04),engrave,"I just wanted it to be right" +ENGRAVING:(32,06),engrave,"It wasn't supposed to happen that way" +ENGRAVING:(35,08),engrave,"I wanted to help" +ENGRAVING:(41,09),engrave,"It was her or me" +ENGRAVING:(40,11),engrave,"I thought she would understand" +ENGRAVING:(44,10),engrave,"Now we can be together" +ENGRAVING:(44,11),engrave,"This is for your own good" + + + diff -Naurbd slashem-0.0.8E0/dat/medusa.des slashem-0.0.8E1/dat/medusa.des --- slashem-0.0.8E0/dat/medusa.des 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/medusa.des 2006-05-15 12:08:59.000000000 +0100 @@ -1,5 +1,5 @@ # SCCS Id: @(#)medusa.des 3.4 1996/05/11 -# $Id: medusa.des,v 1.4 2003/09/06 07:44:22 prousu Exp $ +# $Id: medusa.des,v 1.4.4.1 2005/07/09 18:54:39 j_ali Exp $ # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1990, 1991 by M. Stephenson # Copyright (c) 2003 by Pasi Kallinen @@ -95,6 +95,10 @@ MONSTER:';',"jellyfish",(04,18) MONSTER:'T',"water troll",(51,03) MONSTER:'T',"water troll",(64,11) +MONSTER:'h',"deep one",(28,03) +MONSTER:'h',"deep one",(35,03) +MONSTER:'h',"deep one",(41,03) +MONSTER:'h',"deeper one",(65,10) MONSTER:'S',random,(38,07) MONSTER:'S',random,(38,12) MONSTER:random,random,random @@ -202,6 +206,10 @@ MONSTER:'S',"cobra",(65,10),asleep MONSTER:'A',random,(72,08) MONSTER:'y',"yellow light",(72,11),asleep +MONSTER:'h',"deep one",(28,03) +MONSTER:'h',"deep one",(35,03) +MONSTER:'h',"deep one",(41,03) +MONSTER:'h',"deeper one",(55,16) MONSTER:random,random,(17,07) MONSTER:random,random,(28,11) MONSTER:random,random,(32,13) diff -Naurbd slashem-0.0.8E0/dat/oracles.txt slashem-0.0.8E1/dat/oracles.txt --- slashem-0.0.8E0/dat/oracles.txt 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/oracles.txt 2006-05-15 12:08:59.000000000 +0100 @@ -84,13 +84,13 @@ read from Moloch's book, shall cause the earth to tremble mightily. The light of an enchanted candelabrum shall show thee the way. ----- -In the deepest recesses of the Dungeons of Doom, guarding access to the -nether regions, there standeth a castle, wherein lieth a wand of wishes. -If thou wouldst gain entry, bear with thee an instrument of music, for the -pontlevis may be charmed down with the proper melody. What notes comprise -it only the gods know, but a musical mastermind may yet succeed by witful -improvisation. However, the less perspicacious are not without recourse, -should they be prepared to circumambulate the castle to the postern. +In the deep gorge of the Lethe, guarding access to the nether regions, +there standeth a castle, wherein lieth a wand of wishes. If thou wouldst +gain entry, bear with thee an instrument of music, for the pontlevis may +be charmed down with the proper melody. What notes comprise it only the +gods know, but a musical mastermind may yet succeed by witful improvization. +The less perspicacious, however, should be prepared to bring the gates down +by force, for the only passage leadeth through the castle. ----- Upon a level before all maze There lies a woman who kills with gaze. @@ -102,3 +102,10 @@ utmost calm, thy safety will be aided greatly, but beware lest thy clumsy feet scuff the inscription, cancelling its potence. ----- +Ye waters of the Lethe, being known also as the River of Oblivion, have the +power to wash away memories. It floweth from above the green hills of +earth, thorugh a mighty gorge and unto the depths of Gehennom itself. +Thence it flows past the palaces of the demon lords, eventully to be lost +in the endless darkness of the Gulf of N'Kai. Follow it, for thierin lies +your weird, but be prepared, for the Gates of Gehennom are well guarded. +----- diff -Naurbd slashem-0.0.8E0/dat/rumors.fal slashem-0.0.8E1/dat/rumors.fal --- slashem-0.0.8E0/dat/rumors.fal 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/rumors.fal 2006-05-15 12:08:59.000000000 +0100 @@ -18,6 +18,8 @@ A ring of dungeon master control is a great find. A ring of extra ring finger is useless if not enchanted. A rope may form a trail in a maze. +A scroll of Demonology can tame demons. +A scroll of Elementalism will teach you alchemy. A staff may recharge if you drop it for awhile. A visit to the Zoo is very educational; you meet interesting animals. A wand of deaf is a more dangerous weapon than a wand of sheep. @@ -149,12 +151,15 @@ PLEASE ignore previous rumor. Polymorph into an ettin; meet your opponents face to face to face. Praying will frighten demons. +Quaffing a sparkling potion can restore your memory. +Reading the Nerconomicon might help. Row (3x) that boat gently down the stream, Charon (4x), death is but a dream. Running is good for your legs. Screw up your courage! You've screwed up everything else. Scrolls fading? It's not the heat, it's the humidity. Seepage? Leaky pipes? Rising damp? Summon the plumber! Segmentation fault (core dumped). +Shoggoth corpses are good for stomach acid. Shopkeepers are insured by Croesus himself! Shopkeepers sometimes die from old age. Some mazes (especially small ones) have no solutions, says man 6 maze. @@ -366,11 +371,13 @@ Time stands still as the succubus changes her calendar to January 1, 2000. Tired? Try a scroll of charging on yourself. To achieve the next higher rating, you need 3 more points. +To reach Cthulhu you must pass through Yog Sothoth. To reach heaven, escape the dungeon while wearing a ring of levitation. Tourists wear shirts loud enough to wake the dead. Tridents are for use underwater. Try calling your katana Moulinette. Waltz, dumb nymph, for quick jigs vex. +Tsathoggua dwells in the eternal darkness of the Gulf of N'Kai. Ulch! That meat was painted! Unfortunately, this message was left intentionally blank. Using a morning star in the evening has no effect. diff -Naurbd slashem-0.0.8E0/dat/rumors.tru slashem-0.0.8E1/dat/rumors.tru --- slashem-0.0.8E0/dat/rumors.tru 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/rumors.tru 2006-05-15 12:08:59.000000000 +0100 @@ -31,11 +31,13 @@ Be careful! The Wizard may plan an ambush! Be nice to a nurse: Put away your weapon and take off your clothes. Being digested is a painfully slow process. +Beware of repeating parrots! Blank scrolls make more interesting reading. Blind? Catch a floating eye! Booksellers never read scrolls; they might get carried away. Concise conquest: Control, confuse, conjure, condemn. Conserve energy, turn off the lights. +Demonology might get you a pet or it might get you a master. Digging up a grave could be a bad idea. Dilithium crystals are rare indeed. Dogs are attracted by the smell of tripe. @@ -68,6 +70,7 @@ Gems are too precious to be thrown away carelessly. Getting hungry? Stop wearing rings! Getting too warm? Take off that Amulet of Yendor and stay away from the exit! +Gnolls are only found in Gehennom. Gods expect the best from their priesthood. Gods look down their noses at demigods. Guy Montag keeps his scrolls in a bag. @@ -100,8 +103,10 @@ Kill a unicorn of your color and you kill your luck. Leather is waterproof. Ever see a cow with an umbrella? Leprechauns are the most skilled cutpurses in this dungeon. +Levitation helps keep your feet dry. Lizard corpses protect against cockatrices. Look out! Monkeys! +Moloch has appointed Cthulhu as his high priest. Money lost, little lost; honor lost, much lost; pluck lost, all lost. Most monsters can't swim. Music hath charms to affect the stubborn drawbridge. @@ -113,6 +118,8 @@ Nurses are accustomed to touch naked persons: they don't harm them. Nymphs can unlink more than your chain mail. Once your little dog will be a big dog, and you will be proud of it. +Only female monsters can lay eggs. +Only trust those pets you know you can rely on. Opening a tin is difficult, especially when you attempt it bare handed! Orcs and killer bees share their lifestyle. Orcs do not procreate in dark rooms. @@ -135,6 +142,7 @@ Scrolls fading? It's not the heat, it's the humidity. Shopkeepers accept credit cards, as long as you pay cash. Shopkeepers can spot a tourist a mile away with those Hawaiian shirts. +Shopkeepers can make an amazing parrot pie. Shopkeepers can't tell identical twins apart. Shopkeepers can't swim. Shopkeepers don't read, so what use is engraving in a shop? @@ -153,14 +161,19 @@ The Wizard finds death to be quite an experience. The best equipment for your work is, of course, the most expensive. The gods don't appreciate pesky priesthood. +The gods will get angry if you kill your dog. +The king will return, know him because he carries the Sword of Albion. The magic marker is mightier than the sword. The moon is not the only heavenly body to influence this game. The orc swings his two handed sword named Elfrist at you. You die... The pen is mightier than the sword. The secret of wands of Nothing Happens: try again! +The way to Hell is paved with good intentions. +The wizard has moved (again). Please forward mail to the Gulf of N'Kai. There has always been something mystical about mirrors. There is a Mastermind deep in the dungeon. There is a big treasure hidden in the zoo! +There is a wizard who lives on the banks of the Lethe. There is more magic in this cave than meets the eye. There is no harm in praising a large dog. There is nothing like eating a mimic. @@ -181,6 +194,7 @@ They say that a clove of garlic makes a good talisman if handled right. They say that a cursed scroll of teleportation could land you in trouble. They say that a diamond is another kind of luck stone. +They say that a dip in the Lethe eases a troubled mind. They say that a dog can be trained to fetch objects. They say that a gelatinous cube makes a healthy breakfast. They say that a giant gets strong by eating right, try it! @@ -343,6 +357,7 @@ They say the gods get angry if you kill your dog. They say the gods get angry if you pray too much. They say the shopkeepers are insured by Croesus himself! +They say there are hideous things hiding in the darkness of N'Kai! They say there is a powerful magic item hidden in a castle deep down! Those who wield a cockatrice corpse have a rocky road ahead of them. Throwing food at a wild dog might tame him. @@ -356,6 +371,7 @@ Vault guards never disturb their Lords. Vegetarians enjoy lichen and seaweed. Visitors are requested not to apply genocide to shopkeepers. +Vlad has bought the farm. Watch out, the Wizard might come back. Water traps have no effect on dragons. What is a cockatrice going to eat when it gets hungry? diff -Naurbd slashem-0.0.8E0/dat/yendor.des slashem-0.0.8E1/dat/yendor.des --- slashem-0.0.8E0/dat/yendor.des 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/dat/yendor.des 2006-05-15 12:08:59.000000000 +0100 @@ -1,276 +1,319 @@ # SCCS Id: @(#)yendor.des 3.4 1996/10/20 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by M. Stephenson and Izchak Miller +# Copyright (c) 2005 by J. Ali Harlow # NetHack may be freely redistributed. See license for details. # # The top (real) wizard level. # Keeping the Moat for old-time's sake -MAZE:"wizard1",random -FLAGS:noteleport,hardfloor +MAZE:"wizard1",' ' +FLAGS:noteleport,hardfloor,phlegethon GEOMETRY:center,center MAP -----------------------------. -|.......|..|.........|.....|. -|.......S..|.}}}}}}}.|.....|. -|..--S--|..|.}}---}}.|---S-|. -|..|....|..|.}--.--}.|..|..|. -|..|....|..|.}|...|}.|..|..|. -|..--------|.}--.--}.|..|..|. -|..|.......|.}}---}}.|..|..|. -|..S.......|.}}}}}}}.|..|..|. -|..|.......|.........|..|..|. -|..|.......|-----------S-S-|. -|..|.......S...............|. -----------------------------. + ............. .... ... ... +}} ............... ......... ........ ........ ...... ....... ..... +}}}}................}}}}}}}}}...}}}}}}}}..}}}}}}}}................... ..... +}}}}}..............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.................. .... +.}}}}}............}}}}}---}}}}}}}}----}}}}}}..---}}}}}................ # + .}}}}}...........}}}}----------------------------}}}}}}.....}}}}}...... + .}}}}}.........}}}}}|.......|..|.........|.....|..}}}}}}}}}}}}}}}}..... + .}}}}}.......}}}}}}.|.......S..|.}}}}}}}.|.....|...}}}}}}}}}}}}}}}....... + .}}}}}.......}}}}}...|..--S--|..|.}}---}}.|---S-|.... }}}}}}}..}}}}}}...... + .}}}}}....}}}}}.....|..|....|..|.}--.--}.|..|..|.... ....}}}}}}..... + ..}}}}}.....}}}}}....|..|....|..|.}|...|}.|..|..|...... .......}}}}}}.... +....}}}}}...}}}}}}....|..--------|.}--.--}.|..|..|.................}}}}}.... +.....}}}}}}}}}}}}.....|..|.......|.}}---}}.|..|..| ........... ...}}}}}... + ......}}}}}}}}.......|..S.......|.}}}}}}}.|..|..| ......... .....}}}}}} + .......}}}..........|..|.......|.........|..|..| ........ ......}}}}}}}} + ....................|..|.......|-----------S-S-| ....... ........}}}}}}} + ....................|..|.......S...............|......... .........}}}}}} + .....................----------------------------......... ...........}}} +............. ........---........----........---.......... ............ +...... .... ......................................... ........ + ... ..................................... .... ENDMAP -STAIR:levregion(01,00,79,20),(0,0,28,12),up -STAIR:levregion(01,00,79,20),(0,0,28,12),down -BRANCH:levregion(01,00,79,20),(0,0,28,12) -TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) +# The tower +RANDOM_REGION[0]:(23,06,48,16),(00,00,00,00) +# South of the river +RANDOM_REGION[1]:(00,06,67,20),(23,06,48,16) +# North of the river +RANDOM_REGION[2]:(03,00,75,08),(19,04,63,08) +# South west +STAIR:(00,06,21,16),(07,06,16,11),up +# South east +STAIR:(50,06,70,16),(68,06,70,09),down +BRANCH:(00,00,75,20),(22,05,49,17) +TELEPORT_REGION:(00,00,75,20),(22,05,49,17) # Make it a morgue for rm id in mkmaze.c # for the purpose of random sdoor placement -REGION:(12,01,20,09),unlit,"morgue",unfilled -MAZEWALK:(28,05),east -LADDER:(06,05),down +REGION:(34,05,42,14),unlit,"morgue",unfilled +LADDER:(28,10),down # Non diggable walls # Walls inside the moat stay diggable -NON_DIGGABLE:(00,00,11,12) -NON_DIGGABLE:(11,00,21,00) -NON_DIGGABLE:(11,10,27,12) -NON_DIGGABLE:(21,00,27,10) +NON_DIGGABLE:(22,05,33,17) +NON_DIGGABLE:(33,05,43,05) +NON_DIGGABLE:(33,15,49,17) +NON_DIGGABLE:(43,05,49,15) # Non passable walls -NON_PASSWALL:(00,00,11,12) -NON_PASSWALL:(11,00,21,00) -NON_PASSWALL:(11,10,27,12) -NON_PASSWALL:(21,00,27,10) +NON_PASSWALL:(22,05,33,17) +NON_PASSWALL:(33,05,43,05) +NON_PASSWALL:(33,15,49,17) +NON_PASSWALL:(43,05,49,15) # The wizard and his guards -MONSTER:'@',"Wizard of Yendor",(16,05),asleep -MONSTER:'d',"hell hound",(15,05) -MONSTER:'V',"vampire lord",(17,05) +MONSTER:'@',"Wizard of Yendor",(38,10),asleep +MONSTER:'d',"hell hound",(37,10) +MONSTER:'V',"vampire lord",(39,10) # The local treasure -OBJECT:'+',"Book of the Dead",(16,05) +OBJECT:'+',"Book of the Dead",(38,10) # Surrounding terror -MONSTER:';',"kraken",(14,02) -MONSTER:';',"giant eel",(17,02) -MONSTER:';',"kraken",(13,04) -MONSTER:';',"giant eel",(13,06) -MONSTER:';',"kraken",(19,04) -MONSTER:';',"giant eel",(19,06) -MONSTER:';',"kraken",(15,08) -MONSTER:';',"giant eel",(17,08) -MONSTER:';',"piranha",(15,02) -MONSTER:';',"piranha",(19,08) +MONSTER:';',"kraken",(36,07) +MONSTER:';',"giant eel",(39,07) +MONSTER:';',"kraken",(35,09) +MONSTER:';',"giant eel",(35,11) +MONSTER:';',"kraken",(41,09) +MONSTER:';',"giant eel",(41,11) +MONSTER:';',"kraken",(37,13) +MONSTER:';',"giant eel",(39,13) +MONSTER:';',"piranha",(37,07) +MONSTER:';',"piranha",(41,13) # Random monsters -MONSTER:'D',random,random -MONSTER:'H',random,random -MONSTER:'&',random,random -MONSTER:'&',random,random -MONSTER:'&',random,random -MONSTER:'&',random,random +MONSTER:'D',random,region[0] +MONSTER:'H',random,region[0] +MONSTER:'&',random,region[0] +MONSTER:'&',random,region[0] +MONSTER:'&',random,region[0] +MONSTER:'&',random,region[0] # And to make things a little harder. -TRAP:"board",(16,04) -TRAP:"board",(16,06) -TRAP:"board",(15,05) -TRAP:"board",(17,05) +TRAP:"board",(38,09) +TRAP:"board",(38,11) +TRAP:"board",(37,10) +TRAP:"board",(39,10) # Random traps. -TRAP:"spiked pit",random -TRAP:"sleep gas",random -TRAP:"anti magic",random -TRAP:"magic",random +TRAP:"spiked pit",region[0] +TRAP:"sleep gas",region[0] +TRAP:"anti magic",region[0] +TRAP:"magic",region[0] # Some random loot. -OBJECT:'*',"ruby",random -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'+',random,random -OBJECT:'+',random,random -OBJECT:'+',random,random +OBJECT:'*',"ruby",region[0] +OBJECT:'!',random,region[0] +OBJECT:'!',random,region[0] +OBJECT:'?',random,region[0] +OBJECT:'?',random,region[0] +OBJECT:'+',random,region[0] +OBJECT:'+',random,region[0] +OBJECT:'+',random,region[0] +# South of the river +TRAP:"fire",region[1] +TRAP:"fire",region[1] +MONSTER:'L',random,region[1] +MONSTER:'&',random,region[1] +MONSTER:'&',random,region[1] +MONSTER:random,random,region[1] +MONSTER:random,random,region[1] +MONSTER:random,random,region[1] +OBJECT:'(',random,region[1] +OBJECT:')',random,region[1] +OBJECT:'?',random,region[1] +# North of the river (Odysseus' altar) +ALTAR:(10,10),noalign,altar +TRAP:"falling rock",region[2] +MONSTER:' ',"ghost",region[2],"Teiresias" +MONSTER:' ',"ghost",region[2],"Elpenor" +MONSTER:' ',"ghost",region[2],"Anticleia" +MONSTER:random,random,region[2] +OBJECT:'!',random,region[2] +OBJECT:'+',random,region[2] # The middle wizard level. -MAZE:"wizard2",random -FLAGS:noteleport,hardfloor +MAZE:"wizard2",' ' +FLAGS:noteleport,hardfloor,phlegethon GEOMETRY:center,center MAP -----------------------------. -|.....|.S....|.............|. -|.....|.-------S--------S--|. -|.....|.|.........|........|. -|..-S--S|.........|........|. -|..|....|.........|------S-|. -|..|....|.........|.....|..|. -|-S-----|.........|.....|..|. -|.......|.........|S--S--..|. -|.......|.........|.|......|. -|-----S----S-------.|......|. -|............|....S.|......|. -----------------------------. + }}... .... .. ...... ........ .... +}}}}}}. ..}}}}.}}..}}}}}}...}}}}}}}}.. ... ...... +}}}}}}}.. ... ..}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.. .}}}. . +}}}}}}}}}.}}}.. ..}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.. ..}}}}}. .. ... + ..}}}}}}}}}}..}}}}}}---}}}}}}}.----}}}}..}}---}}}}}}.}}}}}}}}.. ..}}}... + ......}}}}}}}}}}}}}}.----------------------------}}}}}}}}}}}}}}}} }}}}}}}} +........}}}.}}}}}}}...|.....|.S....|.............|..}}}}}}}}..}}}}}}}}}}}}}} +..............}}}.....|.....|.-------S--------S--|....}}........}}}}}}}..}}} + ....................|.....|.|.........|........|.......... .....}}}....... + ...................|..-S--S|.........|........| ......... .............. + ........... ......|..|....|.........|------S-| ....... ........ ... +...... .... ......|..|....|.........|.....|..|. . ... ........ ... +..... ... .....|-S-----|.........|.....|..|.. ........... .... +..... ..... .....|.......|.........|S--S--..|...... .......... .... + ... ........ ......|.......|.........|.|......|...... ........ ..... + ................|-----S----S-------.|......|......... ......... .. + ...............|............|....S.|......|........ ............ + ..... ..............----------------------------....... .......... .... +........ .......... ..---........----........---... .. ............ .... +................... ......... ........ ........ .... ..... .. ...... + .. ...... ..... ...... .... ...... ......... ..... ...... ENDMAP -STAIR:levregion(01,00,79,20),(0,0,28,12),up -STAIR:levregion(01,00,79,20),(0,0,28,12),down -BRANCH:levregion(01,00,79,20),(0,0,28,12) -TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) -REGION:(09,03,17,09),unlit,"zoo" -DOOR:closed,(15,02) -DOOR:closed,(11,10) -MAZEWALK:(28,05),east -LADDER:(12,01),up -LADDER:(14,11),down +# The tower +RANDOM_REGION[0]:(23,06,48,16),(00,00,00,00) +# North of the river +RANDOM_REGION[1]:(00,00,75,04),(00,00,04,04) +# South of the river +RANDOM_REGION[2]:(00,05,75,20),(22,05,49,17) +# South West +STAIR:(00,04,21,20),(15,04,16,04),up +# South East +STAIR:(50,06,75,20),(00,00,00,00),down +BRANCH:(00,00,75,20),(22,05,49,17) +TELEPORT_REGION:(00,00,75,20),(22,05,49,17) +REGION:(31,08,39,14),unlit,"zoo" +DOOR:closed,(37,07) +DOOR:closed,(33,15) +LADDER:(34,06),up +LADDER:(36,16),down # Non diggable walls everywhere -NON_DIGGABLE:(00,00,27,12) +NON_DIGGABLE:(22,05,49,17) # -NON_PASSWALL:(00,00,06,12) -NON_PASSWALL:(06,00,27,02) -NON_PASSWALL:(16,02,27,12) -NON_PASSWALL:(06,12,16,12) +NON_PASSWALL:(22,05,28,17) +NON_PASSWALL:(28,05,49,07) +NON_PASSWALL:(28,07,49,17) +NON_PASSWALL:(28,17,38,17) # Random traps. -TRAP:"spiked pit",random -TRAP:"sleep gas",random -TRAP:"anti magic",random -TRAP:"magic",random +TRAP:"spiked pit",region[0] +TRAP:"sleep gas",region[0] +TRAP:"anti magic",region[0] +TRAP:"magic",region[0] # Some random loot. -OBJECT:'!',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'+',random,random +OBJECT:'!',random,region[0] +OBJECT:'!',random,region[0] +OBJECT:'?',random,region[0] +OBJECT:'?',random,region[0] +OBJECT:'+',random,region[0] # treasures -OBJECT:'"',random,(04,06) +OBJECT:'"',random,(26,11) +# North path +OBJECT:'/',random,region[1] +MONSTER:random,random,region[1] +# The Burning Sand (South of the river) +TRAP:"fire",region[2] +TRAP:"fire",region[2] +TRAP:"fire",region[2] +TRAP:"fire",region[2] +OBJECT:'?',random,region[2] +OBJECT:'!',random,region[2] +MONSTER:random,random,region[2] +MONSTER:random,random,region[2] # The bottom wizard level. # Memorialize the fakewiz setup. -MAZE:"wizard3",random -FLAGS:noteleport,hardfloor +MAZE:"wizard3",' ' +FLAGS:noteleport,hardfloor,phlegethon GEOMETRY:center,center MAP -----------------------------. -|..|............S..........|. -|..|..------------------S--|. -|..|..|.........|..........|. -|..S..|.}}}}}}}.|..........|. -|..|..|.}}---}}.|-S--------|. -|..|..|.}--.--}.|..|.......|. -|..|..|.}|...|}.|..|.......|. -|..---|.}--.--}.|..|.......|. -|.....|.}}---}}.|..|.......|. -|.....S.}}}}}}}.|..|.......|. -|.....|.........|..S.......|. -----------------------------. + T. T..T.. T...T .T..T. T.T T..T. + ...T. .T.T...T.T..T..T.T..T.T..T.T..T..T..TT...T.T..TT.. T...T + ..T.T.T..T..T..T.T..T..T..T.T..T.T}}}}.T.T..T...T.T..T.T..T.T..T.T..T... +.T..T...T..TT..T.T..T.}}}}}}.T.T}}}}..}}}}T.T}}}}}} ....T.T.T..T.T..T.T. +..T...T..T...T.T..T.}}}---.}}}}}}.----...}}}}}---}}} T..T...T.T..T.T. +.T...T..T..T .T}}---------------------------- }}} .T.T.T..T.. + ..T..}}}}. .}}|..|............S..........| .}} .T.T.T..T.. + ..}}}}}}}... .}}|..|..------------------S--|....}}} .T...T..T..T + }}}}}}}}}}}}.....}}}|..|..|.........|..........|......}}} T..T..T..T.. +}}}}}}}T.}}}}}}}}}}}}.|..S..|.}}}}}}}.|..........|........}} }}}..T.T.. +}}}}T...T..}}}}}}}}}..|..|..|.}}---}}.|-S--------|.........}}}}}}}}}T.T.T.T +}}.T..T...T..T}}}}}}..|..|..|.}--.--}.|..|.......|.........}}}}}}}}}}.T}}}. +.T.. .T..}}}}}}.|..|..|.}|...|}.|..|.......|..........}}}}.T}}}}}}}}}} +. T..T.}}}}}}|..---|.}--.--}.|..|.......|.........}}}TT.T.T}}}}}}}} + ... T.}}}}}|.....|.}}---}}.|..|.......|........}}}TT.T.T..}}}T}}} + ..T ..T}}}}|.....S.}}}}}}}.|..|.......|...}}}.}}}}T.TT..TT.T.TT.. + ..T... ...}}}|.....|.........|..S.......|..}}}}}}}TTT.T.TT..T....T. + .T...T T..}}----------------------------.}}} }}}TT.T.T.T..T.T.T..T + .T.T.. .T.}}}---...}}}}}----}}}...}}---.}}} TTT.T.T.T..T.T...T.. + ..T ..T}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} .T..T...T..T..T..T. + T..}}}}}}}} }}}}}} }}}}}}}}}}} ..T..T.T..T..T...T. ENDMAP -STAIR:levregion(01,00,79,20),(0,0,28,12),up -STAIR:levregion(01,00,79,20),(0,0,28,12),down -BRANCH:levregion(01,00,79,20),(0,0,28,12) -TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) -PORTAL:(25,11,25,11),(0,0,0,0),"fakewiz1" -MAZEWALK:(28,09),east -REGION:(07,03,15,11),unlit,"morgue",unfilled -REGION:(17,06,18,11),unlit,"beehive" +# The tower +RANDOM_REGION[0]:(23,06,48,16),(00,00,00,00) +# Outside +RANDOM_REGION[1]:(00,00,75,20),(22,05,49,17) +# South west +STAIR:(00,00,21,08),(00,00,00,00),up +# South east +STAIR:(50,00,75,11),(50,06,59,11),down +BRANCH:(00,00,75,20),(22,05,49,17) +TELEPORT_REGION:(00,00,75,20),(22,05,49,17) +PORTAL:(47,16,47,16),(0,0,0,0),"nkai-b" +REGION:(29,08,37,16),unlit,"morgue",unfilled +REGION:(39,11,40,16),unlit,"beehive" # make the entry chamber a real room; it affects monster arrival; # `unfilled' is a kludge to force an ordinary room to remain a room -REGION:(20,06,26,11),unlit,"ordinary",unfilled -DOOR:closed,(18,05) -DOOR:closed,(19,11) -LADDER:(11,07),up +REGION:(42,11,48,16),unlit,"ordinary",unfilled +DOOR:closed,(40,10) +DOOR:closed,(41,16) +LADDER:(33,12),up # Non diggable walls # Walls inside the moat stay diggable -NON_DIGGABLE:(00,00,06,12) -NON_DIGGABLE:(06,00,27,02) -NON_DIGGABLE:(16,02,27,12) -NON_DIGGABLE:(06,12,16,12) +NON_DIGGABLE:(22,05,28,17) +NON_DIGGABLE:(28,05,49,07) +NON_DIGGABLE:(38,07,49,17) +NON_DIGGABLE:(28,17,38,17) # -NON_PASSWALL:(00,00,06,12) -NON_PASSWALL:(06,00,27,02) -NON_PASSWALL:(16,02,27,12) -NON_PASSWALL:(06,12,16,12) +NON_PASSWALL:(22,05,28,17) +NON_PASSWALL:(28,05,49,07) +NON_PASSWALL:(38,07,49,17) +NON_PASSWALL:(28,17,38,17) # -MONSTER:'L',random,(10,07) -MONSTER:'V',"vampire lord",(12,07) +MONSTER:'L',random,(32,12) +MONSTER:'V',"vampire lord",(34,12) # Some surrounding horrors -MONSTER:';',"kraken",(08,05) -MONSTER:';',"giant eel",(08,08) -MONSTER:';',"kraken",(14,05) -MONSTER:';',"giant eel",(14,08) +MONSTER:';',"kraken",(30,10) +MONSTER:';',"giant eel",(30,13) +MONSTER:';',"kraken",(36,10) +MONSTER:';',"giant eel",(36,13) # Other monsters -MONSTER:'L',random,random -MONSTER:'D',random,random -MONSTER:'D',random,(26,09) -MONSTER:'&',random,random -MONSTER:'&',random,random -MONSTER:'&',random,random +MONSTER:'L',random,region[0] +MONSTER:'D',random,region[0] +MONSTER:'D',random,(48,14) +MONSTER:'&',random,region[0] +MONSTER:'&',random,region[0] +MONSTER:'&',random,region[0] # And to make things a little harder. -TRAP:"board",(10,07) -TRAP:"board",(12,07) -TRAP:"board",(11,06) -TRAP:"board",(11,08) +TRAP:"board",(32,12) +TRAP:"board",(34,12) +TRAP:"board",(33,11) +TRAP:"board",(33,13) # Some loot -OBJECT:')',random,random -OBJECT:'!',random,random -OBJECT:'?',random,random -OBJECT:'?',random,random -OBJECT:'(',random,random -# treasures -OBJECT:'"',random,(11,07) - - -# The former decoy wizard levels. -# There are two of these, and we need to -# distinguish between them for the portal. -MAZE:"fakewiz1",random -GEOMETRY:center,center -MAP -......... -.}}}}}}}. -.}}---}}. -.}--.--}. -.}|...|}. -.}--.--}. -.}}---}}. -.}}}}}}}. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,8,7),up -STAIR:levregion(01,00,79,20),(0,0,8,7),down -BRANCH:levregion(01,00,79,20),(0,0,8,7) -TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6) -PORTAL:(4,4,4,4),(0,0,0,0),"wizard3" -MAZEWALK:(08,05),east -REGION:(04,03,06,06),unlit,"ordinary",unfilled,true -MONSTER:'L',random,(04,04) -MONSTER:'V',"vampire lord",(03,04) -MONSTER:';',"kraken",(06,06) -# And to make things a little harder. -TRAP:"board",(04,03) -TRAP:"board",(04,05) -TRAP:"board",(03,04) -TRAP:"board",(05,04) - - -MAZE:"fakewiz2",random -GEOMETRY:center,center -MAP -......... -.}}}}}}}. -.}}---}}. -.}--.--}. -.}|...|}. -.}--.--}. -.}}---}}. -.}}}}}}}. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,8,7),up -STAIR:levregion(01,00,79,20),(0,0,8,7),down -BRANCH:levregion(01,00,79,20),(0,0,8,7) -TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6) -MAZEWALK:(08,05),east -REGION:(04,03,06,06),unlit,"ordinary",unfilled,true -MONSTER:'L',random,(04,04) -MONSTER:'V',"vampire lord",(03,04) -MONSTER:';',"kraken",(06,06) -# And to make things a little harder. -TRAP:"board",(04,03) -TRAP:"board",(04,05) -TRAP:"board",(03,04) -TRAP:"board",(05,04) +OBJECT:')',random,region[0] +OBJECT:'!',random,region[0] +OBJECT:'?',random,region[0] +OBJECT:'?',random,region[0] +OBJECT:'(',random,region[0] # treasures -OBJECT:'"',random,(04,04) +OBJECT:'"',random,(33,12) +# Outside the tower (Wood of the suicides) +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'B',"harpy",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +MONSTER:'d',"hell hound",region[1] +TRAP:"bear",region[1] +TRAP:"bear",region[1] +TRAP:"pit",region[1] +OBJECT:'!',random,region[1] +OBJECT:'?',random,region[1] diff -Naurbd slashem-0.0.8E0/history.txt slashem-0.0.8E1/history.txt --- slashem-0.0.8E0/history.txt 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/history.txt 2006-05-15 12:08:59.000000000 +0100 @@ -29,6 +29,114 @@ | Section 1: Yesterday's News | +-----------------------------+ +ver 0.0.8E0 [July 2/2005] [Released by Ali] +-Added dumplog patch (Tom Friedetzky and Jukka Lahtinen) +-fixed bug 923003: Invisible mirrors can be applied +-fixed bug 916544: Wrong weight of corpses on Nightmare level +-fixed bug 947369: Crash when multiple wands explode +-fixed bug 950120: crash when wishing for Wallet of Perseus +-fixed bug 933365: wand of draining does not interrupt ctrl-run +-fixed bug 933379: weird behaviour with polyself into monsters like migo drone +-fixed bug 929546: Flaming spheres won't attack acid blobs +-fixed bug 951991: Reading spellbooks not safe for wizards +-fixed bug 914894: "Beautiful" gnome thief seduced female character +-fixed bug 918178: Double message "You are suddenly very hot/cold!" +-fixed bug 921810: Invisible books can be read (?!) +-fixed bug 934076: Dipping amnesia into amnesia gives water +-fixed bug 946306: do_look: bad glyph 3726 at (7, 16) +-fixed bug 929220: Prayer and chi healing +-fixed bug 946157: Water elementals created over lava on Flame mage quest +-fixed bug 946161: Bad message when two-weaponing against a rust monster +-fixed bug 946566: Partly eaten more nutritious while raising drained corpses +-fixed bug 946984: arch-liches are not MR_HITAS* +-fixed bug 949016: Draining a rotten corpse +-fixed bug 951439: Invisible Corpses and Ressurection +-fixed bug 941453: Grand slam against monsters needing +n weapons +-fixed bug 962515: Disarming fire trap doesn't use up water +-fixed bug 1001167: Is this a Gray Stone bug? +-fixed bug 992247: wolfname & ghoulname in default.nh doesn't work +-fixed bug 931679: Space Bar not working as rest +-fixed bug 912588: Molds stagger from your powerful strike +-fixed bug 962574: Display bug when setting OPTIONS=tiles:Small tiles +-fixed bug 1011313: SEGV using technique "raise zombies" +-fixed bug 1018229: impossible splitbill: no resident shopkeeper?? +-fixed bug 1018447: Game crash when Hero with ball displace displacer beast +-fixed bug 1020983: Typo in doc/sources.txt (cloack) +-fixed bug 956891: Breeders are explosive +-fixed bug 1007127: diluted potion of water +-fixed bug 1010421: Thiefbane drains your levels even if you aren't hit +-fixed bug 976157: Dipping into !oAmnesia didn't use up potion +-fixed bug 982331: Can't name Cursed scrolls of teleport after reading them +-fixed some theoretical bugs thrown up by valgrind +-fixed bug 980258: Guidebook doesn't describe showdmg option accurately + (Andy Ruse) +-fixed bug 926202: Gnome thieves don't eat (Andy Ruse) +-fixed bug 926200: Dwarf thieves have M2_NOPOLY (Andy Ruse) +-fixed bug 962568: Mjollnir can't be thrown - code comment incorrect (Andy Ruse) +-fixed bug 1005587: Beholder killed by "it's" own gaze (Andy Ruse) +-fixed bug 1022460: [C343-8] The plural of Nazgul is Nazgul (Andy Ruse) +-fixed bug 1039689: malloc_consolidate hang after using cursed bag of holding +-fixed bug 1028955: Surgery technique doesn't work with polymorph +-fixed bug 1035356: God gave Deathsword to "human" character +-fixed bug 1024200: Problems about Thiefbane +-fixed bug 1024202: Dipping a loadstone into a potion of amnesia +-fixed bug 1038151: Power surge becomes permanent if lost +-fixed bug 1025486: Pets can't follow lvl telep from Blk Mkt +-fixed bug 1029750: Lycanthropes and eating wolfsbane while polymorphed +-fixed bug 1030725: Doppelganger liquid leap does not release from chain +-fixed bug 1032419: Eviscerate tech should not work while wearing gloves +-fixed bug 1055724: Raise Zombies gives tame troll +-fixed bug 1020980: Objects are forgotten when you search blind +-fixed bug 954414: pickup_thrown option includes some non-throw weapons +-fixed bug 937239: Wrong cause of death from exploding wands +-fixed bug 962572: Inventory item prints to console instead of chat buffer +-fixed bug 936167: Started with empty medical kit (Pasi Kallinen) +-fixed bug 934077: Wrote an invisible scroll (Pasi Kallinen) +-fixed bug 1015079: Spurious "it snatches the boulder" message (Pasi Kallinen) +-fixed bug 957731: Shop purchases free after 200 objects +-fixed bug 1062624: GTK Interface is not resizable +-fixed bug 931684: Inventory window behaving strangely +-Fixed build of proxy tests +-fixed bug 1071688: cannot compile on FreeBSD (termcap) +-fixed bug 1071623: Cannot compile on FreeBSD due to menucolor inclusion +-Unbundled proxy and gtk modules: + http://www.nongnu.org/nhproxy/ + http://www.gtkhack.org/ +-fixed bug 993420: Crashes when typing symbols on drop menu +-fixed bug 1084366: ghoul queen don't has M2_FEMALE +-fixed bug 1066530: Fired/thrown items get new inventory letter when retrieved +-fixed bug 992244: Alt Gr key doesn't work +-fixed bug 1076125: Unsuccessful use of medical kits +-fixed bug 1076123: Vampires can eat white pills +-fixed bug 994993: when polying, you take off T-shirt after scales merge +-fixed bug 961914: Deep dragons should resist their own breath +-fixed bug 963344: Stat exercise effects calculated while polymorphed +-fixed bug 1097792: Duplicate message when hit by sleep gaze +-fixed bug 1065927: Should bars stop bullets? +-fixed bug 947009: Scroll of taming exercises skill in healing spells +-fixed bug 1077355: game crashes with: "panic monsndx - could not index monster" +-fixed bug 1098686: Restoring a mounted character wielding Sting can fail +-fixed bug 1105100: Escaping from pits by polymorphing into a mind flayer +-Proxy: Implement get_no_glyph method for compatibility with nhproxy 0.9.1 +-fixed bug 1110081: in_container() uses obj->quan after deallocatin obj +-fixed bug 1116877: Dereferencing freed memory when applying bags which explode +-fixed bug 951483: Wands of cancellation can be held in a bag of holding +-fixed bug 1155634: charm spell or command undead spell invoke genocide +-fixed incorrect #ifdef resulting in compilation failure on ANSI only DOS builds +-fixed bug 1193070: Engraving with a wand of draining keeps illiterate + conduct (Nico Kist) +-fixed bug 924811: Fire vampires leave corpses +-fixed bug 1028948: casting stone to flesh on a gargoyle +-fixed bug 1213881: Lieutenants lack Firearms +-fixed bug 1212903: Int and Wis stats not correct (in obscure case) +-fixed bug 1175912: Deity-gifted pets should not attack like aligned unicorns + (Nico Kist) +-fixed bug 1205563: suppress_alert still says NetHack +-fixed bug 1157414: Do not "loose" faith +-fixed bug 1021014: leashed pet movement bug +-fixed bug 1197822: necromancer zombie's hp +-fixed bug 1185759: Shopkeeper "looks at corpse" through wall +-Experimental support for GNU autoconf ver 0.0.7E6F2 [May 3/2004] [Released by Ali] -fixed bug 910334: Vampire blood and foodless conduct -fixed bug 924384: Inconsistency with shoggoth corroding items diff -Naurbd slashem-0.0.8E0/include/decl.h slashem-0.0.8E1/include/decl.h --- slashem-0.0.8E0/include/decl.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/decl.h 2006-05-15 12:08:59.000000000 +0100 @@ -78,6 +78,7 @@ xchar d_sokoban_dnum; xchar d_mines_dnum, d_quest_dnum; xchar d_spiders_dnum; + xchar d_gehennom_dnum; d_level d_lawful_quest_level; d_level d_neutral_quest_level; d_level d_chaotic_quest_level; @@ -95,6 +96,8 @@ #endif #define medusa_level (dungeon_topology.d_medusa_level) #define stronghold_level (dungeon_topology.d_stronghold_level) +#define ucastle_level (dungeon_topology.d_ucastle_level) +#define lethe_last_level (dungeon_topology.d_lethe_last_level) #define valley_level (dungeon_topology.d_valley_level) #define mineend_level (dungeon_topology.d_mineend_level) #define wiz1_level (dungeon_topology.d_wiz1_level) @@ -119,6 +122,7 @@ #define sokoban_dnum (dungeon_topology.d_sokoban_dnum) #define mines_dnum (dungeon_topology.d_mines_dnum) #define quest_dnum (dungeon_topology.d_quest_dnum) +#define gehennom_dnum (dungeon_topology.d_gehennom_dnum) #define qstart_level (dungeon_topology.d_qstart_level) #define qlocate_level (dungeon_topology.d_qlocate_level) #define nemesis_level (dungeon_topology.d_nemesis_level) @@ -131,11 +135,9 @@ #define blackmarket_level (dungeon_topology.d_blackmarket_level) #endif /* BLACKMARKET */ -E NEARDATA stairway dnstair, upstair; /* stairs up and down */ -#define xdnstair (dnstair.sx) -#define ydnstair (dnstair.sy) -#define xupstair (upstair.sx) -#define yupstair (upstair.sy) +E NEARDATA stairway upstairs[MAXNRSTAIRS]; /* stairs up */ +E NEARDATA stairway dnstairs[MAXNRSTAIRS]; /* ... and down */ +E NEARDATA int n_upstairs, n_dnstairs; /* ... and their counters */ E NEARDATA stairway dnladder, upladder; /* ladders up and down */ #define xdnladder (dnladder.sx) @@ -356,6 +358,9 @@ /* material strings */ E const char *materialnm[]; +/* river strings */ +E const char *river_liquid[]; + /* Monster name articles */ #define ARTICLE_NONE 0 #define ARTICLE_THE 1 diff -Naurbd slashem-0.0.8E0/include/decl.h.orig slashem-0.0.8E1/include/decl.h.orig --- slashem-0.0.8E0/include/decl.h.orig 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/decl.h.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,488 +0,0 @@ -/* SCCS Id: @(#)decl.h 3.4 2001/12/10 */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/* NetHack may be freely redistributed. See license for details. */ - -#ifndef DECL_H -#define DECL_H - -#define E extern - -E int NDECL((*occupation)); -E int NDECL((*afternmv)); - -E const char *hname; -E int hackpid; -#if defined(UNIX) || defined(VMS) -E int locknum; -#endif -#ifdef DEF_PAGER -E char *catmore; -#endif /* DEF_PAGER */ - -E char SAVEF[]; -#ifdef MICRO -E char SAVEP[]; -#endif - -E NEARDATA int bases[MAXOCLASSES]; - -E NEARDATA int multi; -#if 0 -E NEARDATA int warnlevel; -#endif -E NEARDATA int lastuse; -E NEARDATA int nextuse; -E NEARDATA int nroom; -E NEARDATA int nsubroom; -E NEARDATA int occtime; - -#define WARNCOUNT 6 /* number of different warning levels */ -E uchar warnsyms[WARNCOUNT]; - -E int x_maze_max, y_maze_max; -E int otg_temp; - -#ifdef REDO -E NEARDATA int in_doagain; -#endif - -E struct dgn_topology { /* special dungeon levels for speed */ - d_level d_oracle_level; - d_level d_bigroom_level; /* unused */ -#ifdef REINCARNATION - d_level d_rogue_level; -#endif - d_level d_medusa_level; - d_level d_mineend_level; - d_level d_stronghold_level; - d_level d_valley_level; - d_level d_wiz1_level; - d_level d_wiz2_level; - d_level d_wiz3_level; - d_level d_juiblex_level; - d_level d_orcus_level; - d_level d_baalzebub_level; /* unused */ - d_level d_demogorgon_level; /* unused */ - d_level d_dispater_level; /* unused */ - d_level d_geryon_level; /* unused */ - d_level d_yeenoghu_level; /* unused */ - d_level d_asmodeus_level; /* unused */ - d_level d_portal_level; /* only in goto_level() [do.c] */ - d_level d_sanctum_level; - d_level d_earth_level; - d_level d_water_level; - d_level d_fire_level; - d_level d_air_level; - d_level d_astral_level; - xchar d_tower_dnum; - xchar d_sokoban_dnum; - xchar d_mines_dnum, d_quest_dnum; - xchar d_spiders_dnum; - d_level d_lawful_quest_level; - d_level d_neutral_quest_level; - d_level d_chaotic_quest_level; - d_level d_qstart_level, d_qlocate_level, d_nemesis_level; - d_level d_knox_level; -#ifdef BLACKMARKET - d_level d_blackmarket_level; -#endif /* BLACKMARKET */ -} dungeon_topology; -/* macros for accesing the dungeon levels by their old names */ -#define oracle_level (dungeon_topology.d_oracle_level) -#define bigroom_level (dungeon_topology.d_bigroom_level) -#ifdef REINCARNATION -#define rogue_level (dungeon_topology.d_rogue_level) -#endif -#define medusa_level (dungeon_topology.d_medusa_level) -#define stronghold_level (dungeon_topology.d_stronghold_level) -#define valley_level (dungeon_topology.d_valley_level) -#define mineend_level (dungeon_topology.d_mineend_level) -#define wiz1_level (dungeon_topology.d_wiz1_level) -#define wiz2_level (dungeon_topology.d_wiz2_level) -#define wiz3_level (dungeon_topology.d_wiz3_level) -#define juiblex_level (dungeon_topology.d_juiblex_level) -#define orcus_level (dungeon_topology.d_orcus_level) -#define baalzebub_level (dungeon_topology.d_baalzebub_level) -#define yeenoghu_level (dungeon_topology.d_yeenoghu_level) -#define geryon_level (dungeon_topology.d_geryon_level) -#define dispater_level (dungeon_topology.d_dispater_level) -#define demogorgon_level (dungeon_topology.d_demogorgon_level) -#define asmodeus_level (dungeon_topology.d_asmodeus_level) -#define portal_level (dungeon_topology.d_portal_level) -#define sanctum_level (dungeon_topology.d_sanctum_level) -#define earth_level (dungeon_topology.d_earth_level) -#define water_level (dungeon_topology.d_water_level) -#define fire_level (dungeon_topology.d_fire_level) -#define air_level (dungeon_topology.d_air_level) -#define astral_level (dungeon_topology.d_astral_level) -#define tower_dnum (dungeon_topology.d_tower_dnum) -#define sokoban_dnum (dungeon_topology.d_sokoban_dnum) -#define mines_dnum (dungeon_topology.d_mines_dnum) -#define quest_dnum (dungeon_topology.d_quest_dnum) -#define qstart_level (dungeon_topology.d_qstart_level) -#define qlocate_level (dungeon_topology.d_qlocate_level) -#define nemesis_level (dungeon_topology.d_nemesis_level) -#define knox_level (dungeon_topology.d_knox_level) -#define spiders_dnum (dungeon_topology.d_spiders_dnum) -#define lawful_quest_level (dungeon_topology.d_lawful_quest_level) -#define neutral_quest_level (dungeon_topology.d_neutral_quest_level) -#define chaotic_quest_level (dungeon_topology.d_chaotic_quest_level) -#ifdef BLACKMARKET -#define blackmarket_level (dungeon_topology.d_blackmarket_level) -#endif /* BLACKMARKET */ - -E NEARDATA stairway dnstair, upstair; /* stairs up and down */ -#define xdnstair (dnstair.sx) -#define ydnstair (dnstair.sy) -#define xupstair (upstair.sx) -#define yupstair (upstair.sy) - -E NEARDATA stairway dnladder, upladder; /* ladders up and down */ -#define xdnladder (dnladder.sx) -#define ydnladder (dnladder.sy) -#define xupladder (upladder.sx) -#define yupladder (upladder.sy) - -E NEARDATA stairway sstairs; - -E NEARDATA dest_area updest, dndest; /* level-change destination areas */ - -E NEARDATA coord inv_pos; -E NEARDATA dungeon dungeons[]; -E NEARDATA s_level *sp_levchn; -#define dunlev_reached(x) (dungeons[(x)->dnum].dunlev_ureached) - -#include "quest.h" -E struct q_score quest_status; - -E NEARDATA char pl_fruit[PL_FSIZ]; -E NEARDATA int current_fruit; -E NEARDATA struct fruit *ffruit; - -E NEARDATA char tune[6]; - -#define MAXLINFO (MAXDUNGEON * MAXLEVEL) -E struct linfo level_info[MAXLINFO]; - -E NEARDATA struct sinfo { - int gameover; /* self explanatory? */ - int stopprint; /* inhibit further end of game disclosure */ -#if defined(UNIX) || defined(VMS) || defined (__EMX__) || defined(WIN32) - int done_hup; /* SIGHUP or moral equivalent received - * -- no more screen output */ -#endif - int something_worth_saving; /* in case of panic */ - int panicking; /* `panic' is in progress */ -#if defined(VMS) || defined(WIN32) - int exiting; /* an exit handler is executing */ -#endif - int in_impossible; -#ifdef PANICLOG - int in_paniclog; -#endif -} program_state; - -E boolean restoring; - -E const char quitchars[]; -E const char vowels[]; -E const char ynchars[]; -E const char ynqchars[]; -E const char ynaqchars[]; -E const char ynNaqchars[]; -E NEARDATA long yn_number; - -E const char disclosure_options[]; - -E NEARDATA int smeq[]; -E NEARDATA int doorindex; -E NEARDATA char *save_cm; -#define KILLED_BY_AN 0 -#define KILLED_BY 1 -#define NO_KILLER_PREFIX 2 -E NEARDATA int killer_format; -E const char *killer; -E const char *delayed_killer; -#ifdef GOLDOBJ -E long done_money; -#endif -E char killer_buf[BUFSZ]; -#ifdef DUMP_LOG -E char dump_fn[]; /* dumpfile name (dump patch) */ -#endif -E const char *configfile; -E NEARDATA char plname[PL_NSIZ]; -E NEARDATA char dogname[]; -E NEARDATA char catname[]; -E NEARDATA char ghoulname[]; -E NEARDATA char horsename[]; -E NEARDATA char wolfname[]; -#if 0 -E NEARDATA char batname[]; -E NEARDATA char snakename[]; -E NEARDATA char ratname[]; -E NEARDATA char badgername[]; -E NEARDATA char reddragonname[]; -E NEARDATA char whitedragonname[]; -#endif -E char preferred_pet; -E const char *occtxt; /* defined when occupation != NULL */ -E const char *nomovemsg; -E const char nul[]; -E char lock[]; - -E const char sdir[], ndir[]; -E const schar xdir[], ydir[], zdir[]; - -E NEARDATA schar tbx, tby; /* set in mthrowu.c */ - -E NEARDATA struct multishot { int n, i; short o; boolean s; } m_shot; - -E NEARDATA struct dig_info { /* apply.c, hack.c */ - int effort; - d_level level; - coord pos; - long lastdigtime; - boolean down, chew, warned, quiet; -} digging; - -E NEARDATA long moves, monstermoves; -E NEARDATA long wailmsg; - -E NEARDATA boolean in_mklev; -E NEARDATA boolean stoned; -E NEARDATA boolean unweapon; -E NEARDATA boolean mrg_to_wielded; -E NEARDATA struct obj *current_wand; - -E NEARDATA boolean in_steed_dismounting; - -E const int shield_static[]; - - -/*** Objects ***/ -#include "obj.h" - -E NEARDATA struct obj *invent, *uarm, *uarmc, *uarmh, *uarms, *uarmg, *uarmf, -#ifdef TOURIST - *uarmu, /* under-wear, so to speak */ -#endif -#ifdef STEED - *usaddle, -#endif - *uskin, *uamul, *uleft, *uright, *ublindf, - *uwep, *uswapwep, *uquiver; - -E NEARDATA struct obj *uchain; /* defined only when punished */ -E NEARDATA struct obj *uball; -E NEARDATA struct obj *migrating_objs; -E NEARDATA struct obj *billobjs; -E NEARDATA struct obj zeroobj; /* init'd and defined in decl.c */ -E NEARDATA struct obj thisplace; /* init'd and defined in decl.c */ - -#include "spell.h" -E NEARDATA struct spell spl_book[]; /* sized in decl.c */ - -#ifndef TECH_H -#include "tech.h" -#endif -E NEARDATA struct tech tech_list[]; /* sized in decl.c */ - - -/*** The player ***/ -E NEARDATA char pl_character[PL_CSIZ]; -E NEARDATA char pl_race; /* character's race */ -/* KMH, role patch -- more maintainable when declared as an array */ -E const char pl_classes[]; - -#include "you.h" -#include "onames.h" - -E NEARDATA struct you u; -E NEARDATA struct Role urole; - - -/*** Monsters ***/ -#ifndef PM_H -#include "pm.h" -#endif - -E NEARDATA struct permonst playermon, *uasmon; - /* also decl'd extern in permonst.h */ - /* init'd in monst.c */ - -E NEARDATA struct monst youmonst; /* init'd and defined in decl.c */ -E NEARDATA struct monst *mydogs, *migrating_mons; - -E NEARDATA struct permonst upermonst; /* init'd in decl.c, - * defined in polyself.c - */ - -E NEARDATA struct mvitals { - uchar born; - uchar died; - uchar mvflags; -#ifdef EATEN_MEMORY - uchar eaten; /* WAC -- eaten memory */ -#endif -} mvitals[NUMMONS]; - - -/* The names of the colors used for gems, etc. */ -E const char *c_obj_colors[]; - -E struct c_common_strings { - const char *const c_nothing_happens, *const c_thats_enough_tries, - *const c_silly_thing_to, *const c_shudder_for_moment, - *const c_something, *const c_Something, - *const c_You_can_move_again, - *const c_Never_mind, *c_vision_clears, - *const c_the_your[2]; -} c_common_strings; -#define nothing_happens c_common_strings.c_nothing_happens -#define thats_enough_tries c_common_strings.c_thats_enough_tries -#define silly_thing_to c_common_strings.c_silly_thing_to -#define shudder_for_moment c_common_strings.c_shudder_for_moment -#define something c_common_strings.c_something -#define Something c_common_strings.c_Something -#define You_can_move_again c_common_strings.c_You_can_move_again -#define Never_mind c_common_strings.c_Never_mind -#define vision_clears c_common_strings.c_vision_clears -#define the_your c_common_strings.c_the_your - -E const char no_elbow_room[]; - -/* material strings */ -E const char *materialnm[]; - -/* Monster name articles */ -#define ARTICLE_NONE 0 -#define ARTICLE_THE 1 -#define ARTICLE_A 2 -#define ARTICLE_YOUR 3 - -/* Monster name suppress masks */ -#define SUPPRESS_IT 0x01 -#define SUPPRESS_INVISIBLE 0x02 -#define SUPPRESS_HALLUCINATION 0x04 -#define SUPPRESS_SADDLE 0x08 -#define EXACT_NAME 0x0F - - -/*** Vision ***/ -E NEARDATA boolean vision_full_recalc; /* TRUE if need vision recalc */ -E NEARDATA char **viz_array; /* could see/in sight row pointers */ - - -/*** Window system stuff ***/ -#include "color.h" -#ifdef TEXTCOLOR -E const int zapcolors[]; -#endif - -E const char def_oc_syms[MAXOCLASSES]; /* default class symbols */ -E uchar oc_syms[MAXOCLASSES]; /* current class symbols */ -E const char def_monsyms[MAXMCLASSES]; /* default class symbols */ -E uchar monsyms[MAXMCLASSES]; /* current class symbols */ - -E NEARDATA struct c_color_names { - const char *const c_black, *const c_amber, *const c_golden, - *const c_light_blue,*const c_red, *const c_green, - *const c_silver, *const c_blue, *const c_purple, - *const c_white; -} c_color_names; -#define NH_BLACK c_color_names.c_black -#define NH_AMBER c_color_names.c_amber -#define NH_GOLDEN c_color_names.c_golden -#define NH_LIGHT_BLUE c_color_names.c_light_blue -#define NH_RED c_color_names.c_red -#define NH_GREEN c_color_names.c_green -#define NH_SILVER c_color_names.c_silver -#define NH_BLUE c_color_names.c_blue -#define NH_PURPLE c_color_names.c_purple -#define NH_WHITE c_color_names.c_white - -E NEARDATA winid WIN_MESSAGE, WIN_STATUS; -E NEARDATA winid WIN_MAP, WIN_INVEN; -E char toplines[]; -#ifndef TCAP_H -E struct tc_gbl_data { /* also declared in tcap.h */ - char *tc_AS, *tc_AE; /* graphics start and end (tty font swapping) */ - int tc_LI, tc_CO; /* lines and columns */ -} tc_gbl_data; -#define AS tc_gbl_data.tc_AS -#define AE tc_gbl_data.tc_AE -#define LI tc_gbl_data.tc_LI -#define CO tc_gbl_data.tc_CO -#endif - -E struct authentication { - char prog[BUFSZ]; - char args[BUFSZ]; -} authentication; - -#define MAXNOTILESETS 20 -#ifndef TILESET_MAX_FILENAME -#define TILESET_MAX_FILENAME 256 -#endif - -#define TILESET_TRANSPARENT 1 -#define TILESET_PSEUDO3D 2 - -E struct tileset { - char name[PL_PSIZ]; - char file[TILESET_MAX_FILENAME]; - unsigned long flags; - void *data; /* For windowing port's use */ -} tilesets[MAXNOTILESETS]; -E int no_tilesets; -E struct tileset def_tilesets[]; -E char tileset[PL_PSIZ]; - -/* xxxexplain[] is in drawing.c */ -E const char * const monexplain[], invisexplain[], * const objexplain[], * const oclass_names[]; - -/* Some systems want to use full pathnames for some subsets of file names, - * rather than assuming that they're all in the current directory. This - * provides all the subclasses that seem reasonable, and sets up for all - * prefixes being null. Port code can set those that it wants. - */ -#define HACKPREFIX 0 -#define LEVELPREFIX 1 -#define SAVEPREFIX 2 -#define BONESPREFIX 3 -#define DATAPREFIX 4 /* this one must match hardcoded value in dlb.c */ -#define SCOREPREFIX 5 -#define LOCKPREFIX 6 -#define CONFIGPREFIX 7 -#define TROUBLEPREFIX 8 -#define PREFIX_COUNT 9 -/* used in files.c; xxconf.h can override if needed */ -# ifndef FQN_MAX_FILENAME -#define FQN_MAX_FILENAME 512 -# endif - -#if defined(NOCWD_ASSUMPTIONS) || defined(VAR_PLAYGROUND) -/* the bare-bones stuff is unconditional above to simplify coding; for - * ports that actually use prefixes, add some more localized things - */ -#define PREFIXES_IN_USE -#endif - -E char *fqn_prefix[PREFIX_COUNT]; -#ifdef PREFIXES_IN_USE -E char *fqn_prefix_names[PREFIX_COUNT]; -#endif - - -#ifdef AUTOPICKUP_EXCEPTIONS -struct autopickup_exception { - char *pattern; - boolean grab; - struct autopickup_exception *next; -}; -#endif /* AUTOPICKUP_EXCEPTIONS */ - -#undef E - -#endif /* DECL_H */ diff -Naurbd slashem-0.0.8E0/include/display.h slashem-0.0.8E1/include/display.h --- slashem-0.0.8E0/include/display.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/display.h 2006-05-15 12:08:59.000000000 +0100 @@ -173,6 +173,7 @@ /* * covers_objects() + * covers_boulders() * covers_traps() * * These routines are true if what is really at the given location will @@ -181,6 +182,9 @@ #define covers_objects(xx,yy) \ ((is_pool(xx,yy) && !Underwater) || (levl[xx][yy].typ == LAVAPOOL)) +#define covers_boulders(xx,yy) \ + (levl[xx][yy].typ != RIVER && covers_objects(xx,yy)) + #define covers_traps(xx,yy) covers_objects(xx,yy) diff -Naurbd slashem-0.0.8E0/include/dungeon.h slashem-0.0.8E1/include/dungeon.h --- slashem-0.0.8E0/include/dungeon.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/dungeon.h 2006-05-15 12:08:59.000000000 +0100 @@ -117,7 +117,6 @@ #define Is_rogue_level(x) (on_level(x, &rogue_level)) #define Is_stronghold(x) (on_level(x, &stronghold_level)) #define Is_bigroom(x) (on_level(x, &bigroom_level)) - #define Is_demogorgon_level(x) (on_level(x, &demogorgon_level)) #define Is_yeenoghu_level(x) (on_level(x, &yeenoghu_level)) #define Is_geryon_level(x) (on_level(x, &geryon_level)) diff -Naurbd slashem-0.0.8E0/include/extern.h slashem-0.0.8E1/include/extern.h --- slashem-0.0.8E0/include/extern.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/extern.h 2006-05-15 12:08:59.000000000 +0100 @@ -538,9 +538,9 @@ E void FDECL(prev_level, (BOOLEAN_P)); E void FDECL(u_on_newpos, (int,int)); E void NDECL(u_on_sstairs); -E void NDECL(u_on_upstairs); -E void NDECL(u_on_dnstairs); -E boolean FDECL(On_stairs, (XCHAR_P,XCHAR_P)); +E void FDECL(u_on_upstairs, (int,int)); +E void FDECL(u_on_dnstairs, (int,int)); +E int FDECL(On_stairs, (XCHAR_P,XCHAR_P)); E void FDECL(get_level, (d_level *,int)); E boolean FDECL(Is_botlevel, (d_level *)); E boolean FDECL(Can_fall_thru, (d_level *)); @@ -555,6 +555,8 @@ E boolean FDECL(In_V_tower, (d_level *)); E boolean FDECL(On_W_tower_level, (d_level *)); E boolean FDECL(In_W_tower, (int,int,d_level *)); +E void FDECL(find_castle_dungeon, (d_level *)); +E void FDECL(goto_prision, (BOOLEAN_P,BOOLEAN_P)); E void FDECL(find_hell, (d_level *)); E void FDECL(goto_hell, (BOOLEAN_P,BOOLEAN_P)); E void FDECL(assign_level, (d_level *,d_level *)); @@ -1027,7 +1029,7 @@ E boolean FDECL(is_home_elemental, (struct permonst *)); E struct monst *FDECL(clone_mon, (struct monst *,XCHAR_P,XCHAR_P)); E struct monst *FDECL(makemon, (struct permonst *,int,int,int)); -E boolean FDECL(create_critters, (int,struct permonst *)); +E boolean FDECL(create_critters, (int,struct permonst *,int)); E struct permonst *NDECL(rndmonst); E void FDECL(reset_rndmonst, (int)); E struct permonst *FDECL(mkclass, (CHAR_P,int)); @@ -1685,7 +1687,7 @@ E void FDECL(strange_feeling, (struct obj *,const char *)); E void FDECL(potionhit, (struct monst *,struct obj *,BOOLEAN_P)); E void FDECL(potionbreathe, (struct obj *)); -E boolean FDECL(get_wet, (struct obj *, BOOLEAN_P)); +E boolean FDECL(get_wet, (struct obj *, int)); E int NDECL(dodip); E void FDECL(djinni_from_bottle, (struct obj *)); /* KMH, balance patch -- new function */ @@ -1710,6 +1712,7 @@ E const char *FDECL(halu_gname, (ALIGNTYP_P)); E const char *FDECL(align_gtitle, (ALIGNTYP_P)); E void FDECL(altar_wrath, (int,int)); +E void NDECL(moloch_denies_you); /* ### priest.c ### */ @@ -1947,6 +1950,7 @@ E void FDECL(subfrombill, (struct obj *,struct monst *)); E long FDECL(stolen_value, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P,BOOLEAN_P, BOOLEAN_P)); +E void FDECL(revive_parrot, (struct monst *, struct obj *)); E void FDECL(sellobj_state, (int)); E void FDECL(sellobj, (struct obj *,XCHAR_P,XCHAR_P)); E int FDECL(doinvbill, (int)); diff -Naurbd slashem-0.0.8E0/include/global.h slashem-0.0.8E1/include/global.h --- slashem-0.0.8E0/include/global.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/global.h 2006-05-15 12:08:59.000000000 +0100 @@ -411,6 +411,7 @@ #define MAXDUNGEON 32 /* current maximum number of dungeons */ #define MAXLEVEL 50 /* max number of levels in one dungeon */ #define MAXSTAIRS 1 /* max # of special stairways in a dungeon */ +#define MAXNRSTAIRS 32 /* max # of normal stairs up/down on a level */ #define ALIGNWEIGHT 10 /* generation weight of alignment */ #define MAXULEV 30 /* max character experience level */ diff -Naurbd slashem-0.0.8E0/include/mkroom.h slashem-0.0.8E1/include/mkroom.h --- slashem-0.0.8E0/include/mkroom.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/mkroom.h 2006-05-15 12:08:59.000000000 +0100 @@ -43,7 +43,8 @@ * there is at most one non-vault special room on a level */ -extern struct mkroom *dnstairs_room, *upstairs_room, *sstairs_room; +extern struct mkroom *dnstairs_rooms[MAXNRSTAIRS], *upstairs_rooms[MAXNRSTAIRS], + *sstairs_room; struct door { xchar x,y; diff -Naurbd slashem-0.0.8E0/include/monflag.h slashem-0.0.8E1/include/monflag.h --- slashem-0.0.8E0/include/monflag.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/monflag.h 2006-05-15 12:08:59.000000000 +0100 @@ -235,4 +235,13 @@ /* Additional flag for mkclass() */ #define MKC_ULIMIT 0x10000 /* place an upper limit on difficulty of generated monster */ + +/* Lethe */ +/* For create_critters and demonology... */ +#define MAKE_EM_NATURAL 0 /* Create monsters... */ +#define MAKE_EM_HOSTILE 1 /* Create hostile monsters... */ +#define MAKE_EM_PEACEFUL 2 /* Create peaceful monsters... */ +#define MAKE_EM_TAME 3 /* Create tamed monsters... */ + + #endif /* MONFLAG_H */ diff -Naurbd slashem-0.0.8E0/include/patchlevel.h slashem-0.0.8E1/include/patchlevel.h --- slashem-0.0.8E0/include/patchlevel.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/patchlevel.h 2006-05-15 12:08:59.000000000 +0100 @@ -15,11 +15,13 @@ * PATCHLEVEL is updated for each release. */ #define PATCHLEVEL 8 -#define EDITLEVEL 0 -/* #define FIXLEVEL 0 */ +#define EDITLEVEL 1 +#if 0 +#define FIXLEVEL 0 +#endif #define COPYRIGHT_BANNER_A \ -"This is SuperLotsoAddedStuffHack-Extended Magic 1997-2004" +"This is SuperLotsoAddedStuffHack-Extended Magic 1997-2005" #define COPYRIGHT_BANNER_B \ "NetHack, Copyright 1985-2003 Stichting Mathematisch Centrum, M. Stephenson." diff -Naurbd slashem-0.0.8E0/include/rm.h slashem-0.0.8E1/include/rm.h --- slashem-0.0.8E0/include/rm.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/rm.h 2006-05-15 12:08:59.000000000 +0100 @@ -51,24 +51,25 @@ #define WATER 18 #define DRAWBRIDGE_UP 19 #define LAVAPOOL 20 -#define IRONBARS 21 /* Added by KMH */ -#define DOOR 22 -#define CORR 23 -#define ROOM 24 -#define STAIRS 25 -#define LADDER 26 -#define FOUNTAIN 27 -#define THRONE 28 -#define SINK 29 -#define TOILET 30 -#define GRAVE 31 -#define ALTAR 32 -#define ICE 33 -#define DRAWBRIDGE_DOWN 34 -#define AIR 35 -#define CLOUD 36 +#define RIVER 21 +#define IRONBARS 22 /* Added by KMH */ +#define DOOR 23 +#define CORR 24 +#define ROOM 25 +#define STAIRS 26 +#define LADDER 27 +#define FOUNTAIN 28 +#define THRONE 29 +#define SINK 30 +#define TOILET 31 +#define GRAVE 32 +#define ALTAR 33 +#define ICE 34 +#define DRAWBRIDGE_DOWN 35 +#define AIR 36 +#define CLOUD 37 -#define MAX_TYPE 37 +#define MAX_TYPE 38 #define INVALID_TYPE 127 /* @@ -142,79 +143,81 @@ #define S_pool 32 #define S_ice 33 #define S_lava 34 -#define S_vodbridge 35 -#define S_hodbridge 36 -#define S_vcdbridge 37 /* closed drawbridge, vertical wall */ -#define S_hcdbridge 38 /* closed drawbridge, horizontal wall */ -#define S_air 39 -#define S_cloud 40 -#define S_water 41 +#define S_lethe 35 +#define S_phlegethon 36 +#define S_vodbridge 37 +#define S_hodbridge 38 +#define S_vcdbridge 39 /* closed drawbridge, vertical wall */ +#define S_hcdbridge 40 /* closed drawbridge, horizontal wall */ +#define S_air 41 +#define S_cloud 42 +#define S_water 43 /* end dungeon characters, begin traps */ -#define S_arrow_trap 42 -#define S_dart_trap 43 -#define S_falling_rock_trap 44 -#define S_squeaky_board 45 -#define S_bear_trap 46 -#define S_land_mine 47 -#define S_rolling_boulder_trap 48 -#define S_sleeping_gas_trap 49 -#define S_rust_trap 50 -#define S_fire_trap 51 -#define S_pit 52 -#define S_spiked_pit 53 -#define S_hole 54 -#define S_trap_door 55 -#define S_teleportation_trap 56 -#define S_level_teleporter 57 -#define S_magic_portal 58 -#define S_web 59 -#define S_statue_trap 60 -#define S_magic_trap 61 -#define S_anti_magic_trap 62 -#define S_polymorph_trap 63 +#define S_arrow_trap 44 +#define S_dart_trap 45 +#define S_falling_rock_trap 46 +#define S_squeaky_board 47 +#define S_bear_trap 48 +#define S_land_mine 49 +#define S_rolling_boulder_trap 50 +#define S_sleeping_gas_trap 51 +#define S_rust_trap 52 +#define S_fire_trap 53 +#define S_pit 54 +#define S_spiked_pit 55 +#define S_hole 56 +#define S_trap_door 57 +#define S_teleportation_trap 58 +#define S_level_teleporter 59 +#define S_magic_portal 60 +#define S_web 61 +#define S_statue_trap 62 +#define S_magic_trap 63 +#define S_anti_magic_trap 64 +#define S_polymorph_trap 65 /* end traps, begin special effects */ -#define S_vbeam 64 /* The 4 zap beam symbols. Do NOT separate. */ -#define S_hbeam 65 /* To change order or add, see function */ -#define S_lslant 66 /* zapdir_to_glyph() in display.c. */ -#define S_rslant 67 -#define S_digbeam 68 /* dig beam symbol */ -#define S_flashbeam 69 /* camera flash symbol */ -#define S_boomleft 70 /* thrown boomerang, open left, e.g ')' */ -#define S_boomright 71 /* thrown boomerand, open right, e.g. '(' */ -#define S_ss1 72 /* 4 magic shield glyphs */ -#define S_ss2 73 -#define S_ss3 74 -#define S_ss4 75 +#define S_vbeam 66 /* The 4 zap beam symbols. Do NOT separate. */ +#define S_hbeam 67 /* To change order or add, see function */ +#define S_lslant 68 /* zapdir_to_glyph() in display.c. */ +#define S_rslant 69 +#define S_digbeam 70 /* dig beam symbol */ +#define S_flashbeam 71 /* camera flash symbol */ +#define S_boomleft 72 /* thrown boomerang, open left, e.g ')' */ +#define S_boomright 73 /* thrown boomerand, open right, e.g. '(' */ +#define S_ss1 74 /* 4 magic shield glyphs */ +#define S_ss2 75 +#define S_ss3 76 +#define S_ss4 77 /* The 8 swallow symbols. Do NOT separate. To change order or add, see */ /* the function swallow_to_glyph() in display.c. */ -#define S_sw_tl 76 /* swallow top left [1] */ -#define S_sw_tc 77 /* swallow top center [2] Order: */ -#define S_sw_tr 78 /* swallow top right [3] */ -#define S_sw_ml 79 /* swallow middle left [4] 1 2 3 */ -#define S_sw_mr 80 /* swallow middle right [6] 4 5 6 */ -#define S_sw_bl 81 /* swallow bottom left [7] 7 8 9 */ -#define S_sw_bc 82 /* swallow bottom center [8] */ -#define S_sw_br 83 /* swallow bottom right [9] */ +#define S_sw_tl 78 /* swallow top left [1] */ +#define S_sw_tc 79 /* swallow top center [2] Order: */ +#define S_sw_tr 80 /* swallow top right [3] */ +#define S_sw_ml 81 /* swallow middle left [4] 1 2 3 */ +#define S_sw_mr 82 /* swallow middle right [6] 4 5 6 */ +#define S_sw_bl 83 /* swallow bottom left [7] 7 8 9 */ +#define S_sw_bc 84 /* swallow bottom center [8] */ +#define S_sw_br 85 /* swallow bottom right [9] */ -#define S_explode1 84 /* explosion top left */ -#define S_explode2 85 /* explosion top center */ -#define S_explode3 86 /* explosion top right Ex. */ -#define S_explode4 87 /* explosion middle left */ -#define S_explode5 88 /* explosion middle center /-\ */ -#define S_explode6 89 /* explosion middle right |@| */ -#define S_explode7 90 /* explosion bottom left \-/ */ -#define S_explode8 91 /* explosion bottom center */ -#define S_explode9 92 /* explosion bottom right */ +#define S_explode1 86 /* explosion top left */ +#define S_explode2 87 /* explosion top center */ +#define S_explode3 88 /* explosion top right Ex. */ +#define S_explode4 89 /* explosion middle left */ +#define S_explode5 90 /* explosion middle center /-\ */ +#define S_explode6 91 /* explosion middle right |@| */ +#define S_explode7 92 /* explosion bottom left \-/ */ +#define S_explode8 93 /* explosion bottom center */ +#define S_explode9 94 /* explosion bottom right */ /* end effects */ -#define MAXPCHARS 93 /* maximum number of mapped characters */ -#define MAXDCHARS 42 /* maximum of mapped dungeon characters */ +#define MAXPCHARS 95 /* maximum number of mapped characters */ +#define MAXDCHARS 44 /* maximum of mapped dungeon characters */ #define MAXTCHARS 22 /* maximum of mapped trap characters */ #define MAXECHARS 29 /* maximum of mapped effects characters */ #define MAXEXPCHARS 9 /* number of explosion characters */ @@ -481,7 +484,10 @@ Bitfield(is_cavernous_lev,1); Bitfield(arboreal, 1); /* Trees replace rock */ Bitfield(spooky,1); /* Spooky sounds (Tina Hall) */ - Bitfield(lethe, 1); /* All water on level causes amnesia */ + Bitfield(river, 2); +#define RIVER_NONE 0 /* Normal level */ +#define RIVER_LETHE 1 /* All water on level causes amnesia */ +#define RIVER_PHLEGETHON 2 /* All "water" is boiling blood */ }; typedef struct diff -Naurbd slashem-0.0.8E0/include/sp_lev.h slashem-0.0.8E1/include/sp_lev.h --- slashem-0.0.8E0/include/sp_lev.h 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/include/sp_lev.h 2006-05-15 12:08:59.000000000 +0100 @@ -24,6 +24,7 @@ #define ARBOREAL 16 #define SPOOKY 32 #define LETHE 64 /* All water on level is Lethe-ized */ +#define PHLEGETHON 128 /* and similarly for phlegethon */ /* special level types */ #define SP_LEV_ROOMS 1 diff -Naurbd slashem-0.0.8E0/readme.txt slashem-0.0.8E1/readme.txt --- slashem-0.0.8E0/readme.txt 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/readme.txt 2006-05-15 12:08:59.000000000 +0100 @@ -62,119 +62,21 @@ http://www.slashem.org/ -1.2 Changes ------------ +1.2 Phelegethon experiment +-------------------------- -ver 0.0.8E0 [July 2/2005] [Released by Ali] --Added dumplog patch (Tom Friedetzky and Jukka Lahtinen) --fixed bug 923003: Invisible mirrors can be applied --fixed bug 916544: Wrong weight of corpses on Nightmare level --fixed bug 947369: Crash when multiple wands explode --fixed bug 950120: crash when wishing for Wallet of Perseus --fixed bug 933365: wand of draining does not interrupt ctrl-run --fixed bug 933379: weird behaviour with polyself into monsters like migo drone --fixed bug 929546: Flaming spheres won't attack acid blobs --fixed bug 951991: Reading spellbooks not safe for wizards --fixed bug 914894: "Beautiful" gnome thief seduced female character --fixed bug 918178: Double message "You are suddenly very hot/cold!" --fixed bug 921810: Invisible books can be read (?!) --fixed bug 934076: Dipping amnesia into amnesia gives water --fixed bug 946306: do_look: bad glyph 3726 at (7, 16) --fixed bug 929220: Prayer and chi healing --fixed bug 946157: Water elementals created over lava on Flame mage quest --fixed bug 946161: Bad message when two-weaponing against a rust monster --fixed bug 946566: Partly eaten more nutritious while raising drained corpses --fixed bug 946984: arch-liches are not MR_HITAS* --fixed bug 949016: Draining a rotten corpse --fixed bug 951439: Invisible Corpses and Ressurection --fixed bug 941453: Grand slam against monsters needing +n weapons --fixed bug 962515: Disarming fire trap doesn't use up water --fixed bug 1001167: Is this a Gray Stone bug? --fixed bug 992247: wolfname & ghoulname in default.nh doesn't work --fixed bug 931679: Space Bar not working as rest --fixed bug 912588: Molds stagger from your powerful strike --fixed bug 962574: Display bug when setting OPTIONS=tiles:Small tiles --fixed bug 1011313: SEGV using technique "raise zombies" --fixed bug 1018229: impossible splitbill: no resident shopkeeper?? --fixed bug 1018447: Game crash when Hero with ball displace displacer beast --fixed bug 1020983: Typo in doc/sources.txt (cloack) --fixed bug 956891: Breeders are explosive --fixed bug 1007127: diluted potion of water --fixed bug 1010421: Thiefbane drains your levels even if you aren't hit --fixed bug 976157: Dipping into !oAmnesia didn't use up potion --fixed bug 982331: Can't name Cursed scrolls of teleport after reading them --fixed some theoretical bugs thrown up by valgrind --fixed bug 980258: Guidebook doesn't describe showdmg option accurately - (Andy Ruse) --fixed bug 926202: Gnome thieves don't eat (Andy Ruse) --fixed bug 926200: Dwarf thieves have M2_NOPOLY (Andy Ruse) --fixed bug 962568: Mjollnir can't be thrown - code comment incorrect (Andy Ruse) --fixed bug 1005587: Beholder killed by "it's" own gaze (Andy Ruse) --fixed bug 1022460: [C343-8] The plural of Nazgul is Nazgul (Andy Ruse) --fixed bug 1039689: malloc_consolidate hang after using cursed bag of holding --fixed bug 1028955: Surgery technique doesn't work with polymorph --fixed bug 1035356: God gave Deathsword to "human" character --fixed bug 1024200: Problems about Thiefbane --fixed bug 1024202: Dipping a loadstone into a potion of amnesia --fixed bug 1038151: Power surge becomes permanent if lost --fixed bug 1025486: Pets can't follow lvl telep from Blk Mkt --fixed bug 1029750: Lycanthropes and eating wolfsbane while polymorphed --fixed bug 1030725: Doppelganger liquid leap does not release from chain --fixed bug 1032419: Eviscerate tech should not work while wearing gloves --fixed bug 1055724: Raise Zombies gives tame troll --fixed bug 1020980: Objects are forgotten when you search blind --fixed bug 954414: pickup_thrown option includes some non-throw weapons --fixed bug 937239: Wrong cause of death from exploding wands --fixed bug 962572: Inventory item prints to console instead of chat buffer --fixed bug 936167: Started with empty medical kit (Pasi Kallinen) --fixed bug 934077: Wrote an invisible scroll (Pasi Kallinen) --fixed bug 1015079: Spurious "it snatches the boulder" message (Pasi Kallinen) --fixed bug 957731: Shop purchases free after 200 objects --fixed bug 1062624: GTK Interface is not resizable --fixed bug 931684: Inventory window behaving strangely --Fixed build of proxy tests --fixed bug 1071688: cannot compile on FreeBSD (termcap) --fixed bug 1071623: Cannot compile on FreeBSD due to menucolor inclusion --Unbundled proxy and gtk modules: - http://www.nongnu.org/nhproxy/ - http://www.gtkhack.org/ --fixed bug 993420: Crashes when typing symbols on drop menu --fixed bug 1084366: ghoul queen don't has M2_FEMALE --fixed bug 1066530: Fired/thrown items get new inventory letter when retrieved --fixed bug 992244: Alt Gr key doesn't work --fixed bug 1076125: Unsuccessful use of medical kits --fixed bug 1076123: Vampires can eat white pills --fixed bug 994993: when polying, you take off T-shirt after scales merge --fixed bug 961914: Deep dragons should resist their own breath --fixed bug 963344: Stat exercise effects calculated while polymorphed --fixed bug 1097792: Duplicate message when hit by sleep gaze --fixed bug 1065927: Should bars stop bullets? --fixed bug 947009: Scroll of taming exercises skill in healing spells --fixed bug 1077355: game crashes with: "panic monsndx - could not index monster" --fixed bug 1098686: Restoring a mounted character wielding Sting can fail --fixed bug 1105100: Escaping from pits by polymorphing into a mind flayer --Proxy: Implement get_no_glyph method for compatibility with nhproxy 0.9.1 --fixed bug 1110081: in_container() uses obj->quan after deallocatin obj --fixed bug 1116877: Dereferencing freed memory when applying bags which explode --fixed bug 951483: Wands of cancellation can be held in a bag of holding --fixed bug 1155634: charm spell or command undead spell invoke genocide --fixed incorrect #ifdef resulting in compilation failure on ANSI only DOS builds --fixed bug 1193070: Engraving with a wand of draining keeps illiterate - conduct (Nico Kist) --fixed bug 924811: Fire vampires leave corpses --fixed bug 1028948: casting stone to flesh on a gargoyle --fixed bug 1213881: Lieutenants lack Firearms --fixed bug 1212903: Int and Wis stats not correct (in obscure case) --fixed bug 1175912: Deity-gifted pets should not attack like aligned unicorns - (Nico Kist) --fixed bug 1205563: suppress_alert still says NetHack --fixed bug 1157414: Do not "loose" faith --fixed bug 1021014: leashed pet movement bug --fixed bug 1197822: necromancer zombie's hp --fixed bug 1185759: Shopkeeper "looks at corpse" through wall --Experimental support for GNU autoconf +Version 0.0.8E1 is an experimental branch to try out Ali's proposal +for integrating Mik Clarke's Lethe patch. The following issues are +known about: -See history.txt for changes made in previous versions. +* Data base (review SLethe additions too). +* Check player level teleport. +* Check dungeon numbers in dungeon.c - lethe changes assume lethe is + dungeon 1 (which is now back to gehennom). +* ^O feedback for stair to elemental planes is unhelpful. +* Beef up cerberus. +* Labyrinth isn't complete (just enough to give an idea of what it might + look like). +----------------------------+ | Section 2: Getting started | diff -Naurbd slashem-0.0.8E0/src/allmain.c slashem-0.0.8E1/src/allmain.c --- slashem-0.0.8E0/src/allmain.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/allmain.c 2006-05-15 12:08:59.000000000 +0100 @@ -572,7 +572,7 @@ /* quest_init();*/ /* Now part of role_init() */ mklev(); - u_on_upstairs(); + u_on_upstairs(0, 0); vision_reset(); /* set up internals for level (after mklev) */ check_special_room(FALSE); diff -Naurbd slashem-0.0.8E0/src/allmain.c.orig slashem-0.0.8E1/src/allmain.c.orig --- slashem-0.0.8E0/src/allmain.c.orig 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/allmain.c.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,718 +0,0 @@ -/* SCCS Id: @(#)allmain.c 3.4 2003/04/02 */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* various code that was replicated in *main.c */ - -#include "hack.h" -#ifndef NO_SIGNAL -#include -#endif -#ifdef SHORT_FILENAMES -#include "patchlev.h" -#else -#include "patchlevel.h" -#endif - -#ifdef POSITIONBAR -STATIC_DCL void NDECL(do_positionbar); -#endif - -#define decrnknow(spell) spl_book[spell].sp_know-- -#define spellid(spell) spl_book[spell].sp_id -#define spellknow(spell) spl_book[spell].sp_know - -#ifdef OVL0 - -void -moveloop() -{ -#if defined(MICRO) || defined(WIN32) - char ch; - int abort_lev; -#endif - int moveamt = 0, wtcap = 0, change = 0; - boolean didmove = FALSE, monscanmove = FALSE; - - flags.moonphase = phase_of_the_moon(); - if(flags.moonphase == FULL_MOON) { - You("are lucky! Full moon tonight."); - change_luck(1); - } else if(flags.moonphase == NEW_MOON) { - pline("Be careful! New moon tonight."); - } - flags.friday13 = friday_13th(); - if (flags.friday13) { - pline("Watch out! Bad things can happen on Friday the 13th."); - change_luck(-1); - } - /* KMH -- February 2 */ - flags.groundhogday = groundhog_day(); - if (flags.groundhogday) - pline("Happy Groundhog Day!"); - - initrack(); - - - /* Note: these initializers don't do anything except guarantee that - we're linked properly. - */ - decl_init(); - monst_init(); - monstr_init(); /* monster strengths */ - objects_init(); - -#ifdef WIZARD - if (wizard) add_debug_extended_commands(); -#endif - - (void) encumber_msg(); /* in case they auto-picked up something */ - - u.uz0.dlevel = u.uz.dlevel; - youmonst.movement = NORMAL_SPEED; /* give the hero some movement points */ - - for(;;) { - get_nh_event(); -#ifdef POSITIONBAR - do_positionbar(); -#endif - - didmove = flags.move; - if(didmove) { - /* actual time passed */ - youmonst.movement -= NORMAL_SPEED; - - do { /* hero can't move this turn loop */ - wtcap = encumber_msg(); - - flags.mon_moving = TRUE; - do { - monscanmove = movemon(); - if (youmonst.movement > NORMAL_SPEED) - break; /* it's now your turn */ - } while (monscanmove); - flags.mon_moving = FALSE; - - if (!monscanmove && youmonst.movement < NORMAL_SPEED) { - /* both you and the monsters are out of steam this round */ - /* set up for a new turn */ - struct monst *mtmp; - mcalcdistress(); /* adjust monsters' trap, blind, etc */ - - /* reallocate movement rations to monsters */ - for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) - mtmp->movement += mcalcmove(mtmp); - - if(!rn2(u.uevent.udemigod ? 25 : - (depth(&u.uz) > depth(&stronghold_level)) ? 50 : 70)) - (void) makemon((struct permonst *)0, 0, 0, NO_MM_FLAGS); - - /* calculate how much time passed. */ -#ifdef STEED - if (u.usteed && u.umoved) { - /* your speed doesn't augment steed's speed */ - moveamt = mcalcmove(u.usteed); - } else -#endif - { - moveamt = youmonst.data->mmove; - - if (Very_fast) { /* speed boots or potion */ - /* average movement is 1.67 times normal */ - moveamt += NORMAL_SPEED / 2; - if (rn2(3) == 0) moveamt += NORMAL_SPEED / 2; - } else if (Fast) { - /* average movement is 1.33 times normal */ - if (rn2(3) != 0) moveamt += NORMAL_SPEED / 2; - } - if (tech_inuse(T_BLINK)) { /* TECH: Blinking! */ - /* Case Average Variance - * ------------------------- - * Normal 12 0 - * Fast 16 12 - * V fast 20 12 - * Blinking 24 12 - * F & B 28 18 - * V F & B 30 18 - */ - moveamt += NORMAL_SPEED * 2 / 3; - if (rn2(3) == 0) moveamt += NORMAL_SPEED / 2; - } - } - - switch (wtcap) { - case UNENCUMBERED: break; - case SLT_ENCUMBER: moveamt -= (moveamt / 4); break; - case MOD_ENCUMBER: moveamt -= (moveamt / 2); break; - case HVY_ENCUMBER: moveamt -= ((moveamt * 3) / 4); break; - case EXT_ENCUMBER: moveamt -= ((moveamt * 7) / 8); break; - default: break; - } - - youmonst.movement += moveamt; - if (youmonst.movement < 0) youmonst.movement = 0; - settrack(); - - monstermoves++; - moves++; - - /********************************/ - /* once-per-turn things go here */ - /********************************/ - - if (flags.bypasses) clear_bypasses(); - if(Glib) glibr(); - nh_timeout(); - run_regions(); - -#ifdef DUNGEON_GROWTH - dgn_growths(TRUE, TRUE); -#endif - - if (u.ublesscnt) u.ublesscnt--; - - if(flags.time && !flags.run) - flags.botl = 1; - - /* One possible result of prayer is healing. Whether or - * not you get healed depends on your current hit points. - * If you are allowed to regenerate during the prayer, the - * end-of-prayer calculation messes up on this. - * Another possible result is rehumanization, which requires - * that encumbrance and movement rate be recalculated. - */ - if (u.uinvulnerable) { - /* for the moment at least, you're in tiptop shape */ - wtcap = UNENCUMBERED; - } else if (Upolyd && youmonst.data->mlet == S_EEL && !is_pool(u.ux,u.uy) && !Is_waterlevel(&u.uz)) { - if (u.mh > 1) { - u.mh--; - flags.botl = 1; - } else if (u.mh < 1) - rehumanize(); - } else if (Upolyd && u.mh < u.mhmax) { - if (u.mh < 1) - rehumanize(); - else if (Regeneration || - (wtcap < MOD_ENCUMBER && !(moves%20))) { - flags.botl = 1; - u.mh++; - } - } else if (u.uhp < u.uhpmax && - (wtcap < MOD_ENCUMBER || !u.umoved || Regeneration)) { -/* - * KMH, balance patch -- New regeneration code - * Healthstones have been added, which alter your effective - * experience level and constitution (-2 cursed, +1 uncursed, - * +2 blessed) for the basis of regeneration calculations. - */ - - int efflev = u.ulevel + u.uhealbonus; - int effcon = ACURR(A_CON) + u.uhealbonus; - int heal = 1; - - - if (efflev > 9 && !(moves % 3)) { - if (effcon <= 12) { - heal = 1; - } else { - heal = rnd(effcon); - if (heal > efflev-9) heal = efflev-9; - } - flags.botl = 1; - u.uhp += heal; - if(u.uhp > u.uhpmax) - u.uhp = u.uhpmax; - } else if (Regeneration || - (efflev <= 9 && - !(moves % ((MAXULEV+12) / (u.ulevel+2) + 1)))) { - flags.botl = 1; - u.uhp++; - } - } - - if (!u.uinvulnerable && u.uen > 0 && u.uhp < u.uhpmax && - tech_inuse(T_CHI_HEALING)) { - u.uen--; - u.uhp++; - flags.botl = 1; - } - - /* moving around while encumbered is hard work */ - if (wtcap > MOD_ENCUMBER && u.umoved) { - if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) { - if (Upolyd && u.mh > 1) { - u.mh--; - } else if (!Upolyd && u.uhp > 1) { - u.uhp--; - } else { - You("pass out from exertion!"); - exercise(A_CON, FALSE); - fall_asleep(-10, FALSE); - } - } - } - - - /* KMH -- OK to regenerate if you don't move */ - if ((u.uen < u.uenmax) && (Energy_regeneration || - ((wtcap < MOD_ENCUMBER || !flags.mv) && - (!(moves%((MAXULEV + 15 - u.ulevel) * - (Role_if(PM_WIZARD) ? 3 : 4) / 6)))))) { - u.uen += rn1((int)(ACURR(A_WIS) + ACURR(A_INT)) / 15 + 1,1); -#ifdef WIZ_PATCH_DEBUG - pline("mana was = %d now = %d",temp,u.uen); -#endif - - if (u.uen > u.uenmax) u.uen = u.uenmax; - flags.botl = 1; - } - - if(!u.uinvulnerable) { - if(Teleportation && !rn2(85)) { - xchar old_ux = u.ux, old_uy = u.uy; - tele(); - if (u.ux != old_ux || u.uy != old_uy) { - if (!next_to_u()) { - check_leash(old_ux, old_uy); - } -#ifdef REDO - /* clear doagain keystrokes */ - pushch(0); - savech(0); -#endif - } - } - /* delayed change may not be valid anymore */ - if ((change == 1 && !Polymorph) || - (change == 2 && u.ulycn == NON_PM)) - change = 0; - if(Polymorph && !rn2(100)) - change = 1; - else if (u.ulycn >= LOW_PM && !Upolyd && - !rn2(80 - (20 * night()))) - change = 2; - if (change && !Unchanging) { - if (multi >= 0) { - if (occupation) - stop_occupation(); - else - nomul(0); - if (change == 1) polyself(FALSE); - else you_were(); - change = 0; - } - } - } /* !u.uinvulnerable */ - - if(Searching && multi >= 0) (void) dosearch0(1); - dosounds(); - do_storms(); - gethungry(); - age_spells(); - exerchk(); - invault(); - if (u.uhave.amulet) amulet(); - if (!rn2(40+(int)(ACURR(A_DEX)*3))) u_wipe_engr(rnd(3)); - if (u.uevent.udemigod && !u.uinvulnerable) { - if (u.udg_cnt) u.udg_cnt--; - if (!u.udg_cnt) { - intervene(); - u.udg_cnt = rn1(200, 50); - } - } - restore_attrib(); - - /* underwater and waterlevel vision are done here */ - if (Is_waterlevel(&u.uz)) - movebubbles(); - else if (Underwater) - under_water(0); - /* vision while buried done here */ - else if (u.uburied) under_ground(0); - - /* when immobile, count is in turns */ - if(multi < 0) { - if (++multi == 0) { /* finished yet? */ - unmul((char *)0); - /* if unmul caused a level change, take it now */ - if (u.utotype) deferred_goto(); - } - } - } - } while (youmonst.movement= 0 && occupation) { -#if defined(MICRO) || defined(WIN32) - abort_lev = 0; - if (kbhit()) { - if ((ch = Getchar()) == ABORT) - abort_lev++; -# ifdef REDO - else - pushch(ch); -# endif /* REDO */ - } - if (!abort_lev && (*occupation)() == 0) -#else - if ((*occupation)() == 0) -#endif - occupation = 0; - if( -#if defined(MICRO) || defined(WIN32) - abort_lev || -#endif - monster_nearby()) { - stop_occupation(); - reset_eat(); - } -#if defined(MICRO) || defined(WIN32) - if (!(++occtime % 7)) - display_nhwindow(WIN_MAP, FALSE); -#endif - continue; - } - - if ((u.uhave.amulet || Clairvoyant) && - !In_endgame(&u.uz) && !BClairvoyant && - !(moves % 15) && !rn2(2)) - do_vicinity_map(); - - if(u.utrap && u.utraptype == TT_LAVA) { - if(!is_lava(u.ux,u.uy)) - u.utrap = 0; - else if (!u.uinvulnerable) { - u.utrap -= 1<<8; - if(u.utrap < 1<<8) { - killer_format = KILLED_BY; - killer = "molten lava"; - You("sink below the surface and die."); - done(DISSOLVED); - } else if(didmove && !u.umoved) { - Norep("You sink deeper into the lava."); - u.utrap += rnd(4); - } - } - } - -#ifdef WIZARD - if (iflags.sanity_check) - sanity_check(); -#endif - -#ifdef CLIPPING - /* just before rhack */ - cliparound(u.ux, u.uy); -#endif - - u.umoved = FALSE; - - if (multi > 0) { - lookaround(); - if (!multi) { - /* lookaround may clear multi */ - flags.move = 0; - if (flags.time) flags.botl = 1; - continue; - } - if (flags.mv) { - if(multi < COLNO && !--multi) - flags.travel = iflags.travel1 = flags.mv = flags.run = 0; - domove(); - } else { - --multi; - rhack(save_cm); - } - } else if (multi == 0) { -#ifdef MAIL - ckmailstatus(); -#endif - rhack((char *)0); - } - if (u.utotype) /* change dungeon level */ - deferred_goto(); /* after rhack() */ - /* !flags.move here: multiple movement command stopped */ - else if (flags.time && (!flags.move || !flags.mv)) - flags.botl = 1; - - if (vision_full_recalc) vision_recalc(0); /* vision! */ - /* when running in non-tport mode, this gets done through domove() */ - if ((!flags.run || iflags.runmode == RUN_TPORT) && - (multi && (!flags.travel ? !(multi % 7) : !(moves % 7L)))) { - if (flags.time && flags.run) flags.botl = 1; - display_nhwindow(WIN_MAP, FALSE); - } - } -} - - -#endif /* OVL0 */ -#ifdef OVL1 - -void -stop_occupation() -{ - if(occupation) { - if (!maybe_finished_meal(TRUE)) - You("stop %s.", occtxt); - occupation = 0; - flags.botl = 1; /* in case u.uhs changed */ -/* fainting stops your occupation, there's no reason to sync. - sync_hunger(); -*/ -#ifdef REDO - nomul(0); - pushch(0); -#endif - } -} - -#endif /* OVL1 */ -#ifdef OVLB - -void -display_gamewindows() -{ - WIN_MESSAGE = create_nhwindow(NHW_MESSAGE); - WIN_STATUS = create_nhwindow(NHW_STATUS); - WIN_MAP = create_nhwindow(NHW_MAP); - WIN_INVEN = create_nhwindow(NHW_MENU); - -#ifdef MAC - /* - * This _is_ the right place for this - maybe we will - * have to split display_gamewindows into create_gamewindows - * and show_gamewindows to get rid of this ifdef... - */ - if ( ! strcmp ( windowprocs . name , "mac" ) ) { - SanePositions ( ) ; - } -#endif - - /* - * The mac port is not DEPENDENT on the order of these - * displays, but it looks a lot better this way... - */ - display_nhwindow(WIN_STATUS, FALSE); - display_nhwindow(WIN_MESSAGE, FALSE); - clear_glyph_buffer(); - display_nhwindow(WIN_MAP, FALSE); -} - -void -newgame() -{ - int i; - -#ifdef MFLOPPY - gameDiskPrompt(); -#endif - - flags.ident = 1; - - for (i = 0; i < NUMMONS; i++) - mvitals[i].mvflags = mons[i].geno & G_NOCORPSE; - - init_objects(); /* must be before u_init() */ - - flags.pantheon = -1; /* role_init() will reset this */ - role_init(); /* must be before init_dungeons(), u_init(), - * and init_artifacts() */ - - init_dungeons(); /* must be before u_init() to avoid rndmonst() - * creating odd monsters for any tins and eggs - * in hero's initial inventory */ - init_artifacts(); /* before u_init() in case $WIZKIT specifies - * any artifacts */ - u_init(); - init_artifacts1(); /* must be after u_init() */ - -#ifndef NO_SIGNAL - (void) signal(SIGINT, (SIG_RET_TYPE) done1); -#endif -#ifdef NEWS - if(iflags.news) display_file_area(NEWS_AREA, NEWS, FALSE); -#endif - - load_qtlist(); /* load up the quest text info */ -/* quest_init();*/ /* Now part of role_init() */ - - mklev(); - u_on_upstairs(); - vision_reset(); /* set up internals for level (after mklev) */ - check_special_room(FALSE); - - flags.botlx = 1; - - /* Move the monster from under you or else - * makedog() will fail when it calls makemon(). - * - ucsfcgl!kneller - */ - - if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy)); - (void) makedog(); - - docrt(); - - if (flags.legacy) { - flush_screen(1); - com_pager(1); - } -#ifdef INSURANCE - save_currentstate(); -#endif - program_state.something_worth_saving++; /* useful data now exists */ - - /* Success! */ - welcome(TRUE); - return; -} - -/* show "welcome [back] to nethack" message at program startup */ -void -welcome(new_game) -boolean new_game; /* false => restoring an old game */ -{ - char buf[BUFSZ]; - boolean currentgend = Upolyd ? u.mfemale : flags.female; - - /* - * The "welcome back" message always describes your innate form - * even when polymorphed or wearing a helm of opposite alignment. - * Alignment is shown unconditionally for new games; for restores - * it's only shown if it has changed from its original value. - * Sex is shown for new games except when it is redundant; for - * restores it's only shown if different from its original value. - */ - *buf = '\0'; - if (new_game || u.ualignbase[A_ORIGINAL] != u.ualignbase[A_CURRENT]) - Sprintf(eos(buf), " %s", align_str(u.ualignbase[A_ORIGINAL])); - if (!urole.name.f && - (new_game ? (urole.allow & ROLE_GENDMASK) == (ROLE_MALE|ROLE_FEMALE) : - currentgend != flags.initgend)) - Sprintf(eos(buf), " %s", genders[currentgend].adj); - -#if 0 - pline(new_game ? "%s %s, welcome to NetHack! You are a%s %s %s." - : "%s %s, the%s %s %s, welcome back to NetHack!", - Hello((struct monst *) 0), plname, buf, urace.adj, - (currentgend && urole.name.f) ? urole.name.f : urole.name.m); -#endif - if (new_game) pline("%s %s, welcome to %s! You are a%s %s %s.", - Hello((struct monst *) 0), plname, DEF_GAME_NAME, buf, urace.adj, - (currentgend && urole.name.f) ? urole.name.f : urole.name.m); - else pline("%s %s, the%s %s %s, welcome back to %s!", - Hello((struct monst *) 0), plname, buf, urace.adj, - (currentgend && urole.name.f) ? urole.name.f : urole.name.m, - DEF_GAME_NAME); -} - -#ifdef POSITIONBAR -STATIC_DCL void -do_positionbar() -{ - static char pbar[COLNO]; - char *p; - - p = pbar; - /* up stairway */ - if (upstair.sx && -#ifdef DISPLAY_LAYERS - (level.locations[upstair.sx][upstair.sy].mem_bg == S_upstair || - level.locations[upstair.sx][upstair.sy].mem_bg == S_upladder)) { -#else - (glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) == - S_upstair || - glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) == - S_upladder)) { -#endif - *p++ = '<'; - *p++ = upstair.sx; - } - if (sstairs.sx && -#ifdef DISPLAY_LAYERS - (level.locations[sstairs.sx][sstairs.sy].mem_bg == S_upstair || - level.locations[sstairs.sx][sstairs.sy].mem_bg == S_upladder)) { -#else - (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == - S_upstair || - glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == - S_upladder)) { -#endif - *p++ = '<'; - *p++ = sstairs.sx; - } - - /* down stairway */ - if (dnstair.sx && -#ifdef DISPLAY_LAYERS - (level.locations[dnstair.sx][dnstair.sy].mem_bg == S_dnstair || - level.locations[dnstair.sx][dnstair.sy].mem_bg == S_dnladder)) { -#else - (glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) == - S_dnstair || - glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) == - S_dnladder)) { -#endif - *p++ = '>'; - *p++ = dnstair.sx; - } - if (sstairs.sx && -#ifdef DISPLAY_LAYERS - (level.locations[sstairs.sx][sstairs.sy].mem_bg == S_dnstair || - level.locations[sstairs.sx][sstairs.sy].mem_bg == S_dnladder)) { -#else - (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == - S_dnstair || - glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == - S_dnladder)) { -#endif - *p++ = '>'; - *p++ = sstairs.sx; - } - - /* hero location */ - if (u.ux) { - *p++ = '@'; - *p++ = u.ux; - } - /* fence post */ - *p = 0; - - update_positionbar(pbar); -} -#endif - -#endif /* OVLB */ - -/*allmain.c*/ diff -Naurbd slashem-0.0.8E0/src/cmd.c slashem-0.0.8E1/src/cmd.c --- slashem-0.0.8E0/src/cmd.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/cmd.c 2006-05-15 12:08:59.000000000 +0100 @@ -4,7 +4,7 @@ #include "hack.h" #include "func_tab.h" -/* #define DEBUG */ /* uncomment for debugging */ +/* #define DEBUG */ /* uncomment w debugging */ /* * Some systems may have getchar() return EOF for various reasons, and @@ -3497,14 +3497,8 @@ } else if(IS_THRONE(levl[u.ux][u.uy].typ)) { cmd[0]=M('s'); return cmd; - } else if((u.ux == xupstair && u.uy == yupstair) - || (u.ux == sstairs.sx && u.uy == sstairs.sy && sstairs.up) - || (u.ux == xupladder && u.uy == yupladder)) { - return "<"; - } else if((u.ux == xdnstair && u.uy == ydnstair) - || (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up) - || (u.ux == xdnladder && u.uy == ydnladder)) { - return ">"; + } else if((dir = On_stairs(u.ux, u.uy))) { + return dir == LA_UP ? "<" : ">"; } else if(OBJ_AT(u.ux, u.uy)) { cmd[0] = Is_container(level.objects[u.ux][u.uy]) ? M('l') : ','; return cmd; diff -Naurbd slashem-0.0.8E0/src/dbridge.c slashem-0.0.8E1/src/dbridge.c --- slashem-0.0.8E0/src/dbridge.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/dbridge.c 2006-05-15 12:08:59.000000000 +0100 @@ -41,7 +41,8 @@ if (!isok(x,y)) return FALSE; ltyp = levl[x][y].typ; - if (ltyp == POOL || ltyp == MOAT || ltyp == WATER) return TRUE; + if (ltyp == POOL || ltyp == MOAT || ltyp == WATER || ltyp == RIVER) + return TRUE; if (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT) return TRUE; return FALSE; diff -Naurbd slashem-0.0.8E0/src/decl.c slashem-0.0.8E1/src/decl.c --- slashem-0.0.8E0/src/decl.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/decl.c 2006-05-15 12:08:59.000000000 +0100 @@ -115,7 +115,8 @@ NEARDATA dungeon dungeons[MAXDUNGEON]; /* ini'ed by init_dungeon() */ NEARDATA s_level *sp_levchn; -NEARDATA stairway upstair = { 0, 0 }, dnstair = { 0, 0 }; +NEARDATA stairway upstairs[MAXNRSTAIRS], dnstairs[MAXNRSTAIRS]; +NEARDATA int n_upstairs = 0, n_dnstairs = 0; NEARDATA stairway upladder = { 0, 0 }, dnladder = { 0, 0 }; NEARDATA stairway sstairs = { 0, 0 }; NEARDATA dest_area updest = { 0, 0, 0, 0, 0, 0, 0, 0 }; @@ -137,7 +138,8 @@ NEARDATA struct mkroom rooms[(MAXNROFROOMS+1)*2] = {DUMMY}; NEARDATA struct mkroom* subrooms = &rooms[MAXNROFROOMS+1]; -struct mkroom *upstairs_room, *dnstairs_room, *sstairs_room; +struct mkroom *upstairs_rooms[MAXNRSTAIRS], *dnstairs_rooms[MAXNRSTAIRS], + *sstairs_room; dlevel_t level; /* level map */ struct trap *ftrap = (struct trap *)0; @@ -285,6 +287,12 @@ "plastic", "glass", "gemstone", "stone" }; +/* NOTE: the order of these words exactly corresponds to the + order of river values #define'd in rm.h. */ +const char *river_liquid[] = { + "water", "sparkling water", "boiling blood" +}; + /* Vision */ NEARDATA boolean vision_full_recalc = 0; NEARDATA char **viz_array = 0;/* used in cansee() and couldsee() macros */ diff -Naurbd slashem-0.0.8E0/src/decl.c.orig slashem-0.0.8E1/src/decl.c.orig --- slashem-0.0.8E0/src/decl.c.orig 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/decl.c.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,344 +0,0 @@ -/* SCCS Id: @(#)decl.c 3.2 2001/12/10 */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" - -int NDECL((*afternmv)); -int NDECL((*occupation)); - -/* from xxxmain.c */ -const char *hname = 0; /* name of the game (argv[0] of main) */ -int hackpid = 0; /* current process id */ -#if defined(UNIX) || defined(VMS) -int locknum = 0; /* max num of simultaneous users */ -#endif -#ifdef DEF_PAGER -char *catmore = 0; /* default pager */ -#endif - -NEARDATA int bases[MAXOCLASSES] = DUMMY; - -NEARDATA int multi = 0; -NEARDATA boolean multi_one = FALSE; /* used by dofire() and throw_the_obj() */ -#if 0 -NEARDATA int warnlevel = 0; /* used by movemon and dochugw */ -#endif -NEARDATA int nroom = 0; -NEARDATA int nsubroom = 0; -NEARDATA int occtime = 0; - -int x_maze_max, y_maze_max; /* initialized in main, used in mkmaze.c */ -int otg_temp; /* used by object_to_glyph() [otg] */ - -#ifdef REDO -NEARDATA int in_doagain = 0; -#endif - -/* - * The following structure will be initialized at startup time with - * the level numbers of some "important" things in the game. - */ -struct dgn_topology dungeon_topology = {DUMMY}; - -#include "quest.h" -struct q_score quest_status = DUMMY; - -NEARDATA int smeq[MAXNROFROOMS+1] = DUMMY; -NEARDATA int doorindex = 0; - -NEARDATA char *save_cm = 0; -NEARDATA int killer_format = 0; -const char *killer = 0; -const char *delayed_killer = 0; -#ifdef GOLDOBJ -NEARDATA long done_money = 0; -#endif -char killer_buf[BUFSZ] = DUMMY; -const char *nomovemsg = 0; -const char nul[40] = DUMMY; /* contains zeros */ -NEARDATA char plname[PL_NSIZ] = DUMMY; /* player name */ -NEARDATA char pl_character[PL_CSIZ] = DUMMY; -NEARDATA char pl_race = '\0'; - -NEARDATA char pl_fruit[PL_FSIZ] = DUMMY; -NEARDATA int current_fruit = 0; -NEARDATA struct fruit *ffruit = (struct fruit *)0; - -NEARDATA char tune[6] = DUMMY; - -const char *occtxt = DUMMY; -const char quitchars[] = " \r\n\033"; -const char vowels[] = "aeiouAEIOU"; -const char ynchars[] = "yn"; -const char ynqchars[] = "ynq"; -const char ynaqchars[] = "ynaq"; -const char ynNaqchars[] = "yn#aq"; -NEARDATA long yn_number = 0L; - -const char disclosure_options[] = "iavgc"; - -#if defined(MICRO) || defined(WIN32) -char hackdir[PATHLEN]; /* where rumors, help, record are */ -# ifdef MICRO -char levels[PATHLEN]; /* where levels are */ -# endif -#endif /* MICRO || WIN32 */ - - -#ifdef MFLOPPY -char permbones[PATHLEN]; /* where permanent copy of bones go */ -int ramdisk = FALSE; /* whether to copy bones to levels or not */ -int saveprompt = TRUE; -const char *alllevels = "levels.*"; -const char *allbones = "bones*.*"; -#endif - -struct linfo level_info[MAXLINFO]; - -NEARDATA struct sinfo program_state; - -/* 'rogue'-like direction commands (cmd.c) */ -const char sdir[] = "hykulnjb><"; -const char ndir[] = "47896321><"; /* number pad mode */ -const schar xdir[10] = { -1,-1, 0, 1, 1, 1, 0,-1, 0, 0 }; -const schar ydir[10] = { 0,-1,-1,-1, 0, 1, 1, 1, 0, 0 }; -const schar zdir[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 1,-1 }; - -NEARDATA schar tbx = 0, tby = 0; /* mthrowu: target */ - -/* for xname handling of multiple shot missile volleys: - number of shots, index of current one, validity check, shoot vs throw */ -NEARDATA struct multishot m_shot = { 0, 0, STRANGE_OBJECT, FALSE }; - -NEARDATA struct dig_info digging; - -NEARDATA dungeon dungeons[MAXDUNGEON]; /* ini'ed by init_dungeon() */ -NEARDATA s_level *sp_levchn; -NEARDATA stairway upstair = { 0, 0 }, dnstair = { 0, 0 }; -NEARDATA stairway upladder = { 0, 0 }, dnladder = { 0, 0 }; -NEARDATA stairway sstairs = { 0, 0 }; -NEARDATA dest_area updest = { 0, 0, 0, 0, 0, 0, 0, 0 }; -NEARDATA dest_area dndest = { 0, 0, 0, 0, 0, 0, 0, 0 }; -NEARDATA coord inv_pos = { 0, 0 }; - -NEARDATA boolean in_mklev = FALSE; -NEARDATA boolean stoned = FALSE; /* done to monsters hit by 'c' */ -NEARDATA boolean unweapon = FALSE; -NEARDATA boolean mrg_to_wielded = FALSE; - /* weapon picked is merged with wielded one */ -NEARDATA struct obj *current_wand = 0; /* wand currently zapped/applied */ - -NEARDATA boolean in_steed_dismounting = FALSE; - -NEARDATA coord bhitpos = DUMMY; -NEARDATA struct door doors[DOORMAX] = {DUMMY}; - -NEARDATA struct mkroom rooms[(MAXNROFROOMS+1)*2] = {DUMMY}; -NEARDATA struct mkroom* subrooms = &rooms[MAXNROFROOMS+1]; -struct mkroom *upstairs_room, *dnstairs_room, *sstairs_room; - -dlevel_t level; /* level map */ -struct trap *ftrap = (struct trap *)0; -NEARDATA struct monst youmonst = DUMMY; -NEARDATA struct permonst upermonst = DUMMY; -NEARDATA struct flag flags = DUMMY; -NEARDATA struct instance_flags iflags = DUMMY; -NEARDATA struct you u = DUMMY; - -NEARDATA struct obj *invent = (struct obj *)0, - *uwep = (struct obj *)0, *uarm = (struct obj *)0, - *uswapwep = (struct obj *)0, - *uquiver = (struct obj *)0, /* quiver */ -#ifdef TOURIST - *uarmu = (struct obj *)0, /* under-wear, so to speak */ -#endif - *uskin = (struct obj *)0, /* dragon armor, if a dragon */ - *uarmc = (struct obj *)0, *uarmh = (struct obj *)0, - *uarms = (struct obj *)0, *uarmg = (struct obj *)0, - *uarmf = (struct obj *)0, *uamul = (struct obj *)0, - *uright = (struct obj *)0, - *uleft = (struct obj *)0, - *ublindf = (struct obj *)0, -#ifdef STEED - *usaddle = (struct obj *)0, -#endif - *uchain = (struct obj *)0, - *uball = (struct obj *)0; - -#ifdef TEXTCOLOR -/* - * This must be the same order as used for buzz() in zap.c. - */ -const int zapcolors[NUM_ZAP] = { - HI_ZAP, /* 0 - missile */ - CLR_ORANGE, /* 1 - fire */ - CLR_WHITE, /* 2 - frost */ - HI_ZAP, /* 3 - sleep */ - CLR_BLACK, /* 4 - death */ - CLR_WHITE, /* 5 - lightning */ - CLR_YELLOW, /* 6 - poison gas */ - CLR_GREEN, /* 7 - acid */ -}; -#endif /* text color */ - -const int shield_static[SHIELD_COUNT] = { - S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, /* 7 per row */ - S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, - S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, -}; - -NEARDATA struct spell spl_book[MAXSPELL + 1] = {DUMMY}; - -NEARDATA struct tech tech_list[MAXTECH + 1] = {DUMMY}; - -NEARDATA long moves = 1L, monstermoves = 1L; - /* These diverge when player is Fast or Very_fast */ -NEARDATA long wailmsg = 0L; - -/* objects that are moving to another dungeon level */ -NEARDATA struct obj *migrating_objs = (struct obj *)0; -/* objects not yet paid for */ -NEARDATA struct obj *billobjs = (struct obj *)0; - -/* used to zero all elements of a struct obj */ -NEARDATA struct obj zeroobj = DUMMY; - -/* used as an address returned by getobj() */ -NEARDATA struct obj thisplace = DUMMY; - -/* originally from dog.c */ -NEARDATA char dogname[PL_PSIZ] = DUMMY; -NEARDATA char catname[PL_PSIZ] = DUMMY; -NEARDATA char ghoulname[PL_PSIZ] = DUMMY; -NEARDATA char horsename[PL_PSIZ] = DUMMY; -NEARDATA char wolfname[PL_PSIZ] = DUMMY; -#if 0 -NEARDATA char batname[PL_PSIZ] = DUMMY; -NEARDATA char snakename[PL_PSIZ] = DUMMY; -NEARDATA char ratname[PL_PSIZ] = DUMMY; -NEARDATA char badgername[PL_PSIZ] = DUMMY; -NEARDATA char reddragonname[PL_PSIZ] = DUMMY; -NEARDATA char whitedragonname[PL_PSIZ] = DUMMY; -#endif -char preferred_pet; /* '\0', 'c', 'd', 'n' (none) */ -/* monsters that went down/up together with @ */ -NEARDATA struct monst *mydogs = (struct monst *)0; -/* monsters that are moving to another dungeon level */ -NEARDATA struct monst *migrating_mons = (struct monst *)0; - -NEARDATA struct mvitals mvitals[NUMMONS]; - -/* originally from end.c */ -#ifdef DUMP_LOG -#ifdef DUMP_FN -char dump_fn[] = DUMP_FN; -#else -char dump_fn[PL_PSIZ] = DUMMY; -#endif -#endif /* DUMP_LOG */ - -NEARDATA struct c_color_names c_color_names = { - "black", "amber", "golden", - "light blue", "red", "green", - "silver", "blue", "purple", - "white" -}; - -const char *c_obj_colors[] = { - "black", /* CLR_BLACK */ - "red", /* CLR_RED */ - "green", /* CLR_GREEN */ - "brown", /* CLR_BROWN */ - "blue", /* CLR_BLUE */ - "magenta", /* CLR_MAGENTA */ - "cyan", /* CLR_CYAN */ - "gray", /* CLR_GRAY */ - "transparent", /* no_color */ - "orange", /* CLR_ORANGE */ - "bright green", /* CLR_BRIGHT_GREEN */ - "yellow", /* CLR_YELLOW */ - "bright blue", /* CLR_BRIGHT_BLUE */ - "bright magenta", /* CLR_BRIGHT_MAGENTA */ - "bright cyan", /* CLR_BRIGHT_CYAN */ - "white", /* CLR_WHITE */ -}; - -#ifdef MENU_COLOR -struct menucoloring *menu_colorings = 0; -#endif - -struct c_common_strings c_common_strings = { - "Nothing happens.", "That's enough tries!", - "That is a silly thing to %s.", "shudder for a moment.", - "something", "Something", "You can move again.", "Never mind.", - "vision quickly clears.", {"the", "your"} -}; - -/* NOTE: the order of these words exactly corresponds to the - order of oc_material values #define'd in objclass.h. */ -const char *materialnm[] = { - "mysterious", "liquid", "wax", "organic", "flesh", - "paper", "cloth", "leather", "wooden", "bone", "dragonhide", - "iron", "metal", "copper", "silver", "gold", "platinum", "mithril", - "plastic", "glass", "gemstone", "stone" -}; - -/* Vision */ -NEARDATA boolean vision_full_recalc = 0; -NEARDATA char **viz_array = 0;/* used in cansee() and couldsee() macros */ - -/* Global windowing data, defined here for multi-window-system support */ -NEARDATA winid WIN_MESSAGE = WIN_ERR, WIN_STATUS = WIN_ERR; -NEARDATA winid WIN_MAP = WIN_ERR, WIN_INVEN = WIN_ERR; -char toplines[TBUFSZ]; -/* Windowing stuff that's really tty oriented, but present for all ports */ -struct tc_gbl_data tc_gbl_data = { 0,0, 0,0 }; /* AS,AE, LI,CO */ - -struct authentication authentication = { "", "" }; - -struct tileset tilesets[MAXNOTILESETS]; -int no_tilesets = 0; -struct tileset def_tilesets[] = { -#if defined(X11_GRAPHICS) || defined(QT_GRAPHICS) || defined(GTK_GRAPHICS) || \ - defined(GNOME_GRAPHICS) || defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) - { "Small tiles", "x11tiles", 0 }, - { "Big tiles", "x11bigtiles", TILESET_TRANSPARENT }, -#endif -#if defined(GTK_GRAPHICS) - { "Big 3D tiles", "x11big3dtiles", TILESET_TRANSPARENT | TILESET_PSEUDO3D }, -#endif -#if defined(GEM_GRAPHICS) - { "Monochrome tiles", "nh2.img", 0 }, - { "Colour tiles", "nh16.img", 0 }, -#endif -#if defined(MSDOS) - { "Planer style tiles", "slashem1.tib", 0 }, -#endif -#if defined(ALLEG_FX) - { "Small tiles", "slam16.bmp", 0 }, - { "Big tiles", "slam32.bmp", TILESET_TRANSPARENT }, - { "Big 3D tiles", "slam3D.bmp", TILESET_TRANSPARENT | TILESET_PSEUDO3D }, -#endif - { "", "", 0, } -}; - -char tileset[PL_PSIZ] = DUMMY; - -char *fqn_prefix[PREFIX_COUNT] = { (char *)0, (char *)0, (char *)0, (char *)0, - (char *)0, (char *)0, (char *)0, (char *)0, (char *)0 }; - -#ifdef PREFIXES_IN_USE -char *fqn_prefix_names[PREFIX_COUNT] = { "hackdir", "leveldir", "savedir", - "bonesdir", "datadir", "scoredir", - "lockdir", "configdir", "troubledir" }; -#endif - -/* dummy routine used to force linkage */ -void -decl_init() -{ - return; -} - -/*decl.c*/ diff -Naurbd slashem-0.0.8E0/src/dig.c slashem-0.0.8E1/src/dig.c --- slashem-0.0.8E0/src/dig.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/dig.c 2006-05-15 12:08:59.000000000 +0100 @@ -491,12 +491,14 @@ register int x1, y1; int lo_x = max(1,x-1), hi_x = min(x+1,COLNO-1), lo_y = max(0,y-1), hi_y = min(y+1,ROWNO-1); - int pool_cnt = 0, moat_cnt = 0, lava_cnt = 0; + int river_cnt = 0, pool_cnt = 0, moat_cnt = 0, lava_cnt = 0; for (x1 = lo_x; x1 <= hi_x; x1++) for (y1 = lo_y; y1 <= hi_y; y1++) if (levl[x1][y1].typ == POOL) pool_cnt++; + else if (levl[x1][y1].typ == RIVER) + river_cnt++; else if (levl[x1][y1].typ == MOAT || (levl[x1][y1].typ == DRAWBRIDGE_UP && (levl[x1][y1].drawbridgemask & DB_UNDER) == DB_MOAT)) @@ -513,6 +515,8 @@ return MOAT; else if (pool_cnt > 0 && rn2(pool_cnt + 1)) return POOL; + else if (river_cnt > 0 && rn2(river_cnt + 1)) + return RIVER; else return ROOM; } diff -Naurbd slashem-0.0.8E0/src/display.c slashem-0.0.8E1/src/display.c --- slashem-0.0.8E0/src/display.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/display.c 2006-05-15 12:08:59.000000000 +0100 @@ -162,6 +162,25 @@ #endif /* else vobj_at() is defined in display.h */ /* + * svobj_at() + * + * A version of vobj_at() that looks for a specific object type. + */ +struct obj * +svobj_at(n,x,y) + int n; + xchar x,y; +{ + register struct obj *obj = level.objects[x][y]; + + while (obj) { + if (obj->otyp == n && (!obj->oinvis || See_invisible)) return obj; + obj = obj->nexthere; + } + return ((struct obj *) 0); +} + +/* * magic_map_background() * * This function is similar to map_background (see below) except we pay @@ -364,6 +383,9 @@ if (level.flags.hero_memory) { \ if ((obj = vobj_at(x, y)) && !covers_objects(x, y)) \ map_object(obj, FALSE); \ + else if ((obj = svobj_at(BOULDER, x, y)) && \ + !covers_boulders(x, y)) \ + map_object(obj, FALSE); \ else \ levl[x][y].mem_corpse = levl[x][y].mem_obj = 0; \ if ((trap = t_at(x, y)) && trap->tseen && !covers_traps(x, y)) \ @@ -374,6 +396,8 @@ if (show) show_glyph(x, y, memory_glyph(x, y)); \ } else if ((obj = vobj_at(x,y)) && !covers_objects(x,y)) \ map_object(obj,show); \ + else if ((obj = svobj_at(BOULDER,x,y)) && !covers_boulders(x,y)) \ + map_object(obj,show); \ else if ((trap = t_at(x,y)) && trap->tseen && !covers_traps(x,y)) \ map_trap(trap,show); \ else \ @@ -387,6 +411,8 @@ \ if ((obj = vobj_at(x,y)) && !covers_objects(x,y)) \ map_object(obj,show); \ + else if ((obj = svobj_at(BOULDER,x,y)) && !covers_boulders(x,y)) \ + map_object(obj,show); \ else if ((trap = t_at(x,y)) && trap->tseen && !covers_traps(x,y)) \ map_trap(trap,show); \ else \ @@ -1727,8 +1753,15 @@ idx = S_ndoor; break; case TREE: idx = S_tree; break; - case POOL: - case MOAT: idx = S_pool; break; + case POOL: idx = S_pool; break; + case MOAT: + case RIVER: + switch(level.flags.river) { + case RIVER_LETHE: idx = S_lethe; break; + case RIVER_PHLEGETHON: idx = S_phlegethon; break; + default: idx = S_pool; break; + } + break; case STAIRS: idx = (ptr->ladder & LA_DOWN) ? S_dnstair : S_upstair; break; diff -Naurbd slashem-0.0.8E0/src/display.c.orig slashem-0.0.8E1/src/display.c.orig --- slashem-0.0.8E0/src/display.c.orig 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/display.c.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,2508 +0,0 @@ -/* SCCS Id: @(#)display.c 3.4 2003/02/19 */ -/* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ -/* and Dave Cohrs, 1990. */ -/* NetHack may be freely redistributed. See license for details. */ - -/* - * THE NEW DISPLAY CODE - * - * The old display code has been broken up into three parts: vision, display, - * and drawing. Vision decides what locations can and cannot be physically - * seen by the hero. Display decides _what_ is displayed at a given location. - * Drawing decides _how_ to draw a monster, fountain, sword, etc. - * - * The display system uses information from the vision system to decide - * what to draw at a given location. The routines for the vision system - * can be found in vision.c and vision.h. The routines for display can - * be found in this file (display.c) and display.h. The drawing routines - * are part of the window port. See doc/window.doc for the drawing - * interface. - * - * The display system deals with an abstraction called a glyph. Anything - * that could possibly be displayed has a unique glyph identifier. - * - * What is seen on the screen is a combination of what the hero remembers - * and what the hero currently sees. Objects and dungeon features (walls - * doors, etc) are remembered when out of sight. Monsters and temporary - * effects are not remembered. Each location on the level has an - * associated glyph. This is the hero's _memory_ of what he or she has - * seen there before. - * - * Display rules: - * - * If the location is in sight, display in order: - * visible (or sensed) monsters - * visible objects - * known traps - * background - * - * If the location is out of sight, display in order: - * sensed monsters (telepathy) - * memory - * - * - * - * Here is a list of the major routines in this file to be used externally: - * - * newsym - * - * Possibly update the screen location (x,y). This is the workhorse routine. - * It is always correct --- where correct means following the in-sight/out- - * of-sight rules. **Most of the code should use this routine.** This - * routine updates the map and displays monsters. - * - * - * map_background - * map_object - * map_trap - * map_invisible - * unmap_object - * - * If you absolutely must override the in-sight/out-of-sight rules, there - * are two possibilities. First, you can mess with vision to force the - * location in sight then use newsym(), or you can use the map_* routines. - * The first has not been tried [no need] and the second is used in the - * detect routines --- detect object, magic mapping, etc. The map_* - * routines *change* what the hero remembers. All changes made by these - * routines will be sticky --- they will survive screen redraws. Do *not* - * use these for things that only temporarily change the screen. These - * routines are also used directly by newsym(). unmap_object is used to - * clear a remembered object when/if detection reveals it isn't there. - * - * - * show_glyph - * - * This is direct (no processing in between) buffered access to the screen. - * Temporary screen effects are run through this and its companion, - * flush_screen(). There is yet a lower level routine, print_glyph(), - * but this is unbuffered and graphic dependent (i.e. it must be surrounded - * by graphic set-up and tear-down routines). Do not use print_glyph(). - * - * - * see_monsters - * see_objects - * see_traps - * - * These are only used when something affects all of the monsters or - * objects or traps. For objects and traps, the only thing is hallucination. - * For monsters, there are hallucination and changing from/to blindness, etc. - * - * - * tmp_at - * - * This is a useful interface for displaying temporary items on the screen. - * Its interface is different than previously, so look at it carefully. - * - * - * - * Parts of the rm structure that are used: - * - * typ - What is really there. - * glyph - What the hero remembers. This will never be a monster. - * Monsters "float" above this. - * lit - True if the position is lit. An optimization for - * lit/unlit rooms. - * waslit - True if the position was *remembered* as lit. - * seenv - A vector of bits representing the directions from which the - * hero has seen this position. The vector's primary use is - * determining how walls are seen. E.g. a wall sometimes looks - * like stone on one side, but is seen as a wall from the other. - * Other uses are for unmapping detected objects and felt - * locations, where we need to know if the hero has ever - * seen the location. - * flags - Additional information for the typ field. Different for - * each typ. - * horizontal - Indicates whether the wall or door is horizontal or - * vertical. - */ -#include "hack.h" -#include "region.h" - -STATIC_DCL void FDECL(display_monster,(XCHAR_P,XCHAR_P,struct monst *,int,XCHAR_P)); -STATIC_DCL int FDECL(swallow_to_glyph, (int, int)); -STATIC_DCL void FDECL(display_warning,(struct monst *)); - -STATIC_DCL int FDECL(check_pos, (int, int, int)); -#ifdef WA_VERBOSE -STATIC_DCL boolean FDECL(more_than_one, (int, int, int, int, int)); -#endif -STATIC_DCL int FDECL(set_twall, (int,int, int,int, int,int, int,int)); -STATIC_DCL int FDECL(set_wall, (int, int, int)); -STATIC_DCL int FDECL(set_corn, (int,int, int,int, int,int, int,int)); -STATIC_DCL int FDECL(set_crosswall, (int, int)); -STATIC_DCL void FDECL(set_seenv, (struct rm *, int, int, int, int)); -STATIC_DCL void FDECL(t_warn, (struct rm *)); -STATIC_DCL int FDECL(wall_angle, (struct rm *)); -STATIC_DCL int FDECL(back_to_cmap, (XCHAR_P, XCHAR_P)); - -STATIC_VAR boolean transp; /* cached transparency flag for current tileset */ - -#ifdef INVISIBLE_OBJECTS -/* - * vobj_at() - * - * Returns a pointer to an object if the hero can see an object at the - * given location. This takes care of invisible objects. NOTE, this - * assumes that the hero is not blind and on top of the object pile. - * It does NOT take into account that the location is out of sight, or, - * say, one can see blessed, etc. - */ -struct obj * -vobj_at(x,y) - xchar x,y; -{ - register struct obj *obj = level.objects[x][y]; - - while (obj) { - if (!obj->oinvis || See_invisible) return obj; - obj = obj->nexthere; - } - return ((struct obj *) 0); -} -#endif /* else vobj_at() is defined in display.h */ - -/* - * magic_map_background() - * - * This function is similar to map_background (see below) except we pay - * attention to and correct unexplored, lit ROOM and CORR spots. - */ -void -magic_map_background(x, y, show) - xchar x,y; - int show; -{ - int cmap = back_to_cmap(x,y); /* assumes hero can see x,y */ - struct rm *lev = &levl[x][y]; - - /* - * Correct for out of sight lit corridors and rooms that the hero - * doesn't remember as lit. - */ - if (!cansee(x,y) && !lev->waslit) { - /* Floor spaces are dark if unlit. Corridors are dark if unlit. */ - if (lev->typ == ROOM && cmap == S_room) - cmap = S_stone; - else if (lev->typ == CORR && cmap == S_litcorr) - cmap = S_corr; - } - if (level.flags.hero_memory) -#ifdef DISPLAY_LAYERS - lev->mem_bg = cmap; -#else - lev->glyph = cmap_to_glyph(cmap); -#endif - if (show || transp) show_glyph(x,y, cmap_to_glyph(cmap)); -} - -/* - * The routines map_background(), map_object(), and map_trap() could just - * as easily be: - * - * map_glyph(x,y,glyph,show) - * - * Which is called with the xx_to_glyph() in the call. Then I can get - * rid of 3 routines that don't do very much anyway. And then stop - * having to create fake objects and traps. However, I am reluctant to - * make this change. - */ -/* FIXME: some of these use xchars for x and y, and some use ints. Make - * this consistent. - */ - -/* - * map_background() - * - * Make the real background part of our map. This routine assumes that - * the hero can physically see the location. Update the screen if directed. - */ -void -map_background(x, y, show) - register xchar x,y; - register int show; -{ - register int cmap = back_to_cmap(x,y); - - if (level.flags.hero_memory) -#ifdef DISPLAY_LAYERS - levl[x][y].mem_bg = cmap; -#else - levl[x][y].glyph = cmap_to_glyph(cmap); -#endif - if (show || transp) show_glyph(x,y, cmap_to_glyph(cmap)); -} - -/* - * map_trap() - * - * Map the trap and print it out if directed. This routine assumes that the - * hero can physically see the location. - */ -void -map_trap(trap, show) - register struct trap *trap; - register int show; -{ - register int x = trap->tx, y = trap->ty; - register int cmap = trap_to_cmap(trap); - - if (level.flags.hero_memory) -#ifdef DISPLAY_LAYERS - levl[x][y].mem_trap = 1 + cmap - MAXDCHARS; -#else - levl[x][y].glyph = cmap_to_glyph(cmap); -#endif - if (show || transp) show_glyph(x, y, cmap_to_glyph(cmap)); -} - -/* - * map_object() - * - * Map the given object. This routine assumes that the hero can physically - * see the location of the object. Update the screen if directed. - */ -void -map_object(obj, show) - register struct obj *obj; - register int show; -{ - register int x = obj->ox, y = obj->oy; - register int glyph = obj_to_glyph(obj); - - if (level.flags.hero_memory) -#ifdef DISPLAY_LAYERS - if ((levl[x][y].mem_corpse = glyph_is_body(glyph))) - levl[x][y].mem_obj = 1 + glyph_to_body(glyph); - else - levl[x][y].mem_obj = 1 + glyph_to_obj(glyph); -#else - levl[x][y].glyph = glyph; -#endif - if (show) show_glyph(x, y, glyph); -} - -/* - * map_invisible() - * - * Make the hero remember that a square contains an invisible monster. - * This is a special case in that the square will continue to be displayed - * this way even when the hero is close enough to see it. To get rid of - * this and display the square's actual contents, use unmap_object() followed - * by newsym() if necessary. - */ -void -map_invisible(x, y) -register xchar x, y; -{ - if (x != u.ux || y != u.uy) { /* don't display I at hero's location */ - if (level.flags.hero_memory) -#ifdef DISPLAY_LAYERS - levl[x][y].mem_invis = 1; -#else - levl[x][y].glyph = GLYPH_INVISIBLE; -#endif - show_glyph(x, y, GLYPH_INVISIBLE); - } -} - -/* - * unmap_object() - * - * Remove something from the map when the hero realizes it's not there any - * more. Replace it with background or known trap, but not with any other - * If this is used for detection, a full screen update is imminent anyway; - * if this is used to get rid of an invisible monster notation, we might have - * to call newsym(). - */ -void -unmap_object(x, y) - register int x, y; -{ -#ifndef DISPLAY_LAYERS - register struct trap *trap; -#endif - - if (!level.flags.hero_memory) return; - -#ifdef DISPLAY_LAYERS - levl[x][y].mem_invis = levl[x][y].mem_corpse = levl[x][y].mem_obj = 0; -#else - if ((trap = t_at(x,y)) != 0 && trap->tseen && !covers_traps(x,y)) - map_trap(trap, 0); - else if (levl[x][y].seenv) { - struct rm *lev = &levl[x][y]; - - map_background(x, y, 0); - - /* turn remembered dark room squares dark */ - if (!lev->waslit && lev->glyph == cmap_to_glyph(S_room) && - lev->typ == ROOM) - lev->glyph = cmap_to_glyph(S_stone); - } else - levl[x][y].glyph = cmap_to_glyph(S_stone); /* default val */ -#endif -} - -#define DETECTED 2 -#define PHYSICALLY_SEEN 1 -#define is_worm_tail(mon) ((mon) && ((x != (mon)->mx) || (y != (mon)->my))) - -/* - * map_location() - * - * Make whatever at this location show up. This is only for non-living - * things. This will not handle feeling invisible objects correctly. - * - * Internal to display.c, this is a #define for speed. - */ -#ifdef DISPLAY_LAYERS -#define _map_location(x,y,show) \ -{ \ - register struct obj *obj; \ - register struct trap *trap; \ - \ - if (level.flags.hero_memory) { \ - if ((obj = vobj_at(x, y)) && !covers_objects(x, y)) \ - map_object(obj, FALSE); \ - else \ - levl[x][y].mem_corpse = levl[x][y].mem_obj = 0; \ - if ((trap = t_at(x, y)) && trap->tseen && !covers_traps(x, y)) \ - map_trap(trap, FALSE); \ - else \ - levl[x][y].mem_trap = 0; \ - map_background(x, y, FALSE); \ - if (show) show_glyph(x, y, memory_glyph(x, y)); \ - } else if ((obj = vobj_at(x,y)) && !covers_objects(x,y)) \ - map_object(obj,show); \ - else if ((trap = t_at(x,y)) && trap->tseen && !covers_traps(x,y)) \ - map_trap(trap,show); \ - else \ - map_background(x,y,show); \ -} -#else /* DISPLAY_LAYERS */ -#define _map_location(x,y,show) \ -{ \ - register struct obj *obj; \ - register struct trap *trap; \ - \ - if ((obj = vobj_at(x,y)) && !covers_objects(x,y)) \ - map_object(obj,show); \ - else if ((trap = t_at(x,y)) && trap->tseen && !covers_traps(x,y)) \ - map_trap(trap,show); \ - else \ - map_background(x,y,show); \ -} -#endif /* DISPLAY_LAYERS */ - -void -map_location(x,y,show) - int x, y, show; -{ - _map_location(x,y,show); -} - -int memory_glyph(x, y) - int x, y; -{ -#ifdef DISPLAY_LAYERS - if (levl[x][y].mem_invis) - return GLYPH_INVISIBLE; - else if (levl[x][y].mem_obj) - if (levl[x][y].mem_corpse) - return body_to_glyph(levl[x][y].mem_obj - 1); - else - return objnum_to_glyph(levl[x][y].mem_obj - 1); - else if (levl[x][y].mem_trap) - return cmap_to_glyph(levl[x][y].mem_trap - 1 + MAXDCHARS); - else - return cmap_to_glyph(levl[x][y].mem_bg); -#else - return levl[x][y].glyph; -#endif -} - -void clear_memory_glyph(x, y, to) - int x, y, to; -{ -#ifdef DISPLAY_LAYERS - levl[x][y].mem_bg = to; - levl[x][y].mem_trap = 0; - levl[x][y].mem_obj = 0; - levl[x][y].mem_corpse = 0; - levl[x][y].mem_invis = 0; -#else - levl[x][y].glyph = cmap_to_glyph(to); -#endif -} - -/* - * display_monster() - * - * Note that this is *not* a map_XXXX() function! Monsters sort of float - * above everything. - * - * Yuck. Display body parts by recognizing that the display position is - * not the same as the monster position. Currently the only body part is - * a worm tail. - * - */ -STATIC_OVL void -display_monster(x, y, mon, sightflags, worm_tail) - register xchar x, y; /* display position */ - register struct monst *mon; /* monster to display */ - int sightflags; /* 1 if the monster is physically seen */ - /* 2 if detected using Detect_monsters */ - register xchar worm_tail; /* mon is actually a worm tail */ -{ - register boolean mon_mimic = (mon->m_ap_type != M_AP_NOTHING); - register int sensed = mon_mimic && - (Protection_from_shape_changers || sensemon(mon)); - /* - * We must do the mimic check first. If the mimic is mimicing something, - * and the location is in sight, we have to change the hero's memory - * so that when the position is out of sight, the hero remembers what - * the mimic was mimicing. - */ - - if (mon_mimic && (sightflags == PHYSICALLY_SEEN)) { - switch (mon->m_ap_type) { - default: - impossible("display_monster: bad m_ap_type value [ = %d ]", - (int) mon->m_ap_type); - case M_AP_NOTHING: - show_glyph(x, y, mon_to_glyph(mon)); - break; - - case M_AP_FURNITURE: { - /* - * This is a poor man's version of map_background(). I can't - * use map_background() because we are overriding what is in - * the 'typ' field. Maybe have map_background()'s parameters - * be (x,y,glyph) instead of just (x,y). - * - * mappearance is currently set to an S_ index value in - * makemon.c. - */ - register int glyph = cmap_to_glyph(mon->mappearance); -#ifdef DISPLAY_LAYERS - levl[x][y].mem_bg = mon->mappearance; -#else - levl[x][y].glyph = glyph; -#endif - if (!sensed) show_glyph(x,y, glyph); - break; - } - - case M_AP_OBJECT: { - struct obj obj; /* Make a fake object to send */ - /* to map_object(). */ - obj.ox = x; - obj.oy = y; - obj.otyp = mon->mappearance; - obj.corpsenm = PM_TENGU; /* if mimicing a corpse */ - map_object(&obj,!sensed); - break; - } - - case M_AP_MONSTER: - show_glyph(x,y, monnum_to_glyph(what_mon((int)mon->mappearance))); - break; - } - - } - - /* If the mimic is unsucessfully mimicing something, display the monster */ - if (!mon_mimic || sensed) { - int num; - - /* [ALI] Only use detected glyphs when monster wouldn't be - * visible by any other means. - */ - if (sightflags == DETECTED) { - if (worm_tail) - num = detected_monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)); - else - num = detected_mon_to_glyph(mon); - } else if (mon->mtame && !Hallucination) { - if (worm_tail) - num = petnum_to_glyph(PM_LONG_WORM_TAIL); - else - num = pet_to_glyph(mon); - } else { - if (worm_tail) - num = monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)); - else - num = mon_to_glyph(mon); - } - show_glyph(x,y,num); - } -} -/* - * display_warning() - * - * This is also *not* a map_XXXX() function! Monster warnings float - * above everything just like monsters do, but only if the monster - * is not showing. - * - * Do not call for worm tails. - */ -STATIC_OVL void -display_warning(mon) - register struct monst *mon; -{ - int x = mon->mx, y = mon->my; - int wl = (int) (mon->m_lev / 4); - int glyph; - - if (mon_warning(mon)) { - if (wl > WARNCOUNT - 1) wl = WARNCOUNT - 1; - /* 3.4.1: this really ought to be rn2(WARNCOUNT), but value "0" - isn't handled correctly by the what_is routine so avoid it */ - if (Hallucination) wl = rn1(WARNCOUNT-1,1); - glyph = warning_to_glyph(wl); - } else if (MATCH_WARN_OF_MON(mon)) { - glyph = mon_to_glyph(mon); - } else { - impossible("display_warning did not match warning type?"); - return; - } - show_glyph(x, y, glyph); -} - -/* - * feel_location() - * - * Feel the given location. This assumes that the hero is blind and that - * the given position is either the hero's or one of the eight squares - * adjacent to the hero (except for a boulder push). - */ -void -feel_location(x, y) - xchar x, y; -{ - struct rm *lev = &(levl[x][y]); - struct obj *boulder; - register struct monst *mon; - - /* If the hero's memory of an invisible monster is accurate, we want to keep - * him from detecting the same monster over and over again on each turn. - * We must return (so we don't erase the monster). (We must also, in the - * search function, be sure to skip over previously detected 'I's.) - */ - if (memory_is_invisible(x,y) && m_at(x,y)) return; - - /* The hero can't feel non pool locations while under water. */ - if (Underwater && !Is_waterlevel(&u.uz) && ! is_pool(x,y)) - return; - - /* Set the seen vector as if the hero had seen it. It doesn't matter */ - /* if the hero is levitating or not. */ - set_seenv(lev, u.ux, u.uy, x, y); - - if (Levitation && !Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz)) { - /* - * Levitation Rules. It is assumed that the hero can feel the state - * of the walls around herself and can tell if she is in a corridor, - * room, or doorway. Boulders are felt because they are large enough. - * Anything else is unknown because the hero can't reach the ground. - * This makes things difficult. - * - * Check (and display) in order: - * - * + Stone, walls, and closed doors. - * + Boulders. [see a boulder before a doorway] - * + Doors. - * + Room/water positions - * + Everything else (hallways!) - */ - if (IS_ROCK(lev->typ) || (IS_DOOR(lev->typ) && - (lev->doormask & (D_LOCKED | D_CLOSED)))) { - map_background(x, y, 1); - } else if ((boulder = sobj_at(BOULDER,x,y)) != 0) { - map_object(boulder, 1); - } else if (IS_DOOR(lev->typ)) { - map_background(x, y, 1); - } else if (IS_ROOM(lev->typ) || IS_POOL(lev->typ)) { - /* - * An open room or water location. Normally we wouldn't touch - * this, but we have to get rid of remembered boulder symbols. - * This will only occur in rare occations when the hero goes - * blind and doesn't find a boulder where expected (something - * came along and picked it up). We know that there is not a - * boulder at this location. Show fountains, pools, etc. - * underneath if already seen. Otherwise, show the appropriate - * floor symbol. - * - * Similarly, if the hero digs a hole in a wall or feels a location - * that used to contain an unseen monster. In these cases, - * there's no reason to assume anything was underneath, so - * just show the appropriate floor symbol. If something was - * embedded in the wall, the glyph will probably already - * reflect that. Don't change the symbol in this case. - * - * This isn't quite correct. If the boulder was on top of some - * other objects they should be seen once the boulder is removed. - * However, we have no way of knowing that what is there now - * was there then. So we let the hero have a lapse of memory. - * We could also just display what is currently on the top of the - * object stack (if anything). - */ - if (remembered_object(x, y) == BOULDER) { - if (lev->typ != ROOM && lev->seenv) { - map_background(x, y, 1); - } else { -#ifdef DISPLAY_LAYERS - lev->mem_bg = lev->waslit ? S_room : S_stone; -#else - lev->glyph = lev->waslit ? cmap_to_glyph(S_room) : - cmap_to_glyph(S_stone); -#endif - show_glyph(x, y, memory_glyph(x, y)); - } -#ifdef DISPLAY_LAYERS - } else if ((lev->mem_bg >= S_stone && lev->mem_bg < S_room) || - memory_is_invisible(x, y)) { - lev->mem_bg = lev->waslit ? S_room : S_stone; -#else - } else if ((lev->glyph >= cmap_to_glyph(S_stone) && - lev->glyph < cmap_to_glyph(S_room)) || - glyph_is_invisible(levl[x][y].glyph)) { - lev->glyph = lev->waslit ? cmap_to_glyph(S_room) : - cmap_to_glyph(S_stone); -#endif - show_glyph(x, y, memory_glyph(x, y)); - } - } else { - /* We feel it (I think hallways are the only things left). */ - map_background(x, y, 1); - /* Corridors are never felt as lit (unless remembered that way) */ - /* (lit_corridor only). */ -#ifdef DISPLAY_LAYERS - if (lev->typ == CORR && lev->mem_bg == S_litcorr && !lev->waslit) - show_glyph(x, y, cmap_to_glyph(lev->mem_bg = S_corr)); -#else - if (lev->typ == CORR && - lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit) - show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr)); -#endif - } - } else { - _map_location(x, y, 1); - - if (Punished) { - /* - * A ball or chain is only felt if it is first on the object - * location list. Otherwise, we need to clear the felt bit --- - * something has been dropped on the ball/chain. If the bit is - * not cleared, then when the ball/chain is moved it will drop - * the wrong glyph. - */ - if (uchain->ox == x && uchain->oy == y) { - if (level.objects[x][y] == uchain) - u.bc_felt |= BC_CHAIN; - else - u.bc_felt &= ~BC_CHAIN; /* do not feel the chain */ - } - if (!carried(uball) && uball->ox == x && uball->oy == y) { - if (level.objects[x][y] == uball) - u.bc_felt |= BC_BALL; - else - u.bc_felt &= ~BC_BALL; /* do not feel the ball */ - } - } - - /* Floor spaces are dark if unlit. Corridors are dark if unlit. */ -#ifdef DISPLAY_LAYERS - if (lev->typ == ROOM && lev->mem_bg == S_room && !lev->waslit) { - lev->mem_bg = S_stone; - show_glyph(x,y, memory_glyph(x, y)); - } else if (lev->typ == CORR && - lev->mem_bg == S_litcorr && !lev->waslit) { - lev->mem_bg = S_corr; - show_glyph(x,y, memory_glyph(x, y)); - } -#else - if (lev->typ == ROOM && - lev->glyph == cmap_to_glyph(S_room) && !lev->waslit) - show_glyph(x,y, lev->glyph = cmap_to_glyph(S_stone)); - else if (lev->typ == CORR && - lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit) - show_glyph(x,y, lev->glyph = cmap_to_glyph(S_corr)); -#endif - } - /* draw monster on top if we can sense it */ - if ((x != u.ux || y != u.uy) && (mon = m_at(x,y)) && sensemon(mon)) - display_monster(x, y, mon, - (tp_sensemon(mon) || MATCH_WARN_OF_MON(mon)) ? PHYSICALLY_SEEN : DETECTED, - is_worm_tail(mon)); -} - -/* - * newsym() - * - * Possibly put a new glyph at the given location. - */ -void -newsym(x,y) - register int x,y; -{ - register struct monst *mon; - register struct rm *lev = &(levl[x][y]); - register int see_it; - register xchar worm_tail; - - if (in_mklev) return; - - /* only permit updating the hero when swallowed */ - if (u.uswallow) { - if (x == u.ux && y == u.uy) display_self(); - return; - } - if (Underwater && !Is_waterlevel(&u.uz)) { - /* don't do anything unless (x,y) is an adjacent underwater position */ - int dx, dy; - if (!is_pool(x,y)) return; - dx = x - u.ux; if (dx < 0) dx = -dx; - dy = y - u.uy; if (dy < 0) dy = -dy; - if (dx > 1 || dy > 1) return; - } - - /* Can physically see the location. */ - if (cansee(x,y)) { - NhRegion* reg = visible_region_at(x,y); - /* - * Don't use templit here: E.g. - * - * lev->waslit = !!(lev->lit || templit(x,y)); - * - * Otherwise we have the "light pool" problem, where non-permanently - * lit areas just out of sight stay remembered as lit. They should - * re-darken. - * - * Perhaps ALL areas should revert to their "unlit" look when - * out of sight. - */ - lev->waslit = (lev->lit!=0); /* remember lit condition */ - - if (reg != NULL && ACCESSIBLE(lev->typ)) { - show_region(reg,x,y); - return; - } - if (x == u.ux && y == u.uy) { - if (senseself()) { - _map_location(x,y,0); /* map *under* 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)); - 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 || tt == PIT || - tt == SPIKED_PIT ||tt == WEB) { - trap->tseen = TRUE; - } - } - _map_location(x,y,0); /* map under the monster */ - /* also gets rid of any invisibility glyph */ - display_monster(x, y, mon, see_it? PHYSICALLY_SEEN : DETECTED, worm_tail); - } - else if (mon && mon_warning(mon) && !is_worm_tail(mon)) - display_warning(mon); - else if (memory_is_invisible(x,y)) - map_invisible(x, y); - else - _map_location(x,y,1); /* map the location */ - } - } - - /* Can't see the location. */ - else { - if (x == u.ux && y == u.uy) { - feel_location(u.ux, u.uy); /* forces an update */ - - if (senseself()) display_self(); - } - else if ((mon = m_at(x,y)) - && ((see_it = (tp_sensemon(mon) || MATCH_WARN_OF_MON(mon) - || (see_with_infrared(mon) && mon_visible(mon)))) - || Detect_monsters) - && !is_worm_tail(mon)) { - /* Monsters are printed every time. */ - /* This also gets rid of any invisibility glyph */ - display_monster(x, y, mon, see_it ? 0 : DETECTED, 0); - } - else if ((mon = m_at(x,y)) && mon_warning(mon) && - !is_worm_tail(mon)) { - display_warning(mon); - } - - /* - * If the location is remembered as being both dark (waslit is false) - * and lit (glyph is a lit room or lit corridor) then it was either: - * - * (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. - * - * In either case, we have to manually correct the hero's memory to - * match waslit. Deciding when to change waslit is non-trivial. - * - * Note: If flags.lit_corridor is set, then corridors act like room - * squares. That is, they light up if in night vision range. - * If flags.lit_corridor is not set, then corridors will - * remain dark unless lit by a light spell and may darken - * again, as discussed above. - * - * 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 (!lev->waslit) { -#ifdef DISPLAY_LAYERS - if (lev->mem_bg == S_litcorr && lev->typ == CORR) { - lev->mem_bg = S_corr; - show_glyph(x, y, memory_glyph(x, y)); - } else if (lev->mem_bg == S_room && lev->typ == ROOM) { - lev->mem_bg = S_stone; - show_glyph(x, y, memory_glyph(x, y)); - } -#else /* DISPLAY_LAYERS */ - 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) - show_glyph(x, y, lev->glyph = cmap_to_glyph(S_stone)); -#endif /* DISPLAY_LAYERS */ - else - goto show_mem; - } else { -show_mem: - show_glyph(x, y, memory_glyph(x, y)); - } - } -} - -#undef is_worm_tail - -/* - * shieldeff() - * - * Put magic shield pyrotechnics at the given location. This *could* be - * pulled into a platform dependent routine for fancier graphics if desired. - */ -void -shieldeff(x,y) - xchar x,y; -{ - register int i; - - if (!flags.sparkle) return; - if (cansee(x,y)) { /* Don't see anything if can't see the location */ -#ifdef ALLEG_FX - if (iflags.usealleg) { - newsym(x,y); - if(alleg_shield(x,y)) - return; - } -#endif - for (i = 0; i < SHIELD_COUNT; i++) { - show_glyph(x, y, cmap_to_glyph(shield_static[i])); - flush_screen(1); /* make sure the glyph shows up */ - delay_output(); - } - newsym(x,y); /* restore the old information */ - } -} - - -/* - * tmp_at() - * - * Temporarily place glyphs on the screen. Do not call delay_output(). It - * is up to the caller to decide if it wants to wait [presently, everyone - * but explode() wants to delay]. - * - * Call: - * (DISP_BEAM, glyph) open, initialize glyph - * (DISP_BEAM_ALWAYS, glyph) open, initialize glyph - * (DISP_FLASH, glyph) open, initialize glyph - * (DISP_ALWAYS, glyph) open, initialize glyph - * (DISP_CHANGE, glyph) change glyph - * (DISP_END, 0) close & clean up (second argument doesn't - * matter) - * (DISP_FREEMEM, 0) only used to prevent memory leak during - * exit) - * (x, y) display the glyph at the location - * - * DISP_BEAM - Display the given glyph at each location, but do not erase - * any until the close call. - * WAC added beam_always for lightning strikes - * DISP_BEAM_ALWAYS- Like DISP_BEAM, but vision is not taken into account. - * DISP_FLASH - Display the given glyph at each location, but erase the - * previous location's glyph. - * DISP_ALWAYS- Like DISP_FLASH, but vision is not taken into account. - */ - -static struct tmp_glyph { - coord saved[COLNO]; /* previously updated positions */ - int sidx; /* index of next unused slot in saved[] */ - int style; /* either DISP_BEAM or DISP_FLASH or DISP_ALWAYS */ - int glyph; /* glyph to use when printing */ - struct tmp_glyph *cont; /* Used if saved[] is full */ - struct tmp_glyph *prev; -} tgfirst; -static struct tmp_glyph *tglyph = (struct tmp_glyph *)0; - -void -tmp_at(x, y) - int x, y; -{ - struct tmp_glyph *tmp, *cont; - - switch (x) { - case DISP_BEAM: - case DISP_BEAM_ALWAYS: - case DISP_FLASH: - case DISP_ALWAYS: - if (!tglyph) - tmp = &tgfirst; - else /* nested effect; we need dynamic memory */ - tmp = (struct tmp_glyph *)alloc(sizeof (struct tmp_glyph)); - tmp->prev = tglyph; - tglyph = tmp; - tglyph->sidx = 0; - tglyph->style = x; - tglyph->glyph = y; - tglyph->cont = (struct tmp_glyph *)0; - flush_screen(0); /* flush buffered glyphs */ - return; - case DISP_FREEMEM: /* in case game ends with tmp_at() in progress */ - while (tglyph) { - cont = tglyph->cont; - while (cont) { - tmp = cont->cont; - if (cont != &tgfirst) free((genericptr_t)cont); - cont = tmp; - } - tmp = tglyph->prev; - if (tglyph != &tgfirst) free((genericptr_t)tglyph); - tglyph = tmp; - } - return; - - default: - break; - } - - if (!tglyph) panic("tmp_at: tglyph not initialized"); - - switch (x) { - case DISP_CHANGE: - tglyph->glyph = y; - break; - - case DISP_END: - if (tglyph->style == DISP_BEAM || tglyph->style == DISP_BEAM_ALWAYS) { - register int i; - - /* Erase (reset) from source to end */ - for (i = 0; i < tglyph->sidx; i++) - newsym(tglyph->saved[i].x, tglyph->saved[i].y); - cont = tglyph->cont; - while (cont) { - for (i = 0; i < cont->sidx; i++) - newsym(cont->saved[i].x, cont->saved[i].y); - tmp = cont->cont; - if (cont != &tgfirst) free((genericptr_t)cont); - cont = tmp; - } - /* tglyph->cont = (struct tmp_glyph *)0; */ - } else { /* DISP_FLASH or DISP_ALWAYS */ - if (tglyph->sidx) /* been called at least once */ - newsym(tglyph->saved[0].x, tglyph->saved[0].y); - } - /* tglyph->sidx = 0; -- about to be freed, so not necessary */ - tmp = tglyph->prev; - if (tglyph != &tgfirst) free((genericptr_t)tglyph); - tglyph = tmp; - break; - - default: /* do it */ - if (tglyph->style == DISP_BEAM || tglyph->style == DISP_BEAM_ALWAYS) { - if (!cansee(x,y) && tglyph->style == DISP_BEAM) break; - /* save pos for later erasing */ - if (tglyph->sidx >= SIZE(tglyph->saved)) { - tmp = (struct tmp_glyph *)alloc(sizeof (struct tmp_glyph)); - *tmp = *tglyph; - tglyph->prev = (struct tmp_glyph *)0; - tmp->cont = tglyph; - tglyph = tmp; - tglyph->sidx = 0; - } - tglyph->saved[tglyph->sidx].x = x; - tglyph->saved[tglyph->sidx].y = y; - tglyph->sidx += 1; - } else { /* DISP_FLASH/ALWAYS */ - if (tglyph->sidx) { /* not first call, so reset previous pos */ - newsym(tglyph->saved[0].x, tglyph->saved[0].y); - tglyph->sidx = 0; /* display is presently up to date */ - } - if (!cansee(x,y) && tglyph->style != DISP_ALWAYS) break; - tglyph->saved[0].x = x; - tglyph->saved[0].y = y; - tglyph->sidx = 1; - } - - show_glyph(x, y, tglyph->glyph); /* show it */ - flush_screen(0); /* make sure it shows up */ - break; - } /* end case */ -} - -#ifdef DISPLAY_LAYERS -int -glyph_is_floating(glyph) -int glyph; -{ - return glyph_is_monster(glyph) || glyph_is_explosion(glyph) || - glyph_is_zap_beam(glyph) || glyph_is_swallow(glyph) || - glyph_is_warning(glyph) || tglyph && glyph == tglyph->glyph; -} -#endif - -/* - * swallowed() - * - * The hero is swallowed. Show a special graphics sequence for this. This - * bypasses all of the display routines and messes with buffered screen - * directly. This method works because both vision and display check for - * being swallowed. - */ -void -swallowed(first) - int first; -{ - static xchar lastx, lasty; /* last swallowed position */ - int swallower, left_ok, rght_ok; - - if (first) - cls(); - else { - register int x, y; - - /* Clear old location */ - for (y = lasty-1; y <= lasty+1; y++) - for (x = lastx-1; x <= lastx+1; x++) - if (isok(x,y)) show_glyph(x,y,cmap_to_glyph(S_stone)); - } - -#ifdef ALLEG_FX - if(!iflags.usealleg || !alleg_swallowed(u.ux,u.uy)) { -#endif - swallower = monsndx(u.ustuck->data); - /* assume isok(u.ux,u.uy) */ - left_ok = isok(u.ux-1,u.uy); - rght_ok = isok(u.ux+1,u.uy); - /* - * Display the hero surrounded by the monster's stomach. - */ - if(isok(u.ux, u.uy-1)) { - if (left_ok) - show_glyph(u.ux-1, u.uy-1, swallow_to_glyph(swallower, S_sw_tl)); - show_glyph(u.ux , u.uy-1, swallow_to_glyph(swallower, S_sw_tc)); - if (rght_ok) - show_glyph(u.ux+1, u.uy-1, swallow_to_glyph(swallower, S_sw_tr)); - } - - if (left_ok) - show_glyph(u.ux-1, u.uy , swallow_to_glyph(swallower, S_sw_ml)); - display_self(); - if (rght_ok) - show_glyph(u.ux+1, u.uy , swallow_to_glyph(swallower, S_sw_mr)); - - if(isok(u.ux, u.uy+1)) { - if (left_ok) - show_glyph(u.ux-1, u.uy+1, swallow_to_glyph(swallower, S_sw_bl)); - show_glyph(u.ux , u.uy+1, swallow_to_glyph(swallower, S_sw_bc)); - if (rght_ok) - show_glyph(u.ux+1, u.uy+1, swallow_to_glyph(swallower, S_sw_br)); - } -#ifdef ALLEG_FX - } -#endif - - /* Update the swallowed position. */ - lastx = u.ux; - lasty = u.uy; -} - -/* - * under_water() - * - * Similar to swallowed() in operation. Shows hero when underwater - * except when in water level. Special routines exist for that. - */ -void -under_water(mode) - int mode; -{ - static xchar lastx, lasty; - static boolean dela; - register int x, y; - - /* swallowing has a higher precedence than under water */ - if (Is_waterlevel(&u.uz) || u.uswallow) return; - - /* full update */ - if (mode == 1 || dela) { - cls(); - dela = FALSE; - } - /* delayed full update */ - else if (mode == 2) { - dela = TRUE; - return; - } - /* limited update */ - else { - for (y = lasty-1; y <= lasty+1; y++) - for (x = lastx-1; x <= lastx+1; x++) - if (isok(x,y)) - show_glyph(x,y,cmap_to_glyph(S_stone)); - } - for (x = u.ux-1; x <= u.ux+1; x++) - for (y = u.uy-1; y <= u.uy+1; y++) - if (isok(x,y) && is_pool(x,y)) { - if (Blind && !(x == u.ux && y == u.uy)) - show_glyph(x,y,cmap_to_glyph(S_stone)); - else - newsym(x,y); - } - lastx = u.ux; - lasty = u.uy; -} - -/* - * under_ground() - * - * Very restricted display. You can only see yourself. - */ -void -under_ground(mode) - int mode; -{ - static boolean dela; - - /* swallowing has a higher precedence than under ground */ - if (u.uswallow) return; - - /* full update */ - if (mode == 1 || dela) { - cls(); - dela = FALSE; - } - /* delayed full update */ - else if (mode == 2) { - dela = TRUE; - return; - } - /* limited update */ - else - newsym(u.ux,u.uy); -} - - -/* ========================================================================= */ - -/* - * Loop through all of the monsters and update them. Called when: - * + going blind & telepathic - * + regaining sight & telepathic - * + getting and losing infravision - * + hallucinating - * + doing a full screen redraw - * + see invisible times out or a ring of see invisible is taken off - * + when a potion of see invisible is quaffed or a ring of see - * invisible is put on - * + gaining telepathy when blind [givit() in eat.c, pleased() in pray.c] - * + losing telepathy while blind [xkilled() in mon.c, attrcurse() in - * sit.c] - */ -void -see_monsters() -{ - register struct monst *mon; - - for (mon = fmon; mon; mon = mon->nmon) { - if (DEADMONSTER(mon)) continue; - newsym(mon->mx,mon->my); - if (mon->wormno) see_wsegs(mon); - } -#ifdef STEED - /* when mounted, hero's location gets caught by monster loop */ - if (!u.usteed) -#endif - newsym(u.ux, u.uy); -} - -/* - * Block/unblock light depending on what a mimic is mimicing and if it's - * invisible or not. Should be called only when the state of See_invisible - * changes. - */ -void -set_mimic_blocking() -{ - register struct monst *mon; - - for (mon = fmon; mon; mon = mon->nmon) { - if (DEADMONSTER(mon)) continue; - if (mon->minvis && - ((mon->m_ap_type == M_AP_FURNITURE && - (mon->mappearance == S_vcdoor || mon->mappearance == S_hcdoor)) || - (mon->m_ap_type == M_AP_OBJECT && mon->mappearance == BOULDER))) { - if(See_invisible) - block_point(mon->mx, mon->my); - else - unblock_point(mon->mx, mon->my); - } - } -} - -/* - * Loop through all of the object *locations* and update them. Called when - * + hallucinating. - */ -void -see_objects() -{ - register struct obj *obj; - for(obj = fobj; obj; obj = obj->nobj) - if (vobj_at(obj->ox,obj->oy) == obj) newsym(obj->ox, obj->oy); -} - -/* - * Update hallucinated traps. - */ -void -see_traps() -{ - struct trap *trap; - int glyph; - - for (trap = ftrap; trap; trap = trap->ntrap) { - glyph = glyph_at(trap->tx, trap->ty); - if (glyph_is_trap(glyph)) - newsym(trap->tx, trap->ty); - } -} - -/* - * Put the cursor on the hero. Flush all accumulated glyphs before doing it. - */ -void -curs_on_u() -{ - flush_screen(1); /* Flush waiting glyphs & put cursor on hero */ -} - -int -doredraw() -{ - docrt(); - return 0; -} - -void -docrt() -{ - register int x,y; - register struct rm *lev; - int i, glyph; - - if (!u.ux) return; /* display isn't ready yet */ - - transp = FALSE; - if (tileset[0]) - for(i = 0; i < no_tilesets; ++i) - if (!strcmpi(tileset, tilesets[i].name)) { - transp = !!(tilesets[i].flags & TILESET_TRANSPARENT); - break; - } - - if (u.uswallow) { - swallowed(1); - return; - } - if (Underwater && !Is_waterlevel(&u.uz)) { - under_water(1); - return; - } - if (u.uburied) { - under_ground(1); - return; - } - - /* shut down vision */ - vision_recalc(2); - - /* - * This routine assumes that cls() does the following: - * + fills the physical screen with the symbol for rock - * + clears the glyph buffer - */ - cls(); - - /* display memory */ - for (x = 1; x < COLNO; x++) { - lev = &levl[x][0]; - for (y = 0; y < ROWNO; y++, lev++) - if ((glyph = memory_glyph(x,y)) != cmap_to_glyph(S_stone)) - show_glyph(x,y,glyph); - } - - /* see what is to be seen */ - vision_recalc(0); - - /* overlay with monsters */ - see_monsters(); - - flags.botlx = 1; /* force a redraw of the bottom line */ - -} - - -/* ========================================================================= */ -/* Glyph Buffering (3rd screen) ============================================ */ - -typedef struct { - xchar new; /* perhaps move this bit into the rm strucure. */ - int glyph; -} gbuf_entry; - -static gbuf_entry gbuf[ROWNO][COLNO]; -static char gbuf_start[ROWNO]; -static char gbuf_stop[ROWNO]; - -#ifdef DUMP_LOG -/* D: Added to dump screen to output file */ -STATIC_PTR uchar get_glyph_char(glyph) -int glyph; -{ - uchar ch; - register int offset; - - if (glyph >= NO_GLYPH) - return ; - - /* - * Map the glyph back to a character. - * - * Warning: For speed, this makes an assumption on the order of - * offsets. The order is set in display.h. - */ - if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ - ch = def_warnsyms[offset].sym; - } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ - /* see swallow_to_glyph() in display.c */ - ch = (uchar) defsyms[S_sw_tl + (offset & 0x7)].sym; - } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ - /* see zapdir_to_glyph() in display.c */ - ch = defsyms[S_vbeam + (offset & 0x3)].sym; - } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ - ch = defsyms[offset].sym; - } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ - ch = def_oc_syms[(int)objects[offset].oc_class]; - } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */ - ch = def_monsyms[(int)mons[offset].mlet]; - } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ - ch = def_oc_syms[(int)objects[CORPSE].oc_class]; - } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */ - ch = def_monsyms[(int)mons[offset].mlet]; - } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ - ch = DEF_INVISIBLE; - } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ - ch = def_monsyms[(int)mons[offset].mlet]; - } else { /* a monster */ - ch = monsyms[(int)mons[glyph].mlet]; - } - return ch; -} - -#ifdef TTY_GRAPHICS -extern const char * FDECL(compress_str, (const char *)); -#else -const char* -compress_str(str) /* copied from win/tty/wintty.c */ -const char *str; -{ - static char cbuf[BUFSZ]; - /* compress in case line too long */ - if((int)strlen(str) >= 80) { - register const char *bp0 = str; - register char *bp1 = cbuf; - - do { - if(*bp0 != ' ' || bp0[1] != ' ') - *bp1++ = *bp0; - } while(*bp0++); - } else - return str; - return cbuf; -} -#endif /* TTY_GRAPHICS */ - -/* Take a screen dump */ -void dump_screen() -{ - register int x,y; - int lastc; - /* D: botl.c has a closer approximation to the size, but we'll go with - * this */ - char buf[300], *ptr; - - for (y = 0; y < ROWNO; y++) { - lastc = 0; - ptr = buf; - for (x = 1; x < COLNO; x++) { - uchar c = get_glyph_char(gbuf[y][x].glyph); - *ptr++ = c; - if (c != ' ') - lastc = x; - } - buf[lastc] = '\0'; - dump("", buf); - } - dump("", ""); - bot1str(buf); - ptr = (char *) compress_str((const char *) buf); - dump("", ptr); - bot2str(buf); - dump("", buf); - dump("", ""); - dump("", ""); -} -#endif /* DUMP_LOG */ - -/* - * Store the glyph in the 3rd screen for later flushing. - */ -void -show_glyph(x,y,glyph) - int x, y, glyph; -{ - /* - * Check for bad positions and glyphs. - */ - if (!isok(x, y)) { - const char *text; - int offset; - - /* column 0 is invalid, but it's often used as a flag, so ignore it */ - if (x == 0) return; - - /* - * This assumes an ordering of the offsets. See display.h for - * the definition. - */ - - if (glyph >= GLYPH_WARNING_OFF) { /* a warning */ - text = "warning"; offset = glyph - GLYPH_WARNING_OFF; - } else if (glyph >= GLYPH_SWALLOW_OFF) { /* swallow border */ - text = "swallow border"; offset = glyph - GLYPH_SWALLOW_OFF; - } else if (glyph >= GLYPH_ZAP_OFF) { /* zap beam */ - text = "zap beam"; offset = glyph - GLYPH_ZAP_OFF; - } else if (glyph >= GLYPH_EXPLODE_OFF) { /* explosion */ - text = "explosion"; offset = glyph - GLYPH_EXPLODE_OFF; - } else if (glyph >= GLYPH_CMAP_OFF) { /* cmap */ - text = "cmap_index"; offset = glyph - GLYPH_CMAP_OFF; - } else if (glyph >= GLYPH_OBJ_OFF) { /* object */ - text = "object"; offset = glyph - GLYPH_OBJ_OFF; - } else if (glyph >= GLYPH_RIDDEN_OFF) { /* ridden mon */ - text = "ridden mon"; offset = glyph - GLYPH_RIDDEN_OFF; - } else if (glyph >= GLYPH_BODY_OFF) { /* a corpse */ - text = "corpse"; offset = glyph - GLYPH_BODY_OFF; - } else if (glyph >= GLYPH_DETECT_OFF) { /* detected mon */ - text = "detected mon"; offset = glyph - GLYPH_DETECT_OFF; - } else if (glyph >= GLYPH_INVIS_OFF) { /* invisible mon */ - text = "invisible mon"; offset = glyph - GLYPH_INVIS_OFF; - } else if (glyph >= GLYPH_PET_OFF) { /* a pet */ - text = "pet"; offset = glyph - GLYPH_PET_OFF; - } else { /* a monster */ - text = "monster"; offset = glyph; - } - - impossible("show_glyph: bad pos %d %d with glyph %d [%s %d].", - x, y, glyph, text, offset); - return; - } - - if (glyph >= MAX_GLYPH) { - impossible("show_glyph: bad glyph %d [max %d] at (%d,%d).", - glyph, MAX_GLYPH, x, y); - return; - } - - /* [ALI] In transparent mode it is not sufficient just to consider - * the foreground glyph, we also need to consider the background. - * Rather than extend the display module to do this, for the time - * being we just turn off optimization and rely on the windowing port - * to ignore redundant calls to print_glyph(). - */ - if (transp || gbuf[y][x].glyph != glyph) { - gbuf[y][x].glyph = glyph; - gbuf[y][x].new = 1; - if (gbuf_start[y] > x) gbuf_start[y] = x; - if (gbuf_stop[y] < x) gbuf_stop[y] = x; - } -} - - -/* - * Reset the changed glyph borders so that none of the 3rd screen has - * changed. - */ -#define reset_glyph_bbox() \ - { \ - int i; \ - \ - for (i = 0; i < ROWNO; i++) { \ - gbuf_start[i] = COLNO-1; \ - gbuf_stop[i] = 0; \ - } \ - } - - -static gbuf_entry nul_gbuf = { 0, cmap_to_glyph(S_stone) }; -/* - * Turn the 3rd screen into stone. - */ -void -clear_glyph_buffer() -{ - register int x, y; - register gbuf_entry *gptr; - - for (y = 0; y < ROWNO; y++) { - gptr = &gbuf[y][0]; - for (x = COLNO; x; x--) { - *gptr++ = nul_gbuf; - } - } - reset_glyph_bbox(); -} - -/* - * Assumes that the indicated positions are filled with S_stone glyphs. - */ -void -row_refresh(start,stop,y) - int start,stop,y; -{ - register int x; - - for (x = start; x <= stop; x++) - if (gbuf[y][x].glyph != cmap_to_glyph(S_stone)) - print_glyph(WIN_MAP,x,y,gbuf[y][x].glyph); -} - -void -cls() -{ - display_nhwindow(WIN_MESSAGE, FALSE); /* flush messages */ - flags.botlx = 1; /* force update of botl window */ - clear_nhwindow(WIN_MAP); /* clear physical screen */ - clear_glyph_buffer(); /* this is sort of an extra effort, but OK */ -} - -/* - * Synch the third screen with the display. - */ -void -flush_screen(cursor_on_u) - int cursor_on_u; -{ - /* Prevent infinite loops on errors: - * flush_screen->print_glyph->impossible->pline->flush_screen - */ - static boolean flushing = 0; - static boolean delay_flushing = 0; - register int x,y; - - if (cursor_on_u == -1) delay_flushing = !delay_flushing; - if (delay_flushing) return; - if (flushing) return; /* if already flushing then return */ - flushing = 1; - - for (y = 0; y < ROWNO; y++) { - register gbuf_entry *gptr = &gbuf[y][x = gbuf_start[y]]; - for (; x <= gbuf_stop[y]; gptr++, x++) - if (gptr->new) { - print_glyph(WIN_MAP,x,y,gptr->glyph); - gptr->new = 0; - } - } - - if (cursor_on_u) curs(WIN_MAP, u.ux,u.uy); /* move cursor to the hero */ - display_nhwindow(WIN_MAP, FALSE); - reset_glyph_bbox(); -#ifdef ALLEG_FX - if (iflags.usealleg) alleg_vid_refresh(); -#endif - flushing = 0; - if(flags.botl || flags.botlx) bot(); -} - -/* ========================================================================= */ - -/* - * back_to_cmap() - * - * Use the information in the rm structure at the given position to create - * a glyph of a background. - * - * I had to add a field in the rm structure (horizontal) so that we knew - * if open doors and secret doors were horizontal or vertical. Previously, - * the screen symbol had the horizontal/vertical information set at - * level generation time. - * - * I used the 'ladder' field (really doormask) for deciding if stairwells - * were up or down. I didn't want to check the upstairs and dnstairs - * variables. - */ -STATIC_OVL int -back_to_cmap(x,y) - xchar x,y; -{ - int idx; - struct rm *ptr = &(levl[x][y]); - - switch (ptr->typ) { - /* KMH -- support arboreal levels */ - case SCORR: - case STONE: - idx = level.flags.arboreal ? S_tree : S_stone; - break; - case ROOM: idx = S_room; break; - case CORR: - idx = (ptr->waslit || flags.lit_corridor) ? S_litcorr : S_corr; - break; - case HWALL: - case VWALL: - case TLCORNER: - case TRCORNER: - case BLCORNER: - case BRCORNER: - case CROSSWALL: - case TUWALL: - case TDWALL: - case TLWALL: - case TRWALL: - case SDOOR: - idx = ptr->seenv ? wall_angle(ptr) : S_stone; - break; - case IRONBARS: idx = S_bars; break; - case DOOR: - if (ptr->doormask) { - if (ptr->doormask & D_BROKEN) - idx = S_ndoor; - else if (ptr->doormask & D_ISOPEN) - idx = (ptr->horizontal) ? S_hodoor : S_vodoor; - else /* else is closed */ - idx = (ptr->horizontal) ? S_hcdoor : S_vcdoor; - } else - idx = S_ndoor; - break; - case TREE: idx = S_tree; break; - case POOL: - case MOAT: idx = S_pool; break; - case STAIRS: - idx = (ptr->ladder & LA_DOWN) ? S_dnstair : S_upstair; - break; - case LADDER: - idx = (ptr->ladder & LA_DOWN) ? S_dnladder : S_upladder; - break; - case FOUNTAIN: idx = S_fountain; break; - case SINK: idx = S_sink; break; - case TOILET: idx = S_toilet; break; - case GRAVE: idx = S_grave; break; - case ALTAR: idx = S_altar; break; - case THRONE: idx = S_throne; break; - case LAVAPOOL: idx = S_lava; break; - case ICE: idx = S_ice; break; - case AIR: idx = S_air; break; - case CLOUD: idx = S_cloud; break; - case WATER: idx = S_water; break; - case DBWALL: - idx = (ptr->horizontal) ? S_hcdbridge : S_vcdbridge; - break; - case DRAWBRIDGE_UP: - switch(ptr->drawbridgemask & DB_UNDER) { - case DB_MOAT: idx = S_pool; break; - case DB_LAVA: idx = S_lava; break; - case DB_ICE: idx = S_ice; break; - case DB_FLOOR: idx = S_room; break; - default: - impossible("Strange db-under: %d", - ptr->drawbridgemask & DB_UNDER); - idx = S_room; /* something is better than nothing */ - break; - } - break; - case DRAWBRIDGE_DOWN: - idx = (ptr->horizontal) ? S_hodbridge : S_vodbridge; - break; - default: - impossible("back_to_glyph: unknown level type [ = %d ]",ptr->typ); - idx = S_room; - break; - } - return idx; -} - -int -back_to_glyph(x,y) - xchar x,y; -{ - return cmap_to_glyph(back_to_cmap(x,y)); -} - - -/* - * swallow_to_glyph() - * - * Convert a monster number and a swallow location into the correct glyph. - * If you don't want a patchwork monster while hallucinating, decide on - * a random monster in swallowed() and don't use what_mon() here. - */ -STATIC_OVL int -swallow_to_glyph(mnum, loc) - int mnum; - int loc; -{ - if (loc < S_sw_tl || S_sw_br < loc) { - impossible("swallow_to_glyph: bad swallow location"); - loc = S_sw_br; - } - return ((int) (what_mon(mnum)<<3) | (loc - S_sw_tl)) + GLYPH_SWALLOW_OFF; -} - - - -/* - * zapdir_to_glyph() - * - * Change the given zap direction and beam type into a glyph. Each beam - * type has four glyphs, one for each of the symbols below. The order of - * the zap symbols [0-3] as defined in rm.h are: - * - * | S_vbeam ( 0, 1) or ( 0,-1) - * - S_hbeam ( 1, 0) or (-1, 0) - * \ S_lslant ( 1, 1) or (-1,-1) - * / S_rslant (-1, 1) or ( 1,-1) - */ -int -zapdir_to_glyph(dx, dy, beam_type) - register int dx, dy; - int beam_type; -{ - if (beam_type >= NUM_ZAP) { - impossible("zapdir_to_glyph: illegal beam type"); - beam_type = 0; - } - dx = (dx == dy) ? 2 : (dx && dy) ? 3 : dx ? 1 : 0; - - return ((int) ((beam_type << 2) | dx)) + GLYPH_ZAP_OFF; -} - - -/* - * Utility routine for dowhatis() used to find out the glyph displayed at - * the location. This isn't necessarily the same as the glyph in the levl - * structure, so we must check the "third screen". - */ -int -glyph_at(x, y) - xchar x,y; -{ - if(x < 0 || y < 0 || x >= COLNO || y >= ROWNO) - return cmap_to_glyph(S_room); /* XXX */ - return gbuf[y][x].glyph; -} - - -/* ------------------------------------------------------------------------- */ -/* Wall Angle -------------------------------------------------------------- */ - -/*#define WA_VERBOSE*/ /* give (x,y) locations for all "bad" spots */ - -#ifdef WA_VERBOSE - -static const char *FDECL(type_to_name, (int)); -static void FDECL(error4, (int,int,int,int,int,int)); - -static int bad_count[MAX_TYPE]; /* count of positions flagged as bad */ -static const char *type_names[MAX_TYPE] = { - "STONE", "VWALL", "HWALL", "TLCORNER", - "TRCORNER", "BLCORNER", "BRCORNER", "CROSSWALL", - "TUWALL", "TDWALL", "TLWALL", "TRWALL", - "DBWALL", "SDOOR", "SCORR", "POOL", - "MOAT", "WATER", "DRAWBRIDGE_UP","LAVAPOOL", - "DOOR", "CORR", "ROOM", "STAIRS", - "LADDER", "FOUNTAIN", "THRONE", "SINK", - "ALTAR", "ICE", "DRAWBRIDGE_DOWN","AIR", - "CLOUD" -}; - - -static const char * -type_to_name(type) - int type; -{ - return (type < 0 || type > MAX_TYPE) ? "unknown" : type_names[type]; -} - -STATIC_OVL void -error4(x, y, a, b, c, dd) - int x, y, a, b, c, dd; -{ - pline("set_wall_state: %s @ (%d,%d) %s%s%s%s", - type_to_name(levl[x][y].typ), x, y, - a ? "1":"", b ? "2":"", c ? "3":"", dd ? "4":""); - bad_count[levl[x][y].typ]++; -} -#endif /* WA_VERBOSE */ - -/* - * Return 'which' if position is implies an unfinshed exterior. Return - * zero otherwise. Unfinished implies outer area is rock or a corridor. - * - * Things that are ambigious: lava - */ -STATIC_OVL int -check_pos(x, y, which) - int x, y, which; -{ - int type; - if (!isok(x,y)) return which; - type = levl[x][y].typ; - if (IS_ROCK(type) || type == CORR || type == SCORR) return which; - return 0; -} - -/* Return TRUE if more than one is non-zero. */ -/*ARGSUSED*/ -#ifdef WA_VERBOSE -STATIC_OVL boolean -more_than_one(x, y, a, b, c) - int x, y, a, b, c; -{ -#if defined(MAC_MPW) -# pragma unused ( x,y ) -#endif - if ((a && (b|c)) || (b && (a|c)) || (c && (a|b))) { - error4(x,y,a,b,c,0); - return TRUE; - } - return FALSE; -} -#else -#define more_than_one(x, y, a, b, c) (((a) && ((b)|(c))) || ((b) && ((a)|(c))) || ((c) && ((a)|(b)))) -#endif - -/* Return the wall mode for a T wall. */ -STATIC_OVL int -set_twall(x0,y0, x1,y1, x2,y2, x3,y3) -int x0,y0, x1,y1, x2,y2, x3,y3; -{ - int wmode, is_1, is_2, is_3; - - is_1 = check_pos(x1, y1, WM_T_LONG); - is_2 = check_pos(x2, y2, WM_T_BL); - is_3 = check_pos(x3, y3, WM_T_BR); - if (more_than_one(x0, y0, is_1, is_2, is_3)) { - wmode = 0; - } else { - wmode = is_1 + is_2 + is_3; - } - return wmode; -} - -/* Return wall mode for a horizontal or vertical wall. */ -STATIC_OVL int -set_wall(x, y, horiz) - int x, y, horiz; -{ - int wmode, is_1, is_2; - - if (horiz) { - is_1 = check_pos(x,y-1, WM_W_TOP); - is_2 = check_pos(x,y+1, WM_W_BOTTOM); - } else { - is_1 = check_pos(x-1,y, WM_W_LEFT); - is_2 = check_pos(x+1,y, WM_W_RIGHT); - } - if (more_than_one(x, y, is_1, is_2, 0)) { - wmode = 0; - } else { - wmode = is_1 + is_2; - } - return wmode; -} - -/* - * If an invisible monster has gone away, that will be discovered. If an - * invisible monster has appeared, this will _not_ be discovered since - * searching only finds one monster per turn so we must check that separately. - * - * Return a wall mode for a corner wall. (x4,y4) is the "inner" position. - */ -STATIC_OVL int -set_corn(x1,y1, x2,y2, x3,y3, x4,y4) - int x1, y1, x2, y2, x3, y3, x4, y4; -{ - int wmode, is_1, is_2, is_3, is_4; - - is_1 = check_pos(x1, y1, 1); - is_2 = check_pos(x2, y2, 1); - is_3 = check_pos(x3, y3, 1); - is_4 = check_pos(x4, y4, 1); /* inner location */ - - /* - * All 4 should not be true. So if the inner location is rock, - * use it. If all of the outer 3 are true, use outer. We currently - * can't cover the case where only part of the outer is rock, so - * we just say that all the walls are finished (if not overridden - * by the inner section). - */ - if (is_4) { - wmode = WM_C_INNER; - } else if (is_1 && is_2 && is_3) - wmode = WM_C_OUTER; - else - wmode = 0; /* finished walls on all sides */ - - return wmode; -} - -/* Return mode for a crosswall. */ -STATIC_OVL int -set_crosswall(x, y) - int x, y; -{ - int wmode, is_1, is_2, is_3, is_4; - - is_1 = check_pos(x-1, y-1, 1); - is_2 = check_pos(x+1, y-1, 1); - is_3 = check_pos(x+1, y+1, 1); - is_4 = check_pos(x-1, y+1, 1); - - wmode = is_1+is_2+is_3+is_4; - if (wmode > 1) { - if (is_1 && is_3 && (is_2+is_4 == 0)) { - wmode = WM_X_TLBR; - } else if (is_2 && is_4 && (is_1+is_3 == 0)) { - wmode = WM_X_BLTR; - } else { -#ifdef WA_VERBOSE - error4(x,y,is_1,is_2,is_3,is_4); -#endif - wmode = 0; - } - } else if (is_1) - wmode = WM_X_TL; - else if (is_2) - wmode = WM_X_TR; - else if (is_3) - wmode = WM_X_BR; - else if (is_4) - wmode = WM_X_BL; - - return wmode; -} - -/* Called from mklev. Scan the level and set the wall modes. */ -void -set_wall_state() -{ - int x, y; - int wmode; - struct rm *lev; - -#ifdef WA_VERBOSE - for (x = 0; x < MAX_TYPE; x++) bad_count[x] = 0; -#endif - - for (x = 0; x < COLNO; x++) - for (lev = &levl[x][0], y = 0; y < ROWNO; y++, lev++) { - switch (lev->typ) { - case SDOOR: - wmode = set_wall(x, y, (int) lev->horizontal); - break; - case VWALL: - wmode = set_wall(x, y, 0); - break; - case HWALL: - wmode = set_wall(x, y, 1); - break; - case TDWALL: - wmode = set_twall(x,y, x,y-1, x-1,y+1, x+1,y+1); - break; - case TUWALL: - wmode = set_twall(x,y, x,y+1, x+1,y-1, x-1,y-1); - break; - case TLWALL: - wmode = set_twall(x,y, x+1,y, x-1,y-1, x-1,y+1); - break; - case TRWALL: - wmode = set_twall(x,y, x-1,y, x+1,y+1, x+1,y-1); - break; - case TLCORNER: - wmode = set_corn(x-1,y-1, x,y-1, x-1,y, x+1,y+1); - break; - case TRCORNER: - wmode = set_corn(x,y-1, x+1,y-1, x+1,y, x-1,y+1); - break; - case BLCORNER: - wmode = set_corn(x,y+1, x-1,y+1, x-1,y, x+1,y-1); - break; - case BRCORNER: - wmode = set_corn(x+1,y, x+1,y+1, x,y+1, x-1,y-1); - break; - case CROSSWALL: - wmode = set_crosswall(x, y); - break; - - default: - wmode = -1; /* don't set wall info */ - break; - } - - if (wmode >= 0) - lev->wall_info = (lev->wall_info & ~WM_MASK) | wmode; - } - -#ifdef WA_VERBOSE - /* check if any bad positions found */ - for (x = y = 0; x < MAX_TYPE; x++) - if (bad_count[x]) { - if (y == 0) { - y = 1; /* only print once */ - pline("set_wall_type: wall mode problems with: "); - } - pline("%s %d;", type_names[x], bad_count[x]); - } -#endif /* WA_VERBOSE */ -} - -/* ------------------------------------------------------------------------- */ -/* This matrix is used here and in vision.c. */ -unsigned char seenv_matrix[3][3] = { {SV2, SV1, SV0}, - {SV3, SVALL, SV7}, - {SV4, SV5, SV6} }; - -#define sign(z) ((z) < 0 ? -1 : ((z) > 0 ? 1 : 0)) - -/* Set the seen vector of lev as if seen from (x0,y0) to (x,y). */ -STATIC_OVL void -set_seenv(lev, x0, y0, x, y) - struct rm *lev; - int x0, y0, x, y; /* from, to */ -{ - int dx = x-x0, dy = y0-y; - lev->seenv |= seenv_matrix[sign(dy)+1][sign(dx)+1]; -} - -/* ------------------------------------------------------------------------- */ - -/* T wall types, one for each row in wall_matrix[][]. */ -#define T_d 0 -#define T_l 1 -#define T_u 2 -#define T_r 3 - -/* - * These are the column names of wall_matrix[][]. They are the "results" - * of a tdwall pattern match. All T walls are rotated so they become - * a tdwall. Then we do a single pattern match, but return the - * correct result for the original wall by using different rows for - * each of the wall types. - */ -#define T_stone 0 -#define T_tlcorn 1 -#define T_trcorn 2 -#define T_hwall 3 -#define T_tdwall 4 - -static const int wall_matrix[4][5] = { - { S_stone, S_tlcorn, S_trcorn, S_hwall, S_tdwall }, /* tdwall */ - { S_stone, S_trcorn, S_brcorn, S_vwall, S_tlwall }, /* tlwall */ - { S_stone, S_brcorn, S_blcorn, S_hwall, S_tuwall }, /* tuwall */ - { S_stone, S_blcorn, S_tlcorn, S_vwall, S_trwall }, /* trwall */ -}; - - -/* Cross wall types, one for each "solid" quarter. Rows of cross_matrix[][]. */ -#define C_bl 0 -#define C_tl 1 -#define C_tr 2 -#define C_br 3 - -/* - * These are the column names for cross_matrix[][]. They express results - * in C_br (bottom right) terms. All crosswalls with a single solid - * quarter are rotated so the solid section is at the bottom right. - * We pattern match on that, but return the correct result depending - * on which row we'ere looking at. - */ -#define C_trcorn 0 -#define C_brcorn 1 -#define C_blcorn 2 -#define C_tlwall 3 -#define C_tuwall 4 -#define C_crwall 5 - -static const int cross_matrix[4][6] = { - { S_brcorn, S_blcorn, S_tlcorn, S_tuwall, S_trwall, S_crwall }, - { S_blcorn, S_tlcorn, S_trcorn, S_trwall, S_tdwall, S_crwall }, - { S_tlcorn, S_trcorn, S_brcorn, S_tdwall, S_tlwall, S_crwall }, - { S_trcorn, S_brcorn, S_blcorn, S_tlwall, S_tuwall, S_crwall }, -}; - - -/* Print out a T wall warning and all interesting info. */ -STATIC_OVL void -t_warn(lev) - struct rm *lev; -{ - static const char warn_str[] = "wall_angle: %s: case %d: seenv = 0x%x"; - const char *wname; - - if (lev->typ == TUWALL) wname = "tuwall"; - else if (lev->typ == TLWALL) wname = "tlwall"; - else if (lev->typ == TRWALL) wname = "trwall"; - else if (lev->typ == TDWALL) wname = "tdwall"; - else wname = "unknown"; - impossible(warn_str, wname, lev->wall_info & WM_MASK, - (unsigned int) lev->seenv); -} - - -/* - * Return the correct graphics character index using wall type, wall mode, - * and the seen vector. It is expected that seenv is non zero. - * - * All T-wall vectors are rotated to be TDWALL. All single crosswall - * blocks are rotated to bottom right. All double crosswall are rotated - * to W_X_BLTR. All results are converted back. - * - * The only way to understand this is to take out pen and paper and - * draw diagrams. See rm.h for more details on the wall modes and - * seen vector (SV). - */ -STATIC_OVL int -wall_angle(lev) - struct rm *lev; -{ - register unsigned int seenv = lev->seenv & 0xff; - const int *row; - int col, idx; - -#define only(sv, bits) (((sv) & (bits)) && ! ((sv) & ~(bits))) - switch (lev->typ) { - case TUWALL: - row = wall_matrix[T_u]; - seenv = (seenv >> 4 | seenv << 4) & 0xff;/* rotate to tdwall */ - goto do_twall; - case TLWALL: - row = wall_matrix[T_l]; - seenv = (seenv >> 2 | seenv << 6) & 0xff;/* rotate to tdwall */ - goto do_twall; - case TRWALL: - row = wall_matrix[T_r]; - seenv = (seenv >> 6 | seenv << 2) & 0xff;/* rotate to tdwall */ - goto do_twall; - case TDWALL: - row = wall_matrix[T_d]; -do_twall: - switch (lev->wall_info & WM_MASK) { - case 0: - if (seenv == SV4) { - col = T_tlcorn; - } else if (seenv == SV6) { - col = T_trcorn; - } else if (seenv & (SV3|SV5|SV7) || - ((seenv & SV4) && (seenv & SV6))) { - col = T_tdwall; - } else if (seenv & (SV0|SV1|SV2)) { - col = (seenv & (SV4|SV6) ? T_tdwall : T_hwall); - } else { - t_warn(lev); - col = T_stone; - } - break; - case WM_T_LONG: - if (seenv & (SV3|SV4) && !(seenv & (SV5|SV6|SV7))) { - col = T_tlcorn; - } else if (seenv&(SV6|SV7) && !(seenv&(SV3|SV4|SV5))) { - col = T_trcorn; - } else if ((seenv & SV5) || - ((seenv & (SV3|SV4)) && (seenv & (SV6|SV7)))) { - col = T_tdwall; - } else { - /* only SV0|SV1|SV2 */ - if (! only(seenv, SV0|SV1|SV2) ) - t_warn(lev); - col = T_stone; - } - break; - case WM_T_BL: -#if 0 /* older method, fixed */ - if (only(seenv, SV4|SV5)) { - col = T_tlcorn; - } else if ((seenv & (SV0|SV1|SV2)) && - only(seenv, SV0|SV1|SV2|SV6|SV7)) { - col = T_hwall; - } else if (seenv & SV3 || - ((seenv & (SV0|SV1|SV2)) && (seenv & (SV4|SV5)))) { - col = T_tdwall; - } else { - if (seenv != SV6) - t_warn(lev); - col = T_stone; - } -#endif /* 0 */ - if (only(seenv, SV4|SV5)) - col = T_tlcorn; - else if ((seenv & (SV0|SV1|SV2|SV7)) && - !(seenv & (SV3|SV4|SV5))) - col = T_hwall; - else if (only(seenv, SV6)) - col = T_stone; - else - col = T_tdwall; - break; - case WM_T_BR: -#if 0 /* older method, fixed */ - if (only(seenv, SV5|SV6)) { - col = T_trcorn; - } else if ((seenv & (SV0|SV1|SV2)) && - only(seenv, SV0|SV1|SV2|SV3|SV4)) { - col = T_hwall; - } else if (seenv & SV7 || - ((seenv & (SV0|SV1|SV2)) && (seenv & (SV5|SV6)))) { - col = T_tdwall; - } else { - if (seenv != SV4) - t_warn(lev); - col = T_stone; - } -#endif /* 0 */ - if (only(seenv, SV5|SV6)) - col = T_trcorn; - else if ((seenv & (SV0|SV1|SV2|SV3)) && - !(seenv & (SV5|SV6|SV7))) - col = T_hwall; - else if (only(seenv, SV4)) - col = T_stone; - else - col = T_tdwall; - - break; - default: - impossible("wall_angle: unknown T wall mode %d", - lev->wall_info & WM_MASK); - col = T_stone; - break; - } - idx = row[col]; - break; - - case SDOOR: - if (lev->horizontal) goto horiz; - /* fall through */ - case VWALL: - switch (lev->wall_info & WM_MASK) { - case 0: idx = seenv ? S_vwall : S_stone; break; - case 1: idx = seenv & (SV1|SV2|SV3|SV4|SV5) ? S_vwall : - S_stone; - break; - case 2: idx = seenv & (SV0|SV1|SV5|SV6|SV7) ? S_vwall : - S_stone; - break; - default: - impossible("wall_angle: unknown vwall mode %d", - lev->wall_info & WM_MASK); - idx = S_stone; - break; - } - break; - - case HWALL: -horiz: - switch (lev->wall_info & WM_MASK) { - case 0: idx = seenv ? S_hwall : S_stone; break; - case 1: idx = seenv & (SV3|SV4|SV5|SV6|SV7) ? S_hwall : - S_stone; - break; - case 2: idx = seenv & (SV0|SV1|SV2|SV3|SV7) ? S_hwall : - S_stone; - break; - default: - impossible("wall_angle: unknown hwall mode %d", - lev->wall_info & WM_MASK); - idx = S_stone; - break; - } - break; - -#define set_corner(idx, lev, which, outer, inner, name) \ - switch ((lev)->wall_info & WM_MASK) { \ - case 0: idx = which; break; \ - case WM_C_OUTER: idx = seenv & (outer) ? which : S_stone; break; \ - case WM_C_INNER: idx = seenv & ~(inner) ? which : S_stone; break; \ - default: \ - impossible("wall_angle: unknown %s mode %d", name, \ - (lev)->wall_info & WM_MASK); \ - idx = S_stone; \ - break; \ - } - - case TLCORNER: - set_corner(idx, lev, S_tlcorn, (SV3|SV4|SV5), SV4, "tlcorn"); - break; - case TRCORNER: - set_corner(idx, lev, S_trcorn, (SV5|SV6|SV7), SV6, "trcorn"); - break; - case BLCORNER: - set_corner(idx, lev, S_blcorn, (SV1|SV2|SV3), SV2, "blcorn"); - break; - case BRCORNER: - set_corner(idx, lev, S_brcorn, (SV7|SV0|SV1), SV0, "brcorn"); - break; - - - case CROSSWALL: - switch (lev->wall_info & WM_MASK) { - case 0: - if (seenv == SV0) - idx = S_brcorn; - else if (seenv == SV2) - idx = S_blcorn; - else if (seenv == SV4) - idx = S_tlcorn; - else if (seenv == SV6) - idx = S_trcorn; - else if (!(seenv & ~(SV0|SV1|SV2)) && - (seenv & SV1 || seenv == (SV0|SV2))) - idx = S_tuwall; - else if (!(seenv & ~(SV2|SV3|SV4)) && - (seenv & SV3 || seenv == (SV2|SV4))) - idx = S_trwall; - else if (!(seenv & ~(SV4|SV5|SV6)) && - (seenv & SV5 || seenv == (SV4|SV6))) - idx = S_tdwall; - else if (!(seenv & ~(SV0|SV6|SV7)) && - (seenv & SV7 || seenv == (SV0|SV6))) - idx = S_tlwall; - else - idx = S_crwall; - break; - - case WM_X_TL: - row = cross_matrix[C_tl]; - seenv = (seenv >> 4 | seenv << 4) & 0xff; - goto do_crwall; - case WM_X_TR: - row = cross_matrix[C_tr]; - seenv = (seenv >> 6 | seenv << 2) & 0xff; - goto do_crwall; - case WM_X_BL: - row = cross_matrix[C_bl]; - seenv = (seenv >> 2 | seenv << 6) & 0xff; - goto do_crwall; - case WM_X_BR: - row = cross_matrix[C_br]; -do_crwall: - if (seenv == SV4) - idx = S_stone; - else { - seenv = seenv & ~SV4; /* strip SV4 */ - if (seenv == SV0) { - col = C_brcorn; - } else if (seenv & (SV2|SV3)) { - if (seenv & (SV5|SV6|SV7)) - col = C_crwall; - else if (seenv & (SV0|SV1)) - col = C_tuwall; - else - col = C_blcorn; - } else if (seenv & (SV5|SV6)) { - if (seenv & (SV1|SV2|SV3)) - col = C_crwall; - else if (seenv & (SV0|SV7)) - col = C_tlwall; - else - col = C_trcorn; - } else if (seenv & SV1) { - col = seenv & SV7 ? C_crwall : C_tuwall; - } else if (seenv & SV7) { - col = seenv & SV1 ? C_crwall : C_tlwall; - } else { - impossible( - "wall_angle: bottom of crwall check"); - col = C_crwall; - } - - idx = row[col]; - } - break; - - case WM_X_TLBR: - if ( only(seenv, SV1|SV2|SV3) ) - idx = S_blcorn; - else if ( only(seenv, SV5|SV6|SV7) ) - idx = S_trcorn; - else if ( only(seenv, SV0|SV4) ) - idx = S_stone; - else - idx = S_crwall; - break; - - case WM_X_BLTR: - if ( only(seenv, SV0|SV1|SV7) ) - idx = S_brcorn; - else if ( only(seenv, SV3|SV4|SV5) ) - idx = S_tlcorn; - else if ( only(seenv, SV2|SV6) ) - idx = S_stone; - else - idx = S_crwall; - break; - - default: - impossible("wall_angle: unknown crosswall mode"); - idx = S_stone; - break; - } - break; - - default: - impossible("wall_angle: unexpected wall type %d", lev->typ); - idx = S_stone; - } - return idx; -} - -/*display.c*/ diff -Naurbd slashem-0.0.8E0/src/do.c slashem-0.0.8E1/src/do.c --- slashem-0.0.8E0/src/do.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/do.c 2006-05-15 12:08:59.000000000 +0100 @@ -64,7 +64,8 @@ { if (!otmp || otmp->otyp != BOULDER) impossible("Not a boulder?"); - else if (!Is_waterlevel(&u.uz) && (is_pool(rx,ry) || is_lava(rx,ry))) { + else if (!Is_waterlevel(&u.uz) && levl[rx][ry].typ != RIVER && + (is_pool(rx,ry) || is_lava(rx,ry))) { boolean lava = is_lava(rx,ry), fills_up; const char *what = waterbody_name(rx,ry); schar ltyp = levl[rx][ry].typ; @@ -782,9 +783,8 @@ dodown() { struct trap *trap = 0; - boolean stairs_down = ((u.ux == xdnstair && u.uy == ydnstair) || - (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up)), - ladder_down = (u.ux == xdnladder && u.uy == ydnladder); + boolean ladder_down = (u.ux == xdnladder && u.uy == ydnladder), + stairs_down = !ladder_down && On_stairs(u.ux, u.uy) == LA_DOWN; if (Role_if(PM_GNOME) && on_level(&mineend_level,&u.uz)) { pline("The staircase is filled with tons of rubble and debris."); @@ -875,11 +875,7 @@ int doup() { - if( (u.ux != xupstair || u.uy != yupstair) - && (!xupladder || u.ux != xupladder || u.uy != yupladder) - && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy - || !sstairs.up) - ) { + if (On_stairs(u.ux, u.uy) != LA_UP) { You_cant("go up here."); return(0); } @@ -1032,34 +1028,48 @@ * -1 8.33 4.17 0.0 -1 6.25 8.33 12.5 * -2 8.33 4.17 0.0 -2 6.25 8.33 0.0 * -3 8.33 4.17 0.0 -3 6.25 0.0 0.0 - * [Tom] I removed this... it's indescribably annoying. - * - * if (Inhell && up && u.uhave.amulet && !newdungeon && !portal && - * (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)-3)) { - * if (!rn2(4)) { - * int odds = 3 + (int)u.ualign.type, * 2..4 * - * diff = odds <= 1 ? 0 : rn2(odds); * paranoia * - * - * if (diff != 0) { - * assign_rnd_level(newlevel, &u.uz, diff); - * * if inside the tower, stay inside * - * if (was_in_W_tower && - * !On_W_tower_level(newlevel)) diff = 0; - * } - * if (diff == 0) - * assign_level(newlevel, &u.uz); - * - * new_ledger = ledger_no(newlevel); - * - * pline("A mysterious force momentarily surrounds you..."); - * if (on_level(newlevel, &u.uz)) { - * (void) safe_teleds(FALSE); - * (void) next_to_u(); - * return; - * } else - * at_stairs = at_ladder = FALSE; - * } - }*/ + * Note: In Slash'EM it is not possible for the amulet to enter the + * mortal world. This is intended to prevent players escaping the + * dungeon when they were trying to enter the elemental planes. + */ + if (Inhell && up && u.uhave.amulet && + (!newdungeon || Is_valley(&u.uz)) && !portal && + (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)-3)) { + if (newdungeon) { + /* + * If newdungeon is set, then we can't write to newlevel + * without modifying the dungeon structure, so we take + * the easy way out and always stay on the same level. + */ + pline("A mysterious force momentarily surrounds you..."); + (void) safe_teleds(FALSE); + (void) next_to_u(); + return; + } + if (!rn2(4)) { + int odds = 3 + (int)u.ualign.type, /* 2..4 */ + diff = odds <= 1 ? 0 : rn2(odds); /* paranoia */ + + if (diff != 0) { + assign_rnd_level(newlevel, &u.uz, diff); + /* if inside the tower, stay inside */ + if (was_in_W_tower && + !On_W_tower_level(newlevel)) diff = 0; + } + if (diff == 0) + assign_level(newlevel, &u.uz); + + new_ledger = ledger_no(newlevel); + + pline("A mysterious force momentarily surrounds you..."); + if (on_level(newlevel, &u.uz)) { + (void) safe_teleds(FALSE); + (void) next_to_u(); + return; + } else + at_stairs = at_ladder = FALSE; + } + } /* Prevent the player from going past the first quest level unless * (s)he has been given the go-ahead by the leader. @@ -1194,7 +1204,7 @@ IS_WALL(levl[x][y].typ)); u_on_newpos(x, y); } else u_on_sstairs(); - } else u_on_dnstairs(); + } else u_on_dnstairs(u.ux, u.uy); } /* Remove bug which crashes with levitation/punishment KAA */ if (Punished && !Levitation) { @@ -1207,7 +1217,7 @@ u_on_newpos(xupladder, yupladder); } else { if (newdungeon) u_on_sstairs(); - else u_on_upstairs(); + else u_on_upstairs(u.ux, u.uy); } if (u.dz && Flying) You("fly down along the %s.", diff -Naurbd slashem-0.0.8E0/src/dog.c slashem-0.0.8E1/src/dog.c --- slashem-0.0.8E0/src/dog.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/dog.c 2006-05-15 12:08:59.000000000 +0100 @@ -352,9 +352,9 @@ break; case MIGR_NEAR_PLAYER: xlocale = u.ux, ylocale = u.uy; break; - case MIGR_STAIRS_UP: xlocale = xupstair, ylocale = yupstair; + case MIGR_STAIRS_UP: xlocale = upstairs->sx, ylocale = upstairs->sy; break; - case MIGR_STAIRS_DOWN: xlocale = xdnstair, ylocale = ydnstair; + case MIGR_STAIRS_DOWN: xlocale = dnstairs->sx, ylocale = dnstairs->sy; break; case MIGR_LADDER_UP: xlocale = xupladder, ylocale = yupladder; break; @@ -904,7 +904,8 @@ /* KMH -- Added gypsy */ mtmp->isgyp || is_covetous(mtmp->data) || is_human(mtmp->data) || - (is_demon(mtmp->data) && !is_demon(youmonst.data)) || + /* Demonology kludge */ +/* (is_demon(mtmp->data) && !is_demon(youmonst.data)) || */ /* Mik -- New flag to indicate which things cannot be tamed... */ cannot_be_tamed(mtmp->data) || (obj && dogfood(mtmp, obj) >= MANFOOD)) return (struct monst *)0; diff -Naurbd slashem-0.0.8E0/src/dokick.c slashem-0.0.8E1/src/dokick.c --- slashem-0.0.8E0/src/dokick.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/dokick.c 2006-05-15 12:08:59.000000000 +0100 @@ -1463,7 +1463,7 @@ otmp->owornmask = 0L; switch ((int)where) { - case MIGR_STAIRS_UP: nx = xupstair, ny = yupstair; + case MIGR_STAIRS_UP: nx = upstairs->sx, ny = upstairs->sy; break; case MIGR_LADDER_UP: nx = xupladder, ny = yupladder; break; @@ -1528,16 +1528,15 @@ if (on_level(&u.uz, &qstart_level) && !ok_to_quest()) return MIGR_NOWHERE; - if ((xdnstair == x && ydnstair == y) || - (sstairs.sx == x && sstairs.sy == y && !sstairs.up)) { - gate_str = "down the stairs"; - return (xdnstair == x && ydnstair == y) ? - MIGR_STAIRS_UP : MIGR_SSTAIRS; - } if (xdnladder == x && ydnladder == y) { gate_str = "down the ladder"; return MIGR_LADDER_UP; } + if (On_stairs(x, y) == LA_DOWN) { + gate_str = "down the stairs"; + return (sstairs.sx == x && sstairs.sx == y) ? + MIGR_SSTAIRS : MIGR_STAIRS_UP; + } if (((ttmp = t_at(x, y)) != 0 && ttmp->tseen) && (ttmp->ttyp == TRAPDOOR || ttmp->ttyp == HOLE)) { diff -Naurbd slashem-0.0.8E0/src/drawing.c slashem-0.0.8E1/src/drawing.c --- slashem-0.0.8E0/src/drawing.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/drawing.c 2006-05-15 12:08:59.000000000 +0100 @@ -252,6 +252,8 @@ {'}', "water", C(CLR_BLUE)}, /* pool */ {'.', "ice", C(CLR_CYAN)}, /* ice */ {'}', "molten lava", C(CLR_RED)}, /* lava */ + {'}', "sparkling water",C(CLR_BLUE)}, /* lethe */ + {'}', "boiling blood", C(CLR_RED)}, /* phlegethon */ {'.', "lowered drawbridge",C(CLR_BROWN)}, /* vodbridge */ {'.', "lowered drawbridge",C(CLR_BROWN)}, /* hodbridge */ {'#', "raised drawbridge",C(CLR_BROWN)},/* vcdbridge */ @@ -361,6 +363,8 @@ 0xf7, /* S_pool: meta-w, approx. equals */ 0xfa, /* S_ice: meta-z, centered dot */ 0xf7, /* S_lava: meta-w, approx. equals */ + 0xf7, /* S_lethe: meta-w, approx. equals */ + 0xf7, /* S_phlegethon:meta-w, approx. equals */ 0xfa, /* S_vodbridge: meta-z, centered dot */ 0xfa, /* S_hodbridge: meta-z, centered dot */ g_FILLER(S_vcdbridge), @@ -461,6 +465,8 @@ 0xe0, /* S_pool: meta-\, diamond */ 0xfe, /* S_ice: meta-~, centered dot */ 0xe0, /* S_lava: meta-\, diamond */ + 0xe0, /* S_lethe: meta-\, diamond */ + 0xe0, /* S_phlegethon:meta-\, diamond */ 0xfe, /* S_vodbridge: meta-~, centered dot */ 0xfe, /* S_hodbridge: meta-~, centered dot */ g_FILLER(S_vcdbridge), @@ -559,6 +565,8 @@ 0xe0, /* S_pool */ g_FILLER(S_ice), g_FILLER(S_lava), + g_FILLER(S_lethe), + g_FILLER(S_phlegethon), g_FILLER(S_vodbridge), g_FILLER(S_hodbridge), g_FILLER(S_vcdbridge), diff -Naurbd slashem-0.0.8E0/src/dungeon.c slashem-0.0.8E1/src/dungeon.c --- slashem-0.0.8E0/src/dungeon.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/dungeon.c 2006-05-15 12:08:59.000000000 +0100 @@ -758,7 +758,9 @@ for (branch_num = 0; branch_num < pd.n_brs; branch_num++) if (!strcmp(pd.tmpbranch[branch_num].name, dungeons[i].dname)) { br = add_branch(i, branch_num, &pd); +#if 0 break; +#endif } /* Set the dungeon entry level from the first branch */ @@ -859,23 +861,30 @@ * levels of the quest dungeon occur. */ Sprintf(x->proto, "%s%s", urole.filecode, &lev_map->lev_name[1]); - } else if (lev_map->lev_spec == &knox_level) { + } else if (lev_map->lev_spec == &knox_level || + lev_map->lev_spec == &sanctum_level) { branch *br; /* * Kludge to allow floating Knox entrance. We * specify a floating entrance by the fact that * its entrance (end1) has a bogus dnum, namely * n_dgns. + * While the sanctum's entrance is at a fixed + * place we treat it as floating so that it + * is not accessible until after the invocation. */ for (br = branches; br; br = br->next) - if (on_level(&br->end2, &knox_level)) break; - - if (br) br->end1.dnum = n_dgns; - /* adjust the branch's position on the list */ + if (on_level(&br->end2, &sanctum_level) || + on_level(&br->end2, &knox_level)) { + br->end1.dnum = n_dgns; + /* adjust the branch's + * position on the list + */ insert_branch(br, TRUE); } } } + } /* * I hate hardwiring these names. :-( */ @@ -884,6 +893,7 @@ mines_dnum = dname_to_dnum("The Gnomish Mines"); spiders_dnum = dname_to_dnum("The Spider Caves"); tower_dnum = dname_to_dnum("Vlad's Tower"); + gehennom_dnum = dname_to_dnum("Gehennom"); /* #ifdef BLACKMARKET blackmarket_dnum = dname_to_dnum("The Black Market"); @@ -1097,7 +1107,7 @@ /* Taking an up dungeon branch. */ /* KMH -- Upwards branches are okay if not level 1 */ /* (Just make sure it doesn't go above depth 1) */ - if(!u.uz.dnum && u.uz.dlevel == 1 && !u.uhave.amulet) done(ESCAPED); + if(!u.uz.dnum && u.uz.dlevel == 1) done(ESCAPED); else goto_level(&sstairs.tolev, at_stairs, FALSE, FALSE); } else { /* Going up a stairs or rising through the ceiling. */ @@ -1150,32 +1160,67 @@ } void -u_on_upstairs() /* place you on upstairs (or special equivalent) */ +u_on_upstairs(x, y) /* place you on upstairs (or special equivalent) */ +int x, y; { - if (xupstair) { - u_on_newpos(xupstair, yupstair); + int stair, dist, i, d; + if (n_upstairs) { + stair = 0; + if (n_upstairs > 1 && x != 0) { + dist = dist2(upstairs->sx, upstairs->sy, x, y); + for(i = 1; i < n_upstairs; i++) { + d = dist2(upstairs[i].sx, upstairs[i].sy, x, y); + if (d < dist) { + dist = d; + stair = i; + } + } + } + u_on_newpos(upstairs[stair].sx, upstairs[stair].sy); } else u_on_sstairs(); } void -u_on_dnstairs() /* place you on dnstairs (or special equivalent) */ +u_on_dnstairs(x, y) /* place you on dnstairs (or special equivalent) */ +int x, y; { - if (xdnstair) { - u_on_newpos(xdnstair, ydnstair); + int stair, dist, i, d; + if (n_dnstairs) { + stair = 0; + if (n_dnstairs > 1 && x != 0) { + dist = dist2(dnstairs->sx, dnstairs->sy, x, y); + for(i = 1; i < n_dnstairs; i++) { + d = dist2(dnstairs[i].sx, dnstairs[i].sy, x, y); + if (d < dist) { + dist = d; + stair = i; + } + } + } + u_on_newpos(dnstairs[stair].sx, dnstairs[stair].sy); } else u_on_sstairs(); } -boolean +int On_stairs(x, y) xchar x, y; { - return((boolean)((x == xupstair && y == yupstair) || - (x == xdnstair && y == ydnstair) || - (x == xdnladder && y == ydnladder) || - (x == xupladder && y == yupladder) || - (x == sstairs.sx && y == sstairs.sy))); + int i; + if (x == sstairs.sx && y == sstairs.sy) + return sstairs.up ? LA_UP : LA_DOWN; + if (x == xupladder && y == yupladder) + return LA_UP; + if (x == xdnladder && y == ydnladder) + return LA_DOWN; + for(i = 0; i < n_upstairs; i++) + if (x == upstairs[i].sx && y == upstairs[i].sy) + return LA_UP; + for(i = 0; i < n_dnstairs; i++) + if (x == dnstairs[i].sx && y == dnstairs[i].sy) + return LA_DOWN; + return 0; } boolean @@ -1251,7 +1296,35 @@ } else if (levnum > dungeons[dgn].depth_start + dungeons[dgn].num_dunlevs - 1) { /* beyond end of dungeon, jump to last level */ + /* levnum = dungeons[dgn].num_dunlevs; */ + /* Lethe change... */ + /* In dungeons 0 and 1, we can try the next dungeon... */ + switch (dgn) { + + case 0: /* Dungeons of Doom */ + dgn = 1; + if (levnum <= dungeons[dgn].depth_start + + dungeons[dgn].num_dunlevs - 1) { + levnum = levnum - dungeons[dgn].depth_start + 1; + break; + } + + case 1: /* Lethe Gorge */ + dgn = 2; + if (levnum <= dungeons[dgn].depth_start + + dungeons[dgn].num_dunlevs - 1) { + levnum = levnum - dungeons[dgn].depth_start + 1; + break; + } + /* I really dont know why this part was added - if it is + beyond end of gehennom, we can just cap it down */ +// dgn = 1; +// impossible("Teleport extension beyond Lethe failed!"); + + default: /* beyond end of dungeon, jump to last level */ levnum = dungeons[dgn].num_dunlevs; + break; + } } else { /* The desired level is in this dungeon or a "higher" one. */ @@ -1472,7 +1545,7 @@ d_level *lev; { return((boolean)(In_hell(lev) && - lev->dlevel == (dungeons[lev->dnum].num_dunlevs - 1))); + lev->dlevel == dungeons[lev->dnum].num_dunlevs)); } /* use instead of depth() wherever a degree of difficulty is made diff -Naurbd slashem-0.0.8E0/src/end.c slashem-0.0.8E1/src/end.c --- slashem-0.0.8E0/src/end.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/end.c 2006-05-15 12:08:59.000000000 +0100 @@ -731,6 +731,52 @@ return; } } + + /* Lethe */ + /* Python sketch to the rescue... */ + + if ( how < GENOCIDED + && Unchanging + && Upolyd + && u.umonnum == PM_PARROT ) { + + register struct monst *shpk; + + shpk = shop_keeper(inside_shop(u.ux, u.uy)); + + if ( shpk != NULL + && inhishop(shpk) + && !shpk->msleeping + && shpk->mcanmove ) { + You("die..."); + + mark_synch(); /* flush buffered screen output */ + + if (ANGRY(shpk)) { + pline("%s glowers at your corpse.", Monnam(shpk)); + pline("%s says 'My, my, a dead parrot. How uncommon.'", Monnam(shpk)); + pline("%s says 'Time to make some parrot pie.'", Monnam(shpk)); + } else { + pline("%s scowls a your corpse.", Monnam(shpk)); + pline("%s says 'You're not dead! You're only resting!'", Monnam(shpk)); + pline("%s says 'Get up you lazy bugger!'", Monnam(shpk)); + + (void) adjattrib(A_CON, -1, TRUE); + + if(u.mhmax <= 0) { + u.mhmax = 10; /* arbitrary */ + } + + savelife(how); + + killer = 0; + killer_format = 0; + + return; + } + } + } + if (( #ifdef WIZARD wizard || diff -Naurbd slashem-0.0.8E0/src/engrave.c slashem-0.0.8E1/src/engrave.c --- slashem-0.0.8E0/src/engrave.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/engrave.c 2006-05-15 12:08:59.000000000 +0100 @@ -177,6 +177,8 @@ return "maw"; else if (IS_AIR(lev->typ) && Is_airlevel(&u.uz)) return "air"; + else if (lev->typ == RIVER) + return "river"; else if (is_pool(x,y)) return (Underwater && !Is_waterlevel(&u.uz)) ? "bottom" : "water"; else if (is_ice(x,y)) diff -Naurbd slashem-0.0.8E0/src/fountain.c slashem-0.0.8E1/src/fountain.c --- slashem-0.0.8E0/src/fountain.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/fountain.c 2006-05-15 12:08:59.000000000 +0100 @@ -392,7 +392,7 @@ if(in_town(u.ux, u.uy)) (void) angry_guards(FALSE); return; - } else if (get_wet(obj, FALSE) && !rn2(2)) + } else if (get_wet(obj, RIVER_NONE) && !rn2(2)) return; /* Acid and water don't mix */ @@ -508,7 +508,7 @@ floating_above("toilet"); return; } - (void) get_wet(obj, FALSE); + (void) get_wet(obj, RIVER_NONE); /* KMH -- acid and water don't mix */ if (obj->otyp == POT_ACID) { useup(obj); diff -Naurbd slashem-0.0.8E0/src/invent.c slashem-0.0.8E1/src/invent.c --- slashem-0.0.8E0/src/invent.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/invent.c 2006-05-15 12:08:59.000000000 +0100 @@ -2397,6 +2397,7 @@ int ltyp = lev->typ, cmap = -1; const char *dfeature = 0; static char altbuf[BUFSZ]; + int dir; if (IS_DOOR(ltyp)) { switch (lev->doormask) { @@ -2428,16 +2429,12 @@ Sprintf(altbuf, "altar to %s (%s)", a_gname(), align_str(Amask2align(lev->altarmask & ~AM_SHRINE))); dfeature = altbuf; - } else if ((x == xupstair && y == yupstair) || - (x == sstairs.sx && y == sstairs.sy && sstairs.up)) - cmap = S_upstair; /* "staircase up" */ - else if ((x == xdnstair && y == ydnstair) || - (x == sstairs.sx && y == sstairs.sy && !sstairs.up)) - cmap = S_dnstair; /* "staircase down" */ - else if (x == xupladder && y == yupladder) + } else if (x == xupladder && y == yupladder) cmap = S_upladder; /* "ladder up" */ else if (x == xdnladder && y == ydnladder) cmap = S_dnladder; /* "ladder down" */ + else if ((dir = On_stairs(x, y))) /* "staircase ..." */ + cmap = dir == LA_UP ? S_upstair : S_dnstair;/* "... up / down" */ else if (ltyp == DRAWBRIDGE_DOWN) cmap = S_vodbridge; /* "lowered drawbridge" */ else if (ltyp == DBWALL) diff -Naurbd slashem-0.0.8E0/src/mail.c slashem-0.0.8E1/src/mail.c --- slashem-0.0.8E0/src/mail.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/mail.c 2006-05-15 12:08:59.000000000 +0100 @@ -150,14 +150,14 @@ * Arrive at an up or down stairwell if it is in line of sight from the * hero. */ - if (couldsee(upstair.sx, upstair.sy)) { - startp->x = upstair.sx; - startp->y = upstair.sy; + if (couldsee(upstairs->sx, upstairs->sy)) { + startp->x = upstairs->sx; + startp->y = upstairs->sy; return TRUE; } - if (couldsee(dnstair.sx, dnstair.sy)) { - startp->x = dnstair.sx; - startp->y = dnstair.sy; + if (couldsee(dnstairs->sx, dnstairs->sy)) { + startp->x = dnstairs->sx; + startp->y = dnstairs->sy; return TRUE; } diff -Naurbd slashem-0.0.8E0/src/makemon.c slashem-0.0.8E1/src/makemon.c --- slashem-0.0.8E0/src/makemon.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/makemon.c 2006-05-15 12:08:59.000000000 +0100 @@ -1728,16 +1728,22 @@ /* returns TRUE iff you know monsters have been created */ boolean -create_critters(cnt, mptr) +create_critters(cnt, mptr, mood) int cnt; struct permonst *mptr; /* usually null; used for confused reading */ +int mood; { coord c; int x, y; - struct monst *mon; + struct monst *mon, *mon2; boolean known = FALSE; #ifdef WIZARD boolean ask = wizard; + + if (mptr != (struct permonst *)0) { + ask = FALSE; + } + #endif while (cnt--) { @@ -1757,7 +1763,29 @@ x = c.x, y = c.y; mon = makemon(mptr, x, y, NO_MM_FLAGS); - if (mon && canspotmon(mon)) known = TRUE; + + if (mon) { + switch (mood) { + case MAKE_EM_TAME: + mon2 = tamedog(mon, (struct obj *)0); + if (mon2) { + mon = mon2; + } + break; + case MAKE_EM_PEACEFUL: + mon->mpeaceful = TRUE; + break; + case MAKE_EM_HOSTILE: + setmangry(mon); + break; + default: + break; + } + if (canspotmon(mon)) { + known = TRUE; + } + } + } return known; } diff -Naurbd slashem-0.0.8E0/src/mhitu.c slashem-0.0.8E1/src/mhitu.c --- slashem-0.0.8E0/src/mhitu.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/mhitu.c 2006-05-15 12:08:59.000000000 +0100 @@ -1545,6 +1545,7 @@ boolean moat = (levl[mtmp->mx][mtmp->my].typ != POOL) && (levl[mtmp->mx][mtmp->my].typ != WATER) && + (levl[mtmp->mx][mtmp->my].typ != RIVER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz); diff -Naurbd slashem-0.0.8E0/src/mklev.c slashem-0.0.8E1/src/mklev.c --- slashem-0.0.8E0/src/mklev.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/mklev.c 2006-05-15 12:08:59.000000000 +0100 @@ -607,7 +607,7 @@ level.flags.arboreal = 0; level.flags.is_maze_lev = 0; level.flags.is_cavernous_lev = 0; - level.flags.lethe = 0; + level.flags.river = RIVER_NONE; nroom = 0; rooms[0].hx = -1; @@ -616,7 +616,7 @@ doorindex = 0; init_rect(); init_vault(); - xdnstair = ydnstair = xupstair = yupstair = 0; + n_dnstairs = n_upstairs = 0; sstairs.sx = sstairs.sy = 0; xdnladder = ydnladder = xupladder = yupladder = 0; made_branch = FALSE; @@ -910,8 +910,11 @@ for (x = 2; x < (COLNO - 2); x++) for (y = 1; y < (ROWNO - 1); y++) if ((levl[x][y].typ == POOL && !rn2(10)) || + (levl[x][y].typ == RIVER && !rn2(20)) || (levl[x][y].typ == MOAT && !rn2(30))) - (void)mksobj_at(KELP_FROND, x, y, TRUE, FALSE); + (void)mksobj_at(level.flags.river == RIVER_PHLEGETHON ? + levl[x][y].typ == RIVER ? BOULDER : ROCK : + KELP_FROND, x, y, TRUE, FALSE); /* determine if it is even allowed; almost all special levels are excluded */ @@ -1083,12 +1086,18 @@ } else { /* not perfect - there may be only one stairway */ if(nroom > 2) { - int tryct = 0; + int stair, tryct = 0; - do + do { croom = &rooms[rn2(nroom)]; - while((croom == dnstairs_room || croom == upstairs_room || - croom->rtype != OROOM) && (++tryct < 100)); + for(stair = n_dnstairs - 1; stair >= 0; stair--) + if (croom == dnstairs_rooms[stair]) + break; + if (stair < 0) + for(stair = n_upstairs - 1; stair >= 0; stair--) + if (croom == upstairs_rooms[stair]) + break; + } while((stair >= 0 || croom->rtype != OROOM) && (++tryct < 100)); } else croom = &rooms[rn2(nroom)]; @@ -1348,13 +1357,17 @@ return; if(up) { - xupstair = x; - yupstair = y; - upstairs_room = croom; + if (n_upstairs == MAXNRSTAIRS) + panic("Too many stairways up!"); + upstairs[n_upstairs].sx = x; + upstairs[n_upstairs].sy = y; + upstairs_rooms[n_upstairs++] = croom; } else { - xdnstair = x; - ydnstair = y; - dnstairs_room = croom; + if (n_dnstairs == MAXNRSTAIRS) + panic("Too many stairways down!"); + dnstairs[n_dnstairs].sx = x; + dnstairs[n_dnstairs].sy = y; + dnstairs_rooms[n_dnstairs++] = croom; } levl[x][y].typ = STAIRS; @@ -1536,7 +1549,17 @@ } You("are standing at the top of a stairwell leading down!"); +#if 0 mkstairs(u.ux, u.uy, 0, (struct mkroom *)0); /* down */ +#else + { + branch *br; + br = dungeon_branch("The Lethe Gorge"); + br->end1 = u.uz; + insert_branch(br, TRUE); + place_branch(br, u.ux, u.uy); + } +#endif newsym(u.ux, u.uy); vision_full_recalc = 1; /* everything changed */ } diff -Naurbd slashem-0.0.8E0/src/mkmaze.c slashem-0.0.8E1/src/mkmaze.c --- slashem-0.0.8E0/src/mkmaze.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/mkmaze.c 2006-05-15 12:08:59.000000000 +0100 @@ -542,10 +542,6 @@ level.flags.graveyard = 1; } else if (Is_stronghold(&u.uz)) { level.flags.graveyard = 1; - } else if(Is_sanctum(&u.uz)) { - croom = search_special(TEMPLE); - - create_secret_door(croom, W_ANY); } else if(on_level(&u.uz, &orcus_level)) { register struct monst *mtmp, *mtmp2; @@ -573,6 +569,55 @@ num_lregions = 0; } +/* Pick a spot for the vibrating square... */ + +void +mkvsquare() +{ + int x,y; +#define x_maze_min 2 +#define y_maze_min 2 + /* + * Pick a position where the stairs down to Moloch's Sanctum + * level will ultimately be created. At that time, an area + * will be altered: walls removed, moat and traps generated, + * boulders destroyed. The position picked here must ensure + * that that invocation area won't extend off the map. + * + * We actually allow up to 2 squares around the usual edge of + * the area to get truncated; see mkinvokearea(mklev.c). + */ +#define INVPOS_X_MARGIN (6 - 2) +#define INVPOS_Y_MARGIN (5 - 2) +#define INVPOS_DISTANCE 11 + int x_range = x_maze_max - x_maze_min - 2*INVPOS_X_MARGIN - 1, + y_range = y_maze_max - y_maze_min - 2*INVPOS_Y_MARGIN - 1; + +#ifdef DEBUG + if (x_range <= INVPOS_X_MARGIN || y_range <= INVPOS_Y_MARGIN || + (x_range * y_range) <= (INVPOS_DISTANCE * INVPOS_DISTANCE)) + panic("inv_pos: maze is too small! (%d x %d)", + x_maze_max, y_maze_max); +#endif + inv_pos.x = inv_pos.y = 0; /*{occupied() => invocation_pos()}*/ + do { + x = rn1(x_range, x_maze_min + INVPOS_X_MARGIN + 1); + y = rn1(y_range, y_maze_min + INVPOS_Y_MARGIN + 1); + /* we don't want it to be too near the stairs, nor + to be on a spot that's already in use (wall|trap) */ + } while (x == upstairs->sx || y == upstairs->sy || /*(direct line)*/ + abs(x - upstairs->sx) == abs(y - upstairs->sy) || + distmin(x, y, upstairs->sx, upstairs->sy) <= INVPOS_DISTANCE || + !SPACE_POS(levl[x][y].typ) || occupied(x, y)); + inv_pos.x = x; + inv_pos.y = y; +#undef INVPOS_X_MARGIN +#undef INVPOS_Y_MARGIN +#undef INVPOS_DISTANCE +#undef x_maze_min +#undef y_maze_min +} + void makemaz(s) register const char *s; @@ -629,6 +674,10 @@ Strcat(protofile, LEV_EXT); if(load_special(protofile)) { fixup_special(); + /* Allow a special level on the invokation level... */ + if (Invocation_lev(&u.uz)) { + mkvsquare(); + } /* some levels can end up with monsters on dead mon list, including light source monsters */ dmonsfree(); @@ -663,47 +712,7 @@ mazexy(&mm); mkstairs(mm.x, mm.y, 0, (struct mkroom *)0); /* down */ } else { /* choose "vibrating square" location */ -#define x_maze_min 2 -#define y_maze_min 2 - /* - * Pick a position where the stairs down to Moloch's Sanctum - * level will ultimately be created. At that time, an area - * will be altered: walls removed, moat and traps generated, - * boulders destroyed. The position picked here must ensure - * that that invocation area won't extend off the map. - * - * We actually allow up to 2 squares around the usual edge of - * the area to get truncated; see mkinvokearea(mklev.c). - */ -#define INVPOS_X_MARGIN (6 - 2) -#define INVPOS_Y_MARGIN (5 - 2) -#define INVPOS_DISTANCE 11 - int x_range = x_maze_max - x_maze_min - 2*INVPOS_X_MARGIN - 1, - y_range = y_maze_max - y_maze_min - 2*INVPOS_Y_MARGIN - 1; - -#ifdef DEBUG - if (x_range <= INVPOS_X_MARGIN || y_range <= INVPOS_Y_MARGIN || - (x_range * y_range) <= (INVPOS_DISTANCE * INVPOS_DISTANCE)) - panic("inv_pos: maze is too small! (%d x %d)", - x_maze_max, y_maze_max); -#endif - inv_pos.x = inv_pos.y = 0; /*{occupied() => invocation_pos()}*/ - do { - x = rn1(x_range, x_maze_min + INVPOS_X_MARGIN + 1); - y = rn1(y_range, y_maze_min + INVPOS_Y_MARGIN + 1); - /* we don't want it to be too near the stairs, nor - to be on a spot that's already in use (wall|trap) */ - } while (x == xupstair || y == yupstair || /*(direct line)*/ - abs(x - xupstair) == abs(y - yupstair) || - distmin(x, y, xupstair, yupstair) <= INVPOS_DISTANCE || - !SPACE_POS(levl[x][y].typ) || occupied(x, y)); - inv_pos.x = x; - inv_pos.y = y; -#undef INVPOS_X_MARGIN -#undef INVPOS_Y_MARGIN -#undef INVPOS_DISTANCE -#undef x_maze_min -#undef y_maze_min + mkvsquare(); } /* place branch stair or portal */ @@ -1245,11 +1254,11 @@ (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_ICE)) return "ice"; - else if (((ltyp != POOL) && (ltyp != WATER) && + else if (((ltyp != POOL) && (ltyp != WATER) && (ltyp != RIVER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz) && !Is_juiblex_level(&u.uz)) || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT)) return "moat"; - else if ((ltyp != POOL) && (ltyp != WATER) && Is_juiblex_level(&u.uz)) + else if ((ltyp != POOL) && (ltyp != WATER) && (ltyp != RIVER) && Is_juiblex_level(&u.uz)) return "swamp"; else if (ltyp == POOL) return "pool of water"; diff -Naurbd slashem-0.0.8E0/src/mkroom.c slashem-0.0.8E1/src/mkroom.c --- slashem-0.0.8E0/src/mkroom.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/mkroom.c 2006-05-15 12:08:59.000000000 +0100 @@ -652,7 +652,9 @@ has_dnstairs(sroom) register struct mkroom *sroom; { - if (sroom == dnstairs_room) + int stair; + for(stair = 0; stair < n_upstairs; stair++) + if (sroom == dnstairs_rooms[stair]) return TRUE; if (sstairs.sx && !sstairs.up) return((boolean)(sroom == sstairs_room)); @@ -663,7 +665,9 @@ has_upstairs(sroom) register struct mkroom *sroom; { - if (sroom == upstairs_room) + int stair; + for(stair = 0; stair < n_upstairs; stair++) + if (sroom == upstairs_rooms[stair]) return TRUE; if (sstairs.sx && sstairs.up) return((boolean)(sroom == sstairs_room)); diff -Naurbd slashem-0.0.8E0/src/mon.c slashem-0.0.8E1/src/mon.c --- slashem-0.0.8E0/src/mon.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/mon.c 2006-05-15 12:08:59.000000000 +0100 @@ -1691,7 +1691,7 @@ /* Dead Kops may come back. */ switch(rnd(5)) { case 1: /* returns near the stairs */ - (void) makemon(mtmp->data,xdnstair,ydnstair,NO_MM_FLAGS); + (void) makemon(mtmp->data,dnstairs->sx,dnstairs->sy,NO_MM_FLAGS); break; case 2: /* randomly */ (void) makemon(mtmp->data,0,0,NO_MM_FLAGS); @@ -1794,17 +1794,55 @@ (2 + ((int)(mdat->geno & G_FREQ)<2) + verysmall(mdat)))); } +/* Check for parrots dieing in shops... */ +void +check_parrot(corpse) +register struct obj *corpse; +{ + register struct monst *shkp; + + /* Find the shopkeeper... */ + + shkp = shop_keeper(inside_shop(corpse->ox, corpse->oy)); + + /* Must have an alive, awake and mobile shop keeper... */ + + if ( shkp == NULL + || !inhishop(shkp) + || shkp->msleeping + || !shkp->mcanmove ) { + return; + } + + revive_parrot(shkp, corpse); + + return; +} + /* drop (perhaps) a cadaver and remove monster */ void mondied(mdef) register struct monst *mdef; { + register struct obj *corpse; + register struct permonst *mdat; + int mndx; + mondead(mdef); if (mdef->mhp > 0) return; /* lifesaved */ - if (corpse_chance(mdef, (struct monst *)0, FALSE) && - (accessible(mdef->mx, mdef->my) || is_pool(mdef->mx, mdef->my))) - (void) make_corpse(mdef); + corpse = NULL; + + if (corpse_chance(mdef, (struct monst*)0, FALSE)) + corpse = make_corpse(mdef); + + if (corpse != NULL) { + mdat = mdef->data; + mndx = monsndx(mdat); + if (mndx == PM_PARROT) { + check_parrot(corpse); + } + } } /* monster disappears, not dies */ @@ -2015,11 +2053,14 @@ register struct permonst *mdat; int mndx; register struct obj *otmp; + register struct obj *corpse; register struct trap *t; boolean redisp = FALSE; boolean wasinside = u.uswallow && (u.ustuck == mtmp); + corpse = NULL; + /* KMH, conduct */ u.uconduct.killer++; @@ -2117,7 +2158,7 @@ * if we want both, we have to specify it explicitly. */ if (corpse_chance(mtmp, (struct monst *)0, FALSE)) - (void) make_corpse(mtmp); + corpse = make_corpse(mtmp); } if(redisp) newsym(x,y); cleanup: @@ -2172,6 +2213,15 @@ /* malign was already adjusted for u.ualign.type and randomization */ adjalign(mtmp->malign); + + /* Some monsters just won't stay dead... */ + + if ( mndx == PM_PARROT + && corpse != NULL) { + check_parrot(corpse); + } + + return; } /* changes the monster into a stone monster of the same type */ diff -Naurbd slashem-0.0.8E0/src/muse.c slashem-0.0.8E1/src/muse.c --- slashem-0.0.8E0/src/muse.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/muse.c 2006-05-15 12:08:59.000000000 +0100 @@ -245,6 +245,10 @@ #define MUSE_WAN_EXTRA_HEALING 21 #define MUSE_WAN_CREATE_HORDE 22 #define MUSE_POT_VAMPIRE_BLOOD 23 +/* Lethe */ +#define MUSE_SCR_DEMONOLOGY 24 +#define MUSE_SCR_ELEMENTALISM 25 + /* #define MUSE_INNATE_TPT 9999 * We cannot use this. Since monsters get unlimited teleportation, if they @@ -367,12 +371,18 @@ } if (levl[x][y].typ == STAIRS && !stuck && !immobile) { - if (x == xdnstair && y == ydnstair && !is_floater(mtmp->data)) + int i; + if (!is_floater(mtmp->data)) + for(i = 0; i < n_dnstairs; i++) + if (x == dnstairs[i].sx && y == dnstairs[i].sy) { m.has_defense = MUSE_DOWNSTAIRS; - if (x == xupstair && y == yupstair && ledger_no(&u.uz) != 1) - /* Unfair to let the monsters leave the dungeon with the Amulet */ - /* (or go to the endlevel since you also need it, to get there) */ + break; + } + for(i = 0; i < n_upstairs; i++) + if (x == upstairs[i].sx && y == upstairs[i].sy) { m.has_defense = MUSE_UPSTAIRS; + break; + } } else if (levl[x][y].typ == LADDER && !stuck && !immobile) { if (x == xupladder && y == yupladder) m.has_defense = MUSE_UP_LADDER; @@ -546,6 +556,16 @@ m.has_defense = MUSE_WAN_CREATE_MONSTER; } } + nomore(MUSE_SCR_DEMONOLOGY); + if(obj->otyp == SCR_DEMONOLOGY) { + m.defensive = obj; + m.has_defense = MUSE_SCR_DEMONOLOGY; + } + nomore(MUSE_SCR_ELEMENTALISM); + if(obj->otyp == SCR_ELEMENTALISM) { + m.defensive = obj; + m.has_defense = MUSE_SCR_ELEMENTALISM; + } nomore(MUSE_SCR_CREATE_MONSTER); if(obj->otyp == SCR_CREATE_MONSTER) { m.defensive = obj; @@ -780,6 +800,157 @@ m_useup(mtmp, otmp); return 2; } + case MUSE_SCR_DEMONOLOGY: + { coord cc; + struct permonst *pm = 0, *fish = 0; + int cnt = 1; + struct monst *mon; + boolean known = FALSE; + + if (!rn2(73)) cnt += rnd(4); + if (mtmp->mconf || otmp->cursed) cnt += rn2(8); + if (mtmp->mconf) pm = fish = &mons[PM_MANES]; + else if (is_pool(mtmp->mx, mtmp->my)) + fish = &mons[PM_WATER_DEMON]; + mreadmsg(mtmp, otmp); + /* Pick a demon time... */ + if (!pm) { + switch(rn2(20)) { + case 0: + case 1: + pm = &mons[PM_MANES]; + cnt += rn2(4); + break; + case 2: + case 3: + pm = &mons[PM_WATER_DEMON]; + break; + case 4: + case 5: + pm = &mons[PM_HORNED_DEVIL]; + break; + case 6: + case 7: + pm = &mons[PM_SUCCUBUS]; + break; + case 8: + case 9: + pm = &mons[PM_INCUBUS]; + break; + case 10: + case 11: + pm = &mons[PM_VROCK]; + break; + case 12: + pm = &mons[PM_HEZROU]; + break; + case 13: + pm = &mons[PM_BARBED_DEVIL]; + break; + case 14: + pm = &mons[PM_MARILITH]; + break; + case 15: + pm = &mons[PM_BONE_DEVIL]; + break; + case 16: + pm = &mons[PM_ICE_DEVIL]; + break; + case 17: + pm = &mons[PM_NALFESHNEE]; + break; + case 18: + pm = &mons[PM_PIT_FIEND]; + break; + case 19: + pm = &mons[PM_BALROG]; + break; + } + } + while(cnt--) { + /* `fish' potentially gives bias towards water locations; + `pm' is what to actually create (0 => random) */ + if (!enexto(&cc, mtmp->mx, mtmp->my, fish)) break; + mon = makemon(pm, cc.x, cc.y, NO_MM_FLAGS); + if (mon && canspotmon(mon)) known = TRUE; + } + /* The only case where we don't use oseen. For wands, you + * have to be able to see the monster zap the wand to know + * what type it is. For teleport scrolls, you have to see + * the monster to know it teleported. + */ + if (known) + makeknown(SCR_DEMONOLOGY); + else if (!objects[SCR_DEMONOLOGY].oc_name_known + && !objects[SCR_DEMONOLOGY].oc_uname) + docall(otmp); + m_useup(mtmp, otmp); + return 2; + } + case MUSE_SCR_ELEMENTALISM: + { coord cc; + struct permonst *pm = 0, *fish = 0; + int cnt = 1; + struct monst *mon; + boolean known = FALSE; + + if (!rn2(73)) cnt += rnd(4); + if (mtmp->mconf || otmp->cursed) cnt += rn2(8); + if (mtmp->mconf) pm = fish = &mons[PM_MANES]; + else if (is_pool(mtmp->mx, mtmp->my)) + fish = &mons[PM_WATER_ELEMENTAL]; + mreadmsg(mtmp, otmp); + /* Pick an elemental time... */ + switch(rn2(4)) { + case 0: /* Air */ + if (mtmp->mconf) { + pm = &mons[PM_GAS_SPORE]; + } else { + pm = &mons[PM_AIR_ELEMENTAL]; + } + break; + case 1: /* Fire */ + if (mtmp->mconf) { + pm = &mons[PM_FLAMING_SPHERE]; + } else { + pm = &mons[PM_FIRE_ELEMENTAL]; + } + break; + case 2: /* Water */ + if (mtmp->mconf) { + pm = &mons[PM_FREEZING_SPHERE]; + } else { + pm = &mons[PM_WATER_ELEMENTAL]; + } + break; + case 3: /* Earth */ + if (mtmp->mconf) { + pm = &mons[PM_SHOCKING_SPHERE]; + } else { + pm = &mons[PM_EARTH_ELEMENTAL]; + } + break; + } + while(cnt--) { + /* `fish' potentially gives bias towards water locations; + `pm' is what to actually create (0 => random) */ + if (!enexto(&cc, mtmp->mx, mtmp->my, fish)) break; + mon = makemon(pm, cc.x, cc.y, NO_MM_FLAGS); + if (mon && canspotmon(mon)) known = TRUE; + } + /* The only case where we don't use oseen. For wands, you + * have to be able to see the monster zap the wand to know + * what type it is. For teleport scrolls, you have to see + * the monster to know it teleported. + */ + if (known) + makeknown(SCR_ELEMENTALISM); + else if (!objects[SCR_ELEMENTALISM].oc_name_known + && !objects[SCR_ELEMENTALISM].oc_uname) + docall(otmp); + m_useup(mtmp, otmp); + return 2; + } case MUSE_TRAPDOOR: /* trap doors on "bottom" levels of dungeons are rock-drop * trap doors, not holes in the floor. We check here for @@ -826,7 +997,8 @@ return 2; } m_flee(mtmp); - if (Inhell && mon_has_amulet(mtmp) && !rn2(4) && + if ((Inhell && !rn2(4) || Is_valley(&u.uz)) && + mon_has_amulet(mtmp) && (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) { if (vismon) pline( "As %s climbs the stairs, a mysterious force momentarily surrounds %s...", @@ -2190,7 +2362,8 @@ break; case SCROLL_CLASS: if (typ == SCR_TELEPORTATION || typ == SCR_CREATE_MONSTER - || typ == SCR_EARTH) + || typ == SCR_EARTH || typ == SCR_DEMONOLOGY + || typ == SCR_ELEMENTALISM) /* Lethe */ return TRUE; break; case AMULET_CLASS: @@ -2400,3 +2573,4 @@ } /*muse.c*/ + diff -Naurbd slashem-0.0.8E0/src/objects.c slashem-0.0.8E1/src/objects.c --- slashem-0.0.8E0/src/objects.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/objects.c 2006-05-15 12:08:59.000000000 +0100 @@ -242,7 +242,9 @@ /* Quarterstaves */ WEAPON("quarterstaff", "staff", - 0, 0, 1, 11, 40, 5, 6, 6, 0, B, P_QUARTERSTAFF, WOOD, HI_WOOD), + 0, 0, 1, 8, 40, 5, 6, 6, 0, B, P_QUARTERSTAFF, WOOD, HI_WOOD), +WEAPON("silver capped staff", (char *)0, + 0, 0, 1, 3, 40,100, 6, 6, 0, B, P_QUARTERSTAFF, SILVER, HI_SILVER), /* Polearms */ /* (also weptool fishing pole) */ @@ -1012,31 +1014,33 @@ SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, HI_PAPER ) /* Attack */ SCROLL("create monster", "LEP GEX VEN ZEA", P_ATTACK_SPELL, 1, 45, 200), +SCROLL("demonology", "IA CTHULHU", P_ATTACK_SPELL, 1, 10, 350), /* Enchantment */ SCROLL("taming", "PRIRUTSENIE", P_ENCHANTMENT_SPELL, 1, 15, 200), /* Divination */ -SCROLL("light", "VERR YED HORRE", P_DIVINATION_SPELL, 1, 90, 50), +SCROLL("light", "VERR YED HORRE", P_DIVINATION_SPELL, 1, 85, 50), SCROLL("food detection", "YUM YUM", P_DIVINATION_SPELL, 1, 25, 100), SCROLL("gold detection", "THARR", P_DIVINATION_SPELL, 1, 33, 100), -SCROLL("identify", "KERNOD WEL", P_DIVINATION_SPELL, 1, 185, 20), +SCROLL("identify", "KERNOD WEL", P_DIVINATION_SPELL, 1, 180, 20), SCROLL("magic mapping", "ELAM EBOW", P_DIVINATION_SPELL, 1, 45, 100), /* Enchantment */ -SCROLL("confuse monster", "NR 9", P_ENCHANTMENT_SPELL, 1, 43, 100), -SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", P_ENCHANTMENT_SPELL, 1, 35, 100), -SCROLL("enchant weapon", "DAIYEN FOOELS", P_ENCHANTMENT_SPELL, 1, 80, 60), +SCROLL("confuse monster", "NR 9", P_ENCHANTMENT_SPELL, 1, 53, 100), +SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", P_ENCHANTMENT_SPELL, 1, 30, 100), +SCROLL("enchant weapon", "DAIYEN FOOELS", P_ENCHANTMENT_SPELL, 1, 75, 60), SCROLL("enchant armor", "ZELGO MER", P_ENCHANTMENT_SPELL, 1, 63, 80), /* Protection */ SCROLL("remove curse", "PRATYAVAYAH", P_PROTECTION_SPELL, 1, 65, 80), /* Body */ SCROLL("teleportation", "VENZAR BORGAVVE", P_BODY_SPELL, 1, 55, 100), /* Matter */ -SCROLL("fire", "ANDOVA BEGARIN", P_MATTER_SPELL, 1, 33, 100), -SCROLL("earth", "KIRJE", P_MATTER_SPELL, 1, 20, 200), +SCROLL("fire", "ANDOVA BEGARIN", P_MATTER_SPELL, 1, 30, 100), +SCROLL("earth", "KIRJE", P_MATTER_SPELL, 1, 18, 200), +SCROLL("elementalism", "4OFAE OF9 SCC9", P_MATTER_SPELL, 1, 10, 350), SCROLL("destroy armor", "JUYED AWK YACC", P_NONE, 1, 45, 100), SCROLL("amnesia", "DUAM XNAHT", P_NONE, 1, 35, 200), SCROLL("charging", "HACKEM MUCHE", P_NONE, 1, 15, 300), -SCROLL("genocide", "ELBIB YLOH", P_NONE, 1, 15, 300), +SCROLL("genocide", "ELBIB YLOH", P_NONE, 1, 10, 300), SCROLL("punishment", "VE FORBRYDERNE", P_NONE, 1, 15, 300), SCROLL("stinking cloud", "VELOX NEB", P_NONE, 1, 15, 300), SCROLL((char *)0, "FOOBIE BLETCH", P_NONE, 1, 0, 100), diff -Naurbd slashem-0.0.8E0/src/objnam.c slashem-0.0.8E1/src/objnam.c --- slashem-0.0.8E0/src/objnam.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/objnam.c 2006-05-15 12:08:59.000000000 +0100 @@ -3040,9 +3040,11 @@ delete_contents(otmp); obfree(otmp, (struct obj *) 0); otmp = &zeroobj; - pline("For a moment, you feel %s in your %s, but it disappears!", +/* pline("For a moment, you feel %s in your %s, but it disappears!", something, - makeplural(body_part(HAND))); + makeplural(body_part(HAND))); */ + /* Lethe message looks better for this situation... */ + moloch_denies_you(); } if (halfeaten && otmp->oclass == FOOD_CLASS) { diff -Naurbd slashem-0.0.8E0/src/pager.c slashem-0.0.8E1/src/pager.c --- slashem-0.0.8E0/src/pager.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/pager.c 2006-05-15 12:08:59.000000000 +0100 @@ -273,6 +273,8 @@ Strcat(buf, " embedded in a wall"); else if (closed_door(x,y)) Strcat(buf, " embedded in a door"); + else if (levl[x][y].typ == RIVER) + Strcat(buf, " in river"); else if (is_pool(x,y)) Strcat(buf, " in water"); else if (is_lava(x,y)) @@ -300,10 +302,6 @@ case S_cloud: Strcpy(buf, Is_airlevel(&u.uz) ? "cloudy area" : "fog/vapor cloud"); break; - case S_water: - case S_pool: - Strcpy(buf, level.flags.lethe? "sparkling water" : "water"); - break; default: Strcpy(buf,defsyms[glyph_to_cmap(glyph)].explanation); break; @@ -658,14 +656,13 @@ /* avoid "an air", "a water", or "a floor of a room" */ int article = (i == S_room) ? 2 : /* 2=>"the" */ !(strcmp(x_str, "air") == 0 || /* 1=>"an" */ - strcmp(x_str, "water") == 0); /* 0=>(none)*/ + strcmp(x_str, "water") == 0 || /* 0=>(none)*/ + i == S_phlegethon); if (!found) { if (is_cmap_trap(i)) { Sprintf(out_str, "%c a trap", sym); hit_trap = TRUE; - } else if (level.flags.lethe && !strcmp(x_str, "water")) { - Sprintf(out_str, "%c sparkling water", sym); } else { Sprintf(out_str, "%c %s", sym, article == 2 ? the(x_str) : @@ -675,9 +672,7 @@ found++; } else if (!u.uswallow && !(hit_trap && is_cmap_trap(i)) && !(found >= 3 && is_cmap_drawbridge(i))) { - if (level.flags.lethe && !strcmp(x_str, "water")) - found += append_str(out_str, "sparkling water"); - else + if (i != S_lethe) /* Water includes sparking water */ found += append_str(out_str, article == 2 ? the(x_str) : article == 1 ? an(x_str) : x_str); @@ -772,9 +767,14 @@ if (found == 1 && ans != LOOK_QUICK && ans != LOOK_ONCE && (ans == LOOK_VERBOSE || (flags.help && !quick))) { char temp_buf[BUFSZ]; - Strcpy(temp_buf, level.flags.lethe - && !strcmp(firstmatch, "water")? - "lethe" : firstmatch); + if (level.flags.river && !strcmp(firstmatch, "water")) { + if (level.flags.river == RIVER_LETHE) + Strcpy(temp_buf, "lethe"); + else + Strcpy(temp_buf, "phlegethon"); + } + else + Strcpy(temp_buf, firstmatch); checkfile(temp_buf, pm, FALSE, (boolean)(ans == LOOK_VERBOSE)); } } else { diff -Naurbd slashem-0.0.8E0/src/potion.c slashem-0.0.8E1/src/potion.c --- slashem-0.0.8E0/src/potion.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/potion.c 2006-05-15 12:08:59.000000000 +0100 @@ -955,10 +955,7 @@ /* reverse kludge */ HLevitation = 0; if (otmp->cursed && !Is_waterlevel(&u.uz)) { - if((u.ux != xupstair || u.uy != yupstair) - && (u.ux != sstairs.sx || u.uy != sstairs.sy || !sstairs.up) - && (!xupladder || u.ux != xupladder || u.uy != yupladder) - ) { + if (On_stairs(u.ux, u.uy) != LA_UP) { You("hit your %s on the %s.", body_part(HEAD), ceiling(u.ux,u.uy)); @@ -1219,7 +1216,7 @@ /* Uh-oh! */ if (uarmh && is_helmet(uarmh) && rn2(10 - (uarmh->cursed? 8 : 0))) - get_wet(uarmh, TRUE); + get_wet(uarmh, RIVER_LETHE); break; } } else { @@ -1931,9 +1928,9 @@ } boolean -get_wet(obj, amnesia) +get_wet(obj, river) register struct obj *obj; -boolean amnesia; +int river; /* returns TRUE if something happened (potion should be used up) */ { char Your_buf[BUFSZ]; @@ -1941,7 +1938,7 @@ if (snuff_lit(obj)) return(TRUE); - if (obj->greased) { + if (obj->greased && river != RIVER_PHLEGETHON) { grease_protect(obj,(char *)0,&youmonst); return(FALSE); } @@ -1949,8 +1946,13 @@ /* (Rusting shop goods ought to be charged for.) */ switch (obj->oclass) { case POTION_CLASS: + if (river == RIVER_PHLEGETHON) { + if (obj->otyp == POT_BLOOD || + obj->otyp == POT_VAMPIRE_BLOOD) + return FALSE; + } else { if (obj->otyp == POT_WATER) { - if (amnesia) { + if (river == RIVER_LETHE) { Your("%s to sparkle.", aobjnam(obj,"start")); obj->odiluted = 0; obj->otyp = POT_AMNESIA; @@ -1968,6 +1970,7 @@ used = TRUE; break; } + } /* KMH -- Water into acid causes an explosion */ if (obj->otyp == POT_ACID) { @@ -1975,7 +1978,7 @@ You("are caught in the explosion!"); losehp(Acid_resistance ? rnd(5) : rnd(10), "elementary chemistry", KILLED_BY); - if (amnesia) { + if (river == RIVER_LETHE) { You_feel("a momentary lapse of reason!"); forget(2 + rn2(3)); } @@ -1983,16 +1986,19 @@ used = TRUE; break; } - if (amnesia) + if (river == RIVER_PHLEGETHON) + pline("%s %s red.", Your_buf, aobjnam(obj,"turn")); + else if (river == RIVER_LETHE) pline("%s %s completely.", Your_buf, aobjnam(obj,"dilute")); else pline("%s %s%s.", Your_buf, aobjnam(obj,"dilute"), obj->odiluted ? " further" : ""); if(obj->unpaid && costly_spot(u.ux, u.uy)) { - You("dilute it, you pay for it."); + You("%s it, you pay for it.", + river == RIVER_PHLEGETHON ? "ruin" : "dilute"); bill_dummy_object(obj); } - if (obj->odiluted || amnesia) { + if (obj->odiluted || river) { obj->odiluted = 0; #ifdef UNIXPC obj->blessed = FALSE; @@ -2000,6 +2006,9 @@ #else obj->blessed = obj->cursed = FALSE; #endif + if (river == RIVER_PHLEGETHON) + obj->otyp = POT_BLOOD; + else obj->otyp = POT_WATER; } else obj->odiluted++; used = TRUE; @@ -2027,6 +2036,11 @@ case SPBOOK_CLASS: if (obj->otyp != SPE_BLANK_PAPER) { if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { + if (river == RIVER_PHLEGETHON) { + pline("%s %s.", The(xname(obj)), + otense(obj, "glow")); + bless(obj); + } else pline("%s suddenly heats up; steam rises and it remains dry.", The(xname(obj))); } else { @@ -2046,14 +2060,14 @@ } break; case GEM_CLASS: - if (amnesia && (obj->otyp == LUCKSTONE || + if (river == RIVER_LETHE && (obj->otyp == LUCKSTONE || obj->otyp == LOADSTONE || obj->otyp == HEALTHSTONE || obj->otyp == TOUCHSTONE)) downgrade_obj(obj, FLINT, &used); break; case TOOL_CLASS: /* Artifacts aren't downgraded by amnesia */ - if (amnesia && !obj->oartifact) { + if (river == RIVER_LETHE && !obj->oartifact) { switch (obj->otyp) { case MAGIC_LAMP: /* Magic lamps forget their djinn... */ @@ -2113,7 +2127,7 @@ return TRUE; } /* !ofAmnesia acts as a disenchanter... */ - if (amnesia && obj->spe > 0) { + if (river == RIVER_LETHE && obj->spe > 0) { pre_downgrade_obj(obj, &used); drain_item(obj); } @@ -2132,14 +2146,14 @@ break; } /* !ofAmnesia might strip away fooproofing... */ - if (amnesia && obj->oerodeproof && !rn2(13)) { + if (river == RIVER_LETHE && obj->oerodeproof && !rn2(13)) { pre_downgrade_obj(obj, &used); obj->oerodeproof = FALSE; } /* !ofAmnesia also strips blessed/cursed status... */ - if (amnesia && (obj->cursed || obj->blessed)) { + if (river == RIVER_LETHE && (obj->cursed || obj->blessed)) { /* Blessed objects are valuable, cursed objects aren't, unless * they're water. */ @@ -2156,7 +2170,8 @@ if (used) update_inventory(); else - pline("%s %s wet.", Your_buf, aobjnam(obj,"get")); + pline("%s %s %s.", Your_buf, aobjnam(obj,"get"), + river == RIVER_PHLEGETHON ? "bloody" : "wet"); return used; } @@ -2654,7 +2669,7 @@ rider_cant_reach(); /* not skilled enough to reach */ #endif } else { - (void) get_wet(obj, level.flags.lethe); + (void) get_wet(obj, level.flags.river); if (obj->otyp == POT_ACID) useup(obj); } return 1; @@ -2736,7 +2751,7 @@ (artifact_wet(obj,TRUE)-1), NULL); break; } - if (get_wet(obj, FALSE)) + if (get_wet(obj, RIVER_NONE)) goto poof; } } else if (potion->otyp == POT_AMNESIA) { @@ -2745,7 +2760,7 @@ potion = splitobj(obj, 1L); potion->in_use = TRUE; } - if (get_wet(obj, TRUE)) goto poof; + if (get_wet(obj, RIVER_LETHE)) goto poof; } /* WAC - Finn Theoderson - make polymorph and gain level msgs similar * Give out name of new object and allow user to name the potion diff -Naurbd slashem-0.0.8E0/src/pray.c slashem-0.0.8E1/src/pray.c --- slashem-0.0.8E0/src/pray.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/pray.c 2006-05-15 12:08:59.000000000 +0100 @@ -467,6 +467,32 @@ } } +void +moloch_denies_you() +{ + pline("The dread voice of %s fills the air!", Moloch); + + verbalize("So, mortal, you seek the powers of the olden gods to use against me?"); + + pline( "For a moment, you feel %s in your %s, but it disappears!", + something, + makeplural(body_part(HAND))); + + verbalize("I think not!"); + + summon_minion(A_NONE, FALSE); + + if (!rn2(3)) { + summon_minion(A_NONE, FALSE); + } + + if (!rn2(7)) { + summon_minion(A_NONE, FALSE); + } + + return; +} + /* "I am sometimes shocked by... the nuns who never take a bath without * wearing a bathrobe all the time. When asked why, since no man can see them, * they reply 'Oh, but you forget the good God'. Apparently they conceive of diff -Naurbd slashem-0.0.8E0/src/priest.c slashem-0.0.8E1/src/priest.c --- slashem-0.0.8E0/src/priest.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/priest.c 2006-05-15 12:08:59.000000000 +0100 @@ -183,6 +183,8 @@ } /* exclusively for mktemple() */ + +/* For Lethe, Cthulhu us the high priest, so there are a few changes... */ void priestini(lvl, sroom, sx, sy, sanctum) d_level *lvl; @@ -197,8 +199,7 @@ if(MON_AT(sx+1, sy)) (void) rloc(m_at(sx+1, sy), FALSE); /* insurance */ - priest = makemon(&mons[sanctum ? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST], - sx + 1, sy, NO_MM_FLAGS); + priest = makemon(&mons[on_level(&astral_level, &u.uz)? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST], sx + 1, sy, NO_MM_FLAGS); if (priest) { EPRI(priest)->shroom = (sroom - rooms) + ROOMOFFSET; EPRI(priest)->shralign = Amask2align(levl[sx][sy].altarmask); @@ -212,10 +213,10 @@ set_malign(priest); /* mpeaceful may have changed */ /* now his/her goodies... */ - if(sanctum && EPRI(priest)->shralign == A_NONE && + /* if(sanctum && EPRI(priest)->shralign == A_NONE && on_level(&sanctum_level, &u.uz)) { (void) mongets(priest, AMULET_OF_YENDOR); - } + } */ /* 2 to 4 spellbooks */ for (cnt = rn1(3,2); cnt > 0; --cnt) { (void) mpickobj(priest, mkobj(SPBOOK_CLASS, FALSE)); @@ -346,8 +347,7 @@ if(!temple_occupied(u.urooms0)) { if(tended) { shrined = has_shrine(priest); - sanctum = (priest->data == &mons[PM_HIGH_PRIEST] && - (Is_sanctum(&u.uz) || In_endgame(&u.uz))); + sanctum = (Is_sanctum(&u.uz) || In_endgame(&u.uz)); can_speak = (priest->mcanmove && !priest->msleeping && flags.soundok); if (can_speak) { diff -Naurbd slashem-0.0.8E0/src/read.c slashem-0.0.8E1/src/read.c --- slashem-0.0.8E0/src/read.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/read.c 2006-05-15 12:08:59.000000000 +0100 @@ -1168,12 +1168,181 @@ case SPE_CREATE_MONSTER: if (create_critters(1 + ((confused || sobj->cursed) ? 12 : 0) + ((sobj->blessed || rn2(73)) ? 0 : rnd(4)), - confused ? &mons[PM_ACID_BLOB] : (struct permonst *)0)) + confused ? &mons[PM_ACID_BLOB] : (struct permonst *)0, + MAKE_EM_NATURAL)) known = TRUE; /* no need to flush monsters; we ask for identification only if the * monsters are not visible */ break; + /* Lethe */ + case SCR_DEMONOLOGY: { + struct permonst *critter = 0; + int n = 1, x = 0; + int state = MAKE_EM_HOSTILE; + if (sobj->blessed) { + if (confused) { + n = 3 + rn2(10); + critter = &mons[PM_MANES]; + state = MAKE_EM_TAME; + adjalign(-2); + } else if (rn2(2)) { + state = MAKE_EM_TAME; + } else { + state = MAKE_EM_HOSTILE; + } + } else if (sobj->cursed) { + if (confused) { + x = 100; + } else { + n = 2 + rn2(3); + x = 5; + } + } else { + if (confused) { + n = 3 + rn2(10); + critter = &mons[PM_MANES]; + adjalign(-2); + } else if (rn2(2)) { + state = MAKE_EM_PEACEFUL; + } + } + if (critter == (struct permonst *)0) { + /* Normally you get a minor demon... */ + x += rn2(100); + if ( x < 35 ) { + critter = &mons[PM_VROCK]; + } else if ( x < 45 ) { + critter = &mons[PM_HEZROU]; + } else if ( x < 54 ) { + critter = &mons[PM_HORNED_DEVIL]; + } else if ( x < 63 ) { + critter = &mons[PM_BARBED_DEVIL]; + } else if ( x < 71 ) { + critter = &mons[PM_BONE_DEVIL]; + } else if ( x < 79 ) { + critter = &mons[PM_ICE_DEVIL]; + } else if ( x < 84 ) { + critter = &mons[PM_MARILITH]; + } else if ( x < 89 ) { + critter = &mons[PM_NALFESHNEE]; + } else if ( x < 94 ) { + critter = &mons[PM_PIT_FIEND]; + } else if ( x < 98 ) { + critter = &mons[PM_BALROG]; + } else { + /* 1 in 100, you get a major demon... */ + int pm = 0; + n = 1; + if (u.ualign.type == A_LAWFUL) { + state = MAKE_EM_HOSTILE; + } else if (state == MAKE_EM_TAME) { + state = MAKE_EM_PEACEFUL; + } + if (x > 140) { + pm = dlord(A_NONE); /* Yen, Jub */ + } else { + pm = dprince(A_NONE); /* Other */ + } + /* Send in some MANES if nobody is home... */ + if ( pm == 0 ) { + pm = PM_MANES; + n = 5 + rn2(10); + if (u.ualign.type == A_CHAOTIC) { + state = MAKE_EM_TAME; + } + } else { + adjalign(-2); + } + critter = &mons[pm]; + } + } + /* Summoning demons is a chaotic thing... */ + adjalign((u.ualign.type == A_LAWFUL) ? -3 : -1); + if (create_critters(n, critter,state)) { + known = TRUE; + } + if (Hallucination) { + You_feel("like a walking study!"); + } else { + You("smell brimstone."); + } + /* no need to flush monsters; we ask for identification only if the + * monsters are not visible + * */ + break; + } + case SCR_ELEMENTALISM: { + struct permonst *critter = 0; + int n = 1; + int state = MAKE_EM_HOSTILE; + if (sobj->blessed) { + if (confused) { + n = 3 + rn2(10); + state = MAKE_EM_TAME; + } else if (!rn2(3)) { + state = MAKE_EM_HOSTILE; /* 1 in 3 */ + } else { + state = MAKE_EM_TAME; + } + } else if (sobj->cursed) { + if (!confused) { + n = 2 + rn2(3); + } + } else { + if (confused) { + n = 3 + rn2(10); + } else if (!rn2(2)) { + state = MAKE_EM_PEACEFUL; + } + } + if (critter == (struct permonst *)0) { + /* Normally you get an elemental... */ + switch (rn2(4)) { + case 0: /* Air */ + if (confused) { + critter = &mons[PM_GAS_SPORE]; + } else { + critter = &mons[PM_AIR_ELEMENTAL]; + } + break; + case 1: /* Fire */ + if (confused) { + critter = &mons[PM_FLAMING_SPHERE]; + } else { + critter = &mons[PM_FIRE_ELEMENTAL]; + } + break; + case 2: /* Water */ + if (confused) { + critter = &mons[PM_FREEZING_SPHERE]; + } else { + critter = &mons[PM_WATER_ELEMENTAL]; + } + break; + default: + case 3: /* Earth */ + if (confused) { + critter = &mons[PM_SHOCKING_SPHERE]; + } else { + critter = &mons[PM_EARTH_ELEMENTAL]; + } + break; + } + } + if (create_critters(n, critter,state)) { + known = TRUE; + } + if (Hallucination) { + You_feel("you have experienced something fundamental."); + } else { + pline("The elements swirl around you."); + } + /* no need to flush monsters; we ask for identification only if the + * monsters are not visible + */ + break; + } case SPE_SUMMON_UNDEAD: { int cnt = 1, oldmulti = multi; diff -Naurbd slashem-0.0.8E0/src/restore.c slashem-0.0.8E1/src/restore.c --- slashem-0.0.8E0/src/restore.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/restore.c 2006-05-15 12:08:59.000000000 +0100 @@ -814,8 +814,10 @@ #endif /* RLECOMP */ mread(fd, (genericptr_t)&omoves, sizeof(omoves)); - mread(fd, (genericptr_t)&upstair, sizeof(stairway)); - mread(fd, (genericptr_t)&dnstair, sizeof(stairway)); + mread(fd, (genericptr_t)&n_upstairs, sizeof(int)); + mread(fd, (genericptr_t)upstairs, n_upstairs * sizeof(stairway)); + mread(fd, (genericptr_t)&n_dnstairs, sizeof(int)); + mread(fd, (genericptr_t)dnstairs, n_dnstairs * sizeof(stairway)); mread(fd, (genericptr_t)&upladder, sizeof(stairway)); mread(fd, (genericptr_t)&dnladder, sizeof(stairway)); mread(fd, (genericptr_t)&sstairs, sizeof(stairway)); @@ -895,12 +897,13 @@ freefruitchn(oldfruit), oldfruit = 0; if (lev > ledger_no(&medusa_level) && - lev < ledger_no(&stronghold_level) && xdnstair == 0) { + lev < ledger_no(&stronghold_level) && n_dnstairs == 0) { coord cc; mazexy(&cc); - xdnstair = cc.x; - ydnstair = cc.y; + dnstairs[0].sx = cc.x; + dnstairs[0].sy = cc.y; + n_dnstairs++; levl[cc.x][cc.y].typ = STAIRS; } diff -Naurbd slashem-0.0.8E0/src/restore.c.orig slashem-0.0.8E1/src/restore.c.orig --- slashem-0.0.8E0/src/restore.c.orig 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/restore.c.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,1135 +0,0 @@ -/* SCCS Id: @(#)restore.c 3.4 2003/09/06 */ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/* NetHack may be freely redistributed. See license for details. */ - -#include "hack.h" -#include "lev.h" -#include "tcap.h" /* for TERMLIB and ASCIIGRAPH */ - -#if defined(MICRO) -extern int dotcnt; /* shared with save */ -extern int dotrow; /* shared with save */ -#endif - -#ifdef USE_TILES -extern void FDECL(substitute_tiles, (d_level *)); /* from tile.c */ -#endif - -#ifdef ZEROCOMP -static int NDECL(mgetc); -#endif -STATIC_DCL void NDECL(find_lev_obj); -STATIC_DCL void FDECL(restlevchn, (int)); -STATIC_DCL void FDECL(restdamage, (int,BOOLEAN_P)); -STATIC_DCL struct obj *FDECL(restobjchn, (int,BOOLEAN_P,BOOLEAN_P)); -STATIC_DCL struct monst *FDECL(restmonchn, (int,BOOLEAN_P)); -STATIC_DCL struct fruit *FDECL(loadfruitchn, (int)); -STATIC_DCL void FDECL(freefruitchn, (struct fruit *)); -STATIC_DCL void FDECL(ghostfruit, (struct obj *)); -STATIC_DCL boolean FDECL(restgamestate, (int, unsigned int *, unsigned int *)); -STATIC_DCL void FDECL(restlevelstate, (unsigned int, unsigned int)); -STATIC_DCL int FDECL(restlevelfile, (int,XCHAR_P)); -STATIC_DCL void FDECL(reset_oattached_mids, (BOOLEAN_P)); - -/* - * Save a mapping of IDs from ghost levels to the current level. This - * map is used by the timer routines when restoring ghost levels. - */ -#define N_PER_BUCKET 64 -struct bucket { - struct bucket *next; - struct { - unsigned gid; /* ghost ID */ - unsigned nid; /* new ID */ - } map[N_PER_BUCKET]; -}; - -STATIC_DCL void NDECL(clear_id_mapping); -STATIC_DCL void FDECL(add_id_mapping, (unsigned, unsigned)); - -static int n_ids_mapped = 0; -static struct bucket *id_map = 0; - - -#ifdef AMII_GRAPHICS -void FDECL( amii_setpens, (int) ); /* use colors from save file */ -extern int amii_numcolors; -#endif - -#include "quest.h" - -boolean restoring = FALSE; -static NEARDATA struct fruit *oldfruit; -static NEARDATA long omoves; - -#define Is_IceBox(o) ((o)->otyp == ICE_BOX ? TRUE : FALSE) - -/* Recalculate level.objects[x][y], since this info was not saved. */ -STATIC_OVL void -find_lev_obj() -{ - register struct obj *fobjtmp = (struct obj *)0; - register struct obj *otmp; - int x,y; - - for(x=0; xnobj; - otmp->nobj = fobjtmp; - otmp->where = OBJ_FREE; - fobjtmp = otmp; - } - /* fobj should now be empty */ - - /* Set level.objects (as well as reversing the chain back again) */ - while ((otmp = fobjtmp) != 0) { - fobjtmp = otmp->nobj; - place_object(otmp, otmp->ox, otmp->oy); - } -} - -/* Things that were marked "in_use" when the game was saved (ex. via the - * infamous "HUP" cheat) get used up here. - */ -void -inven_inuse(quietly) -boolean quietly; -{ - register struct obj *otmp, *otmp2; - - for (otmp = invent; otmp; otmp = otmp2) { - otmp2 = otmp->nobj; -#ifndef GOLDOBJ - if (otmp->oclass == COIN_CLASS) { - /* in_use gold is created by some menu operations */ - if (!otmp->in_use) { - impossible("inven_inuse: !in_use gold in inventory"); - } - extract_nobj(otmp, &invent); - otmp->in_use = FALSE; - dealloc_obj(otmp); - } else -#endif /* GOLDOBJ */ - if (otmp->in_use) { - if (!quietly) pline("Finishing off %s...", xname(otmp)); - useup(otmp); - } - } -} - -STATIC_OVL void -restlevchn(fd) -register int fd; -{ - int cnt; - s_level *tmplev, *x; - - sp_levchn = (s_level *) 0; - mread(fd, (genericptr_t) &cnt, sizeof(int)); - for(; cnt > 0; cnt--) { - - tmplev = (s_level *)alloc(sizeof(s_level)); - mread(fd, (genericptr_t) tmplev, sizeof(s_level)); - if(!sp_levchn) sp_levchn = tmplev; - else { - - for(x = sp_levchn; x->next; x = x->next); - x->next = tmplev; - } - tmplev->next = (s_level *)0; - } -} - -STATIC_OVL void -restdamage(fd, ghostly) -int fd; -boolean ghostly; -{ - int counter; - struct damage *tmp_dam; - - mread(fd, (genericptr_t) &counter, sizeof(counter)); - if (!counter) - return; - tmp_dam = (struct damage *)alloc(sizeof(struct damage)); - while (--counter >= 0) { - char damaged_shops[5], *shp = (char *)0; - - mread(fd, (genericptr_t) tmp_dam, sizeof(*tmp_dam)); - if (ghostly) - tmp_dam->when += (monstermoves - omoves); - Strcpy(damaged_shops, - in_rooms(tmp_dam->place.x, tmp_dam->place.y, SHOPBASE)); - if (u.uz.dlevel) { - /* when restoring, there are two passes over the current - * level. the first time, u.uz isn't set, so neither is - * shop_keeper(). just wait and process the damage on - * the second pass. - */ - for (shp = damaged_shops; *shp; shp++) { - struct monst *shkp = shop_keeper(*shp); - - if (shkp && inhishop(shkp) && - repair_damage(shkp, tmp_dam, TRUE)) - break; - } - } - if (!shp || !*shp) { - tmp_dam->next = level.damagelist; - level.damagelist = tmp_dam; - tmp_dam = (struct damage *)alloc(sizeof(*tmp_dam)); - } - } - free((genericptr_t)tmp_dam); -} - -STATIC_OVL struct obj * -restobjchn(fd, ghostly, frozen) -register int fd; -boolean ghostly, frozen; -{ - register struct obj *otmp, *otmp2 = 0; - register struct obj *first = (struct obj *)0; - int xl; - - while(1) { - mread(fd, (genericptr_t) &xl, sizeof(xl)); - if(xl == -1) break; - otmp = newobj(xl); - if(!first) first = otmp; - else otmp2->nobj = otmp; - mread(fd, (genericptr_t) otmp, - (unsigned) xl + sizeof(struct obj)); - if (ghostly) { - unsigned nid = flags.ident++; - add_id_mapping(otmp->o_id, nid); - otmp->o_id = nid; - } - if (ghostly && otmp->otyp == SLIME_MOLD) ghostfruit(otmp); - /* Ghost levels get object age shifted from old player's clock - * to new player's clock. Assumption: new player arrived - * immediately after old player died. - */ - if (ghostly && !frozen && !age_is_relative(otmp)) - otmp->age = monstermoves - omoves + otmp->age; - - /* get contents of a container or statue */ - if (Has_contents(otmp)) { - struct obj *otmp3; - otmp->cobj = restobjchn(fd, ghostly, Is_IceBox(otmp)); - /* restore container back pointers */ - for (otmp3 = otmp->cobj; otmp3; otmp3 = otmp3->nobj) - otmp3->ocontainer = otmp; - } - if (otmp->bypass) otmp->bypass = 0; - - otmp2 = otmp; - } - if(first && otmp2->nobj){ - impossible("Restobjchn: error reading objchn."); - otmp2->nobj = 0; - } - - return(first); -} - -STATIC_OVL struct monst * -restmonchn(fd, ghostly) -register int fd; -boolean ghostly; -{ - register struct monst *mtmp, *mtmp2 = 0; - register struct monst *first = (struct monst *)0; - int xl; - struct permonst *monbegin; - boolean moved; - - /* get the original base address */ - mread(fd, (genericptr_t)&monbegin, sizeof(monbegin)); - moved = (monbegin != mons); - - while(1) { - mread(fd, (genericptr_t) &xl, sizeof(xl)); - if(xl == -1) break; - mtmp = newmonst(xl); - if(!first) first = mtmp; - else mtmp2->nmon = mtmp; - mread(fd, (genericptr_t) mtmp, (unsigned) xl + sizeof(struct monst)); - if (ghostly) { - unsigned nid = flags.ident++; - add_id_mapping(mtmp->m_id, nid); - mtmp->m_id = nid; - } - if (moved && mtmp->data) { - int offset = mtmp->data - monbegin; /*(ptrdiff_t)*/ - mtmp->data = mons + offset; /* new permonst location */ - } - if (ghostly) { - int mndx = monsndx(mtmp->data); - if (propagate(mndx, TRUE, ghostly) == 0) { - /* cookie to trigger purge in getbones() */ - mtmp->mhpmax = DEFUNCT_MONSTER; - } - } - if (mtmp->isshk) restore_shk_bill(fd, mtmp); - if(mtmp->minvent) { - struct obj *obj; - mtmp->minvent = restobjchn(fd, ghostly, FALSE); - /* restore monster back pointer */ - for (obj = mtmp->minvent; obj; obj = obj->nobj) - obj->ocarry = mtmp; - } - if (mtmp->mw) { - struct obj *obj; - - for(obj = mtmp->minvent; obj; obj = obj->nobj) - if (obj->owornmask & W_WEP) break; - if (obj) mtmp->mw = obj; - else { - MON_NOWEP(mtmp); - /* KMH -- this is more an annoyance than a bug */ -/* impossible("bad monster weapon restore"); */ - } - } - - if (mtmp->isshk) restshk(mtmp, ghostly); - if (mtmp->ispriest) restpriest(mtmp, ghostly); - if (mtmp->isgyp && ghostly) gypsy_init(mtmp); - - mtmp2 = mtmp; - } - if(first && mtmp2->nmon){ - impossible("Restmonchn: error reading monchn."); - mtmp2->nmon = 0; - } - return(first); -} - -STATIC_OVL struct fruit * -loadfruitchn(fd) -int fd; -{ - register struct fruit *flist, *fnext; - - flist = 0; - while (fnext = newfruit(), - mread(fd, (genericptr_t)fnext, sizeof *fnext), - fnext->fid != 0) { - fnext->nextf = flist; - flist = fnext; - } - dealloc_fruit(fnext); - return flist; -} - -STATIC_OVL void -freefruitchn(flist) -register struct fruit *flist; -{ - register struct fruit *fnext; - - while (flist) { - fnext = flist->nextf; - dealloc_fruit(flist); - flist = fnext; - } -} - -STATIC_OVL void -ghostfruit(otmp) -register struct obj *otmp; -{ - register struct fruit *oldf; - - for (oldf = oldfruit; oldf; oldf = oldf->nextf) - if (oldf->fid == otmp->spe) break; - - if (!oldf) impossible("no old fruit?"); - else otmp->spe = fruitadd(oldf->fname); -} - -STATIC_OVL -boolean -restgamestate(fd, stuckid, steedid) -register int fd; -unsigned int *stuckid, *steedid; /* STEED */ -{ - /* discover is actually flags.explore */ - boolean remember_discover = discover; - struct obj *otmp; - int uid; - - mread(fd, (genericptr_t) &uid, sizeof uid); - if (uid != getuid()) { /* strange ... */ - /* for wizard mode, issue a reminder; for others, treat it - as an attempt to cheat and refuse to restore this file */ - pline("Saved game was not yours."); -#ifdef WIZARD - if(!wizard) -#endif - return FALSE; - } - - mread(fd, (genericptr_t) &flags, sizeof(struct flag)); - flags.bypasses = 0; /* never use the saved value of bypasses */ - if (remember_discover) discover = remember_discover; - - role_init(); /* Reset the initial role, gender, and alignment */ - -#ifdef AMII_GRAPHICS - amii_setpens(amii_numcolors); /* use colors from save file */ -#endif - mread(fd, (genericptr_t) &u, sizeof(struct you)); - init_uasmon(); -#ifdef CLIPPING - cliparound(u.ux, u.uy); -#endif - if(u.uhp <= 0 && (!Upolyd || u.mh <= 0)) { - u.ux = u.uy = 0; /* affects pline() [hence You()] */ - You("were not healthy enough to survive restoration."); - /* wiz1_level.dlevel is used by mklev.c to see if lots of stuff is - * uninitialized, so we only have to set it and not the other stuff. - */ - wiz1_level.dlevel = 0; - u.uz.dnum = 0; - u.uz.dlevel = 1; - return(FALSE); - } - - /* this stuff comes after potential aborted restore attempts */ - restore_timers(fd, RANGE_GLOBAL, FALSE, 0L); - restore_light_sources(fd); - invent = restobjchn(fd, FALSE, FALSE); - migrating_objs = restobjchn(fd, FALSE, FALSE); - migrating_mons = restmonchn(fd, FALSE); - mread(fd, (genericptr_t) mvitals, sizeof(mvitals)); - - /* this comes after inventory has been loaded */ - for(otmp = invent; otmp; otmp = otmp->nobj) - if(otmp->owornmask) -#ifdef DEBUG - { - pline ("obj(%s),", xname(otmp)); -#endif - setworn(otmp, otmp->owornmask); -#ifdef DEBUG - } -#endif - /* reset weapon so that player will get a reminder about "bashing" - during next fight when bare-handed or wielding an unconventional - item; for pick-axe, we aren't able to distinguish between having - applied or wielded it, so be conservative and assume the former */ - otmp = uwep; /* `uwep' usually init'd by setworn() in loop above */ - uwep = 0; /* clear it and have setuwep() reinit */ - setuwep(otmp,FALSE); /* (don't need any null check here) */ - /* KMH, balance patch -- added fishing pole */ - if (!uwep || uwep->otyp == PICK_AXE || uwep->otyp == GRAPPLING_HOOK || - uwep->otyp == FISHING_POLE) - unweapon = TRUE; - - restore_dungeon(fd); - - restlevchn(fd); - mread(fd, (genericptr_t) &moves, sizeof moves); - mread(fd, (genericptr_t) &monstermoves, sizeof monstermoves); - mread(fd, (genericptr_t) &quest_status, sizeof(struct q_score)); - mread(fd, (genericptr_t) spl_book, - sizeof(struct spell) * (MAXSPELL + 1)); - mread(fd, (genericptr_t) tech_list, - sizeof(struct tech) * (MAXTECH + 1)); - restore_artifacts(fd); - restore_oracles(fd); - if (u.ustuck) - mread(fd, (genericptr_t) stuckid, sizeof (*stuckid)); -#ifdef STEED - if (u.usteed) - mread(fd, (genericptr_t) steedid, sizeof (*steedid)); -#endif - mread(fd, (genericptr_t) pl_character, sizeof (pl_character)); - - mread(fd, (genericptr_t) pl_fruit, sizeof pl_fruit); - mread(fd, (genericptr_t) ¤t_fruit, sizeof current_fruit); - freefruitchn(ffruit); /* clean up fruit(s) made by initoptions() */ - ffruit = loadfruitchn(fd); - - restnames(fd); - restore_waterlevel(fd); - /* must come after all mons & objs are restored */ - relink_timers(FALSE); - relink_light_sources(FALSE); - return(TRUE); -} - -/* update game state pointers to those valid for the current level (so we - * don't dereference a wild u.ustuck when saving the game state, for instance) - */ -STATIC_OVL void -restlevelstate(stuckid, steedid) -unsigned int stuckid, steedid; /* STEED */ -{ - register struct monst *mtmp; - - if (stuckid) { - for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) - if (mtmp->m_id == stuckid) break; - if (!mtmp) panic("Cannot find the monster ustuck."); - setustuck(mtmp); - } -#ifdef STEED - if (steedid) { - for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) - if (mtmp->m_id == steedid) break; - if (!mtmp) panic("Cannot find the monster usteed."); - u.usteed = mtmp; - remove_monster(mtmp->mx, mtmp->my); - } -#endif -} - -/*ARGSUSED*/ /* fd used in MFLOPPY only */ -STATIC_OVL int -restlevelfile(fd, ltmp) -register int fd; -xchar ltmp; -{ -#ifdef MAC_MPW -# pragma unused(fd) -#endif - register int nfd; - char whynot[BUFSZ]; - - nfd = create_levelfile(ltmp, whynot); - if (nfd < 0) { - /* BUG: should suppress any attempt to write a panic - save file if file creation is now failing... */ - panic("restlevelfile: %s", whynot); - } -#ifdef MFLOPPY - if (!savelev(nfd, ltmp, COUNT_SAVE)) { - - /* The savelev can't proceed because the size required - * is greater than the available disk space. - */ - pline("Not enough space on `%s' to restore your game.", - levels); - - /* Remove levels and bones that may have been created. - */ - (void) close(nfd); -# ifdef AMIGA - clearlocks(); -# else - eraseall(levels, alllevels); - eraseall(levels, allbones); - - /* Perhaps the person would like to play without a - * RAMdisk. - */ - /* Maybe not [Tom] */ -#if 0 - if (ramdisk) { - /* PlaywoRAMdisk may not return, but if it does - * it is certain that ramdisk will be 0. - */ - playwoRAMdisk(); - /* Rewind save file and try again */ - (void) lseek(fd, (off_t)0, 0); - (void) uptodate(fd, (char *)0); /* skip version */ - return dorecover(fd); /* 0 or 1 */ - } else -#endif - { -# endif - pline("Be seeing you..."); - terminate(EXIT_SUCCESS); -# ifndef AMIGA - } -# endif - } -#endif - bufon(nfd); - savelev(nfd, ltmp, WRITE_SAVE | FREE_SAVE); - bclose(nfd); - return(2); -} - -int -dorecover(fd) -register int fd; -{ - unsigned int stuckid = 0, steedid = 0; /* not a register */ - xchar ltmp; - int rtmp; - struct obj *otmp; - -#ifdef STORE_PLNAME_IN_FILE - mread(fd, (genericptr_t) plname, PL_NSIZ); -#endif - - restoring = TRUE; - getlev(fd, 0, (xchar)0, FALSE); - if (!restgamestate(fd, &stuckid, &steedid)) { - display_nhwindow(WIN_MESSAGE, TRUE); - savelev(-1, 0, FREE_SAVE); /* discard current level */ - (void) close(fd); - (void) delete_savefile(); - restoring = FALSE; - return(0); - } - restlevelstate(stuckid, steedid); -#ifdef INSURANCE - savestateinlock(); -#endif - rtmp = restlevelfile(fd, ledger_no(&u.uz)); - if (rtmp < 2) return(rtmp); /* dorecover called recursively */ - - /* these pointers won't be valid while we're processing the - * other levels, but they'll be reset again by restlevelstate() - * afterwards, and in the meantime at least u.usteed may mislead - * place_monster() on other levels - */ - setustuck((struct monst *)0); -#ifdef STEED - u.usteed = (struct monst *)0; -#endif - -#ifdef MICRO -# ifdef AMII_GRAPHICS - { - extern struct window_procs amii_procs; - if(windowprocs.win_init_nhwindows== amii_procs.win_init_nhwindows){ - extern winid WIN_BASE; - clear_nhwindow(WIN_BASE); /* hack until there's a hook for this */ - } - } -# else - clear_nhwindow(WIN_MAP); -# endif - clear_nhwindow(WIN_MESSAGE); - /* moved lower */ - curs(WIN_MAP, 1, 1); - dotcnt = 0; - dotrow = 2; -# ifdef TTY_GRAPHICS - if (!strncmpi("tty", windowprocs.name, 3)) - putstr(WIN_MAP, 0, "Restoring:"); -# endif -#endif - while(1) { -#ifdef ZEROCOMP - if(mread(fd, (genericptr_t) <mp, sizeof ltmp) < 0) -#else - if(read(fd, (genericptr_t) <mp, sizeof ltmp) != sizeof ltmp) -#endif - break; - getlev(fd, 0, ltmp, FALSE); -#if defined(MICRO) && defined(TTY_GRAPHICS) - if (!strncmpi("tty", windowprocs.name, 3)) { - curs(WIN_MAP, 1+dotcnt++, dotrow); - if (dotcnt >= (COLNO - 1)) { - dotrow++; - dotcnt = 0; - } - putstr(WIN_MAP, 0, "."); - mark_synch(); - } -#endif - rtmp = restlevelfile(fd, ltmp); - if (rtmp < 2) return(rtmp); /* dorecover called recursively */ - } - -#ifdef BSD - (void) lseek(fd, 0L, 0); -#else - (void) lseek(fd, 0L, 0); -/* (void) lseek(fd, (off_t)0, 0); */ -#endif - (void) uptodate(fd, (char *)0); /* skip version info */ -#ifdef STORE_PLNAME_IN_FILE - mread(fd, (genericptr_t) plname, PL_NSIZ); -#endif - getlev(fd, 0, (xchar)0, FALSE); - (void) close(fd); - - if (!wizard && !discover) - (void) delete_savefile(); -#ifdef REINCARNATION - if (Is_rogue_level(&u.uz)) assign_rogue_graphics(TRUE); -#endif -#ifdef USE_TILES - substitute_tiles(&u.uz); -#endif - restlevelstate(stuckid, steedid); - - /* WAC -- This needs to be after the second restlevelstate - * You() writes to the message line, which also updates the - * status line. However, u.usteed needs to be corrected or else - * weight/carrying capacities will be calculated by dereferencing - * garbage pointers. - * Side effect of this is that you don't see this message until after the - * all the levels are loaded - */ - You("return to level %d in %s%s.", - depth(&u.uz), dungeons[u.uz.dnum].dname, - flags.debug ? " while in debug mode" : - flags.explore ? " while in explore mode" : ""); - -#ifdef MFLOPPY - gameDiskPrompt(); -#endif - max_rank_sz(); /* to recompute mrank_sz (botl.c) */ - /* take care of iron ball & chain */ - for(otmp = fobj; otmp; otmp = otmp->nobj) - if(otmp->owornmask) - setworn(otmp, otmp->owornmask); - - /* in_use processing must be after: - * + The inventory has been read so that freeinv() works. - * + The current level has been restored so billing information - * is available. - */ - inven_inuse(FALSE); - - load_qtlist(); /* re-load the quest text info */ - reset_attribute_clock(); - /* Set up the vision internals, after levl[] data is loaded */ - /* but before docrt(). */ - vision_reset(); - vision_full_recalc = 1; /* recompute vision (not saved) */ - - run_timers(); /* expire all timers that have gone off while away */ - docrt(); - restoring = FALSE; - clear_nhwindow(WIN_MESSAGE); - program_state.something_worth_saving++; /* useful data now exists */ - - /* Success! */ - welcome(FALSE); - return(1); -} - -void -trickery(reason) -char *reason; -{ - pline("Strange, this map is not as I remember it."); - pline("Somebody is trying some trickery here..."); - pline("This game is void."); - killer = reason; - done(TRICKED); -} - -void -getlev(fd, pid, lev, ghostly) -int fd, pid; -xchar lev; -boolean ghostly; -{ - register struct trap *trap; - register struct monst *mtmp; - branch *br; - int hpid; - xchar dlvl; - int x, y; -#ifdef TOS - short tlev; -#endif - - if (ghostly) - clear_id_mapping(); - -#if defined(MSDOS) || defined(OS2) - setmode(fd, O_BINARY); -#endif - /* Load the old fruit info. We have to do it first, so the - * information is available when restoring the objects. - */ - if (ghostly) oldfruit = loadfruitchn(fd); - - /* First some sanity checks */ - mread(fd, (genericptr_t) &hpid, sizeof(hpid)); -/* CHECK: This may prevent restoration */ -#ifdef TOS - mread(fd, (genericptr_t) &tlev, sizeof(tlev)); - dlvl=tlev&0x00ff; -#else - mread(fd, (genericptr_t) &dlvl, sizeof(dlvl)); -#endif - if ((pid && pid != hpid) || (lev && dlvl != lev)) { - char trickbuf[BUFSZ]; - - if (pid && pid != hpid) - Sprintf(trickbuf, "PID (%d) doesn't match saved PID (%d)!", - hpid, pid); - else - Sprintf(trickbuf, "This is level %d, not %d!", dlvl, lev); -#ifdef WIZARD - if (wizard) pline(trickbuf); -#endif - trickery(trickbuf); - } - -#ifdef RLECOMP - { - short i, j; - uchar len; - struct rm r; - -#if defined(MAC) - /* Suppress warning about used before set */ - (void) memset((genericptr_t) &r, 0, sizeof(r)); -#endif - i = 0; j = 0; len = 0; - while(i < ROWNO) { - while(j < COLNO) { - if(len > 0) { - levl[j][i] = r; - len -= 1; - j += 1; - } else { - mread(fd, (genericptr_t)&len, sizeof(uchar)); - mread(fd, (genericptr_t)&r, sizeof(struct rm)); - } - } - j = 0; - i += 1; - } - } -#else - mread(fd, (genericptr_t) levl, sizeof(levl)); -#endif /* RLECOMP */ - - mread(fd, (genericptr_t)&omoves, sizeof(omoves)); - mread(fd, (genericptr_t)&upstair, sizeof(stairway)); - mread(fd, (genericptr_t)&dnstair, sizeof(stairway)); - mread(fd, (genericptr_t)&upladder, sizeof(stairway)); - mread(fd, (genericptr_t)&dnladder, sizeof(stairway)); - mread(fd, (genericptr_t)&sstairs, sizeof(stairway)); - mread(fd, (genericptr_t)&updest, sizeof(dest_area)); - mread(fd, (genericptr_t)&dndest, sizeof(dest_area)); - mread(fd, (genericptr_t)&level.flags, sizeof(level.flags)); - mread(fd, (genericptr_t)doors, sizeof(doors)); - rest_rooms(fd); /* No joke :-) */ - /* ALI - regenerate doorindex */ - if (nroom) - doorindex = rooms[nroom - 1].fdoor + rooms[nroom - 1].doorct; - else { - doorindex = 0; - for (y = 0; y < ROWNO; y++) - for (x = 0; x < COLNO; x++) - if (IS_DOOR(levl[x][y].typ)) - doorindex++; - } - - restore_timers(fd, RANGE_LEVEL, ghostly, monstermoves - omoves); - restore_light_sources(fd); - fmon = restmonchn(fd, ghostly); - - /* regenerate animals while on another level */ - if (u.uz.dlevel) { - register struct monst *mtmp2; - - for(mtmp = fmon; mtmp; mtmp = mtmp2) { - mtmp2 = mtmp->nmon; - if (ghostly) { - /* reset peaceful/malign relative to new character */ - if(!mtmp->isshk) - /* shopkeepers will reset based on name */ - mtmp->mpeaceful = peace_minded(mtmp->data); - set_malign(mtmp); - } else if (monstermoves > omoves) - mon_catchup_elapsed_time(mtmp, monstermoves - omoves); - - /* update shape-changers in case protection against - them is different now than when the level was saved */ - restore_cham(mtmp); - } - } - - rest_worm(fd); /* restore worm information */ - ftrap = 0; - while (trap = newtrap(), - mread(fd, (genericptr_t)trap, sizeof(struct trap)), - trap->tx != 0) { /* need "!= 0" to work around DICE 3.0 bug */ - trap->ntrap = ftrap; - ftrap = trap; - } - dealloc_trap(trap); - fobj = restobjchn(fd, ghostly, FALSE); - find_lev_obj(); - /* restobjchn()'s `frozen' argument probably ought to be a callback - routine so that we can check for objects being buried under ice */ - level.buriedobjlist = restobjchn(fd, ghostly, FALSE); - billobjs = restobjchn(fd, ghostly, FALSE); - rest_engravings(fd); - - /* reset level.monsters for new level */ - for (x = 0; x < COLNO; x++) - for (y = 0; y < ROWNO; y++) - level.monsters[x][y] = (struct monst *) 0; - for (mtmp = level.monlist; mtmp; mtmp = mtmp->nmon) { - if (mtmp->isshk) - set_residency(mtmp, FALSE); - place_monster(mtmp, mtmp->mx, mtmp->my); - if (mtmp->wormno) place_wsegs(mtmp); - } - restdamage(fd, ghostly); - - rest_regions(fd, ghostly); - if (ghostly) { - /* Now get rid of all the temp fruits... */ - freefruitchn(oldfruit), oldfruit = 0; - - if (lev > ledger_no(&medusa_level) && - lev < ledger_no(&stronghold_level) && xdnstair == 0) { - coord cc; - - mazexy(&cc); - xdnstair = cc.x; - ydnstair = cc.y; - levl[cc.x][cc.y].typ = STAIRS; - } - - br = Is_branchlev(&u.uz); - if (br && u.uz.dlevel == 1) { - d_level ltmp; - - if (on_level(&u.uz, &br->end1)) - assign_level(<mp, &br->end2); - else - assign_level(<mp, &br->end1); - - switch(br->type) { - case BR_STAIR: - case BR_NO_END1: - case BR_NO_END2: /* OK to assign to sstairs if it's not used */ - assign_level(&sstairs.tolev, <mp); - break; - case BR_PORTAL: /* max of 1 portal per level */ - { - register struct trap *ttmp; - for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) - if (ttmp->ttyp == MAGIC_PORTAL) - break; - if (!ttmp) panic("getlev: need portal but none found"); - assign_level(&ttmp->dst, <mp); - } - break; - } - } else if (!br) { - /* Remove any dangling portals. */ - register struct trap *ttmp; - for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) - if (ttmp->ttyp == MAGIC_PORTAL) { - deltrap(ttmp); - break; /* max of 1 portal/level */ - } - } - } - - /* must come after all mons & objs are restored */ - relink_timers(ghostly); - relink_light_sources(ghostly); - reset_oattached_mids(ghostly); -#ifdef DUNGEON_GROWTH - if (!ghostly) catchup_dgn_growths((monstermoves - omoves) / 5); -#endif - if (ghostly) - clear_id_mapping(); -} - - -/* Clear all structures for object and monster ID mapping. */ -STATIC_OVL void -clear_id_mapping() -{ - struct bucket *curr; - - while ((curr = id_map) != 0) { - id_map = curr->next; - free((genericptr_t) curr); - } - n_ids_mapped = 0; -} - -/* Add a mapping to the ID map. */ -STATIC_OVL void -add_id_mapping(gid, nid) - unsigned gid, nid; -{ - int idx; - - idx = n_ids_mapped % N_PER_BUCKET; - /* idx is zero on first time through, as well as when a new bucket is */ - /* needed */ - if (idx == 0) { - struct bucket *gnu = (struct bucket *) alloc(sizeof(struct bucket)); - gnu->next = id_map; - id_map = gnu; - } - - id_map->map[idx].gid = gid; - id_map->map[idx].nid = nid; - n_ids_mapped++; -} - -/* - * Global routine to look up a mapping. If found, return TRUE and fill - * in the new ID value. Otherwise, return false and return -1 in the new - * ID. - */ -boolean -lookup_id_mapping(gid, nidp) - unsigned gid, *nidp; -{ - int i; - struct bucket *curr; - - if (n_ids_mapped) - for (curr = id_map; curr; curr = curr->next) { - /* first bucket might not be totally full */ - if (curr == id_map) { - i = n_ids_mapped % N_PER_BUCKET; - if (i == 0) i = N_PER_BUCKET; - } else - i = N_PER_BUCKET; - - while (--i >= 0) - if (gid == curr->map[i].gid) { - *nidp = curr->map[i].nid; - return TRUE; - } - } - - return FALSE; -} - -STATIC_OVL void -reset_oattached_mids(ghostly) -boolean ghostly; -{ - struct obj *otmp; - unsigned oldid, nid; - for (otmp = fobj; otmp; otmp = otmp->nobj) { - if (ghostly && otmp->oattached == OATTACHED_MONST && otmp->oxlth) { - struct monst *mtmp = (struct monst *)otmp->oextra; - - mtmp->m_id = 0; - mtmp->mpeaceful = mtmp->mtame = 0; /* pet's owner died! */ - } - if (ghostly && otmp->oattached == OATTACHED_M_ID) { - (void) memcpy((genericptr_t)&oldid, (genericptr_t)otmp->oextra, - sizeof(oldid)); - if (lookup_id_mapping(oldid, &nid)) - (void) memcpy((genericptr_t)otmp->oextra, (genericptr_t)&nid, - sizeof(nid)); - else - otmp->oattached = OATTACHED_NOTHING; - } - } -} - - -#ifdef ZEROCOMP -#define RLESC '\0' /* Leading character for run of RLESC's */ - -#ifndef ZEROCOMP_BUFSIZ -#define ZEROCOMP_BUFSIZ BUFSZ -#endif -static NEARDATA unsigned char inbuf[ZEROCOMP_BUFSIZ]; -static NEARDATA unsigned short inbufp = 0; -static NEARDATA unsigned short inbufsz = 0; -static NEARDATA short inrunlength = -1; -static NEARDATA int mreadfd; - -static int -mgetc() -{ - if (inbufp >= inbufsz) { - inbufsz = read(mreadfd, (genericptr_t)inbuf, sizeof inbuf); - if (!inbufsz) { - if (inbufp > sizeof inbuf) - error("EOF on file #%d.\n", mreadfd); - inbufp = 1 + sizeof inbuf; /* exactly one warning :-) */ - return -1; - } - inbufp = 0; - } - return inbuf[inbufp++]; -} - -void -minit() -{ - inbufsz = 0; - inbufp = 0; - inrunlength = -1; -} - -int -mread(fd, buf, len) -int fd; -genericptr_t buf; -register unsigned len; -{ - /*register int readlen = 0;*/ - if (fd < 0) error("Restore error; mread attempting to read file %d.", fd); - mreadfd = fd; - while (len--) { - if (inrunlength > 0) { - inrunlength--; - *(*((char **)&buf))++ = '\0'; - } else { - register short ch = mgetc(); - if (ch < 0) return -1; /*readlen;*/ - if ((*(*(char **)&buf)++ = (char)ch) == RLESC) { - inrunlength = mgetc(); - } - } - /*readlen++;*/ - } - return 0; /*readlen;*/ -} - -#else /* ZEROCOMP */ - -void -minit() -{ - return; -} - -void -mread(fd, buf, len) -register int fd; -register genericptr_t buf; -register unsigned int len; -{ - register int rlen; - -#if defined(BSD) || defined(ULTRIX) - rlen = read(fd, buf, (int) len); - if(rlen != len){ -#else /* e.g. SYSV, __TURBOC__ */ - rlen = read(fd, buf, (unsigned) len); - if((unsigned)rlen != len){ -#endif - pline("Read %d instead of %u bytes.", rlen, len); - if(restoring) { - (void) close(fd); - (void) delete_savefile(); - error("Error restoring old game."); - } - panic("Error reading level file."); - } -} -#endif /* ZEROCOMP */ - -/*restore.c*/ diff -Naurbd slashem-0.0.8E0/src/save.c slashem-0.0.8E1/src/save.c --- slashem-0.0.8E0/src/save.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/save.c 2006-05-15 12:08:59.000000000 +0100 @@ -590,8 +590,12 @@ #endif /* RLECOMP */ bwrite(fd,(genericptr_t) &monstermoves,sizeof(monstermoves)); - bwrite(fd,(genericptr_t) &upstair,sizeof(stairway)); - bwrite(fd,(genericptr_t) &dnstair,sizeof(stairway)); + bwrite(fd,(genericptr_t) &n_upstairs,sizeof(int)); + if (n_upstairs) + bwrite(fd,(genericptr_t) upstairs,n_upstairs*sizeof(stairway)); + bwrite(fd,(genericptr_t) &n_dnstairs,sizeof(int)); + if (n_dnstairs) + bwrite(fd,(genericptr_t) dnstairs,n_dnstairs*sizeof(stairway)); bwrite(fd,(genericptr_t) &upladder,sizeof(stairway)); bwrite(fd,(genericptr_t) &dnladder,sizeof(stairway)); bwrite(fd,(genericptr_t) &sstairs,sizeof(stairway)); diff -Naurbd slashem-0.0.8E0/src/shk.c slashem-0.0.8E1/src/shk.c --- slashem-0.0.8E0/src/shk.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/shk.c 2006-05-15 12:08:59.000000000 +0100 @@ -440,12 +440,12 @@ trap = trap->ntrap; } } else { - mm.x = xdnstair; - mm.y = ydnstair; + mm.x = dnstairs->sx; + mm.y = dnstairs->sy; } #else /* BLACKMARKET */ - mm.x = xdnstair; - mm.y = ydnstair; + mm.x = dnstairs->sx; + mm.y = dnstairs->sy; #endif /* BLACKMARKET */ makekops(&mm); /* Create swarm near shopkeeper (hinders return to shop) */ @@ -3039,6 +3039,26 @@ return(value); } +/* Python's parrot sketch with a twist... */ + +void +revive_parrot(shkp, obj) +register struct monst *shkp; +register struct obj *obj; +{ + /* This time he's telling the truth! */ + + pline("%s scowls.", Monnam(shkp)); + pline("%s says 'It's not dead! It's only resting!'", Monnam(shkp)); + + (void) revive(obj); + + pline("The parrot squaarks!"); + + return; +} + + /* auto-response flag for/from "sell foo?" 'a' => 'y', 'q' => 'n' */ static char sell_response = 'a'; static int sell_how = SELL_NORMAL; @@ -3096,6 +3116,19 @@ offer = ltmp + cltmp; + /* OK, we're in a shop and we've dropped obj on the floor + and, presumably, the shop keeper is around... */ + + if ( obj->otyp == CORPSE + && (obj->corpsenm == PM_PARROT) + && !shkp->msleeping + && shkp->mcanmove ) { + + revive_parrot(shkp, obj); + + return; + } + /* get one case out of the way: nothing to sell, and no gold */ if(!isgold && ((offer + gltmp) == 0L || sell_how == SELL_DONTSELL)) { diff -Naurbd slashem-0.0.8E0/src/sp_lev.c slashem-0.0.8E1/src/sp_lev.c --- slashem-0.0.8E0/src/sp_lev.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/sp_lev.c 2006-05-15 12:08:59.000000000 +0100 @@ -1487,38 +1487,44 @@ /* * Disgusting hack: since special levels have their rooms filled before - * sorting the rooms, we have to re-arrange the speed values upstairs_room - * and dnstairs_room after the rooms have been sorted. On normal levels, + * sorting the rooms, we have to re-arrange the speed values upstairs_rooms + * and dnstairs_rooms after the rooms have been sorted. On normal levels, * stairs don't get created until _after_ sorting takes place. */ STATIC_OVL void fix_stair_rooms() { - int i; + int i, j; + int x, y; struct mkroom *croom; - if(xdnstair && - !((dnstairs_room->lx <= xdnstair && xdnstair <= dnstairs_room->hx) && - (dnstairs_room->ly <= ydnstair && ydnstair <= dnstairs_room->hy))) { + for(j=0; j < n_dnstairs; j++) { + x = dnstairs[j].sx; + y = dnstairs[j].sy; + if(!((dnstairs_rooms[j]->lx <= x && x <= dnstairs_rooms[j]->hx) && + (dnstairs_rooms[j]->ly <= y && y <= dnstairs_rooms[j]->hy))) { for(i=0; i < nroom; i++) { croom = &rooms[i]; - if((croom->lx <= xdnstair && xdnstair <= croom->hx) && - (croom->ly <= ydnstair && ydnstair <= croom->hy)) { - dnstairs_room = croom; + if((croom->lx <= x && x <= croom->hx) && + (croom->ly <= y && y <= croom->hy)) { + dnstairs_rooms[j] = croom; break; } } if(i == nroom) panic("Couldn't find dnstair room in fix_stair_rooms!"); } - if(xupstair && - !((upstairs_room->lx <= xupstair && xupstair <= upstairs_room->hx) && - (upstairs_room->ly <= yupstair && yupstair <= upstairs_room->hy))) { + } + for(j=0; j < n_upstairs; j++) { + x = upstairs[j].sx; + y = upstairs[j].sy; + if(!((upstairs_rooms[j]->lx <= x && x <= upstairs_rooms[j]->hx) && + (upstairs_rooms[j]->ly <= y && y <= upstairs_rooms[j]->hy))) { for(i=0; i < nroom; i++) { croom = &rooms[i]; - if((croom->lx <= xupstair && xupstair <= croom->hx) && - (croom->ly <= yupstair && yupstair <= croom->hy)) { - upstairs_room = croom; + if((croom->lx <= x && x <= croom->hx) && + (croom->ly <= y && y <= croom->hy)) { + upstairs_rooms[j] = croom; break; } } @@ -1526,6 +1532,7 @@ panic("Couldn't find upstair room in fix_stair_rooms!"); } } +} /* * Corridors always start from a door. But it can end anywhere... @@ -1873,7 +1880,9 @@ if (lev_flags & SPOOKY) level.flags.spooky = 1; if (lev_flags & LETHE) - level.flags.lethe = 1; + level.flags.river = RIVER_LETHE; + else if (lev_flags & PHLEGETHON) + level.flags.river = RIVER_PHLEGETHON; /* Read message */ Fread((genericptr_t) &n, 1, sizeof(n), fd); diff -Naurbd slashem-0.0.8E0/src/tech.c slashem-0.0.8E1/src/tech.c --- slashem-0.0.8E0/src/tech.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/tech.c 2006-05-15 12:08:59.000000000 +0100 @@ -1781,6 +1781,7 @@ break; case AIR: case MOAT: /* Doesn't freeze */ + case RIVER: case WATER: powbonus = 4; break; diff -Naurbd slashem-0.0.8E0/src/teleport.c slashem-0.0.8E1/src/teleport.c --- slashem-0.0.8E0/src/teleport.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/teleport.c 2006-05-15 12:08:59.000000000 +0100 @@ -64,10 +64,13 @@ is_badpos = 1; if (pool && !ignorewater) { - if (mtmp == &youmonst) - return (HLevitation || Flying || Wwalking || - Swimming || Amphibious) ? is_badpos : -1; - else return (is_flyer(mdat) || is_swimmer(mdat) || + boolean wade = level.flags.river != RIVER_PHLEGETHON || + likes_lava(mdat) && + maybe_polyd(is_vampire(mdat), Race_if(PM_VAMPIRE)); + if (mtmp == &youmonst) { + return (HLevitation || Flying || Wwalking || wade && + (Swimming || Amphibious)) ? is_badpos : -1; + } else return (is_flyer(mdat) || wade && is_swimmer(mdat) || is_clinger(mdat)) ? is_badpos : -1; } else if (is_lava(x,y)) { if (mtmp == &youmonst) @@ -1168,14 +1171,16 @@ /* [dlevel used to be set to 1, but it doesn't make sense to teleport out of the dungeon and float or fly down to the surface but then actually arrive back inside the dungeon] */ - } else if (u.uz.dnum == medusa_level.dnum && +/* Lethe... */ + /* } else if (u.uz.dnum == medusa_level.dnum && newlev >= dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz)) { #ifdef WIZARD if (!(wizard && force_dest)) #endif - find_hell(&newlevel); + find_hell(&newlevel); */ } else { +#if 0 /* if invocation did not yet occur, teleporting into * the last level of Gehennom is forbidden. */ @@ -1185,18 +1190,11 @@ if (Inhell && !u.uevent.invoked && newlev >= (dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz) - 1)) { -# ifdef WIZARD - if (!wizard) - { -# endif /* WIZARD */ newlev = dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz) - 2; pline("Sorry..."); -# ifdef WIZARD - } -# endif /* WIZARD */ - } +#endif /* no teleporting out of quest dungeon */ if # ifdef WIZARD @@ -1409,7 +1407,7 @@ if (mtmp->iswiz && mtmp->mx) { /* Wizard, not just arriving */ if (!In_W_tower(u.ux, u.uy, &u.uz)) - x = xupstair, y = yupstair; + x = upstairs->sx, y = upstairs->sy; else if (!xdnladder) /* bottom level of tower */ x = xupladder, y = yupladder; else @@ -1673,8 +1671,10 @@ min_depth = In_quest(&u.uz) ? dungeons[u.uz.dnum].depth_start : 1; max_depth = dunlevs_in_dungeon(&u.uz) + (dungeons[u.uz.dnum].depth_start - 1); +#if 0 /* can't reach the Sanctum if the invocation hasn't been performed */ if (Inhell && !u.uevent.invoked) max_depth -= 1; +#endif /* Get a random value relative to the current dungeon */ /* Range is 1 to current+3, current not counting */ diff -Naurbd slashem-0.0.8E0/src/trap.c slashem-0.0.8E1/src/trap.c --- slashem-0.0.8E0/src/trap.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/trap.c 2006-05-15 12:08:59.000000000 +0100 @@ -2804,7 +2804,7 @@ register boolean force, here; { /* Dips in the Lethe are a very poor idea */ - int luckpenalty = level.flags.lethe? 7 : 0; + int luckpenalty = level.flags.river == RIVER_LETHE ? 7 : 0; struct obj *otmp; /* Scrolls, spellbooks, potions, weapons and @@ -2839,7 +2839,7 @@ continue; } else { /* The Lethe strips blessed and cursed status... */ - if (level.flags.lethe) { + if (level.flags.river == RIVER_LETHE) { uncurse(obj); unbless(obj); } @@ -2851,8 +2851,10 @@ #endif { /* The Lethe sometimes does a little rewrite */ - obj->otyp = (level.flags.lethe && !rn2(10)) ? - SCR_AMNESIA : SCR_BLANK_PAPER; + if (level.flags.river == RIVER_LETHE && !rn2(10)) + obj->otyp = SCR_AMNESIA; + else + obj->otyp = SCR_BLANK_PAPER; obj->spe = 0; } break; @@ -2870,7 +2872,7 @@ continue; } else /* Potions turn to water or amnesia... */ - if (level.flags.lethe) { + if (level.flags.river == RIVER_LETHE) { if (obj->otyp == POT_WATER) obj->otyp = POT_AMNESIA; else if (obj->otyp != POT_AMNESIA) { @@ -2885,14 +2887,15 @@ obj->odiluted++; break; case GEM_CLASS: - if (level.flags.lethe && (obj->otyp == LUCKSTONE - || obj->otyp == LOADSTONE - || obj->otyp == HEALTHSTONE - || obj->otyp == TOUCHSTONE)) + if (level.flags.river == RIVER_LETHE && + (obj->otyp == LUCKSTONE || + obj->otyp == LOADSTONE || + obj->otyp == HEALTHSTONE || + obj->otyp == TOUCHSTONE)) obj->otyp = FLINT; break; case TOOL_CLASS: - if (level.flags.lethe) { + if (level.flags.river == RIVER_LETHE) { switch (obj->otyp) { case MAGIC_LAMP: obj->otyp = OIL_LAMP; @@ -2931,20 +2934,19 @@ case ARMOR_CLASS: case WAND_CLASS: case RING_CLASS: - if ( level.flags.lethe - && ( obj->oclass == WEAPON_CLASS - || obj->oclass == ARMOR_CLASS - || obj->oclass == WAND_CLASS - || obj->oclass == RING_CLASS - || is_weptool(obj) )) { - + if (level.flags.river == RIVER_LETHE && + (obj->oclass == WEAPON_CLASS || + obj->oclass == ARMOR_CLASS || + obj->oclass == WAND_CLASS || + obj->oclass == RING_CLASS || + is_weptool(obj))) { /* Shift enchantment one step closer to 0 */ if (obj->spe > 0) drain_item(obj); } /* Magic markers run... */ - if ( level.flags.lethe - && obj->otyp == MAGIC_MARKER ) { + if (level.flags.river == RIVER_LETHE && + obj->otyp == MAGIC_MARKER ) { obj->spe -= (3 + rn2(10)); if (obj->spe < 0) obj->spe = 0; } @@ -2957,8 +2959,8 @@ (obj->blessed && !rnl(4)))) obj->oeroded++; /* The Lethe may unfooproof the item... */ - if (level.flags.lethe - && obj->oerodeproof && !rn2(5)) + if (level.flags.river == RIVER_LETHE && + obj->oerodeproof && !rn2(5)) obj->oerodeproof = FALSE; } } @@ -3047,33 +3049,45 @@ { boolean inpool_ok = FALSE, crawl_ok; int i, x, y; - const char *sparkle = level.flags.lethe? "sparkling " : ""; + boolean wading = (Swimming || Amphibious) && + (level.flags.river != RIVER_PHLEGETHON || + likes_lava(youmonst.data) && + maybe_polyd(is_vampire(youmonst.data), Race_if(PM_VAMPIRE))); /* happily wading in the same contiguous pool */ if (u.uinwater && is_pool(u.ux-u.dx,u.uy-u.dy) && - (Swimming || Amphibious)) { + wading) { /* water effects on objects every now and then */ if (!rn2(5)) inpool_ok = TRUE; else return(FALSE); } if (!u.uinwater) { - You("%s into the %swater%c", + You("%s into the %s%c", Is_waterlevel(&u.uz) ? "plunge" : "fall", - sparkle, - Amphibious || Swimming ? '.' : '!'); + river_liquid[level.flags.river], + wading ? '.' : '!'); if (!Swimming && !Is_waterlevel(&u.uz)) You("sink like %s.", Hallucination ? "the Titanic" : "a rock"); } - if (level.flags.lethe) { + if (level.flags.river == RIVER_LETHE) { /* Bad idea */ You_feel("the sparkling waters of the Lethe sweep away your " "cares!"); forget(25); } + if (level.flags.river == RIVER_PHLEGETHON) { + burn_away_slime(); + if (!Fire_resistance) { + destroy_item(SCROLL_CLASS, AD_FIRE); + destroy_item(SPBOOK_CLASS, AD_FIRE); + destroy_item(POTION_CLASS, AD_FIRE); + } + } else { + water_damage(invent, FALSE, FALSE); if (u.umonnum == PM_GREMLIN && rn2(3)) @@ -3084,6 +3098,9 @@ if (u.mhmax > i) u.mhmax -= i; losehp(i, "rusting away", KILLED_BY); } + + } + if (inpool_ok) return(FALSE); if ((i = number_leashed()) > 0) { @@ -3093,7 +3110,7 @@ unleash_all(); } - if (Amphibious || Swimming) { + if (wading) { if (Amphibious) { if (flags.verbose) pline("But you aren't drowning."); @@ -3161,7 +3178,9 @@ boolean succ = Is_waterlevel(&u.uz) ? TRUE : emergency_disrobe(&lost); - You("try to crawl out of the water."); + You("try to crawl out of the %s.", + level.flags.river == RIVER_PHLEGETHON ? + "blood" : "water"); if (lost) You("dump some of your gear to lose weight..."); if (succ) { @@ -3179,11 +3198,14 @@ if (Upolyd && !Unchanging && Race_if(PM_VAMPIRE)) { rehumanize(); u.uinwater = 0; - You("fly up out of the water!"); + You("fly up out of the %s!", + level.flags.river == RIVER_PHLEGETHON ? + "blood" : "water"); return (TRUE); } killer_format = KILLED_BY_AN; killer = (levl[u.ux][u.uy].typ == POOL || Is_medusa_level(&u.uz)) ? + level.flags.river == RIVER_PHLEGETHON ? "pool of blood" : "pool of water" : "moat"; done(DROWNING); /* oops, we're still alive. better get out of the water. */ diff -Naurbd slashem-0.0.8E0/src/vision.c slashem-0.0.8E1/src/vision.c --- slashem-0.0.8E0/src/vision.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/vision.c 2006-05-15 12:08:59.000000000 +0100 @@ -168,7 +168,7 @@ (lev->doormask & (D_CLOSED|D_LOCKED|D_TRAPPED) ))) return 1; - if (lev->typ == CLOUD || lev->typ == WATER || + if (lev->typ == CLOUD || lev->typ == WATER || lev->typ == RIVER || (lev->typ == MOAT && Underwater)) return 1; diff -Naurbd slashem-0.0.8E0/src/wizard.c slashem-0.0.8E1/src/wizard.c --- slashem-0.0.8E0/src/wizard.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/wizard.c 2006-05-15 12:08:59.000000000 +0100 @@ -312,11 +312,11 @@ /* unless, of course, there are no stairs (e.g. endlevel) */ mtmp->mavenge = 1; /* covetous monsters attack while fleeing */ if (In_W_tower(mtmp->mx, mtmp->my, &u.uz) || - (mtmp->iswiz && !xupstair && !mon_has_amulet(mtmp))) { + (mtmp->iswiz && !n_upstairs && !mon_has_amulet(mtmp))) { if (!rn2(3 + mtmp->mhp/10)) (void) rloc(mtmp, FALSE); - } else if (xupstair && - (mtmp->mx != xupstair || mtmp->my != yupstair)) { - (void) mnearto(mtmp, xupstair, yupstair, TRUE); + } else if (n_upstairs && + (mtmp->mx != upstairs->sx || mtmp->my != upstairs->sy)) { + (void) mnearto(mtmp, upstairs->sx, upstairs->sy, TRUE); } /* if you're not around, cast healing spells */ if (distu(mtmp->mx,mtmp->my) > (BOLT_LIM * BOLT_LIM)) diff -Naurbd slashem-0.0.8E0/src/zap.c slashem-0.0.8E1/src/zap.c --- slashem-0.0.8E0/src/zap.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/src/zap.c 2006-05-15 12:08:59.000000000 +0100 @@ -2078,10 +2078,11 @@ break; case WAN_CREATE_MONSTER: known = create_critters(rn2(23) ? 1 : rn1(7,2), - (struct permonst *)0); + (struct permonst *)0, MAKE_EM_NATURAL); break; case WAN_CREATE_HORDE: - known = create_critters(rn1(7,6), (struct permonst *)0); + known = create_critters(rn1(7,6), (struct permonst *)0, + MAKE_EM_NATURAL); break; case WAN_WISHING: known = TRUE; @@ -2808,7 +2809,7 @@ if (is_db_wall(x,y) && find_drawbridge(&xx, &yy)) { open_drawbridge(xx, yy); disclose = TRUE; - } else if (u.dz > 0 && (x == xdnstair && y == ydnstair) && + } else if (u.dz > 0 && (x == dnstairs->sx && y == dnstairs->sy) && /* can't use the stairs down to quest level 2 until leader "unlocks" them; give feedback if you try */ on_level(&u.uz, &qstart_level) && !ok_to_quest()) { @@ -4343,12 +4344,17 @@ boolean lava = is_lava(x,y); boolean moat = (!lava && (lev->typ != POOL) && (lev->typ != WATER) && + (lev->typ != RIVER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz)); - if (lev->typ == WATER) { - /* For now, don't let WATER freeze. */ + if (lev->typ == WATER || lev->typ == RIVER) { + /* For now, don't let WATER or RIVER freeze. */ if (cansee(x,y)) + if (lev->typ == RIVER && + level.flags.river == RIVER_PHLEGETHON) + pline_The("blood cools for a moment."); + else pline_The("water freezes for a moment."); else You_hear("a soft crackling."); diff -Naurbd slashem-0.0.8E0/sys/autoconf/Makefile.dat slashem-0.0.8E1/sys/autoconf/Makefile.dat --- slashem-0.0.8E0/sys/autoconf/Makefile.dat 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/autoconf/Makefile.dat 2006-05-15 12:08:59.000000000 +0100 @@ -263,13 +263,14 @@ kobold-1.des kobold-2.des lich.des mall-1.des mall-2.des medusa.des \ mines.des mtemple.des newmall.des nightmar.des nymph.des oracle.des \ rats.des sea.des spiders.des stor-1.des stor-2.des stor-3.des tomb.des \ - tower.des yendor.des sokoban.des + tower.des yendor.des sokoban.des lethe.des elysium.des ../util/lev_comp $(srcdir)/beholder.des ../util/lev_comp $(srcdir)/bigroom.des ../util/lev_comp $(srcdir)/blkmar.des ../util/lev_comp $(srcdir)/castle.des ../util/lev_comp $(srcdir)/grund.des ../util/lev_comp $(srcdir)/dragons.des + ../util/lev_comp $(srcdir)/elysium.des ../util/lev_comp $(srcdir)/endgame.des ../util/lev_comp $(srcdir)/frnknstn.des ../util/lev_comp $(srcdir)/gehennom.des @@ -278,6 +279,7 @@ ../util/lev_comp $(srcdir)/knox.des ../util/lev_comp $(srcdir)/kobold-1.des ../util/lev_comp $(srcdir)/kobold-2.des + ../util/lev_comp $(srcdir)/lethe.des ../util/lev_comp $(srcdir)/lich.des ../util/lev_comp $(srcdir)/mall-1.des ../util/lev_comp $(srcdir)/mall-2.des diff -Naurbd slashem-0.0.8E0/sys/autoconf/Makefile.top slashem-0.0.8E1/sys/autoconf/Makefile.top --- slashem-0.0.8E0/sys/autoconf/Makefile.top 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/autoconf/Makefile.top 2006-05-15 12:08:59.000000000 +0100 @@ -130,7 +130,7 @@ DATHELP = help hh cmdhelp history opthelp wizhelp gypsy.txt -SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev fakewiz?.lev \ +SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev \ juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev \ minetn-?.lev oracle.lev orcus.lev sanctum.lev soko?-?.lev \ tower?.lev valley.lev wizard?.lev \ @@ -139,7 +139,9 @@ grund-?.lev demogorg.lev dispater.lev dragons.lev geryon.lev \ guild.lev kobold-?.lev lich.lev mall-?.lev mall.lev mineking.lev \ mtemple.lev nymph.lev rats.lev sea.lev spiders.lev stor-?.lev \ - tomb.lev yeenoghu.lev frnknstn.lev nightmar.lev + tomb.lev yeenoghu.lev frnknstn.lev nightmar.lev pvalley.lev \ + nkai-?.lev nkai-a-?.lev lethe-?.lev leth-?-?.lev olympus.lev \ + elysian.lev minos.lev laby-?.lev QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev SHARE_DATNODLB = $(CNF_SHARE_DATND) diff -Naurbd slashem-0.0.8E0/sys/autoconf/Makefile.utl slashem-0.0.8E1/sys/autoconf/Makefile.utl --- slashem-0.0.8E0/sys/autoconf/Makefile.utl 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/autoconf/Makefile.utl 2006-05-15 12:08:59.000000000 +0100 @@ -292,7 +292,7 @@ $(CC) $(LFLAGS) -o dlb $(DLBOBJS) $(LIBS) dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h ../include/date.h - $(CC) $(CFLAGS) -c dlb_main.c + $(CC) $(CFLAGS) -c $(srcdir)/dlb_main.c diff -Naurbd slashem-0.0.8E0/sys/autoconf/acinclude.m4 slashem-0.0.8E1/sys/autoconf/acinclude.m4 --- slashem-0.0.8E0/sys/autoconf/acinclude.m4 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/autoconf/acinclude.m4 2006-05-15 12:08:59.000000000 +0100 @@ -1,4 +1,4 @@ -# $Id: acinclude.m4,v 1.1 2005/06/11 15:52:45 j_ali Exp $ +# $Id: acinclude.m4,v 1.3 2005/07/02 19:27:29 j_ali Exp $ AC_DEFUN([NETHACK_ENABLE], [AC_MSG_CHECKING(whether to enable $1) @@ -23,16 +23,17 @@ # Update if there is a newer source AC_DEFUN([NETHACK_LINKS_ADD], if test ${srcdir}/$1 -nt $1 ; then - NETHACK_LINKS="${LINKS_LIST} $1:$1" + NETHACK_LINKS="${NETHACK_LINKS} $1:$1" fi) # Autoconf's standard AC_CONFIG_HEADERS() avoids undefining switches because # of concern that it might undefine system switches (eg., POSIX_SOURCE). -# However, we need to override the settings in config.h etc., so we -# post-process the generated headers and force an explicit define or undefine. +# However, we need to override the settings in config.h etc., so we post-process +# the generated headers and force an explicit define and/or undefine. AC_DEFUN([NETHACK_CONFIG_HEADER], [AC_CONFIG_HEADERS([$1], - [sed 's,^/\* \(#undef .*\) \*/,\1,'] < m4_bpatsubst([$1], [:.*]) \ - > m4_bpatsubst([$1], [[^.]*:.*], [new]) + [sed -e 's,^/\* \(#undef .*\) \*/,\1,' \ + -e 's,#define \([^ ]*\),#undef \1\n&,'] \ + < m4_bpatsubst([$1], [:.*]) > m4_bpatsubst([$1], [[^.]*:.*], [new]) [mv] m4_bpatsubst([$1], [[^.]*:.*], [new]) \ m4_bpatsubst([$1], [:.*]),[])]) diff -Naurbd slashem-0.0.8E0/sys/autoconf/autoconf.hin slashem-0.0.8E1/sys/autoconf/autoconf.hin --- slashem-0.0.8E0/sys/autoconf/autoconf.hin 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/autoconf/autoconf.hin 2006-05-15 12:08:59.000000000 +0100 @@ -199,6 +199,9 @@ /* Fancy mazes */ #undef WALLIFIED_MAZE +/* The person allowed to use the -D option */ +#undef WIZARD + /* X11 graphics */ #undef X11_GRAPHICS diff -Naurbd slashem-0.0.8E0/sys/autoconf/configure.ac slashem-0.0.8E1/sys/autoconf/configure.ac --- slashem-0.0.8E0/sys/autoconf/configure.ac 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/autoconf/configure.ac 2006-05-15 12:08:59.000000000 +0100 @@ -1,6 +1,10 @@ dnl SLASHEM autoconf template AC_INIT(SLASHEM, 0.0.8, http://sourceforge.net/bugs/?group_id=9746) -AC_REVISION($Revision: 1.1 $) +dnl Avoid AC_REVISION() because we check configure into CVS +dnl and it will cause confusing revision numbers to be included +dnl in configure if developers forget to check in configure.ac +dnl before running bootstrap.sh and checking in configure. +# $Revision: 1.3 $ AC_CONFIG_AUX_DIR(sys/autoconf) dnl ----- Precious variables @@ -273,22 +277,35 @@ NETHACK_ENABLE(autopickup-exceptions,autopickup_exceptions, [Exceptions to autopickup (experimental)],AUTOPICKUP_EXCEPTIONS) +AC_MSG_CHECKING([whether to enable wizmode]) +AC_ARG_ENABLE([wizmode], AC_HELP_STRING([--enable-wizmode=USER], + [enable wizard mode for the specified user (default=wizard)]), + if test "$enableval" != no; then enable_wizmode=yes; wizard=$enableval; + else enable_wizmode=no; fi, enable_wizmode=yes; wizard="wizard") +if test "$enable_wizmode" != "no" ; then + AC_MSG_RESULT([yes (user $wizard)]) + AC_DEFINE_UNQUOTED([WIZARD], ["$wizard"], [The person allowed to use the -D option]) +else + AC_MSG_RESULT([no]) +fi + + NETHACK_LINKS= NETHACK_LINKS_ADD([include/file.h]) NETHACK_LINKS_ADD([dat/data.base]) -NETHACK_LINKS_ADD([dat/rumors.tru:dat/rumors.tru]) -NETHACK_LINKS_ADD([dat/rumors.fal:dat/rumors.fal]) -NETHACK_LINKS_ADD([dat/quest.txt:dat/quest.txt]) -NETHACK_LINKS_ADD([dat/oracles.txt:dat/oracles.txt]) -NETHACK_LINKS_ADD([dat/dungeon.def:dat/dungeon.def]) -NETHACK_LINKS_ADD([dat/help:dat/help]) -NETHACK_LINKS_ADD([dat/hh:dat/hh]) -NETHACK_LINKS_ADD([dat/cmdhelp:dat/cmdhelp]) -NETHACK_LINKS_ADD([dat/history:dat/history]) -NETHACK_LINKS_ADD([dat/opthelp:dat/opthelp]) -NETHACK_LINKS_ADD([dat/wizhelp:dat/wizhelp]) -NETHACK_LINKS_ADD([dat/gypsy.txt:dat/gypsy.txt]) -NETHACK_LINKS_ADD([win/share/tile_t.h:win/share/tile_t.h]) +NETHACK_LINKS_ADD([dat/rumors.tru]) +NETHACK_LINKS_ADD([dat/rumors.fal]) +NETHACK_LINKS_ADD([dat/quest.txt]) +NETHACK_LINKS_ADD([dat/oracles.txt]) +NETHACK_LINKS_ADD([dat/dungeon.def]) +NETHACK_LINKS_ADD([dat/help]) +NETHACK_LINKS_ADD([dat/hh]) +NETHACK_LINKS_ADD([dat/cmdhelp]) +NETHACK_LINKS_ADD([dat/history]) +NETHACK_LINKS_ADD([dat/opthelp]) +NETHACK_LINKS_ADD([dat/wizhelp]) +NETHACK_LINKS_ADD([dat/gypsy.txt]) +NETHACK_LINKS_ADD([win/share/tile_t.h]) AC_CONFIG_LINKS(${NETHACK_LINKS}) diff -Naurbd slashem-0.0.8E0/sys/unix/Makefile.dat slashem-0.0.8E1/sys/unix/Makefile.dat --- slashem-0.0.8E0/sys/unix/Makefile.dat 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/unix/Makefile.dat 2006-05-15 12:08:59.000000000 +0100 @@ -259,13 +259,14 @@ kobold-1.des kobold-2.des lich.des mall-1.des mall-2.des medusa.des \ mines.des mtemple.des newmall.des nightmar.des nymph.des oracle.des \ rats.des sea.des spiders.des stor-1.des stor-2.des stor-3.des tomb.des \ - tower.des yendor.des sokoban.des + tower.des yendor.des sokoban.des lethe.des elysium.des ../util/lev_comp beholder.des ../util/lev_comp bigroom.des ../util/lev_comp blkmar.des ../util/lev_comp castle.des ../util/lev_comp grund.des ../util/lev_comp dragons.des + ../util/lev_comp elysium.des ../util/lev_comp endgame.des ../util/lev_comp frnknstn.des ../util/lev_comp gehennom.des @@ -274,6 +275,7 @@ ../util/lev_comp knox.des ../util/lev_comp kobold-1.des ../util/lev_comp kobold-2.des + ../util/lev_comp lethe.des ../util/lev_comp lich.des ../util/lev_comp mall-1.des ../util/lev_comp mall-2.des diff -Naurbd slashem-0.0.8E0/sys/unix/Makefile.top slashem-0.0.8E1/sys/unix/Makefile.top --- slashem-0.0.8E0/sys/unix/Makefile.top 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/sys/unix/Makefile.top 2006-05-15 12:08:59.000000000 +0100 @@ -122,7 +122,7 @@ DATHELP = help hh cmdhelp history opthelp wizhelp gypsy.txt -SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev fakewiz?.lev \ +SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev \ juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev \ minetn-?.lev oracle.lev orcus.lev sanctum.lev soko?-?.lev \ tower?.lev valley.lev wizard?.lev \ @@ -131,7 +131,9 @@ grund-?.lev demogorg.lev dispater.lev dragons.lev geryon.lev \ guild.lev kobold-?.lev lich.lev mall-?.lev mall.lev mineking.lev \ mtemple.lev nymph.lev rats.lev sea.lev spiders.lev stor-?.lev \ - tomb.lev yeenoghu.lev frnknstn.lev nightmar.lev + tomb.lev yeenoghu.lev frnknstn.lev nightmar.lev pvalley.lev \ + nkai-?.lev nkai-a-?.lev lethe-?.lev leth-?-?.lev olympus.lev \ + elysian.lev minos.lev laby-?.lev QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev SHARE_DATNODLB = $(CNF_SHARE_DATND) diff -Naurbd slashem-0.0.8E0/util/dgn_comp.y slashem-0.0.8E1/util/dgn_comp.y --- slashem-0.0.8E0/util/dgn_comp.y 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/util/dgn_comp.y 2006-05-15 12:08:59.000000000 +0100 @@ -633,13 +633,13 @@ return(0); } #endif - if(tmpbranch[n_dgns].chain == -2) { + if(tmpbranch[n_brs].chain == -2) { yyerror("Invalid branch chain reference."); return(0); - } else if(tmpbranch[n_dgns].chain != -1) { /* it is chained */ + } else if(tmpbranch[n_brs].chain != -1) { /* it is chained */ - if(tmplevel[tmpbranch[n_dgns].chain].chance != 100) { + if(tmplevel[tmpbranch[n_brs].chain].chance != 100) { yyerror("Branch cannot chain from a probabilistic level."); return(0); } diff -Naurbd slashem-0.0.8E0/util/lev_comp.l slashem-0.0.8E1/util/lev_comp.l --- slashem-0.0.8E0/util/lev_comp.l 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/util/lev_comp.l 2006-05-15 12:08:59.000000000 +0100 @@ -116,7 +116,7 @@ map_cnt = 0; return MAP_ID; } -[-|}{+ABCISHKPLWTFZ\\#. 0123456789]*\r?\n { +[-|}{+ABCISHKPRLWTFZ\\#. 0123456789]*\r?\n { int len = yyleng; /* convert \r\n to \n */ if (len >= 2 && yytext[len - 2] == '\r') len -= 1; @@ -235,6 +235,7 @@ shortsighted { yylval.i=SHORTSIGHTED; return FLAG_TYPE; } spooky { yylval.i=SPOOKY; return FLAG_TYPE; } lethe { yylval.i=LETHE; return FLAG_TYPE; } +phlegethon { yylval.i=PHLEGETHON; return FLAG_TYPE; } \[\ *[0-9]+\%\ *\] { yylval.i = atoi(yytext + 1); return PERCENT; } [+\-]?[0-9]+ { yylval.i=atoi(yytext); return INTEGER; } \"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */ diff -Naurbd slashem-0.0.8E0/util/lev_main.c slashem-0.0.8E1/util/lev_main.c --- slashem-0.0.8E0/util/lev_main.c 2005-07-02 08:31:37.000000000 +0100 +++ slashem-0.0.8E1/util/lev_main.c 2006-05-15 12:08:59.000000000 +0100 @@ -578,6 +578,7 @@ #endif case '}' : return(MOAT); case 'P' : return(POOL); + case 'R' : return(RIVER); case 'L' : return(LAVAPOOL); case 'I' : return(ICE); case 'W' : return(WATER); diff -Naurbd slashem-0.0.8E0/win/share/objects.map slashem-0.0.8E1/win/share/objects.map --- slashem-0.0.8E0/win/share/objects.map 2005-07-02 08:31:38.000000000 +0100 +++ slashem-0.0.8E1/win/share/objects.map 2006-05-15 12:08:59.000000000 +0100 @@ -43,495 +43,498 @@ tile 42 "object, weapons, war hammer" tile 43 "object, weapons, heavy hammer" tile 44 "object, weapons, staff" -tile 45 "object, weapons, vulgar polearm" -tile 46 "object, weapons, single-edged polearm" -tile 47 "object, weapons, forked polearm" -tile 48 "object, weapons, hilted polearm" -tile 49 "object, weapons, long poleaxe" -tile 50 "object, weapons, pole cleaver" -tile 51 "object, weapons, angled poleaxe" -tile 52 "object, weapons, pole sickle" -tile 53 "object, weapons, pruning hook" -tile 54 "object, weapons, hooked polearm" -tile 55 "object, weapons, pronged polearm" -tile 56 "object, weapons, beaked polearm" -tile 57 "object, weapons, crude spear" -tile 58 "object, weapons, spear" -tile 59 "object, weapons, silver spear" -tile 60 "object, weapons, runed spear" -tile 61 "object, weapons, stout spear" -tile 62 "object, weapons, throwing spear" -tile 63 "object, weapons, trident" -tile 64 "object, weapons, lance" -tile 65 "object, weapons, crude bow" -tile 66 "object, weapons, bow" -tile 67 "object, weapons, runed bow" -tile 68 "object, weapons, black runed bow" -tile 69 "object, weapons, long bow" -tile 70 "object, weapons, crude arrow" -tile 71 "object, weapons, arrow" -tile 72 "object, weapons, silver arrow" -tile 73 "object, weapons, runed arrow" -tile 74 "object, weapons, black runed arrow" -tile 75 "object, weapons, bamboo arrow" -tile 76 "object, weapons, sling" -tile 77 "object, weapons, pistol" -tile 78 "object, weapons, submachine gun" -tile 79 "object, weapons, heavy machine gun" -tile 80 "object, weapons, rifle" -tile 81 "object, weapons, assault rifle" -tile 82 "object, weapons, sniper rifle" -tile 83 "object, weapons, shotgun" -tile 84 "object, weapons, auto shotgun" -tile 85 "object, weapons, rocket launcher" -tile 86 "object, weapons, grenade launcher" -tile 87 "object, weapons, bullet" -tile 88 "object, weapons, silver bullet" -tile 89 "object, weapons, shotgun shell" -tile 90 "object, weapons, rocket" -tile 91 "object, weapons, frag grenade" -tile 92 "object, weapons, gas grenade" -tile 93 "object, weapons, red stick" -tile 94 "object, weapons, crossbow" -tile 95 "object, weapons, crossbow bolt" -tile 96 "object, weapons, dart" -tile 97 "object, weapons, throwing star" -tile 98 "object, weapons, boomerang" -tile 99 "object, weapons, bullwhip" -tile 100 "object, weapons, rubber hose" -tile 101 "object, armor, Hawaiian shirt" -tile 102 "object, armor, T-shirt" -tile 103 "object, armor, plate mail" -tile 104 "object, armor, crystal plate mail" -tile 105 "object, armor, bronze plate mail" -tile 106 "object, armor, splint mail" -tile 107 "object, armor, banded mail" -tile 108 "object, armor, dwarvish mithril-coat" -tile 109 "object, armor, dark elven mithril-coat" -tile 110 "object, armor, elven mithril-coat" -tile 111 "object, armor, chain mail" -tile 112 "object, armor, crude chain mail" -tile 113 "object, armor, scale mail" -tile 114 "object, armor, studded leather armor" -tile 115 "object, armor, ring mail" -tile 116 "object, armor, crude ring mail" -tile 117 "object, armor, leather armor" -tile 118 "object, armor, leather jacket" -tile 119 "object, armor, red robe" -tile 120 "object, armor, blue robe" -tile 121 "object, armor, orange robe" -tile 122 "object, armor, green robe" -tile 123 "object, armor, gray dragon scale mail" -tile 124 "object, armor, silver dragon scale mail" -tile 125 "object, armor, shimmering dragon scale mail" -tile 126 "object, armor, deep dragon scale mail" -tile 127 "object, armor, red dragon scale mail" -tile 128 "object, armor, white dragon scale mail" -tile 129 "object, armor, orange dragon scale mail" -tile 130 "object, armor, black dragon scale mail" -tile 131 "object, armor, blue dragon scale mail" -tile 132 "object, armor, green dragon scale mail" -tile 133 "object, armor, yellow dragon scale mail" -tile 134 "object, armor, gray dragon scales" -tile 135 "object, armor, silver dragon scales" -tile 136 "object, armor, shimmering dragon scales" -tile 137 "object, armor, deep dragon scales" -tile 138 "object, armor, red dragon scales" -tile 139 "object, armor, white dragon scales" -tile 140 "object, armor, orange dragon scales" -tile 141 "object, armor, black dragon scales" -tile 142 "object, armor, blue dragon scales" -tile 143 "object, armor, green dragon scales" -tile 144 "object, armor, yellow dragon scales" -tile 145 "object, armor, mummy wrapping" -tile 146 "object, armor, coarse mantelet" -tile 147 "object, armor, hooded cloak" -tile 148 "object, armor, slippery cloak" -tile 149 "object, armor, faded pall" -tile 150 "object, armor, white coat" -tile 151 "object, armor, leather cloak" -tile 152 "object, armor, tattered cape" -tile 153 "object, armor, dirty rag" -tile 154 "object, armor, opera cloak" -tile 155 "object, armor, ornamental cope" -tile 156 "object, armor, piece of cloth" -tile 157 "object, armor, leather hat" -tile 158 "object, armor, iron skull cap" -tile 159 "object, armor, hard hat" -tile 160 "object, armor, fedora" -tile 161 "object, armor, conical hat" +tile 45 "object, weapons, silver capped staff" +tile 46 "object, weapons, vulgar polearm" +tile 47 "object, weapons, single-edged polearm" +tile 48 "object, weapons, forked polearm" +tile 49 "object, weapons, hilted polearm" +tile 50 "object, weapons, long poleaxe" +tile 51 "object, weapons, pole cleaver" +tile 52 "object, weapons, angled poleaxe" +tile 53 "object, weapons, pole sickle" +tile 54 "object, weapons, pruning hook" +tile 55 "object, weapons, hooked polearm" +tile 56 "object, weapons, pronged polearm" +tile 57 "object, weapons, beaked polearm" +tile 58 "object, weapons, crude spear" +tile 59 "object, weapons, spear" +tile 60 "object, weapons, silver spear" +tile 61 "object, weapons, runed spear" +tile 62 "object, weapons, stout spear" +tile 63 "object, weapons, throwing spear" +tile 64 "object, weapons, trident" +tile 65 "object, weapons, lance" +tile 66 "object, weapons, crude bow" +tile 67 "object, weapons, bow" +tile 68 "object, weapons, runed bow" +tile 69 "object, weapons, black runed bow" +tile 70 "object, weapons, long bow" +tile 71 "object, weapons, crude arrow" +tile 72 "object, weapons, arrow" +tile 73 "object, weapons, silver arrow" +tile 74 "object, weapons, runed arrow" +tile 75 "object, weapons, black runed arrow" +tile 76 "object, weapons, bamboo arrow" +tile 77 "object, weapons, sling" +tile 78 "object, weapons, pistol" +tile 79 "object, weapons, submachine gun" +tile 80 "object, weapons, heavy machine gun" +tile 81 "object, weapons, rifle" +tile 82 "object, weapons, assault rifle" +tile 83 "object, weapons, sniper rifle" +tile 84 "object, weapons, shotgun" +tile 85 "object, weapons, auto shotgun" +tile 86 "object, weapons, rocket launcher" +tile 87 "object, weapons, grenade launcher" +tile 88 "object, weapons, bullet" +tile 89 "object, weapons, silver bullet" +tile 90 "object, weapons, shotgun shell" +tile 91 "object, weapons, rocket" +tile 92 "object, weapons, frag grenade" +tile 93 "object, weapons, gas grenade" +tile 94 "object, weapons, red stick" +tile 95 "object, weapons, crossbow" +tile 96 "object, weapons, crossbow bolt" +tile 97 "object, weapons, dart" +tile 98 "object, weapons, throwing star" +tile 99 "object, weapons, boomerang" +tile 100 "object, weapons, bullwhip" +tile 101 "object, weapons, rubber hose" +tile 102 "object, armor, Hawaiian shirt" +tile 103 "object, armor, T-shirt" +tile 104 "object, armor, plate mail" +tile 105 "object, armor, crystal plate mail" +tile 106 "object, armor, bronze plate mail" +tile 107 "object, armor, splint mail" +tile 108 "object, armor, banded mail" +tile 109 "object, armor, dwarvish mithril-coat" +tile 110 "object, armor, dark elven mithril-coat" +tile 111 "object, armor, elven mithril-coat" +tile 112 "object, armor, chain mail" +tile 113 "object, armor, crude chain mail" +tile 114 "object, armor, scale mail" +tile 115 "object, armor, studded leather armor" +tile 116 "object, armor, ring mail" +tile 117 "object, armor, crude ring mail" +tile 118 "object, armor, leather armor" +tile 119 "object, armor, leather jacket" +tile 120 "object, armor, red robe" +tile 121 "object, armor, blue robe" +tile 122 "object, armor, orange robe" +tile 123 "object, armor, green robe" +tile 124 "object, armor, gray dragon scale mail" +tile 125 "object, armor, silver dragon scale mail" +tile 126 "object, armor, shimmering dragon scale mail" +tile 127 "object, armor, deep dragon scale mail" +tile 128 "object, armor, red dragon scale mail" +tile 129 "object, armor, white dragon scale mail" +tile 130 "object, armor, orange dragon scale mail" +tile 131 "object, armor, black dragon scale mail" +tile 132 "object, armor, blue dragon scale mail" +tile 133 "object, armor, green dragon scale mail" +tile 134 "object, armor, yellow dragon scale mail" +tile 135 "object, armor, gray dragon scales" +tile 136 "object, armor, silver dragon scales" +tile 137 "object, armor, shimmering dragon scales" +tile 138 "object, armor, deep dragon scales" +tile 139 "object, armor, red dragon scales" +tile 140 "object, armor, white dragon scales" +tile 141 "object, armor, orange dragon scales" +tile 142 "object, armor, black dragon scales" +tile 143 "object, armor, blue dragon scales" +tile 144 "object, armor, green dragon scales" +tile 145 "object, armor, yellow dragon scales" +tile 146 "object, armor, mummy wrapping" +tile 147 "object, armor, coarse mantelet" +tile 148 "object, armor, hooded cloak" +tile 149 "object, armor, slippery cloak" +tile 150 "object, armor, faded pall" +tile 151 "object, armor, white coat" +tile 152 "object, armor, leather cloak" +tile 153 "object, armor, tattered cape" +tile 154 "object, armor, dirty rag" +tile 155 "object, armor, opera cloak" +tile 156 "object, armor, ornamental cope" +tile 157 "object, armor, piece of cloth" +tile 158 "object, armor, leather hat" +tile 159 "object, armor, iron skull cap" +tile 160 "object, armor, hard hat" +tile 161 "object, armor, fedora" tile 162 "object, armor, conical hat" -tile 163 "object, armor, dented pot" -tile 164 "object, armor, plumed helmet" -tile 165 "object, armor, etched helmet" -tile 166 "object, armor, crested helmet" -tile 167 "object, armor, visored helmet" -tile 168 "object, armor, old gloves" -tile 169 "object, armor, padded gloves" -tile 170 "object, armor, riding gloves" -tile 171 "object, armor, black gloves" -tile 172 "object, armor, fencing gloves" -tile 173 "object, armor, small shield" -tile 174 "object, armor, blue and green shield" -tile 175 "object, armor, white-handed shield" -tile 176 "object, armor, red-eyed shield" -tile 177 "object, armor, large shield" -tile 178 "object, armor, large round shield" -tile 179 "object, armor, polished silver shield" -tile 180 "object, armor, walking shoes" -tile 181 "object, armor, hard shoes" -tile 182 "object, armor, jackboots" -tile 183 "object, armor, combat boots" -tile 184 "object, armor, jungle boots" -tile 185 "object, armor, hiking boots" -tile 186 "object, armor, mud boots" -tile 187 "object, armor, steel boots" -tile 188 "object, armor, riding boots" -tile 189 "object, armor, snow boots" -tile 190 "object, rings, wooden" -tile 191 "object, rings, topaz" -tile 192 "object, rings, ridged" -tile 193 "object, rings, black onyx" -tile 194 "object, rings, shiny" -tile 195 "object, rings, wedding" -tile 196 "object, rings, jade" -tile 197 "object, rings, bronze" -tile 198 "object, rings, diamond" -tile 199 "object, rings, sapphire" -tile 200 "object, rings, brass" -tile 201 "object, rings, opal" -tile 202 "object, rings, obsidian" -tile 203 "object, rings, plain" -tile 204 "object, rings, granite" -tile 205 "object, rings, glass" -tile 206 "object, rings, clay" -tile 207 "object, rings, coral" -tile 208 "object, rings, steel" -tile 209 "object, rings, wire" -tile 210 "object, rings, pearl" -tile 211 "object, rings, engagement" -tile 212 "object, rings, copper" -tile 213 "object, rings, iron" -tile 214 "object, rings, twisted" -tile 215 "object, rings, agate" -tile 216 "object, rings, moonstone" -tile 217 "object, rings, tiger eye" -tile 218 "object, rings, silver" -tile 219 "object, rings, ruby" -tile 220 "object, rings, ivory" -tile 221 "object, rings, emerald" -tile 222 "object, rings, gold" -tile 223 "object, amulets, square" -tile 224 "object, amulets, warped" -tile 225 "object, amulets, circular" -tile 226 "object, amulets, convex" -tile 227 "object, amulets, spherical" -tile 228 "object, amulets, octagonal" -tile 229 "object, amulets, hexagonal" -tile 230 "object, amulets, triangular" -tile 231 "object, amulets, oval" -tile 232 "object, amulets, concave" -tile 233 "object, amulets, pyramidal" -tile 234 "object, amulets, lunate" -tile 235 "object, amulets, Amulet of Yendor" +tile 163 "object, armor, conical hat" +tile 164 "object, armor, dented pot" +tile 165 "object, armor, plumed helmet" +tile 166 "object, armor, etched helmet" +tile 167 "object, armor, crested helmet" +tile 168 "object, armor, visored helmet" +tile 169 "object, armor, old gloves" +tile 170 "object, armor, padded gloves" +tile 171 "object, armor, riding gloves" +tile 172 "object, armor, black gloves" +tile 173 "object, armor, fencing gloves" +tile 174 "object, armor, small shield" +tile 175 "object, armor, blue and green shield" +tile 176 "object, armor, white-handed shield" +tile 177 "object, armor, red-eyed shield" +tile 178 "object, armor, large shield" +tile 179 "object, armor, large round shield" +tile 180 "object, armor, polished silver shield" +tile 181 "object, armor, walking shoes" +tile 182 "object, armor, hard shoes" +tile 183 "object, armor, jackboots" +tile 184 "object, armor, combat boots" +tile 185 "object, armor, jungle boots" +tile 186 "object, armor, hiking boots" +tile 187 "object, armor, mud boots" +tile 188 "object, armor, steel boots" +tile 189 "object, armor, riding boots" +tile 190 "object, armor, snow boots" +tile 191 "object, rings, wooden" +tile 192 "object, rings, topaz" +tile 193 "object, rings, ridged" +tile 194 "object, rings, black onyx" +tile 195 "object, rings, shiny" +tile 196 "object, rings, wedding" +tile 197 "object, rings, jade" +tile 198 "object, rings, bronze" +tile 199 "object, rings, diamond" +tile 200 "object, rings, sapphire" +tile 201 "object, rings, brass" +tile 202 "object, rings, opal" +tile 203 "object, rings, obsidian" +tile 204 "object, rings, plain" +tile 205 "object, rings, granite" +tile 206 "object, rings, glass" +tile 207 "object, rings, clay" +tile 208 "object, rings, coral" +tile 209 "object, rings, steel" +tile 210 "object, rings, wire" +tile 211 "object, rings, pearl" +tile 212 "object, rings, engagement" +tile 213 "object, rings, copper" +tile 214 "object, rings, iron" +tile 215 "object, rings, twisted" +tile 216 "object, rings, agate" +tile 217 "object, rings, moonstone" +tile 218 "object, rings, tiger eye" +tile 219 "object, rings, silver" +tile 220 "object, rings, ruby" +tile 221 "object, rings, ivory" +tile 222 "object, rings, emerald" +tile 223 "object, rings, gold" +tile 224 "object, amulets, square" +tile 225 "object, amulets, warped" +tile 226 "object, amulets, circular" +tile 227 "object, amulets, convex" +tile 228 "object, amulets, spherical" +tile 229 "object, amulets, octagonal" +tile 230 "object, amulets, hexagonal" +tile 231 "object, amulets, triangular" +tile 232 "object, amulets, oval" +tile 233 "object, amulets, concave" +tile 234 "object, amulets, pyramidal" +tile 235 "object, amulets, lunate" tile 236 "object, amulets, Amulet of Yendor" -tile 237 "object, tools, large box" -tile 238 "object, tools, chest" -tile 239 "object, tools, ice box" -tile 240 "object, tools, bag" +tile 237 "object, amulets, Amulet of Yendor" +tile 238 "object, tools, large box" +tile 239 "object, tools, chest" +tile 240 "object, tools, ice box" tile 241 "object, tools, bag" tile 242 "object, tools, bag" tile 243 "object, tools, bag" -tile 244 "object, tools, key" -tile 245 "object, tools, lock pick" -tile 246 "object, tools, credit card" -tile 247 "object, tools, candle" +tile 244 "object, tools, bag" +tile 245 "object, tools, key" +tile 246 "object, tools, lock pick" +tile 247 "object, tools, credit card" tile 248 "object, tools, candle" tile 249 "object, tools, candle" -tile 250 "object, tools, lamp" -tile 251 "object, tools, brass lantern" -tile 252 "object, tools, lamp" -tile 253 "object, tools, whistle" +tile 250 "object, tools, candle" +tile 251 "object, tools, lamp" +tile 252 "object, tools, brass lantern" +tile 253 "object, tools, lamp" tile 254 "object, tools, whistle" -tile 255 "object, tools, flute" +tile 255 "object, tools, whistle" tile 256 "object, tools, flute" -tile 257 "object, tools, horn" +tile 257 "object, tools, flute" tile 258 "object, tools, horn" tile 259 "object, tools, horn" tile 260 "object, tools, horn" -tile 261 "object, tools, harp" +tile 261 "object, tools, horn" tile 262 "object, tools, harp" -tile 263 "object, tools, bell" -tile 264 "object, tools, bugle" -tile 265 "object, tools, drum" +tile 263 "object, tools, harp" +tile 264 "object, tools, bell" +tile 265 "object, tools, bugle" tile 266 "object, tools, drum" -tile 267 "object, tools, land mine" -tile 268 "object, tools, beartrap" -tile 269 "object, tools, spoon" -tile 270 "object, tools, pick-axe" -tile 271 "object, tools, fishing pole" -tile 272 "object, tools, iron hook" -tile 273 "object, tools, unicorn horn" -tile 274 "object, tools, torch" -tile 275 "object, tools, lightsaber" +tile 267 "object, tools, drum" +tile 268 "object, tools, land mine" +tile 269 "object, tools, beartrap" +tile 270 "object, tools, spoon" +tile 271 "object, tools, pick-axe" +tile 272 "object, tools, fishing pole" +tile 273 "object, tools, iron hook" +tile 274 "object, tools, unicorn horn" +tile 275 "object, tools, torch" tile 276 "object, tools, lightsaber" tile 277 "object, tools, lightsaber" -tile 278 "object, tools, double lightsaber" -tile 279 "object, tools, expensive camera" -tile 280 "object, tools, looking glass" -tile 281 "object, tools, glass orb" -tile 282 "object, tools, lenses" -tile 283 "object, tools, blindfold" -tile 284 "object, tools, towel" -tile 285 "object, tools, saddle" -tile 286 "object, tools, leash" -tile 287 "object, tools, stethoscope" -tile 288 "object, tools, tinning kit" -tile 289 "object, tools, leather bag" -tile 290 "object, tools, tin opener" -tile 291 "object, tools, can of grease" -tile 292 "object, tools, figurine" -tile 293 "object, tools, magic marker" -tile 294 "object, tools, bandage" -tile 295 "object, tools, phial" -tile 296 "object, tools, candelabrum" -tile 297 "object, tools, silver bell" -tile 298 "object, food, tripe ration" -tile 299 "object, food, corpse" -tile 300 "object, food, egg" -tile 301 "object, food, meatball" -tile 302 "object, food, meat stick" -tile 303 "object, food, huge chunk of meat" -tile 304 "object, food, meat ring" -tile 305 "object, food, eyeball" -tile 306 "object, food, severed hand" -tile 307 "object, food, kelp frond" -tile 308 "object, food, eucalyptus leaf" -tile 309 "object, food, clove of garlic" -tile 310 "object, food, sprig of wolfsbane" -tile 311 "object, food, apple" -tile 312 "object, food, carrot" -tile 313 "object, food, pear" -tile 314 "object, food, asian pear" -tile 315 "object, food, banana" -tile 316 "object, food, orange" -tile 317 "object, food, mushroom" -tile 318 "object, food, melon" -tile 319 "object, food, slime mold" -tile 320 "object, food, lump of royal jelly" -tile 321 "object, food, cream pie" -tile 322 "object, food, sandwich" -tile 323 "object, food, candy bar" -tile 324 "object, food, fortune cookie" -tile 325 "object, food, pancake" -tile 326 "object, food, tortilla" -tile 327 "object, food, cheese" -tile 328 "object, food, pill" -tile 329 "object, food, holy wafer" -tile 330 "object, food, lembas wafer" -tile 331 "object, food, cram ration" -tile 332 "object, food, food ration" -tile 333 "object, food, K-ration" -tile 334 "object, food, C-ration" -tile 335 "object, food, tin" -tile 336 "object, potions, brown" -tile 337 "object, potions, dark" -tile 338 "object, potions, magenta" -tile 339 "object, potions, fizzy" -tile 340 "object, potions, effervescent" -tile 341 "object, potions, luminescent" -tile 342 "object, potions, orange" -tile 343 "object, potions, sky blue" -tile 344 "object, potions, purple-red" -tile 345 "object, potions, puce" -tile 346 "object, potions, pink" -tile 347 "object, potions, yellow" -tile 348 "object, potions, muddy" -tile 349 "object, potions, cloudy" -tile 350 "object, potions, brilliant blue" -tile 351 "object, potions, bubbly" -tile 352 "object, potions, smoky" -tile 353 "object, potions, swirly" -tile 354 "object, potions, black" -tile 355 "object, potions, cyan" -tile 356 "object, potions, golden" -tile 357 "object, potions, dark" -tile 358 "object, potions, white" -tile 359 "object, potions, murky" -tile 360 "object, potions, ruby" -tile 361 "object, potions, milky" -tile 362 "object, potions, icy" -tile 363 "object, potions, emerald" -tile 364 "object, potions, clear" -tile 365 "object, potions, blood-red" +tile 278 "object, tools, lightsaber" +tile 279 "object, tools, double lightsaber" +tile 280 "object, tools, expensive camera" +tile 281 "object, tools, looking glass" +tile 282 "object, tools, glass orb" +tile 283 "object, tools, lenses" +tile 284 "object, tools, blindfold" +tile 285 "object, tools, towel" +tile 286 "object, tools, saddle" +tile 287 "object, tools, leash" +tile 288 "object, tools, stethoscope" +tile 289 "object, tools, tinning kit" +tile 290 "object, tools, leather bag" +tile 291 "object, tools, tin opener" +tile 292 "object, tools, can of grease" +tile 293 "object, tools, figurine" +tile 294 "object, tools, magic marker" +tile 295 "object, tools, bandage" +tile 296 "object, tools, phial" +tile 297 "object, tools, candelabrum" +tile 298 "object, tools, silver bell" +tile 299 "object, food, tripe ration" +tile 300 "object, food, corpse" +tile 301 "object, food, egg" +tile 302 "object, food, meatball" +tile 303 "object, food, meat stick" +tile 304 "object, food, huge chunk of meat" +tile 305 "object, food, meat ring" +tile 306 "object, food, eyeball" +tile 307 "object, food, severed hand" +tile 308 "object, food, kelp frond" +tile 309 "object, food, eucalyptus leaf" +tile 310 "object, food, clove of garlic" +tile 311 "object, food, sprig of wolfsbane" +tile 312 "object, food, apple" +tile 313 "object, food, carrot" +tile 314 "object, food, pear" +tile 315 "object, food, asian pear" +tile 316 "object, food, banana" +tile 317 "object, food, orange" +tile 318 "object, food, mushroom" +tile 319 "object, food, melon" +tile 320 "object, food, slime mold" +tile 321 "object, food, lump of royal jelly" +tile 322 "object, food, cream pie" +tile 323 "object, food, sandwich" +tile 324 "object, food, candy bar" +tile 325 "object, food, fortune cookie" +tile 326 "object, food, pancake" +tile 327 "object, food, tortilla" +tile 328 "object, food, cheese" +tile 329 "object, food, pill" +tile 330 "object, food, holy wafer" +tile 331 "object, food, lembas wafer" +tile 332 "object, food, cram ration" +tile 333 "object, food, food ration" +tile 334 "object, food, K-ration" +tile 335 "object, food, C-ration" +tile 336 "object, food, tin" +tile 337 "object, potions, brown" +tile 338 "object, potions, dark" +tile 339 "object, potions, magenta" +tile 340 "object, potions, fizzy" +tile 341 "object, potions, effervescent" +tile 342 "object, potions, luminescent" +tile 343 "object, potions, orange" +tile 344 "object, potions, sky blue" +tile 345 "object, potions, purple-red" +tile 346 "object, potions, puce" +tile 347 "object, potions, pink" +tile 348 "object, potions, yellow" +tile 349 "object, potions, muddy" +tile 350 "object, potions, cloudy" +tile 351 "object, potions, brilliant blue" +tile 352 "object, potions, bubbly" +tile 353 "object, potions, smoky" +tile 354 "object, potions, swirly" +tile 355 "object, potions, black" +tile 356 "object, potions, cyan" +tile 357 "object, potions, golden" +tile 358 "object, potions, dark" +tile 359 "object, potions, white" +tile 360 "object, potions, murky" +tile 361 "object, potions, ruby" +tile 362 "object, potions, milky" +tile 363 "object, potions, icy" +tile 364 "object, potions, emerald" +tile 365 "object, potions, clear" tile 366 "object, potions, blood-red" -tile 367 "object, potions, sparkling" -tile 368 "object, scrolls, LEP GEX VEN ZEA" -tile 369 "object, scrolls, PRIRUTSENIE" -tile 370 "object, scrolls, VERR YED HORRE" -tile 371 "object, scrolls, YUM YUM" -tile 372 "object, scrolls, THARR" -tile 373 "object, scrolls, KERNOD WEL" -tile 374 "object, scrolls, ELAM EBOW" -tile 375 "object, scrolls, NR 9" -tile 376 "object, scrolls, XIXAXA XOXAXA XUXAXA" -tile 377 "object, scrolls, DAIYEN FOOELS" -tile 378 "object, scrolls, ZELGO MER" -tile 379 "object, scrolls, PRATYAVAYAH" -tile 380 "object, scrolls, VENZAR BORGAVVE" -tile 381 "object, scrolls, ANDOVA BEGARIN" -tile 382 "object, scrolls, KIRJE" -tile 383 "object, scrolls, JUYED AWK YACC" -tile 384 "object, scrolls, DUAM XNAHT" -tile 385 "object, scrolls, HACKEM MUCHE" -tile 386 "object, scrolls, ELBIB YLOH" -tile 387 "object, scrolls, VE FORBRYDERNE" -tile 388 "object, scrolls, VELOX NEB" -tile 389 "object, scrolls, FOOBIE BLETCH" -tile 390 "object, scrolls, TEMOV" -tile 391 "object, scrolls, GARVEN DEH" -tile 392 "object, scrolls, READ ME" -tile 393 "object, scrolls, stamped" -tile 394 "object, scrolls, unlabeled" -tile 395 "object, spell books, red" -tile 396 "object, spell books, turquoise" -tile 397 "object, spell books, velvet" -tile 398 "object, spell books, dark" -tile 399 "object, spell books, black" -tile 400 "object, spell books, thick" -tile 401 "object, spell books, white" -tile 402 "object, spell books, yellow" -tile 403 "object, spell books, indigo" -tile 404 "object, spell books, plaid" -tile 405 "object, spell books, light brown" -tile 406 "object, spell books, glittering" -tile 407 "object, spell books, cloth" -tile 408 "object, spell books, leather" -tile 409 "object, spell books, cyan" -tile 410 "object, spell books, dark blue" -tile 411 "object, spell books, violet" -tile 412 "object, spell books, bronze" -tile 413 "object, spell books, gray" -tile 414 "object, spell books, dusty" -tile 415 "object, spell books, orange" -tile 416 "object, spell books, light green" -tile 417 "object, spell books, light blue" -tile 418 "object, spell books, magenta" -tile 419 "object, spell books, dull" -tile 420 "object, spell books, thin" -tile 421 "object, spell books, wide" -tile 422 "object, spell books, big" -tile 423 "object, spell books, fuzzy" -tile 424 "object, spell books, deep" -tile 425 "object, spell books, spotted" -tile 426 "object, spell books, long" -tile 427 "object, spell books, wrinkled" -tile 428 "object, spell books, copper" -tile 429 "object, spell books, torn" -tile 430 "object, spell books, purple" -tile 431 "object, spell books, faded" -tile 432 "object, spell books, dark brown" -tile 433 "object, spell books, tan" -tile 434 "object, spell books, gold" -tile 435 "object, spell books, ochre" -tile 436 "object, spell books, silver" -tile 437 "object, spell books, pink" -tile 438 "object, spell books, canvas" -tile 439 "object, spell books, hardcover" -tile 440 "object, spell books, dark green" -tile 441 "object, spell books, parchment" -tile 442 "object, spell books, shining" -tile 443 "object, spell books, vellum" -tile 444 "object, spell books, ragged" -tile 445 "object, spell books, dog eared" -tile 446 "object, spell books, mottled" -tile 447 "object, spell books, stained" -tile 448 "object, spell books, rainbow" -tile 449 "object, spell books, tattered" -tile 450 "object, spell books, colorful" -tile 451 "object, spell books, tartan" -tile 452 "object, spell books, stylish" -tile 453 "object, spell books, psychedelic" -tile 454 "object, spell books, spiral-bound" -tile 455 "object, spell books, left-handed" -tile 456 "object, spell books, stapled" -tile 457 "object, spell books, plain" -tile 458 "object, spell books, papyrus" -tile 459 "object, wands, glass" -tile 460 "object, wands, oak" -tile 461 "object, wands, crystal" -tile 462 "object, wands, bamboo" -tile 463 "object, wands, aluminum" -tile 464 "object, wands, marble" -tile 465 "object, wands, zinc" -tile 466 "object, wands, uranium" -tile 467 "object, wands, balsa" -tile 468 "object, wands, tin" -tile 469 "object, wands, brass" -tile 470 "object, wands, ebony" -tile 471 "object, wands, copper" -tile 472 "object, wands, ceramic" -tile 473 "object, wands, platinum" -tile 474 "object, wands, maple" -tile 475 "object, wands, rusty" -tile 476 "object, wands, silver" -tile 477 "object, wands, iridium" -tile 478 "object, wands, black" -tile 479 "object, wands, bronze" -tile 480 "object, wands, pine" -tile 481 "object, wands, iron" -tile 482 "object, wands, steel" -tile 483 "object, wands, hexagonal" -tile 484 "object, wands, short" -tile 485 "object, wands, runed" -tile 486 "object, wands, long" -tile 487 "object, wands, curved" -tile 488 "object, wands, octagonal" -tile 489 "object, wands, forked" -tile 490 "object, wands, spiked" -tile 491 "object, wands, jeweled" -tile 492 "object, coins, gold piece" -tile 493 "object, rocks, white" -tile 494 "object, rocks, white" -tile 495 "object, rocks, red" -tile 496 "object, rocks, orange" -tile 497 "object, rocks, blue" -tile 498 "object, rocks, black" -tile 499 "object, rocks, green" -tile 500 "object, rocks, green" -tile 501 "object, rocks, yellow" +tile 367 "object, potions, blood-red" +tile 368 "object, potions, sparkling" +tile 369 "object, scrolls, LEP GEX VEN ZEA" +tile 370 "object, scrolls, PRIRUTSENIE" +tile 371 "object, scrolls, VERR YED HORRE" +tile 372 "object, scrolls, YUM YUM" +tile 373 "object, scrolls, THARR" +tile 374 "object, scrolls, KERNOD WEL" +tile 375 "object, scrolls, ELAM EBOW" +tile 376 "object, scrolls, NR 9" +tile 377 "object, scrolls, XIXAXA XOXAXA XUXAXA" +tile 378 "object, scrolls, DAIYEN FOOELS" +tile 379 "object, scrolls, ZELGO MER" +tile 380 "object, scrolls, PRATYAVAYAH" +tile 381 "object, scrolls, VENZAR BORGAVVE" +tile 382 "object, scrolls, ANDOVA BEGARIN" +tile 383 "object, scrolls, KIRJE" +tile 384 "object, scrolls, JUYED AWK YACC" +tile 385 "object, scrolls, DUAM XNAHT" +tile 386 "object, scrolls, HACKEM MUCHE" +tile 387 "object, scrolls, ELBIB YLOH" +tile 388 "object, scrolls, VE FORBRYDERNE" +tile 389 "object, scrolls, VELOX NEB" +tile 390 "object, scrolls, IA CTHULHU" +tile 391 "object, scrolls, 4OFAE OF9 SCC9" +tile 392 "object, scrolls, FOOBIE BLETCH" +tile 393 "object, scrolls, TEMOV" +tile 394 "object, scrolls, GARVEN DEH" +tile 395 "object, scrolls, READ ME" +tile 396 "object, scrolls, stamped" +tile 397 "object, scrolls, unlabeled" +tile 398 "object, spell books, red" +tile 399 "object, spell books, turquoise" +tile 400 "object, spell books, velvet" +tile 401 "object, spell books, dark" +tile 402 "object, spell books, black" +tile 403 "object, spell books, thick" +tile 404 "object, spell books, white" +tile 405 "object, spell books, yellow" +tile 406 "object, spell books, indigo" +tile 407 "object, spell books, plaid" +tile 408 "object, spell books, light brown" +tile 409 "object, spell books, glittering" +tile 410 "object, spell books, cloth" +tile 411 "object, spell books, leather" +tile 412 "object, spell books, cyan" +tile 413 "object, spell books, dark blue" +tile 414 "object, spell books, violet" +tile 415 "object, spell books, bronze" +tile 416 "object, spell books, gray" +tile 417 "object, spell books, dusty" +tile 418 "object, spell books, orange" +tile 419 "object, spell books, light green" +tile 420 "object, spell books, light blue" +tile 421 "object, spell books, magenta" +tile 422 "object, spell books, dull" +tile 423 "object, spell books, thin" +tile 424 "object, spell books, wide" +tile 425 "object, spell books, big" +tile 426 "object, spell books, fuzzy" +tile 427 "object, spell books, deep" +tile 428 "object, spell books, spotted" +tile 429 "object, spell books, long" +tile 430 "object, spell books, wrinkled" +tile 431 "object, spell books, copper" +tile 432 "object, spell books, torn" +tile 433 "object, spell books, purple" +tile 434 "object, spell books, faded" +tile 435 "object, spell books, dark brown" +tile 436 "object, spell books, tan" +tile 437 "object, spell books, gold" +tile 438 "object, spell books, ochre" +tile 439 "object, spell books, silver" +tile 440 "object, spell books, pink" +tile 441 "object, spell books, canvas" +tile 442 "object, spell books, hardcover" +tile 443 "object, spell books, dark green" +tile 444 "object, spell books, parchment" +tile 445 "object, spell books, shining" +tile 446 "object, spell books, vellum" +tile 447 "object, spell books, ragged" +tile 448 "object, spell books, dog eared" +tile 449 "object, spell books, mottled" +tile 450 "object, spell books, stained" +tile 451 "object, spell books, rainbow" +tile 452 "object, spell books, tattered" +tile 453 "object, spell books, colorful" +tile 454 "object, spell books, tartan" +tile 455 "object, spell books, stylish" +tile 456 "object, spell books, psychedelic" +tile 457 "object, spell books, spiral-bound" +tile 458 "object, spell books, left-handed" +tile 459 "object, spell books, stapled" +tile 460 "object, spell books, plain" +tile 461 "object, spell books, papyrus" +tile 462 "object, wands, glass" +tile 463 "object, wands, oak" +tile 464 "object, wands, crystal" +tile 465 "object, wands, bamboo" +tile 466 "object, wands, aluminum" +tile 467 "object, wands, marble" +tile 468 "object, wands, zinc" +tile 469 "object, wands, uranium" +tile 470 "object, wands, balsa" +tile 471 "object, wands, tin" +tile 472 "object, wands, brass" +tile 473 "object, wands, ebony" +tile 474 "object, wands, copper" +tile 475 "object, wands, ceramic" +tile 476 "object, wands, platinum" +tile 477 "object, wands, maple" +tile 478 "object, wands, rusty" +tile 479 "object, wands, silver" +tile 480 "object, wands, iridium" +tile 481 "object, wands, black" +tile 482 "object, wands, bronze" +tile 483 "object, wands, pine" +tile 484 "object, wands, iron" +tile 485 "object, wands, steel" +tile 486 "object, wands, hexagonal" +tile 487 "object, wands, short" +tile 488 "object, wands, runed" +tile 489 "object, wands, long" +tile 490 "object, wands, curved" +tile 491 "object, wands, octagonal" +tile 492 "object, wands, forked" +tile 493 "object, wands, spiked" +tile 494 "object, wands, jeweled" +tile 495 "object, coins, gold piece" +tile 496 "object, rocks, white" +tile 497 "object, rocks, white" +tile 498 "object, rocks, red" +tile 499 "object, rocks, orange" +tile 500 "object, rocks, blue" +tile 501 "object, rocks, black" tile 502 "object, rocks, green" -tile 503 "object, rocks, yellowish brown" -tile 504 "object, rocks, yellowish brown" -tile 505 "object, rocks, black" -tile 506 "object, rocks, white" -tile 507 "object, rocks, yellow" -tile 508 "object, rocks, red" -tile 509 "object, rocks, violet" -tile 510 "object, rocks, red" -tile 511 "object, rocks, violet" -tile 512 "object, rocks, black" -tile 513 "object, rocks, orange" -tile 514 "object, rocks, green" -tile 515 "object, rocks, white" -tile 516 "object, rocks, blue" -tile 517 "object, rocks, red" -tile 518 "object, rocks, yellowish brown" -tile 519 "object, rocks, orange" -tile 520 "object, rocks, yellow" -tile 521 "object, rocks, black" -tile 522 "object, rocks, green" -tile 523 "object, rocks, violet" -tile 524 "object, rocks, gray" -tile 525 "object, rocks, gray" -tile 526 "object, rocks, gray" +tile 503 "object, rocks, green" +tile 504 "object, rocks, yellow" +tile 505 "object, rocks, green" +tile 506 "object, rocks, yellowish brown" +tile 507 "object, rocks, yellowish brown" +tile 508 "object, rocks, black" +tile 509 "object, rocks, white" +tile 510 "object, rocks, yellow" +tile 511 "object, rocks, red" +tile 512 "object, rocks, violet" +tile 513 "object, rocks, red" +tile 514 "object, rocks, violet" +tile 515 "object, rocks, black" +tile 516 "object, rocks, orange" +tile 517 "object, rocks, green" +tile 518 "object, rocks, white" +tile 519 "object, rocks, blue" +tile 520 "object, rocks, red" +tile 521 "object, rocks, yellowish brown" +tile 522 "object, rocks, orange" +tile 523 "object, rocks, yellow" +tile 524 "object, rocks, black" +tile 525 "object, rocks, green" +tile 526 "object, rocks, violet" tile 527 "object, rocks, gray" tile 528 "object, rocks, gray" tile 529 "object, rocks, gray" -tile 530 "object, rocks, rock" -tile 531 "object, large stones, boulder" -tile 532 "object, large stones, statue" -tile 533 "object, iron balls, heavy iron ball" -tile 534 "object, chains, iron chain" -tile 535 "object, venoms, splash of venom" -tile 536 "object, venoms, splash of venom" +tile 530 "object, rocks, gray" +tile 531 "object, rocks, gray" +tile 532 "object, rocks, gray" +tile 533 "object, rocks, rock" +tile 534 "object, large stones, boulder" +tile 535 "object, large stones, statue" +tile 536 "object, iron balls, heavy iron ball" +tile 537 "object, chains, iron chain" +tile 538 "object, venoms, splash of venom" +tile 539 "object, venoms, splash of venom" diff -Naurbd slashem-0.0.8E0/win/share/objects.txt slashem-0.0.8E1/win/share/objects.txt --- slashem-0.0.8E0/win/share/objects.txt 2005-07-02 08:31:38.000000000 +0100 +++ slashem-0.0.8E1/win/share/objects.txt 2006-05-15 12:08:59.000000000 +0100 @@ -869,6 +869,25 @@ MJJAAMMMMMMMMMMM MMAMMMMMMMMMMMMM } +# tile 45 (silver capped staff) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMBPM + MMMMMMMMMMMMBPPA + MMMMMMMMMMMBPPAM + MMMMMMMMMMJPPAAM + MMMMMMMMMJCJAAMM + MMMMMMMMJKJAAMMM + MMMMMMMJKJAAMMMM + MMMMMMMKJAAMMMMM + MMMMMMKJAAMMMMMM + MMMMMJJAAMMMMMMM + MMMMBJAAMMMMMMMM + MMMBPAAMMMMMMMMM + MMBPAAMMMMMMMMMM + MBPAAMMMMMMMMMMM + MMAMMMMMMMMMMMMM +} # tile 45 (vulgar polearm / partisan) { MMMMMMMMMMMMMMMM @@ -7405,6 +7424,44 @@ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } +# tile 389 (IA CTHULHU / demonology) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMPOOOOOPKAMMM + MMMDOOOOOOKDJMMM + MMMMPOOOOOPJAAMM + MMMMMAAAAAAPAMMM + MMMMMLLLLLLPAMMM + MMMMMNJNJAOMAMMM + MMMMMLLLLLLPAMMM + MMMMMLLJLJLPAMMM + MMMMPOOOOOPKAMMM + MMMDOOOOOOKDJMMM + MMMMPOOOOOPJAAMM + MMMMMAAAAAAAAMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM +} +# tile 390 (4OFAE OF9 SCC9 / elementalism) +{ + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM + MMMMPOOOOOPKAMMM + MMMDOOOOOOKDJMMM + MMMMPOOOOOPJAAMM + MMMMMAAAAAAPAMMM + MMMMMLLLLLLPAMMM + MMMMMNJNJAOMAMMM + MMMMMLLLLLLPAMMM + MMMMMLLJLJLPAMMM + MMMMPOOOOOPKAMMM + MMMDOOOOOOKDJMMM + MMMMPOOOOOPJAAMM + MMMMMAAAAAAAAMMM + MMMMMMMMMMMMMMMM + MMMMMMMMMMMMMMMM +} # tile 389 (FOOBIE BLETCH) { MMMMMMMMMMMMMMMM diff -Naurbd slashem-0.0.8E0/win/share/other.map slashem-0.0.8E1/win/share/other.map --- slashem-0.0.8E0/win/share/other.map 2005-07-02 08:31:38.000000000 +0100 +++ slashem-0.0.8E1/win/share/other.map 2006-05-15 12:08:59.000000000 +0100 @@ -33,197 +33,199 @@ tile 32 "cmap, pool" tile 33 "cmap, ice" tile 34 "cmap, molten lava" -tile 35 "cmap, lowered drawbridge, vertical" -tile 36 "cmap, lowered drawbridge, horizontal" -tile 37 "cmap, raised drawbridge, vertical" -tile 38 "cmap, raised drawbridge, horizontal" -tile 39 "cmap, air" -tile 40 "cmap, cloud" -tile 41 "cmap, water" -tile 42 "cmap, trap, arrow trap" -tile 43 "cmap, trap, dart trap" -tile 44 "cmap, trap, falling rock trap" -tile 45 "cmap, trap, squeaky board" -tile 46 "cmap, trap, bear trap" -tile 47 "cmap, trap, land mine" -tile 48 "cmap, trap, rolling boulder trap" -tile 49 "cmap, trap, sleeping gas trap" -tile 50 "cmap, trap, rust trap" -tile 51 "cmap, trap, fire trap" -tile 52 "cmap, trap, pit" -tile 53 "cmap, trap, spiked pit" -tile 54 "cmap, trap, hole" -tile 55 "cmap, trap, trap door" -tile 56 "cmap, trap, teleportation trap" -tile 57 "cmap, trap, level teleporter" -tile 58 "cmap, trap, magic portal" -tile 59 "cmap, trap, web" -tile 60 "cmap, trap, statue trap" -tile 61 "cmap, trap, magic trap" -tile 62 "cmap, trap, anti-magic field" -tile 63 "cmap, trap, polymorph trap" -tile 64 "cmap, effect, vertical beam" -tile 65 "cmap, effect, horizontal beam" -tile 66 "cmap, effect, left slant beam" -tile 67 "cmap, effect, right slant beam" -tile 68 "cmap, effect, dig beam" -tile 69 "cmap, effect, camera flash" -tile 70 "cmap, effect, thrown boomerang, open left" -tile 71 "cmap, effect, thrown boomerang, open right" -tile 72 "cmap, effect, magic shield 1" -tile 73 "cmap, effect, magic shield 2" -tile 74 "cmap, effect, magic shield 3" -tile 75 "cmap, effect, magic shield 4" -tile 76 "cmap, swallow, top left / monster, *, swallow, top left" -tile 77 "cmap, swallow, top center / monster, *, swallow, top center" -tile 78 "cmap, swallow, top right / monster, *, swallow, top right" -tile 79 "cmap, swallow, middle left / monster, *, swallow, middle left" -tile 80 "cmap, swallow, middle right / monster, *, swallow, middle right" -tile 81 "cmap, swallow, bottom left / monster, *, swallow, bottom left" -tile 82 "cmap, swallow, bottom center / monster, *, swallow, bottom center" -tile 83 "cmap, swallow, bottom right / monster, *, swallow, bottom right" -tile 84 "explosion, dark, top left" -tile 85 "explosion, dark, top center" -tile 86 "explosion, dark, top right" -tile 87 "explosion, dark, middle left" -tile 88 "explosion, dark, middle center" -tile 89 "explosion, dark, middle right" -tile 90 "explosion, dark, bottom left" -tile 91 "explosion, dark, bottom center" -tile 92 "explosion, dark, bottom right" -tile 93 "explosion, noxious, top left" -tile 94 "explosion, noxious, top center" -tile 95 "explosion, noxious, top right" -tile 96 "explosion, noxious, middle left" -tile 97 "explosion, noxious, middle center" -tile 98 "explosion, noxious, middle right" -tile 99 "explosion, noxious, bottom left" -tile 100 "explosion, noxious, bottom center" -tile 101 "explosion, noxious, bottom right" -tile 102 "explosion, muddy, top left" -tile 103 "explosion, muddy, top center" -tile 104 "explosion, muddy, top right" -tile 105 "explosion, muddy, middle left" -tile 106 "explosion, muddy, middle center" -tile 107 "explosion, muddy, middle right" -tile 108 "explosion, muddy, bottom left" -tile 109 "explosion, muddy, bottom center" -tile 110 "explosion, muddy, bottom right" -tile 111 "explosion, wet, top left" -tile 112 "explosion, wet, top center" -tile 113 "explosion, wet, top right" -tile 114 "explosion, wet, middle left" -tile 115 "explosion, wet, middle center" -tile 116 "explosion, wet, middle right" -tile 117 "explosion, wet, bottom left" -tile 118 "explosion, wet, bottom center" -tile 119 "explosion, wet, bottom right" -tile 120 "explosion, magical, top left" -tile 121 "explosion, magical, top center" -tile 122 "explosion, magical, top right" -tile 123 "explosion, magical, middle left" -tile 124 "explosion, magical, middle center" -tile 125 "explosion, magical, middle right" -tile 126 "explosion, magical, bottom left" -tile 127 "explosion, magical, bottom center" -tile 128 "explosion, magical, bottom right" -tile 129 "explosion, fiery, top left" -tile 130 "explosion, fiery, top center" -tile 131 "explosion, fiery, top right" -tile 132 "explosion, fiery, middle left" -tile 133 "explosion, fiery, middle center" -tile 134 "explosion, fiery, middle right" -tile 135 "explosion, fiery, bottom left" -tile 136 "explosion, fiery, bottom center" -tile 137 "explosion, fiery, bottom right" -tile 138 "explosion, frosty, top left" -tile 139 "explosion, frosty, top center" -tile 140 "explosion, frosty, top right" -tile 141 "explosion, frosty, middle left" -tile 142 "explosion, frosty, middle center" -tile 143 "explosion, frosty, middle right" -tile 144 "explosion, frosty, bottom left" -tile 145 "explosion, frosty, bottom center" -tile 146 "explosion, frosty, bottom right" -tile 147 "zap, magic missile, vertical" -tile 148 "zap, magic missile, horizontal" -tile 149 "zap, magic missile, left slant" -tile 150 "zap, magic missile, right slant" -tile 151 "zap, fire, vertical" -tile 152 "zap, fire, horizontal" -tile 153 "zap, fire, left slant" -tile 154 "zap, fire, right slant" -tile 155 "zap, cold, vertical" -tile 156 "zap, cold, horizontal" -tile 157 "zap, cold, left slant" -tile 158 "zap, cold, right slant" -tile 159 "zap, sleep, vertical" -tile 160 "zap, sleep, horizontal" -tile 161 "zap, sleep, left slant" -tile 162 "zap, sleep, right slant" -tile 163 "zap, death, vertical" -tile 164 "zap, death, horizontal" -tile 165 "zap, death, left slant" -tile 166 "zap, death, right slant" -tile 167 "zap, lightning, vertical" -tile 168 "zap, lightning, horizontal" -tile 169 "zap, lightning, left slant" -tile 170 "zap, lightning, right slant" -tile 171 "zap, poison gas, vertical" -tile 172 "zap, poison gas, horizontal" -tile 173 "zap, poison gas, left slant" -tile 174 "zap, poison gas, right slant" -tile 175 "zap, acid, vertical" -tile 176 "zap, acid, horizontal" -tile 177 "zap, acid, left slant" -tile 178 "zap, acid, right slant" -tile 179 "warning, 0" -tile 180 "warning, 1" -tile 181 "warning, 2" -tile 182 "warning, 3" -tile 183 "warning, 4" -tile 184 "warning, 5" -tile 185 "cmap, wall, vertical, mine" -tile 186 "cmap, wall, horizontal, mine" -tile 187 "cmap, wall, top left corner, mine" -tile 188 "cmap, wall, top right corner, mine" -tile 189 "cmap, wall, bottom left corner, mine" -tile 190 "cmap, wall, bottom right corner, mine" -tile 191 "cmap, wall, crosswall, mine" -tile 192 "cmap, wall, tee up, mine" -tile 193 "cmap, wall, tee down, mine" -tile 194 "cmap, wall, tee left, mine" -tile 195 "cmap, wall, tee right, mine" -tile 196 "cmap, wall, vertical, gehennom" -tile 197 "cmap, wall, horizontal, gehennom" -tile 198 "cmap, wall, top left corner, gehennom" -tile 199 "cmap, wall, top right corner, gehennom" -tile 200 "cmap, wall, bottom left corner, gehennom" -tile 201 "cmap, wall, bottom right corner, gehennom" -tile 202 "cmap, wall, crosswall, gehennom" -tile 203 "cmap, wall, tee up, gehennom" -tile 204 "cmap, wall, tee down, gehennom" -tile 205 "cmap, wall, tee left, gehennom" -tile 206 "cmap, wall, tee right, gehennom" -tile 207 "cmap, wall, vertical, knox" -tile 208 "cmap, wall, horizontal, knox" -tile 209 "cmap, wall, top left corner, knox" -tile 210 "cmap, wall, top right corner, knox" -tile 211 "cmap, wall, bottom left corner, knox" -tile 212 "cmap, wall, bottom right corner, knox" -tile 213 "cmap, wall, crosswall, knox" -tile 214 "cmap, wall, tee up, knox" -tile 215 "cmap, wall, tee down, knox" -tile 216 "cmap, wall, tee left, knox" -tile 217 "cmap, wall, tee right, knox" -tile 218 "cmap, wall, vertical, sokoban" -tile 219 "cmap, wall, horizontal, sokoban" -tile 220 "cmap, wall, top left corner, sokoban" -tile 221 "cmap, wall, top right corner, sokoban" -tile 222 "cmap, wall, bottom left corner, sokoban" -tile 223 "cmap, wall, bottom right corner, sokoban" -tile 224 "cmap, wall, crosswall, sokoban" -tile 225 "cmap, wall, tee up, sokoban" -tile 226 "cmap, wall, tee down, sokoban" -tile 227 "cmap, wall, tee left, sokoban" -tile 228 "cmap, wall, tee right, sokoban" +tile 35 "cmap, sparkling water" +tile 36 "cmap, boiling blood" +tile 37 "cmap, lowered drawbridge, vertical" +tile 38 "cmap, lowered drawbridge, horizontal" +tile 39 "cmap, raised drawbridge, vertical" +tile 40 "cmap, raised drawbridge, horizontal" +tile 41 "cmap, air" +tile 42 "cmap, cloud" +tile 43 "cmap, water" +tile 44 "cmap, trap, arrow trap" +tile 45 "cmap, trap, dart trap" +tile 46 "cmap, trap, falling rock trap" +tile 47 "cmap, trap, squeaky board" +tile 48 "cmap, trap, bear trap" +tile 49 "cmap, trap, land mine" +tile 50 "cmap, trap, rolling boulder trap" +tile 51 "cmap, trap, sleeping gas trap" +tile 52 "cmap, trap, rust trap" +tile 53 "cmap, trap, fire trap" +tile 54 "cmap, trap, pit" +tile 55 "cmap, trap, spiked pit" +tile 56 "cmap, trap, hole" +tile 57 "cmap, trap, trap door" +tile 58 "cmap, trap, teleportation trap" +tile 59 "cmap, trap, level teleporter" +tile 60 "cmap, trap, magic portal" +tile 61 "cmap, trap, web" +tile 62 "cmap, trap, statue trap" +tile 63 "cmap, trap, magic trap" +tile 64 "cmap, trap, anti-magic field" +tile 65 "cmap, trap, polymorph trap" +tile 66 "cmap, effect, vertical beam" +tile 67 "cmap, effect, horizontal beam" +tile 68 "cmap, effect, left slant beam" +tile 69 "cmap, effect, right slant beam" +tile 70 "cmap, effect, dig beam" +tile 71 "cmap, effect, camera flash" +tile 72 "cmap, effect, thrown boomerang, open left" +tile 73 "cmap, effect, thrown boomerang, open right" +tile 74 "cmap, effect, magic shield 1" +tile 75 "cmap, effect, magic shield 2" +tile 76 "cmap, effect, magic shield 3" +tile 77 "cmap, effect, magic shield 4" +tile 78 "cmap, swallow, top left / monster, *, swallow, top left" +tile 79 "cmap, swallow, top center / monster, *, swallow, top center" +tile 80 "cmap, swallow, top right / monster, *, swallow, top right" +tile 81 "cmap, swallow, middle left / monster, *, swallow, middle left" +tile 82 "cmap, swallow, middle right / monster, *, swallow, middle right" +tile 83 "cmap, swallow, bottom left / monster, *, swallow, bottom left" +tile 84 "cmap, swallow, bottom center / monster, *, swallow, bottom center" +tile 85 "cmap, swallow, bottom right / monster, *, swallow, bottom right" +tile 86 "explosion, dark, top left" +tile 87 "explosion, dark, top center" +tile 88 "explosion, dark, top right" +tile 89 "explosion, dark, middle left" +tile 90 "explosion, dark, middle center" +tile 91 "explosion, dark, middle right" +tile 92 "explosion, dark, bottom left" +tile 93 "explosion, dark, bottom center" +tile 94 "explosion, dark, bottom right" +tile 95 "explosion, noxious, top left" +tile 96 "explosion, noxious, top center" +tile 97 "explosion, noxious, top right" +tile 98 "explosion, noxious, middle left" +tile 99 "explosion, noxious, middle center" +tile 100 "explosion, noxious, middle right" +tile 101 "explosion, noxious, bottom left" +tile 102 "explosion, noxious, bottom center" +tile 103 "explosion, noxious, bottom right" +tile 104 "explosion, muddy, top left" +tile 105 "explosion, muddy, top center" +tile 106 "explosion, muddy, top right" +tile 107 "explosion, muddy, middle left" +tile 108 "explosion, muddy, middle center" +tile 109 "explosion, muddy, middle right" +tile 110 "explosion, muddy, bottom left" +tile 111 "explosion, muddy, bottom center" +tile 112 "explosion, muddy, bottom right" +tile 113 "explosion, wet, top left" +tile 114 "explosion, wet, top center" +tile 115 "explosion, wet, top right" +tile 116 "explosion, wet, middle left" +tile 117 "explosion, wet, middle center" +tile 118 "explosion, wet, middle right" +tile 119 "explosion, wet, bottom left" +tile 120 "explosion, wet, bottom center" +tile 121 "explosion, wet, bottom right" +tile 122 "explosion, magical, top left" +tile 123 "explosion, magical, top center" +tile 124 "explosion, magical, top right" +tile 125 "explosion, magical, middle left" +tile 126 "explosion, magical, middle center" +tile 127 "explosion, magical, middle right" +tile 128 "explosion, magical, bottom left" +tile 129 "explosion, magical, bottom center" +tile 130 "explosion, magical, bottom right" +tile 131 "explosion, fiery, top left" +tile 132 "explosion, fiery, top center" +tile 133 "explosion, fiery, top right" +tile 134 "explosion, fiery, middle left" +tile 135 "explosion, fiery, middle center" +tile 136 "explosion, fiery, middle right" +tile 137 "explosion, fiery, bottom left" +tile 138 "explosion, fiery, bottom center" +tile 139 "explosion, fiery, bottom right" +tile 140 "explosion, frosty, top left" +tile 141 "explosion, frosty, top center" +tile 142 "explosion, frosty, top right" +tile 143 "explosion, frosty, middle left" +tile 144 "explosion, frosty, middle center" +tile 145 "explosion, frosty, middle right" +tile 146 "explosion, frosty, bottom left" +tile 147 "explosion, frosty, bottom center" +tile 148 "explosion, frosty, bottom right" +tile 149 "zap, magic missile, vertical" +tile 150 "zap, magic missile, horizontal" +tile 151 "zap, magic missile, left slant" +tile 152 "zap, magic missile, right slant" +tile 153 "zap, fire, vertical" +tile 154 "zap, fire, horizontal" +tile 155 "zap, fire, left slant" +tile 156 "zap, fire, right slant" +tile 157 "zap, cold, vertical" +tile 158 "zap, cold, horizontal" +tile 159 "zap, cold, left slant" +tile 160 "zap, cold, right slant" +tile 161 "zap, sleep, vertical" +tile 162 "zap, sleep, horizontal" +tile 163 "zap, sleep, left slant" +tile 164 "zap, sleep, right slant" +tile 165 "zap, death, vertical" +tile 166 "zap, death, horizontal" +tile 167 "zap, death, left slant" +tile 168 "zap, death, right slant" +tile 169 "zap, lightning, vertical" +tile 170 "zap, lightning, horizontal" +tile 171 "zap, lightning, left slant" +tile 172 "zap, lightning, right slant" +tile 173 "zap, poison gas, vertical" +tile 174 "zap, poison gas, horizontal" +tile 175 "zap, poison gas, left slant" +tile 176 "zap, poison gas, right slant" +tile 177 "zap, acid, vertical" +tile 178 "zap, acid, horizontal" +tile 179 "zap, acid, left slant" +tile 180 "zap, acid, right slant" +tile 181 "warning, 0" +tile 182 "warning, 1" +tile 183 "warning, 2" +tile 184 "warning, 3" +tile 185 "warning, 4" +tile 186 "warning, 5" +tile 187 "cmap, wall, vertical, mine" +tile 188 "cmap, wall, horizontal, mine" +tile 189 "cmap, wall, top left corner, mine" +tile 190 "cmap, wall, top right corner, mine" +tile 191 "cmap, wall, bottom left corner, mine" +tile 192 "cmap, wall, bottom right corner, mine" +tile 193 "cmap, wall, crosswall, mine" +tile 194 "cmap, wall, tee up, mine" +tile 195 "cmap, wall, tee down, mine" +tile 196 "cmap, wall, tee left, mine" +tile 197 "cmap, wall, tee right, mine" +tile 198 "cmap, wall, vertical, gehennom" +tile 199 "cmap, wall, horizontal, gehennom" +tile 200 "cmap, wall, top left corner, gehennom" +tile 201 "cmap, wall, top right corner, gehennom" +tile 202 "cmap, wall, bottom left corner, gehennom" +tile 203 "cmap, wall, bottom right corner, gehennom" +tile 204 "cmap, wall, crosswall, gehennom" +tile 205 "cmap, wall, tee up, gehennom" +tile 206 "cmap, wall, tee down, gehennom" +tile 207 "cmap, wall, tee left, gehennom" +tile 208 "cmap, wall, tee right, gehennom" +tile 209 "cmap, wall, vertical, knox" +tile 210 "cmap, wall, horizontal, knox" +tile 211 "cmap, wall, top left corner, knox" +tile 212 "cmap, wall, top right corner, knox" +tile 213 "cmap, wall, bottom left corner, knox" +tile 214 "cmap, wall, bottom right corner, knox" +tile 215 "cmap, wall, crosswall, knox" +tile 216 "cmap, wall, tee up, knox" +tile 217 "cmap, wall, tee down, knox" +tile 218 "cmap, wall, tee left, knox" +tile 219 "cmap, wall, tee right, knox" +tile 220 "cmap, wall, vertical, sokoban" +tile 221 "cmap, wall, horizontal, sokoban" +tile 222 "cmap, wall, top left corner, sokoban" +tile 223 "cmap, wall, top right corner, sokoban" +tile 224 "cmap, wall, bottom left corner, sokoban" +tile 225 "cmap, wall, bottom right corner, sokoban" +tile 226 "cmap, wall, crosswall, sokoban" +tile 227 "cmap, wall, tee up, sokoban" +tile 228 "cmap, wall, tee down, sokoban" +tile 229 "cmap, wall, tee left, sokoban" +tile 230 "cmap, wall, tee right, sokoban" diff -Naurbd slashem-0.0.8E0/win/share/other.txt slashem-0.0.8E1/win/share/other.txt --- slashem-0.0.8E0/win/share/other.txt 2005-07-02 08:31:38.000000000 +0100 +++ slashem-0.0.8E1/win/share/other.txt 2006-05-15 12:08:59.000000000 +0100 @@ -679,7 +679,45 @@ DDDDKCDDDDCDDDDD DDDDDDDDDDDKDDDD } -# tile 35 (lowered drawbridge) +# tile 35 (sparkling water) +{ + MMMMMMMMMMNNNMMM + MEEEEMMMMNEMENMM + MMMMEEMEEEMMMMMM + MMMMMEEEMMMMMMMM + MNNMMMMMMEEMMMMM + EMENMMMMEMEEMMEE + MMMENMEMMMMEMMEM + MMMMEEMMMMMMEEMM + MMMMMMMMMMMMMMMM + NMMEEMMMEEEEMMMM + NNEMMEMEMMMEEMMN + MEMMMMEMNNMMEENM + MMMMMMMNEEEEMMMM + MMEEEMMEMMMEEEMM + MEMMEEMMMEMMEEEM + EEMMMMEEEMMMMMEE +} +# tile 36 (boiling blood) +{ + DDDDDDCDDDDDDDDD + DDDDDCDKDDDDDDDD + DDCCDDKDDDDCCCDD + DCJJKDDDDDCKJJKD + DCJDKDDDDDCJCDKD + DDKCDDDDDDCJDCKD + DDDDDDDCDDDKKKDD + DDDCDDDDDDDDDDDD + DDDDJDCDDDDCDDDD + DDDDDDDDDDCJKDDD + DDDDDDDDDDDKDDDC + DDDDCCDDDDDDDDDD + DDDCJJKDDDDDDDDD + CDDCJDKDDDDDDJDD + DDDDKCDDDDCDDDDD + DDDDDDDDDDDKDDDD +} +# tile 37 (lowered drawbridge) { ECKACKCKKCKAKCAE EJKKKKKKKKCKKJAA @@ -698,7 +736,7 @@ EEJJJJJKJJJKJAAA EJCKKKKKKKKCKJAA } -# tile 36 (lowered drawbridge) +# tile 38 (lowered drawbridge) { EEEEEEEEEEEEEEEE JEJCJEJKJEJKJEJK @@ -717,7 +755,7 @@ AAAAAAAAAAAAAAAA AAAEAAAEAAAEAAAE } -# tile 37 (raised drawbridge) +# tile 39 (raised drawbridge) { MMMMMMMMMMMMMMMM MMJKJMJKJMJKJMMM