diff --recursive -P -C3 slashem-0.0.7E7F2/dat/castle.des slethe-0.0.7E7F2/dat/castle.des
*** slashem-0.0.7E7F2/dat/castle.des	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/castle.des	2006-05-28 15:31:15.634006456 +0200
***************
*** 13,241 ****
  # Note : If you don't play the right tune, you get indications like in the
  #	 MasterMind game...
  #
! # To motivate the player : there are 4 storerooms (armors, weapons, food and
! # gems) and a wand of wishing in one of the 4 towers...
  
! MAZE:"castle",random
! FLAGS: noteleport, lethe
  GEOMETRY:center,center
  MAP
! }}}}}}}}}.............................................}}}}}}}}}
! }-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}
! }|.....|-----------------------------------------------|.....|}
! }|.....+...............................................+.....|}
! }-------------------------------+-----------------------------}
! }}}}}}|........|..........+...........|.......S.S.......|}}}}}}
! .....}|........|..........|...........|.......|.|.......|}.....
! .....}|........------------...........---------S---------}.....
! .....}|...{....+..........+.........\.S.................+......
! .....}|........------------...........---------S---------}.....
! .....}|........|..........|...........|.......|.|.......|}.....
! }}}}}}|........|..........+...........|.......S.S.......|}}}}}}
! }-------------------------------+-----------------------------}
! }|.....+...............................................+.....|}
! }|.....|-----------------------------------------------|.....|}
! }-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}
! }}}}}}}}}.............................................}}}}}}}}}
  ENDMAP
! 
  # Random registers initialisation
  RANDOM_OBJECTS:'[',')','*','%'
! RANDOM_PLACES:(04,02),(58,02),(04,14),(58,14)
  RANDOM_MONSTERS:'L','N','E','H','M','O','R','T','X','Z'
  
! TELEPORT_REGION:levregion(01,00,10,20),(1,1,61,15),down
! TELEPORT_REGION:levregion(69,00,79,20),(1,1,61,15),up
! STAIR:levregion(01,00,10,20),(0,0,62,16),up
! FOUNTAIN:(10,08)
  # Doors
! DOOR:closed,(07,03)
! DOOR:closed,(55,03)
! DOOR:locked,(32,04)
! DOOR:locked,(26,05)
! DOOR:locked,(46,05)
! DOOR:locked,(48,05)
! DOOR:locked,(47,07)
! DOOR:closed,(15,08)
! DOOR:closed,(26,08)
! DOOR:locked,(38,08)
! DOOR:locked,(56,08)
! DOOR:locked,(47,09)
! DOOR:locked,(26,11)
! DOOR:locked,(46,11)
! DOOR:locked,(48,11)
! DOOR:locked,(32,12)
! DOOR:closed,(07,13)
! DOOR:closed,(55,13)
  # The drawbridge
! DRAWBRIDGE:(05,08),east,closed
  # Storeroom number 1
! OBJECT:object[0],random,(39,05)
! OBJECT:object[0],random,(40,05)
! OBJECT:object[0],random,(41,05)
! OBJECT:object[0],random,(42,05)
! OBJECT:object[0],random,(43,05)
! OBJECT:object[0],random,(44,05)
! OBJECT:object[0],random,(45,05)
! OBJECT:object[0],random,(39,06)
! OBJECT:object[0],random,(40,06)
! OBJECT:object[0],random,(41,06)
! OBJECT:object[0],random,(42,06)
! OBJECT:object[0],random,(43,06)
! OBJECT:object[0],random,(44,06)
! OBJECT:object[0],random,(45,06)
  # Storeroom number 2
! OBJECT:object[1],random,(49,05)
! OBJECT:object[1],random,(50,05)
! OBJECT:object[1],random,(51,05)
! OBJECT:object[1],random,(52,05)
! OBJECT:object[1],random,(53,05)
! OBJECT:object[1],random,(54,05)
! OBJECT:object[1],random,(55,05)
! OBJECT:object[1],random,(49,06)
! OBJECT:object[1],random,(50,06)
! OBJECT:object[1],random,(51,06)
! OBJECT:object[1],random,(52,06)
! OBJECT:object[1],random,(53,06)
! OBJECT:object[1],random,(54,06)
! OBJECT:object[1],random,(55,06)
  # Storeroom number 3
! OBJECT:object[2],random,(39,10)
! OBJECT:object[2],random,(40,10)
! OBJECT:object[2],random,(41,10)
! OBJECT:object[2],random,(42,10)
! OBJECT:object[2],random,(43,10)
! OBJECT:object[2],random,(44,10)
! OBJECT:object[2],random,(45,10)
! OBJECT:object[2],random,(39,11)
! OBJECT:object[2],random,(40,11)
! OBJECT:object[2],random,(41,11)
! OBJECT:object[2],random,(42,11)
! OBJECT:object[2],random,(43,11)
! OBJECT:object[2],random,(44,11)
! OBJECT:object[2],random,(45,11)
  # Storeroom number 4
! OBJECT:object[3],random,(49,10)
! OBJECT:object[3],random,(50,10)
! OBJECT:object[3],random,(51,10)
! OBJECT:object[3],random,(52,10)
! OBJECT:object[3],random,(53,10)
! OBJECT:object[3],random,(54,10)
! OBJECT:object[3],random,(55,10)
! OBJECT:object[3],random,(49,11)
! OBJECT:object[3],random,(50,11)
! OBJECT:object[3],random,(51,11)
! OBJECT:object[3],random,(52,11)
! OBJECT:object[3],random,(53,11)
! OBJECT:object[3],random,(54,11)
! OBJECT:object[3],random,(55,11)
  # THE WAND OF WISHING in 1 of the 4 towers
  CONTAINER:'(',"chest",place[0]
  OBJECT:'/',"wishing",contained
  # Prevent monsters from eating it.  (@'s never eat objects)
  ENGRAVING:place[0],burn,"Elbereth"
  # The treasure of the lord
! OBJECT:'(',"chest",(37,08)
  # Traps
! TRAP:"trap door",(40,08)
! TRAP:"trap door",(44,08)
! TRAP:"trap door",(48,08)
! TRAP:"trap door",(52,08)
  TRAP:"trap door",(55,08)
  # Soldiers guarding the entry hall
! MONSTER:'@',"soldier",(08,06)
! MONSTER:'@',"soldier",(09,05)
! MONSTER:'@',"soldier",(11,05)
! MONSTER:'@',"soldier",(12,06)
! MONSTER:'@',"soldier",(08,10)
! MONSTER:'@',"soldier",(09,11)
! MONSTER:'@',"soldier",(11,11)
! MONSTER:'@',"soldier",(12,10)
! MONSTER:'@',"lieutenant",(09,08)
  # Soldiers guarding the towers
! MONSTER:'@',"soldier",(03,02)
! MONSTER:'@',"soldier",(05,02)
! MONSTER:'@',"soldier",(57,02)
! MONSTER:'@',"soldier",(59,02)
! MONSTER:'@',"soldier",(03,14)
! MONSTER:'@',"soldier",(05,14)
! MONSTER:'@',"soldier",(57,14)
! MONSTER:'@',"soldier",(59,14)
  # The four dragons that are guarding the storerooms
! MONSTER:'D',random,(47,05)
! MONSTER:'D',random,(47,06)
! MONSTER:'D',random,(47,10)
! MONSTER:'D',random,(47,11)
  # Sea monsters in the moat
! MONSTER:';',"giant eel",(05,07)
! MONSTER:';',"giant eel",(05,09)
! MONSTER:';',"giant eel",(57,07)
! MONSTER:';',"giant eel",(57,09)
! MONSTER:';',"shark",(05,00)
! MONSTER:';',"shark",(05,16)
! MONSTER:';',"shark",(57,00)
! MONSTER:';',"shark",(57,16)
  # The throne room and the court monsters
! MONSTER:monster[0],random,(27,05)
! MONSTER:monster[1],random,(30,05)
! MONSTER:monster[2],random,(33,05)
! MONSTER:monster[3],random,(36,05)
! MONSTER:monster[4],random,(28,06)
! MONSTER:monster[5],random,(31,06)
! MONSTER:monster[6],random,(34,06)
! MONSTER:monster[7],random,(37,06)
! MONSTER:monster[8],random,(27,07)
! MONSTER:monster[9],random,(30,07)
! MONSTER:monster[0],random,(33,07)
! MONSTER:monster[1],random,(36,07)
! MONSTER:monster[2],random,(28,08)
! MONSTER:monster[3],random,(31,08)
! MONSTER:monster[4],random,(34,08)
! MONSTER:monster[5],random,(27,09)
! MONSTER:monster[6],random,(30,09)
! MONSTER:monster[7],random,(33,09)
! MONSTER:monster[8],random,(36,09)
! MONSTER:monster[9],random,(28,10)
! MONSTER:monster[0],random,(31,10)
! MONSTER:monster[1],random,(34,10)
! MONSTER:monster[2],random,(37,10)
! MONSTER:monster[3],random,(27,11)
! MONSTER:monster[4],random,(30,11)
! MONSTER:monster[5],random,(33,11)
! MONSTER:monster[6],random,(36,11)
! # MazeWalks
! MAZEWALK:(00,10),west
! MAZEWALK:(62,06),east
  # Non diggable walls
! NON_DIGGABLE:(00,00,62,16)
  # Subrooms:
  #   Entire castle area
! REGION:(00,00,62,16),unlit,"ordinary"
  #   Courtyards
! REGION:(00,05,05,11),lit,"ordinary"
! REGION:(57,05,62,11),lit,"ordinary"
  #   Throne room
! REGION:(27,05,37,11),lit,"throne",unfilled
  #   Antechamber
! REGION:(07,05,14,11),lit,"ordinary"
  #   Storerooms
! REGION:(39,05,45,06),lit,"ordinary"
! REGION:(39,10,45,11),lit,"ordinary"
! REGION:(49,05,55,06),lit,"ordinary"
! REGION:(49,10,55,11),lit,"ordinary"
  #   Corners
! REGION:(02,02,06,03),lit,"ordinary"
! REGION:(56,02,60,03),lit,"ordinary"
! REGION:(02,13,06,14),lit,"ordinary"
! REGION:(56,13,60,14),lit,"ordinary"
  #   Barracks
! REGION:(16,05,25,06),lit,"barracks"
! REGION:(16,10,25,11),lit,"barracks"
  #   Hallways
! REGION:(08,03,54,03),unlit,"ordinary"
! REGION:(08,13,54,13),unlit,"ordinary"
! REGION:(16,08,25,08),unlit,"ordinary"
! REGION:(39,08,55,08),unlit,"ordinary"
  #   Storeroom alcoves
! REGION:(47,05,47,06),unlit,"ordinary"
! REGION:(47,10,47,11),unlit,"ordinary"
--- 13,370 ----
  # Note : If you don't play the right tune, you get indications like in the
  #	 MasterMind game...
  #
! #
! # Mik: Added Lethe effect to the water and side towers so you cannot simply
! #      go around the castle.
! #
  
! MAZE:"castle",' '
! FLAGS: noteleport,lethe
  GEOMETRY:center,center
  MAP
!       .}}}}}}}}}}}}}}}}}}}}}}....|.....|.....|....}}}}}}}}}}}}}}}}}}}}.     
!  ... .}}-------}}}}}}}}}}}}}}....S.}}}.|.}}}.S....}}}}}}}}}}}}-------}.  .. 
!  ... .}}|.....|-----------------------+-+---------------------|.....|}. ... 
!  ..  .}}|.....+..................|.....|......................+.....|}. ..  
!   # ..}}-------------------+----------+-+----------------------------}.  .  
!  ## ...}}}}}}|........|..........+...........|.......S.S.......|}}}}}}..... 
!  #   .......}|........|..........|...........|.......|.|.......|}...... ....
! ... ........}|........------------...........---------S---------}......  ...
! ............}|...{....+..........+.........\.S.................+........ .. 
!  ....  .....}|........------------...........---------S---------}.......... 
!   ... ......}|........|..........|...........|.......|.|.......|}......  ...
!  .....}}}}}}}|........|..........+...........|.......S.S.......|}}}}}}}}  ..
! .....}}}-------------------+----------+-+----------------------------}}}}}}}
! }}}}}}}}|.....+..................|.....|......................+.....|}}}}}}}
! }}}}}}}}|.....|-----------------------+-+---------------------|.....|}}}}}}}
! }}}}}}}}-------}}}}}}}}}}}}}}....S.}}}.|.}}}.S....}}}}}}}}}}}}-------}}}}}..
! ....}}}}}}}}}}}}}}}}}}}}}}}}}....|.....|.....|....}}}}}}}}}}}}}}}}}}}}}}....
  ENDMAP
!  
  # Random registers initialisation
  RANDOM_OBJECTS:'[',')','*','%'
! RANDOM_PLACES:(11,02),(65,02),(11,14),(65,14)
  RANDOM_MONSTERS:'L','N','E','H','M','O','R','T','X','Z'
  
! STAIR:(01,01),up
! STAIR:(74,01),down
! BRANCH:(23,05,62,11),(00,00,00,00)
! 
  # Doors
! DOOR:locked,(33,01)
! DOOR:locked,(38,02)
! DOOR:locked,(40,02)
! DOOR:locked,(45,01)
! DOOR:locked,(33,15)
! DOOR:locked,(38,14)
! DOOR:locked,(40,14)
! DOOR:locked,(45,15)
! DOOR:closed,(14,03)
! DOOR:closed,(62,03)
! DOOR:locked,(27,04)
! DOOR:locked,(38,04)
! DOOR:closed,(40,04)
! DOOR:closed,(33,05)
! DOOR:locked,(53,05)
! DOOR:locked,(55,05)
! DOOR:locked,(54,07)
! DOOR:closed,(22,08)
! DOOR:closed,(33,08)
! DOOR:locked,(45,08)
! DOOR:locked,(63,08)
! DOOR:locked,(54,09)
! DOOR:closed,(33,11)
! DOOR:locked,(53,11)
! DOOR:locked,(55,11)
! DOOR:closed,(40,12)
! DOOR:locked,(27,12)
! DOOR:locked,(38,12)
! DOOR:closed,(14,13)
! DOOR:closed,(62,13)
  # The drawbridge
! DRAWBRIDGE:(12,08),east,closed
  # Storeroom number 1
! OBJECT:object[0],random,(46,05)
! OBJECT:object[0],random,(47,05)
! OBJECT:object[0],random,(48,05)
! OBJECT:object[0],random,(49,05)
! OBJECT:object[0],random,(50,05)
! OBJECT:object[0],random,(51,05)
! OBJECT:object[0],random,(52,05)
! OBJECT:object[0],random,(46,06)
! OBJECT:object[0],random,(47,06)
! OBJECT:object[0],random,(48,06)
! OBJECT:object[0],random,(49,06)
! OBJECT:object[0],random,(50,06)
! OBJECT:object[0],random,(51,06)
! OBJECT:object[0],random,(52,06)
  # Storeroom number 2
! OBJECT:object[1],random,(56,05)
! OBJECT:object[1],random,(57,05)
! OBJECT:object[1],random,(58,05)
! OBJECT:object[1],random,(59,05)
! OBJECT:object[1],random,(60,05)
! OBJECT:object[1],random,(61,05)
! OBJECT:object[1],random,(62,05)
! OBJECT:object[1],random,(56,06)
! OBJECT:object[1],random,(57,06)
! OBJECT:object[1],random,(58,06)
! OBJECT:object[1],random,(59,06)
! OBJECT:object[1],random,(60,06)
! OBJECT:object[1],random,(61,06)
! OBJECT:object[1],random,(62,06)
  # Storeroom number 3
! OBJECT:object[2],random,(46,10)
! OBJECT:object[2],random,(47,10)
! OBJECT:object[2],random,(48,10)
! OBJECT:object[2],random,(49,10)
! OBJECT:object[2],random,(50,10)
! OBJECT:object[2],random,(51,10)
! OBJECT:object[2],random,(52,10)
! OBJECT:object[2],random,(46,11)
! OBJECT:object[2],random,(47,11)
! OBJECT:object[2],random,(48,11)
! OBJECT:object[2],random,(49,11)
! OBJECT:object[2],random,(50,11)
! OBJECT:object[2],random,(51,11)
! OBJECT:object[2],random,(52,11)
  # Storeroom number 4
! OBJECT:object[3],random,(56,10)
! OBJECT:object[3],random,(57,10)
! OBJECT:object[3],random,(58,10)
! OBJECT:object[3],random,(59,10)
! OBJECT:object[3],random,(60,10)
! OBJECT:object[3],random,(61,10)
! OBJECT:object[3],random,(62,10)
! OBJECT:object[3],random,(56,11)
! OBJECT:object[3],random,(57,11)
! OBJECT:object[3],random,(58,11)
! OBJECT:object[3],random,(59,11)
! OBJECT:object[3],random,(60,11)
! OBJECT:object[3],random,(61,11)
! OBJECT:object[3],random,(62,11)
  # THE WAND OF WISHING in 1 of the 4 towers
  CONTAINER:'(',"chest",place[0]
  OBJECT:'/',"wishing",contained
  # Prevent monsters from eating it.  (@'s never eat objects)
  ENGRAVING:place[0],burn,"Elbereth"
  # The treasure of the lord
! OBJECT:'(',"chest",(44,08)
  # Traps
! TRAP:"trap door",(47,08)
! TRAP:"trap door",(51,08)
  TRAP:"trap door",(55,08)
+ TRAP:"trap door",(59,08)
+ TRAP:"trap door",(62,08)
+ # Soldiers guarding outer towers...
+ MONSTER:'@',"soldier",(31,00)
+ MONSTER:'@',"soldier",(31,01)
+ OBJECT:'/',"lightning",(31,01)
+ OBJECT:'(',"bugle",(31,00)
+ MONSTER:'@',"soldier",(31,16)
+ MONSTER:'@',"soldier",(31,15)
+ OBJECT:'/',"lightning",(31,15)
+ OBJECT:'(',"bugle",(31,16)
+ MONSTER:'@',"soldier",(47,00)
+ MONSTER:'@',"soldier",(47,01)
+ OBJECT:'/',"lightning",(47,01)
+ MONSTER:'@',"soldier",(47,16)
+ MONSTER:'@',"soldier",(47,15)
+ OBJECT:'/',"lightning",(47,15)
  # Soldiers guarding the entry hall
! MONSTER:'@',"soldier",(15,06)
! MONSTER:'@',"soldier",(16,05)
! MONSTER:'@',"soldier",(18,05)
! MONSTER:'@',"soldier",(19,06)
! MONSTER:'@',"soldier",(15,10)
! MONSTER:'@',"soldier",(16,11)
! MONSTER:'@',"soldier",(18,11)
! MONSTER:'@',"soldier",(19,10)
! MONSTER:'@',"lieutenant",(16,08)
  # Soldiers guarding the towers
! MONSTER:'@',"soldier",(10,02)
! MONSTER:'@',"soldier",(12,02)
! MONSTER:'@',"soldier",(64,02)
! MONSTER:'@',"soldier",(66,02)
! MONSTER:'@',"soldier",(10,14)
! MONSTER:'@',"soldier",(12,14)
! MONSTER:'@',"soldier",(64,14)
! MONSTER:'@',"soldier",(66,14)
  # The four dragons that are guarding the storerooms
! MONSTER:'D',random,(54,05)
! MONSTER:'D',random,(54,06)
! MONSTER:'D',random,(54,10)
! MONSTER:'D',random,(54,11)
  # Sea monsters in the moat
! MONSTER:';',"giant eel",(12,07)
! MONSTER:';',"giant eel",(12,09)
! MONSTER:';',"giant eel",(64,07)
! MONSTER:';',"giant eel",(64,09)
! MONSTER:';',"shark",(12,00)
! MONSTER:';',"shark",(12,16)
! MONSTER:';',"shark",(64,00)
! MONSTER:';',"shark",(64,16)
  # The throne room and the court monsters
! MONSTER:monster[0],random,(34,05)
! MONSTER:monster[1],random,(37,05)
! MONSTER:monster[2],random,(40,05)
! MONSTER:monster[3],random,(43,05)
! MONSTER:monster[4],random,(35,06)
! MONSTER:monster[5],random,(38,06)
! MONSTER:monster[6],random,(41,06)
! MONSTER:monster[7],random,(44,06)
! MONSTER:monster[8],random,(34,07)
! MONSTER:monster[9],random,(37,07)
! MONSTER:monster[0],random,(40,07)
! MONSTER:monster[1],random,(43,07)
! MONSTER:monster[2],random,(35,08)
! MONSTER:monster[3],random,(38,08)
! MONSTER:monster[4],random,(41,08)
! MONSTER:monster[5],random,(34,09)
! MONSTER:monster[6],random,(37,09)
! MONSTER:monster[7],random,(40,09)
! MONSTER:monster[8],random,(43,09)
! MONSTER:monster[9],random,(35,10)
! MONSTER:monster[0],random,(38,10)
! MONSTER:monster[1],random,(41,10)
! MONSTER:monster[2],random,(44,10)
! MONSTER:monster[3],random,(34,11)
! MONSTER:monster[4],random,(37,11)
! MONSTER:monster[5],random,(40,11)
! MONSTER:monster[6],random,(43,11)
  # Non diggable walls
! NON_DIGGABLE:(08,00,68,16)
  # Subrooms:
  #   Entire castle area
! REGION:(00,00,74,16),unlit,"ordinary"
  #   Courtyards
! REGION:(07,05,12,11),lit,"ordinary"
! REGION:(64,05,69,11),lit,"ordinary"
  #   Throne room
! REGION:(34,05,44,11),lit,"throne",unfilled
  #   Antechamber
! REGION:(12,05,21,11),lit,"ordinary"
  #   Storerooms
! REGION:(46,05,52,06),lit,"ordinary"
! REGION:(46,10,52,11),lit,"ordinary"
! REGION:(56,05,62,06),lit,"ordinary"
! REGION:(56,10,62,11),lit,"ordinary"
  #   Corners
! REGION:(09,02,13,03),lit,"ordinary"
! REGION:(63,02,67,03),lit,"ordinary"
! REGION:(09,13,13,14),lit,"ordinary"
! REGION:(63,13,67,14),lit,"ordinary"
  #   Barracks
! REGION:(23,05,32,06),lit,"barracks"
! REGION:(23,10,32,11),lit,"barracks"
  #   Hallways
! REGION:(15,03,61,03),unlit,"ordinary"
! REGION:(15,13,61,13),unlit,"ordinary"
! REGION:(23,08,32,08),unlit,"ordinary"
! REGION:(46,08,62,08),unlit,"ordinary"
  #   Storeroom alcoves
! REGION:(54,05,54,06),unlit,"ordinary"
! REGION:(54,10,54,11),unlit,"ordinary"
! 
! MAZE:"ucastle",random
! FLAGS: noteleport,hardfloor
! GEOMETRY:center,center
! MAP
!                                          # # # # # # # # # # #
!    -----                                -+-+-+-+-+-+-+-+-+-+-+-
!    |...+###          ########           |.....................|
!    -----  #          #------+------     |.....................|
!       ----+----      #|...........|     |.....................|
!       |.......|      #|...........+#####+.....................|
!       |.......+#######|...........|     |.....................|
!       |.......|       -------------     |.....................|
!       ----+----                         |.....................|
!           #         ----------          -+-+-+-+-+-+-+-+-+-+-+-
!           #         |........|           # # # # # # # # # # #
!           ##########+........|
!                     |........|
!                     ----------
! ENDMAP
! 
! #  Regions
! REGION:(04,02,06,02),lit,"ordinary"
! REGION:(07,05,13,07),lit,"barracks"
! REGION:(21,10,28,12),unlit,"ordinary"
! REGION:(23,04,33,06),unlit,"ordinary"
! REGION:(41,02,61,08),unlit,"swamp"
! # Stairs
! BRANCH:(04,02,04,02),(00,00,00,00)
! TELEPORT_REGION:(41,02,61,08),(00,00,00,00)
! #  Doors
! DOOR:closed,(07,02)
! DOOR:closed,(10,04)
! DOOR:locked,(10,08)
! DOOR:locked,(20,11)
! DOOR:locked,(14,06)
! DOOR:locked,(28,03)
! DOOR:locked,(34,05)
! DOOR:locked,(40,05)
! # Top row
! DOOR:random,(41,01)
! DOOR:random,(43,01)
! DOOR:random,(45,01)
! DOOR:random,(47,01)
! DOOR:random,(49,01)
! DOOR:random,(51,01)
! DOOR:random,(53,01)
! DOOR:random,(55,01)
! DOOR:random,(57,01)
! DOOR:random,(59,01)
! DOOR:random,(61,01)
! # Bottom row
! DOOR:random,(41,09)
! DOOR:random,(43,09)
! DOOR:random,(45,09)
! DOOR:random,(47,09)
! DOOR:random,(49,09)
! DOOR:random,(51,09)
! DOOR:random,(53,09)
! DOOR:random,(55,09)
! DOOR:random,(57,09)
! DOOR:random,(59,09)
! DOOR:random,(61,09)
! # Traps
! TRAP:"board",(33,05)
! TRAP:"board",(13,06)
! TRAP:"fire",(30,04)
! TRAP:"magic",(30,06)
! # Guardians
! MONSTER:''',random,(26,04)
! MONSTER:''',random,(25,05)
! MONSTER:''',random,(26,06)
! MONSTER[50%]:''',random,(24,04)
! MONSTER[50%]:''',random,(24,06)
! # Jellies and Puddings
! MONSTER[50%]:'j',random,(44,04)
! MONSTER[50%]:'j',random,(56,06)
! MONSTER[80%]:'F',random,(44,06)
! MONSTER[80%]:'F',random,(57,04)
! MONSTER[80%]:'F',random,(49,06)
! MONSTER[50%]:'P',random,(51,07)
! MONSTER[50%]:'P',random,(43,03)
! MONSTER:'P',"green slime",(59,10)
! MONSTER:'P',"green slime",(51,10)
! MONSTER[50%]:'P',"green slime",(43,10)
! # Wine Celler
! OBJECT:'!',"amnesia",(21,10)
! OBJECT:'!',random,(22,10)
! OBJECT:'!',"booze",(23,10)
! OBJECT:'!',random,(24,10)
! OBJECT:'!',"booze",(25,10)
! OBJECT:'!',random,(26,10)
! OBJECT:'!',random,(27,10)
! OBJECT:'!',"booze",(28,10)
! OBJECT:'!',random,(21,12)
! OBJECT:'!',"booze",(22,12)
! OBJECT:'!',random,(23,12)
! OBJECT:'!',"booze",(24,12)
! OBJECT:'!',random,(25,12)
! OBJECT:'!',"booze",(26,12)
! OBJECT:'!',random,(27,12)
! OBJECT:'!',random,(28,12)
! 
diff --recursive -P -C3 slashem-0.0.7E7F2/dat/data.base slethe-0.0.7E7F2/dat/data.base
*** slashem-0.0.7E7F2/dat/data.base	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/data.base	2006-05-28 15:31:15.651003872 +0200
***************
*** 1176,1181 ****
--- 1176,1186 ----
  	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,1414 ****
--- 1414,1422 ----
  	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 --recursive -P -C3 slashem-0.0.7E7F2/dat/dungeon.def slethe-0.0.7E7F2/dat/dungeon.def
*** slashem-0.0.7E7F2/dat/dungeon.def	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/dungeon.def	2006-05-28 15:31:15.655003264 +0200
***************
*** 95,107 ****
  # Medusa and the castle.  There should be nothing in between.
  RNDLEVEL:		"medusa" "none" @ (-5, 4) 4
  LEVALIGN:		chaotic
! 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 ###
  #
--- 95,125 ----
  # Medusa and the castle.  There should be nothing in between.
  RNDLEVEL:		"medusa" "none" @ (-5, 4) 4
  LEVALIGN:		chaotic
! #LEVEL:			"castle" "none" @ (-1, 0)
! #CHAINBRANCH:	"Gehennom" "castle" + (0, 0) no_down
! BRANCH:			"The Lethe Gorge" @ (-1,0) down -8
  
  # Branch to the endgame...
  BRANCH:			"The Elemental Planes" @ (1, 0) no_down up -2
  
+ #
+ #       The Lethe Gorge.
+ #
+ DUNGEON:        "The Lethe Gorge" "L" (9, 0)
+ ALIGNMENT:      unaligned
+ DESCRIPTION:    mazelike
+ RNDLEVEL:       "leth-a"  "A" @ (1,0) 2
+ LEVEL:          "lethe-b" "B" @ (2,0)
+ LEVEL:          "castle" "none" @ (3, 0)
+ CHAINBRANCH:    "Castle Dungeon" "castle" + (0, 0)
+ RNDLEVEL:       "leth-c"  "C" @ (4,0) 2
+ RNDLEVEL:       "leth-d"  "D" @ (5,0) 2
+ LEVEL:          "lethe-e" "E" @ (6,0)
+ LEVEL:          "lethe-f" "F" @ (7,0)
+ LEVEL:          "lethe-g" "G" @ (8,0)
+ LEVEL:          "lethe-z" "Z" @ (9,0)
+ CHAINBRANCH:    "Gehennom" "lethe-z" + (0, 0)
+ 
  
  ### Gehennom ###
  #
***************
*** 123,154 ****
  # also tried to organize it a little -- demons before the wizard, devils
  # after.
  
! DUNGEON:        "Gehennom" "G" (17, 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)
- 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)
  
  
  ### Gnomish Mines ###
--- 141,169 ----
  # also tried to organize it a little -- demons before the wizard, devils
  # after.
  
! DUNGEON:        "Gehennom" "G" (21, 3)
  DESCRIPTION:    mazelike
  DESCRIPTION:    hellish
  ALIGNMENT:      noalign
  LEVEL:          "valley" "V" @ (1, 0)
  LEVEL:          "sanctum" "none" @ (-1, 0)
! LEVEL:          "asmodeus" "A" @ (2, 4)
! LEVEL:          "pvalley" "P" @ (4, 8)
! CHAINBRANCH:    "Vlad's Tower" "pvalley" + (0, 0) up -1
! LEVEL:          "juiblex" "J" @ (4, 4)
! LEVEL:          "baalz" "B" @ (6, 4)
! LEVEL:          "geryon" "G" @ (8, 4)
! LEVEL:          "orcus" "O" @ (10, 4)
! LEVEL:          "dispater" "D" @ (11, 4)
! LEVEL:          "demogorg" "E" @ (12, 4)
! LEVEL:          "yeenoghu" "Y" @ (13, 4)
! RNDLEVEL:       "nkai-a" "K" @ (-5, 0) 2
! LEVEL:          "nkai-b" "L" @ (-4, 0)
! CHAINBRANCH:    "Wizards Tower" "nkai-b" + (0, 0) portal -1
! LEVEL:          "nkai-c" "M" @ (-3, 0)
! LEVEL:          "nkai-z" "Z" @ (-2, 0)
  # Dr. Frankenstein's Lab
  BRANCH:         "Frankenstein's Lab" @ (3, 10) up
  
  
  ### Gnomish Mines ###
***************
*** 162,167 ****
--- 177,188 ----
  RNDLEVEL:	"minend" "E" @ (-2, 0) 3
  LEVEL:		"mineking" "M" @ (-1, 0)
  
+ #
+ #       Under the castle
+ #
+ DUNGEON:        "Castle Dungeon" "U" (1, 0)
+ ALIGNMENT:      unaligned
+ LEVEL:          "ucastle" "E" @ (1, 0)
  
  ### The Quest Dungeon ###
  #   This is a proto-dungeon.  The level file names will be prepended with
***************
*** 273,278 ****
--- 294,312 ----
  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 Endgame levels ###
  #
diff --recursive -P -C3 slashem-0.0.7E7F2/dat/gehennom.des slethe-0.0.7E7F2/dat/gehennom.des
*** slashem-0.0.7E7F2/dat/gehennom.des	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/gehennom.des	2006-05-28 15:31:15.690997792 +0200
***************
*** 5,53 ****
  #
  
  MAZE: "valley", ' '
! FLAGS: hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------------------------------------------------------
! |...S.|..|.....|  |.....-|      |................|   |...............| |...|
! |---|.|.--.---.|  |......--- ----..........-----.-----....---........---.-.|
! |   |.|.|..| |.| --........| |.............|   |.......---| |-...........--|
! |   |...S..| |.| |.......-----.......------|   |--------..---......------- |
! |----------- |.| |-......| |....|...-- |...-----................----       |
! |.....S....---.| |.......| |....|...|  |..............-----------          |
! |.....|.|......| |.....--- |......---  |....---.......|                    |
! |.....|.|------| |....--   --....-- |-------- ----....---------------      |
! |.....|--......---BBB-|     |...--  |.......|    |..................|      |
! |..........||........-|    --...|   |.......|    |...||.............|      |
! |.....|...-||-........------....|   |.......---- |...||.............--     |
! |.....|--......---...........--------..........| |.......---------...--    |
! |.....| |------| |--.......--|   |..B......----- -----....| |.|  |....---  |
! |.....| |......--| ------..| |----..B......|       |.--------.-- |-.....---|
! |------ |........|  |.|....| |.....----BBBB---------...........---.........|
! |       |........|  |...|..| |.....|  |-.............--------...........---|
! |       --.....-----------.| |....-----.....----------     |.........----  |
! |        |..|..B...........| |.|..........|.|              |.|........|    |
! ----------------------------------------------------------------------------
  ENDMAP
  # Dungeon Description
  # The shrine to Moloch.
! REGION:(01,06,05,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
  # Stairs
! STAIR:(01,01),down
  # Branch location
! BRANCH:(66,17,66,17),(0,0,0,0)
  
  # Secret Doors
! DOOR:locked,(04,01)
! DOOR:locked,(08,04)
! DOOR:locked,(06,06)
  
  # The altar of Moloch.
! ALTAR:(03,10),noalign,shrine
  
  # Non diggable walls - everywhere!
  NON_DIGGABLE:(00,00,75,19)
--- 5,56 ----
  #
  
  MAZE: "valley", ' '
! FLAGS: noteleport,hardfloor,nommap,lethe
  GEOMETRY:center,center
  MAP
! ----------------------------------------------}}}}--------------------------
! |...| |...............|   |................| }}}} |-.....|  |.....|..|.S...|
! |.-.---........---....-----.-----..........--}}}} |......|  |.---.--.|.|---|
! |--...........-| |---.......|   |.............}}}}|......-- |.| |..|.|.|   |
! | -------......---..--------|   |------.......}}}}---.....| |.| |..S...|   |
! |  ---- ----................-----...| --...|...}}}}F.....-| |.| -----------|
! |---..---- -----------..............|  |...|...}}}}--.....| |.---....S.....|
! |........------      -FF---..---....|  ---......}}}}|.....| |......|.|.....|
! |.............--------..------ --BB----| --.....}}}}--....| |------|.|.....|
! |---.....................--    |.......|  --...| }}}}|-BBB---......--|.....|
! |  ----..............||...|    |.......|   |...--}}}}|.....|...||....S.....|
! |     --.............||...| ----.......|   |.....}}}}|.....S..-||-...|.....|
! |    --...----.----.......| |..........--------.}}}}......---......--|.....|
! |  ---....|  |.| ----..---------..........|..}}}.}}}..|...---------| |.....|
! |---.....-| --.---..----.......---........}}}}}}}.}------.B.|......| |.....|
! }}}}}}}}..---...........}}}}}}..BBBBB--}}}}}}}}}}}...|.|---........| ------|
! }}}}}}}}}}}}}}}.....}}}}}}}}}}}}}}}}}}}}}}}}}}}}}..|...|  |........|       |
! }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|..-----------.....--       |
! |   }}}}}}}}}}}}}}}}}}}}}}    }}}}}}}}}}}}...   |.........B....|..|        |
! -----------}}}}}}}}}}}}-----------------------------------------------------
  ENDMAP
  # Dungeon Description
  # The shrine to Moloch.
! REGION:(70,06,74,14),lit,"temple"
  # The Morgues
! 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:(74,01),down
  # Branch location
! BRANCH:(05,09,05,09),(0,0,0,0)
! TELEPORT_REGION:(01,06,20,11),(0,0,0,0),down
  
  # Secret Doors
! 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:(72,10),noalign,shrine
  
  # Non diggable walls - everywhere!
  NON_DIGGABLE:(00,00,75,19)
***************
*** 85,99 ****
  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 loot.
  #
! OBJECT:'*',"ruby",random
  OBJECT:'*',random,random
  OBJECT:'*',random,random
  OBJECT:'!',random,random
--- 88,102 ----
  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[50%]:'*',"ruby",random
  OBJECT:'*',random,random
  OBJECT:'*',random,random
  OBJECT:'!',random,random
***************
*** 113,125 ****
  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:"board", random
! TRAP:"dart", (60,01)
! TRAP:"dart", (26,17)
  TRAP:"anti magic", random
  TRAP:"anti magic", random
  TRAP:"magic", random
--- 116,128 ----
  OBJECT:'(',random,random
  
  # (Not so) Random traps.
! 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", (15,01)
! TRAP:"dart", (49,17)
  TRAP:"anti magic", random
  TRAP:"anti magic", random
  TRAP:"magic", random
***************
*** 142,156 ****
  # Some undead nasties for good measure
  MONSTER:'V',random,random
  MONSTER:'V',random,random
! MONSTER:'V',random,random
  MONSTER:'Z',random,random
  MONSTER:'Z',random,random
  MONSTER:'Z',random,random
! MONSTER:'Z',random,random
! MONSTER:'M',random,random
  MONSTER:'M',random,random
  MONSTER:'M',random,random
  MONSTER:'M',random,random
  #
  # The Juiblex level
  #
--- 145,160 ----
  # Some undead nasties for good measure
  MONSTER:'V',random,random
  MONSTER:'V',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[50%]:'M',random,random
+ 
  #
  # The Juiblex level
  #
***************
*** 239,244 ****
--- 243,249 ----
  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,362 ****
  TRAP:"anti magic",random
  TRAP:"magic",random
  TRAP:"magic",random
  #
! # The Orcus Level
  #
  MAZE:"orcus",random
! FLAGS: noteleport,shortsighted
! GEOMETRY:right,center
  # A ghost town
  MAP
! .|....|....|....|..............|....|........
! .|....|....|....|..............|....|........
! .|....|....|....|--...-+-------|.............
! .|....|....|....|..............+.............
! .|.........|....|..............|....|........
! .--+-...-+----+--....-------...--------.+----
! .....................|.....|.................
! .....................|.....|.................
! .--+----....-+---....|.....|...----------+---
! .|....|....|....|....---+---...|......|......
! .|.........|....|..............|......|......
! .----...---------.....-----....+......|......
! .|........................|....|......|......
! .----------+-...--+--|....|....----------+---
! .|....|..............|....+....|.............
! .|....+.......|......|....|....|.............
! .|....|.......|......|....|....|.............
  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)
  # 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)
  # 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"
  # Some traps.
  TRAP:"spiked pit", random
  TRAP:"sleep gas", random
  TRAP:"anti magic", random
  TRAP:"fire", random
  TRAP:"fire", random
  TRAP:"fire", random
  TRAP:"magic", random
  TRAP:"magic", random
  # Some random objects
  OBJECT:random,random,random
  OBJECT:random,random,random
--- 273,356 ----
  TRAP:"anti magic",random
  TRAP:"magic",random
  TRAP:"magic",random
+ 
  #
! # The New Orcus Level
  #
  MAZE:"orcus",random
! FLAGS: noteleport,shortsighted,lethe,hardfloor
! GEOMETRY:center,center
  # A ghost town
  MAP
!  -----                        --------------------
!  |...|..       .............. |.......|.....|....|     |..........----------
!  |...|...........----------.. |.......|.....|....|.....|..........|........|
!  |...+...........|........|...|.......|--+-----+--.....B..........|........|
!  -----..---+---..|........+...----+----.............{..B..........+......\.|
!  |...+..|.....|..|........|.................------.....B..........|........|
!  |...|..|.....|..----------..}}}}}}}........+....|.....|..........|........|
!  |...|..--...--.........}}}}}}}}}}}}}}}}}...|....|.....|..........------S---
!  -----}}}}.}.}}}}...}}}}}}}}}}}}}}}}}}}}}}}}------.....---------+--   |...|
! }}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}..............   |...|
! }}}}}}}}}}.}.}}}}}}}}}}}}}}}-----------}}}}}}}}}}}}}}}}}............  -----
! }}}}}}}}--...--}}}}}}}}.....|.........|..}}}}}}}}}}}}}}}}}}}}}.......
! }}}}....|.....|.............|.........+......}}}}}}}}}}}}}}}}}}}}}}}}}}}
! -------.|.....|..----B----..|.........|................}}}}}}}}}}}}}}}}}}}}}
! |.....|.---+---..|.......|..-----------..-----+----..............}}}}}}}}}}}
! |.....|..........B.......B...............|........|..-------...........}}}}}
! |--+--|...----+---.......-----+----------|........|..|.....-----...--+-----
!    ...... |......|.......|........|......+........|..+.....|...+.. |......|
!           |......|.......|........|......|........|  |.....|...|   |......|
!           -----------------------------------------  -----------   --------
  ENDMAP
  # Entire main area
! 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: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:(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,625 ****
  OBJECT:random,random,random
  OBJECT:random,random,random
  OBJECT:random,random,random
  # The resident nasty
! MONSTER:'&',"Orcus",(33,15)
  # 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)
  # Randomly placed companions
  MONSTER:'Z',"skeleton",random
  MONSTER:'Z',"skeleton",random
  MONSTER:'Z',"skeleton",random
  MONSTER:'Z',"skeleton",random
! MONSTER:'Z',"skeleton",random
  MONSTER:' ',"shade",random
  MONSTER:' ',"shade",random
  MONSTER:' ',"shade",random
  MONSTER:' ',"shade",random
  MONSTER:'Z',"giant zombie",random
  MONSTER:'Z',"giant zombie",random
  MONSTER:'Z',"giant zombie",random
  MONSTER:'Z',"ettin zombie",random
  MONSTER:'Z',"ettin zombie",random
  MONSTER:'Z',"ettin zombie",random
  MONSTER:'Z',"human zombie",random
  MONSTER:'Z',"human zombie",random
  MONSTER:'Z',"human zombie",random
  MONSTER:'V',"vampire",random
  MONSTER:'V',"vampire",random
  MONSTER:'V',"vampire",random
  MONSTER:'V',"vampire lord",random
  MONSTER:'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
  #
! # The Asmodeus Level
  #
  MAZE:"asmodeus",random
! FLAGS: noteleport
  # First part
  GEOMETRY:half-left,center
  MAP
! ---------------------
! |.............|.....|
! |.............S.....|
! |---+------------...|
! |.....|.........|-+--
! |..---|.........|....
! |..|..S.........|....
! |..|..|.........|....
! |..|..|.........|-+--
! |..|..-----------...|
! |..S..........|.....|
! ---------------------
! 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)
! 
  # Doors
! DOOR:closed,(04,03)
! DOOR:locked,(18,04)
! DOOR:closed,(18,08)
! #
! STAIR:(13,07),down
  # Non diggable walls
! NON_DIGGABLE:(00,00,20,11)
! # Entire main area
! REGION:(01,01,20,10),unlit,"ordinary"
  # The fellow in residence
! MONSTER:'&',"Asmodeus",(12,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
! # 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
  
  #
! # The Baalzebub level
  #
  MAZE:"baalz",random
! FLAGS: noteleport
! GEOMETRY:right,center
  MAP
! -------------------------------------------------
! |                    ---               ----      
! |          ----      |   ------------  |         
! | ------      |  --------|..........|---         
! | |....|  -------|...........--------------      
! ---....|--|..................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
  # The fellow in residence
! MONSTER:'&',"Baalzebub",(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:"spiked pit", random
  TRAP:"fire", random
  TRAP:"sleep gas", random
  TRAP:"anti magic", random
! TRAP:"fire", random
  TRAP:"magic", random
  TRAP:"magic", random
  # Random monsters.
! MONSTER:' ',"ghost",(37,07)
! MONSTER:'&',"horned devil",(32,05)
! MONSTER:'&',"barbed devil",(38,07)
  MONSTER:'L',random,random
  # Some Vampires for good measure
  MONSTER:'V',random,random
  MONSTER:'V',random,random
  MONSTER:'V',random,random
  
! # [Tom]
  # The Yeenoghu level
  #
  MAZE:"yeenoghu",random
! FLAGS: noteleport
! GEOMETRY:right,center
  MAP
! -------------------------------------------------
! | ---------|  |----------|                       
! | |....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
! # 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
  MONSTER:'G',"gnoll",random
  MONSTER:'G',"gnoll",random
  MONSTER:'G',"gnoll",random
--- 362,797 ----
  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",(71,04)
  # And its preferred companions
! 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[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[50%]:random,random,random
! 
  #
! # The New Asmodeus Level
  #
  MAZE:"asmodeus",random
! FLAGS: noteleport,lethe,hardfloor
  # First part
  GEOMETRY:half-left,center
  MAP
!                                           }}}}                          ----
! --------------------    -------         |}}}}--                         |..|
! |............S.....|    |.....|------   --}}}}--------------       #####+..|
! |---+-----------...|    |.....|.....|------}}}}|...........|       #    |..|
! |.....|........|-+------|.....|.....|.....F}}}}F...........|    ---+--- ----
! |..---|........|........|.....|.....|.....|}}}}|..{..{..{..|    |.....|
! |..|..S........|..........................|}.|}............+##H#S.....S#
! |..|..|........|........|.....|.....|.....|}}}}|..{..{..{..|    |.....|
! |..|..|........|-+------|.....|.....|.....F}}}}F...........|    ---+---
! |..|..-----S----...|    |.....|.....|------}}}}|...........|       H
! |..S.....|...|.....|    |.....|------    |}}}}--------------       H
! ---------|...|------    -------         --}}}}|  --------          H
!          |...|            ###           |}}}}----|......|          #
!          |...|              #  ###       }}}}| |.+......+###########
!      -----+++-----    ####  #  #         }}}}  |.+......+###########
!      |...........|    #     ######  ----  }}}} --|......|          #
!      |...........S#####     #    #  |..|  }}}}   --------       ---+---
!      |...........|    #     #    ###+..|   }}}}                 |.....|
!      |.....\.....|    #######       |..|   }}}}                 |.....|
!      -------------                  ----  }}}}                  -------
! ENDMAP
! 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: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,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",(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
! # 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 New Baalzebub level
  #
  MAZE:"baalz",random
! FLAGS: noteleport,lethe,hardfloor
! GEOMETRY:center,center
  MAP
!       }}   }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}                  
!   ..}}...} ...}}....}}}}.....}}...}}.}..}.}.}....}}.}  }}.}}...    .....    
!  .}}..}}}..}}}...}}}....}}.F...}}}..}.}}.}.}..F.}..}.}}}...  }}. #.......   
!  }..  }}}}}}}}.F.}}}}}}}}FFF}}}}}}}}}}}}}}}FFFF}}}}.}....}}.}... # ......   
!  .}}}}}}}}}}}}}FFFF}}}}}}F}}}------------}}F}}}}}}}}.}}.}..... }.#          
!   .}}}FFFFFF}}}}}}F}}--------|..........|FFF}}}}}}}}}}.....}}}...  .}...    
!  .}}}}F....F}}-------|...........--------------}}}}}}}}}}.....  }... .}.}   
!  }.}---....|--|..................S............|----}}}}}...}.} ...}......   
!  ..}|...--....S..----------------|..........\.S...|}}}}}}}.....}}...  }..}  
!  .}}---....|--|..................|............|----}}}}}}}}}.....}}.....}.  
!   .}}}F....F}}-------|...........-----S--------}}}}}}}}}.....}}.....} }..   
!  .}.}}FFFFFF}}}}}}F}}--------|..........|FFF}}}}}}}}  }....}..}}..  ....}}  
!  }.}.}}}}}}}}}}FFFF}}}}}F}}}}------------}}F}}}}}}}   ..}}...}...}... }.    
!  }}.}.}}}}}}}}.F.}}}}}}}FFF}}}}}}}}}}}}}}}}FFFF}}... }...}.....}}.}} ...}   
!   .  }..}}}}}}...}}}}}}}}.F.}}}}}....}}}}}}}}.F....}...}...}....}...} ...}  
!  }}. . ..}}}}}}}.}}}}...}...}}...}}....}}}}}}...}}..}....}...}...}}...}     
!  }..}.}.}..  .}.}.}...}..}}...}}...}}}...}}...}.....}.}..}...}}..}  .}..    
!  }}..}.}.}.. }.}.}.}..}.}.}}....}}}...}}}....}}...}}......}}... .}} .....   
!    }}.}}..}}..}}}...}...}}....}}}}}}}}....}}......}....}}}..}}.}......      
!       }}}   }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}    }}}          
! ENDMAP
! # 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",(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:"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",(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
  
! #
  # The Yeenoghu level
  #
+ # Based upon Tom Proudfoots Slash'Em Yeenoghu level
+ #
+ # Yeenoghu is the demon lord of the Gnolls, a secretive, silent
+ # race of mountain dwelling creatures.
+ #
  MAZE:"yeenoghu",random
! FLAGS: noteleport,hardfloor,lethe
! GEOMETRY:center,center
  MAP
!        }}}}       .....  ..    ----------- ------------               ...
!   ....  }}}}    ...   H ....  .|....|....| |......S...-------------- ..}...
!  ......  }}}}   H   .H......H..|....|....| |FFFFFF|...S..........+.|  ... .
!   ....  }}}}   ...H..  .....   |....|S--S---..........|...--------------  .
!    . H }}}}  .....      ...  ---....|..F.......{......|S--|............|--S-
!    H ..}}}}H......H..    ..H........|..F......{.{.....F...+.........\..S...|
!  ...   }}}}  ....   ...      ---....|..F.......{......|---|............|----
! ......  }}}}        .....  ..H.|....|---S---..........|...--------------  .
! .......F}}}}   ..    ...  ... .|....|....| |FFFFFF|...S..........+.| .. ...
!  ......FFFFF.....H..     ....H.|....S....| |......S...--------------  ......
!   ..   }}}}F.  .. .....H.. ..  ----------- ------------...   .... ..H.. ..
!    .  }}}}  ..  . ...    H  ..     .....     ...H.....H. H .H.  ...   H  .H.
!    H   }}}}  .  .  .  .H..   .H.    .....   ...          ...   ...  ...    .
!    ..   }}}}  H H    .. ...    ...  ...... .....H. .H........   H  .....  ..
!  .....   }}}} .... .H.  ....  .. .H....... H ..  ... ...... .H. ..H....  ...
!   ....H..}.}.H...... ..  ...  H     ......H.    ..    ....    ...     .H...
!  ....   }.}.   ....   .. ...H...     ..... .H......  ......H.H.....     ..
!        }}}}            .H..    .....H...      ...     ....     ...
! ENDMAP
! #
! # 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,1027 ****
  MONSTER:'G',"gnoll",random
  MONSTER:'G',"gnoll",random
  MONSTER:'G',"gnoll",random
  
! # [Tom]
! # The Geryon level
  #
  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
! # 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
  
! # [Tom]
  # The Demogorgon level
  #
  MAZE:"demogorg",random
! FLAGS: noteleport
! GEOMETRY:right,center
  MAP
! -------------------------------------------------
! | ------------|------------------                
! | |}}}}}}}}}}}|}...}......}}}}}}|--------------  
! | |}}}}}}}}}}}|....}}...}...}}}}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
! # 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]
- # The Dispater level
- #
- MAZE:"dispater",random
- FLAGS: noteleport
- GEOMETRY:right,center
- MAP
- -------------------------------------------------
- | ----------------------------------------|--    
- | |.....|.....................|...|...|...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
- # 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
- 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
- 
- #
- # The Sanctum Level
- #
- MAZE:"sanctum", ' '
- FLAGS: noteleport,hardfloor
- GEOMETRY:center,center
- MAP
- ----------------------------------------------------------------------------
- |             --------------                                               |
- |             |............|             -------                           |
- |       -------............-----         |.....|                           |
- |       |......................|        --.....|            ---------      |
- |    ----......................---------|......----         |.......|      |
- |    |........---------..........|......+.........|     ------+---..|      |
- |  ---........|.......|..........--S----|.........|     |........|..|      |
- |  |..........|.......|.............|   |.........-------..----------      |
- |  |..........|.......|..........----   |..........|....|..|......|        |
- |  |..........|.......|..........|      --.......----+---S---S--..|        |
- |  |..........---------..........|       |.......|.............|..|        |
- |  ---...........................|       -----+-------S---------S---       |
- |    |...........................|          |...| |......|    |....|--     |
- |    ----.....................----          |...---....---  ---......|     |
- |       |.....................|             |..........|    |.....----     |
- |       -------...........-----             --...-------    |.....|        |
- |             |...........|                  |...|          |.....|        |
- |             -------------                  -----          -------        |
- ----------------------------------------------------------------------------
- ENDMAP
- REGION:(15,07,21,10),lit,"temple"
- ALTAR:(18,08),noalign,sanctum
- REGION:(41,06,48,11),unlit,"morgue",filled,true
  # Non diggable walls
! NON_DIGGABLE:(00,00,75,19)
  # Invisible barrier separating the left & right halves of the level
! NON_PASSWALL:(37,00,39,19)
  # 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
  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 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
  MONSTER:'V',random,random
! STAIR:(63,15),up
--- 801,2847 ----
  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
+ 
+ # 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,random
+ OBJECT:'%',random,random,cursed,random
+ OBJECT:'%',random,random,cursed,random
+ 
+ # 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
+ #
+ 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:'&',"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)
+ 
+ # 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 Geryon level
  #
  MAZE:"geryon",random
! FLAGS: noteleport,lethe,hardfloor
! GEOMETRY:center,center
  MAP
!              }}}}}}}}                     }}      }}}}}    }}}}             
!   .... ....III}}}I}}        ....    ..   III}    }III}}}}}}}}}II}     ....  
!   ........III}}IIII}}}}II..+..... ....+.II}}II I}}}IIII}}I}}}III}..  .....  
!   ..  ...III}}IIIIII}II}II.    .....   .II}}III}}}IIIII}III}III}}I..  ....  
!     .III}}}}IIIIII}III}}II...  }..   III}}}IIII}}IIII}IIIII}}I}}II..   #    
!   ...IIIIII}}IIII}}}IIII}}}III  }}     }}}}}}II}IIIII}}IIII}}IIII}II..###   
!  ...}IIIIIIII}}II}}I}}}}III}}}}         }}III}}}}}}}}}IIII}}IIII}}}II. #    
!  ..I}IIIIIII}}}}}III}}II}}IIII}}I   -----}IIII}}III}}}}II}}}}IIII}}}I  ##   
!  ..II}IIIII}}}IIIII}}IIIII}}III}II  |...|}IIIII}}III}}}}}III}}}}}II}}   #   
!   IIII}}IIII}}IIII}}IIIII}}}}I}}}II |...| }}IIII}IIII}}IIII}}}IIII}}    #   
!    IIII}}}I}II}IIII}}IIIII}}}}I}}}I}--+--  I}}II}}IIIII}IIII}}}IIII}}.  ..  
!    }IIIIII}IIII}}}}II}}}III}}}}}}II}}|.|    II}}}IIIII}}}II}}}I}IIII}}. ... 
!   II}IIIII}IIIII}IIIII}}}}}I}}}}}}I}}F.|     III}}}}IIII}}}}III}}II}}}.#... 
!  III}}III}}}IIIII}IIIII}IIIII}}}II}} |.|      III}II}}}}}III}}II}}III}I  .. 
!  IIII}}II}II}III}}}}III}}IIII}III}}---S----  III}IIII}}IIIII}}}II}II}}}  #  
!  .IIIII}}IIII}}}}}}}}III}}IIII}}I} |......|    }}}IIII}}IIIII}}}}I}}}    #  
!  ...IIII}}}IIII}}}III}III}IIIII}}  |.\....|     .IIII}}IIIII}}}III}}. ....  
!  ....IIII}}}}II}}IIII}}II}IIIII    |......S## ##..IIII}}III}}}III}}. ...... 
!   ....IIII}}}}}}      }}}IIII      -------- ###  ....III}}}}}}}II}..#.....  
!            }}}}        }}}}                              }}}}}}}}}}}        
! ENDMAP
! # 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:'&',"Geryon",(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 Demogorgon level
  #
+ # Based upon Tom Proudfoots Slash'em Demogorgon 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,hardfloor,lethe
! GEOMETRY:center,center
  MAP
!                                   LLLL  ......   LLL    .LLLL  LLL          
!    ..        ......LLL           LLLL  ..... . LLLLLL  .LLLLLLLLLLLLLLLL    
!   ....    .....LLLL.....        LLLL     ... ..LLLLLLLLLLLLL .LLLLL LLLLL.  
!  ....      ...L      ...        LLLL  .-----  ...LLL    LLL   ..LL   LLL.   
!   ..        .      ....          LLLL..|...|------------FFF-         ....   
!    .     ....      .           ..LLLL..S...|...S...........|----------S---  
!    ..   ......   .....        ....LLLL.---+-FF.|....}}}....S...|L...L|...|  
!     ......LL... ..  ...      .....LLLL..L|...F.|....}}}....|--S|..\..S...|  
!    ..  ...LLL....  ......     ....LLLL..L|...F.|...........|...|.....|--+-  
!   ..    ......    ...L..     ....LLLL...L|FFFF.|------------...|.....|...|  
!  .....   ...    ....LL.... .....LLLL....L|.....|    |...S..S...|L...L|----  
!   ....   .        ...... ... ..LLLL....---+----- . |..-------|---S----      
!   ..   ...       ..          .LLLL.....S...|   LLL |.........|.......|      
!  ..   ..         .    ..      LLLL.....|...|  LL   |--FFF----|.......|      
!  .  ...       .....  ...L      LLLL....---S-   LLL    LLL    ----S----      
!  ....L..    ....  .....LL       LLLL      .     LLL  LLLLL     LL.LL        
!   ...LL......      ...LLLLL  LLLLLLL      ..   LLLLLLLLLLLLLL LLLL.LL       
!    ......           .LLL  LLLL  LLLL       ....LLLLL.....LLLLLL...LL        
!                                  LLLL         ......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",(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
! #
! # Based upon Tom Proudfoots Slash'em Dispater level
! #
! # 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,hardfloor,lethe
! GEOMETRY:right,center
! MAP
!               }}}}                               
! ---------       }}}}    ..        ....     ------
! |...|.S.|     ..}}}}. .....     .......----|.S..|
! |.|S|.|S|    ..}}}}..  ....    .. .... |...----.|
! |.|...|.|    .}}}}..      ..  ..       |...S..|.|
! |.-------..  .}}}}.     ........    ----S----.|.|
! |.|.....|......}}}}..........  -----|.....|.S.|.|
! |.|.--|.|.......}}}}...... .   |....+.....|.|.|.|
! |.|...|S|  ...  }}}}.....  .|---+-----S---|.|.S.|
! -S-S|.|.|....  }}}}   ... ..+............ |S---.|
! ....|S--|S|....}}}}  ...... | .........\..F...|.|
! -S-S|...|.|.....}}}}....  ..+............ |----S|
! |.|.|.|.|S| ... }}}}.....  .|---+-----S---|..S..|
! |.|.|.|.|.| ..  }}}} ..... ..  |....+.....|-----|
! |.|...|...|  ..}}}}.... ..  .. -----|.....S....| 
! |.---------  .}}}}...    .. ..      -------....| 
! |.....|     .. }}}}...  .....  ...  .... .+....| 
! |----.|    ....}}}} .. .. ...... .... ....------ 
! |.S...|      .}}}}...   .....      .....         
! -------        }}}}                                 
! ENDMAP
! 
! # 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
! 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)
! 
! #
! #       Pleaseant Valley.
! #
! #       Green hills, trees, sheep, nymphs and people.
! #       Oh, and some of Vlad's minions.
! #
! MAZE: "pvalley",' '
! FLAGS: hardfloor,lethe
! 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...|---|
!   |...\...S.....S...|.         ...........    }}}}}}     ............
!   -------------------                          }}}}
! ENDMAP
! # 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
!                 .........         }}...          -----  }}}}}}}}}---------}}
!   .......     ...............    ...}}}..        |...|...}}}}}}..|.......|.}
!  ....}}...###S................   ...}}.  .       |...+...}}}}}...+.......+.}
!   .......     ...........   ...         .        |...|..}}}}}}}..|.......|.}
!                 .......      ...  ----- .  ----- -----}}}}}}}}}..---------}}
!      ........   ++            ..  |...|-S--|...|    |}}}}}}}}}}..}}}}}}}}}}}
!     ... .. .......     ...... ..  |...|....|...|    |}}}}}}..............}}}
!    ..................      -S-++--|...|....|...|    |}}}}...........--------
!  }}... .}}. ... ... ....   |......|-+----+---+------|}}}............|}}....|
!  }.....}}}}............... |..}}..+.................|}..............+......|
!  }.....}}}}............... |..}}..+.................|}..............+......|
!  }}... .}}. ... ... ....   |......|S--+----+--+-----|}}}............|}}....|
!    ..................      -S-++---.|...|....|..|   |}}}}...........--------
!     ... .. .......     ...... ..   .|...|....|..|   |}}}}}}..............}}}
!      ........   ++            ..   .|...|----|..|   |}}}}}}}}}}..}}}}}}}}}}}
!                 .......      ...   .-----    ---------}}}}}}}}}..---------}}
!   .......     ...........   ...    .      ...    |...|..}}}}}}}..|.......|.}
!  ....}}...###S................      ...  ..}..   |...+...}}}}}...+.......+.}
!   .......     ...............          .. ...    |...|...}}}}}}..|.......|.}
!                 .........                        -----  }}}}}}}}}---------}}
! 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)
  # Invisible barrier separating the left & right halves of the level
! #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:(73,09),up
! #BRANCH:(69,08,74,11),(00,00,00,00)
! 
! # Drawbridges
! DRAWBRIDGE:(53,09),west,closed
! DRAWBRIDGE:(53,10),west,closed
! 
  # Doors
! 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 the other lethe levels, these are not a hardfloor
! #	level, allowing the player to fall through to deeper
! #	levels of the gulf.
! #
! 
! #
! # An introductory level...
! #
! MAZE: "nkai-a-1",' '
! FLAGS: lethe
! GEOMETRY:center,center
! MAP
!                                  }}}}                                       
!    ..      ......        ....   }}}}  ..........  ......  ...... ....     . 
!  .. ... ... .. .. ...  ...  ... }}} } ... . .. ... .. ..  ... ... ..... ... 
!  .... ... .. ..  ..  ...  ..   }} }} }..     ...     ... ... ..  ..   ...   
!    ..  ..  ...  ..  ..   ..  .} }}.}..}..  ...  ..  ..   ..   .. ..  ..   . 
!     ....  ..   ..    ..  .. ..}..}}.}}..  ..     ....   ....   ...  .... .. 
!    ..    ....   ..  ..   ....  }..}}}.}  ....  ...  ... .. .. .. .. ..  ..  
!   ..   ...  .. ..  .... ..  ..}  ..}}}.}  ....  ...  ....  ....   ...  ...  
!  .... ..     ...  ..  ...   .}.  .}}.}}. ..  .... ....  ....  .. .. ....    
!   .....   .... .. ..   ... ...}..}}...}...  ..      ... .. ....  ..  ..     
!     .... ..     ...      .... .}.}.}.}..  ...   ..  . ...   ..   ...  ..    
!    ..  ...    ... ..    ..  .  } }}.}.}  ..   ...  ....    ....   ..   ..   
!   ..  .. ..  ..    ..  ..   ..  }}.} }  .... ...    ....  ..  .. ....  ...  
!    ....   .. ..   .... ... .... .}} } } ...... ... ..  ....    .... .  .... 
!     .... ..  ...   ..   ....  ..}}.} } }.....    ...    ..      ... .. .... 
!   .... ...     .....     .......}.}.}.}.}...    .. .... ...   ...   .. ...  
!  ....   ....  ... ...   .........}.}.}.}...    ...   .....   .....   ...    
!   .... ... ....     ......  ......}.}.}}..   ....      ........  ...     .. 
!     .....    .....    ...     ...  }.}}}.   ......       ....      .......  
!                                    }}}}                                     
! 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: lethe
+ GEOMETRY:center,center
+ MAP
+                                  }}}}                                       
+  ...    .....            ...    }}..}}  ....        .....       .....   ... 
+  ...  ....  ..     ... ... ....}.}..}.}   ...    ..........   ...   .....   
+   .  ...     ...  .. ...    ..}.}....}.}    . .......    .......    ..  ..  
+   ....         .....   .... .}.}.....}..}   ....     ...      .......  ..   
+     ...   .... .. ..    ..  }..}....}...}. ...     ...... ....      ....    
+    .. ..... ....   ..  ..  }....}..}...}.....    .....  ...   ...   . ...   
+   ..    ..   ..     ....  }.}..}.}..}.}..      ....  ........  .... .   ..  
+  ..    ....   ...  .. ... .}....}}}..}}}...  ...     ...........  ...    .  
+   ..   .. ..    ....   ....}...}.}}}}}.}} ...  .... ........  ..   ..    .  
+   ... ..   ...  .. ...   ...}.}...}}}...}  ..    ....  ...     .. ...    .. 
+     ...      ....    ...  ..}..}...}}}...}   ...   ..    ...    ....    ... 
+    .....    ..  ...    ....  }}...}}}...}..    ..   ..     ..  ..  ..   ..  
+   ... ...    ..  ..     ..   .}....}}}...}..   ...   .... ... ... ..    .   
+  ...    ...   ....  ...  ......}....}}}.}. .. .. ...   .... ... ...   ...   
+  ...     ... ... ..   .....  ...}....}}}.   ...   .....      ..    ....     
+   ...     ....     ..  ...    ...}..}}}.     .    .   .....      .... ..    
+    ....  ....  ...  ....    ...   }..}}}... .... ... ..   ........     ...  
+   ... ....  .... .....    ....     }}}.}  ... .... ...    .   ......    ... 
+                                    }}}}                                     
+ 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
! # 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: lethe
! GEOMETRY:center,center
! MAP
!                                  }}}}                                       
!  ..  ..   .     .. ....  .... ....}}}}.....  ...       .......     ....     
!   .. .   ...   .  ......... ... .}}}}.}  .....      ....  .. ..   .   .   . 
!    .... ..  . .     ....        }.}}}}.}           ..  ..    ......      .. 
!  ...  ...    ...             ... }.}}}. }  ....  ...    ... ...   ...  ..   
!   .    ....  .  ...    .........}.} }.}}} ........        ...       ...     
!  ..  ...  ....   .   .... .....} }.} }...}... ...  ...     ..      ... .    
!  ......  ..  .........      ... } }.}.....}.   ..... ..   ....     ..   ... 
!   ... ....    ........ ...  .....}}}...  }..   ..     ...... ..  ...     .  
!   ..    ...  .....   ... .......}.} }.  }.} ......      ...   ....  ...  .. 
!    ..  .  .... ...   .    .. . } }.}.} }.}  ...  ...    ..    .....    ...  
!     ...    ..  ..  ..  }}     ..}...}.}.} }.....   ... ..    .   ... ...    
!    ....   ..   ....  .}}}}}    }.... }.}...}  ...   .....   ..  .. ... .    
!  .... ..  .   ...   .}}---}}  } }.. }.}...}.   ...  ..  ..     ...     ..   
!  ....  .. ......   .}}}|.|}}}} } } }.} }.}.   .......    ..   ......    .   
!  ...    ... ...   . }---.---}}    }.} }.}      ......     .....    ..  ..   
!    ......    ..    .}|.....|}..    }}..}}  ...  ..  ..     ...  ..  ....    
!   ...   .......  .. }---.---}}.. ...}}}}  .......    ...  ..   ......  .. . 
!    .       ...   .. }|.S.|}}} .... }}}}    ....        ....   .....     ... 
!                     }-----}}       }}}}                                     
! 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)
! # 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: lethe
+ GEOMETRY:center,center
+ MAP
+                                  }}}}                                       
+   ...   ...            ...      }}}}   ....        .    .       ..... ....  
+   ...  .......       ... ...  ...}}}}   .......     .   ...    ..   ....... 
+   . ..  ...  ..    ...     .....}}}}}}        ..    ..    ......       ...  
+      ....     ...  .    .... ..}}}}}}}}}       ......    ....  ...          
+       . ..   .. ....  ...    }}}}}}}}}}}}..    .. ..   ...    .. ...   ..   
+       .  .. ..     ....      }}}}}}}}}}}}}... ..  ... .. ......    .. ..    
+      ..   ...       ..      }}}}}}}.}}}}}}}}...   .....   ..  .     ....    
+    ...     ..        ..  .}}}}}}}}-.--}}}}}       ....   ..        .. ...   
+   .. ..  .....      .......}}}}}}......}}}}}}}.    ....   ...    ...    ..  
+  ..   ....   ..    .. .  }}}}}}}.|...|}}}}}}}...   ....    .... ..       .. 
+   ..   ..     ..  .. ...  }}}}}}}--...}}}}}}.. ..  ....       ...       ..  
+    .. ..       ....    .    }}}}}}...}}}}}}}.   .. ....      .. ...     ..  
+    ......    ... ..    ...   }}}}}}.}}}}}}}      .....     ...    ..    ..  
+    H .. ..  ..   ..   ..       }}}}}}}}}}}.       ....    .. ...   ......   
+   ..     ....     .. ..   ....  }}}}}}}}....      ....  ...    .....        
+    ....    ..      ....  ..  .. .}}}}}}. ...     ...... .    ...   ......   
+   ......    ....  ..  .. ..   ....}}}}}.  ...  ...    ...  ... ..    ...... 
+    ....        ....    .....    ..}}}}.     ....        ....    ..    ....  
+                                    }}}}                                     
+ 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
! 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 thie kit).
! #
! MAZE: "nkai-z",' '
! FLAGS: hardfloor,lethe
! GEOMETRY:center,center
! MAP
!                                  }}}}                                       
!   ....   ...   ........ ....    }}} }}      . .....              .......    
!   ..       .  ......  ... ..   }} }} }}    . ........          ....    ..   
!    ......  .... ..         ...}} }..}.}}. .   ....  ...       ...     ....  
!      }  ....     ......     .}.}}.}}.}}.}.            ......}...  .  .....  
!     ..}}..            ......}.}..}..}. }.}.        .......}}...  ...  ...   
!    ..  .}}}....      ..  .}}..} }.}}.}  } }...  .......}}}  ..}   ......    
!    ...    .}}}}}... ..}}}}...}..}.}}..} }  }}.....}}}}} ..}}}}         .    
!      ...      ..}}}}}}.    }}..}..}}.}. }.   }}}}}          ..}}   ....     
!     .. ..  ..}}}.     ...}}  .}   }}...  }. .     }}.        ...}.....      
!    ..   ...}}.   .}}..}}}   .}    }}     .}}}... ...}...    ..  ....        
!   ...   ..}..     ..}}.     }.   }}}}     .}.} ... .} .}   ....  ......     
!    ..    ...     ..}.. .   } }. }}}}}}   ..}..   .   }}.  .....    ......   
!     .  ...      ..}..   .    }. }}}}}}   .}.}   ....  .}   ..    ..         
!     . ....      ....   ...  }. .}}}}}}   . .}  ....    .}      .....        
!      ..  ..      ..   ..... .    }}}}.     ..           .   .....}}......   
!     ...   .. .. ..   .....  .     .....     .    ....  .........}}}}......  
!    .....   ......     .... .... ..... ...  .... .......    ....}}}......    
!    ....      ...         ...  ......    ....   ......         .......       
!                                                                             
! 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
! # 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 --recursive -P -C3 slashem-0.0.7E7F2/dat/lethe.des slethe-0.0.7E7F2/dat/lethe.des
*** slashem-0.0.7E7F2/dat/lethe.des	1970-01-01 01:00:00.000000000 +0100
--- slethe-0.0.7E7F2/dat/lethe.des	2006-05-28 15:31:15.708995056 +0200
***************
*** 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---                 #         ......           ###     #        .... 
+       #                ........  }}}}}}}}}}}}}    ....  #     ##     ##.... 
+                     ........}}}}}}}}}}}}}}}}}}}}}}}T....#      #     #  ..  
+              #####H.....T.}}}}}}}}}}}}}}}}}}}}}}}}}}}}...    ###     #      
+              #      ...}}}}}}}}}}...........}}}}}}}}}}}}}}   #       ###    
+           ####       .}}}}}}}}}}.....T........}}}}}}}}}}}}}  H         #    
+           #             }}}}}}}}}}}......T...}}}}}}}}}}}}}}}...        #    
+         .....         }}}}}}}}}}}}}}}}}}}}}}}}}}}}  ##  }}}}}.....   .....  
+        .......       }}}}}}}}}}}}}}}}}}}}}}}}}}}...#####..}}}}}}......T.... 
+      ........}}}      }}}}}}}}}}}}}}}}}}}}}}}}....        .}}}}}}}}}}}}}}}}}
+      .........}         ..}}}}}}   }}}}}}}T.....           ..}}}}}}}}}}}}}}}
+       .......       ###.....         ........T      ....     ..}}}}}}}}}}}}}
+          .....########     ####         #          ......      ...........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...............#####      ...       ....  
+    |.....|               ##         .......   ...    #####.......    ...... 
+    |...}.+###           ##              #      H     H     .......   .....  
+    |.....|  ####H########  #########.....      .     ##      ....     ...   
+    ---S---       #         #         ......           ###     #        .... 
+       #         ##     ........  }}}}}}}}}}}}}    ....  #     ##     ##.... 
+       H         H   ........}}}}}}}}}}}}}}}}}}}}}}}T....#      #     #  ..  
+       #      #####H.....T.}}}}}}}}}}}}}}}}}}}}}}}}}}}}...    ###     #      
+              #      ...}}}}}}}}}}...........}}}}}}}}}}}}}}   #       ###    
+           ####       .}}}}}}}}}}.....T........}}}}}}}}}}}}}  H         #    
+           #             }}}}}}}}}}}......T...}}}}}}}}}}}}}}}...        #    
+         .....         }}}}}}}}}}}}}}}}}}}}}}}}}}}}  ##  }}}}}.....   .....  
+        .......   }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}...#####..}}}}}}......T.... 
+      ........}}}}}    }}}}}}}}}}}}}}}}}}}}}}}}....        .}}}}}}}}}}}}}}}}}
+      .........}         ..}}}}}}   }}}}}}}T.....           ..}}}}}}}}}}}}}}}
+       .......       ##H.....         ........T      ....     ..}}}}}}}}}}}}}
+          .....########     ####         #          ......      ...........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
+                                                                             
+    ...            ###.......  ....            ....                          
+   .....         ###   ...........           .......####                ...  
+   ....      #####    ...}}}}}}}}}}}}}}     .......    ##         ....H....  
+   ...   ##H##        .T}}}}}}}}}}}}}}}}     .....      ##       .....  ...  
+    #    #   ###     ..}}}}}}}}}}}}}}}}}}       #        #        ...        
+    #H####     #     .}}}}    ....    }}}}    ###     ....          ####     
+      #        ####..}}}}.     ..      }}}}}..#    ......              #     
+      #             }}}}..      #       }}}}}     ........      .......#     
+      .  ..}}}}}}}}}}}}..   ..###      ...}}}}      .....    ....T....       
+      ....}}}}}}}}}}}}     ...      ##....T}}}}...###       ..}}}}}}}}}}}}}} 
+      ..T}}}}}}}}}}}}      .....#      .....}}}}}           .}.}}}}}}}}}}}}} 
+      ..}}}}  ....          ...          .....}}}}          }}}.}}}}}}}}}}}} 
+     ..}}}}      H           #             ...T}}}}}}}}}}}}}}}}}.            
+ }}}}}}}}}       .....     ###           ##. ...}}}}}}}}}}}}}}}.    ...      
+ }}}}}}}}.    ...........  # #  ....     #     . }}}}}}}}}}}}}.    .....     
+ }}}}}}}.    .............## ##.....     #     #   ....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
+                           }                                                 
+           ..      ........}}|.......                                        
+   ###  ##....   ...........}|..........           ......        .......     
+   H ####  ...  ..T.........}|................#+#...........#+##....\..      
+   .    ##...    ..........}}|................#+#.....{.....#+##....\.       
+  ...      ...    ......    }        T.......    .........       .......     
+  ...     ..     ....      }    }}     .....        ....                     
+  ....          ...      T}}} }}}     ##..##                     ###.....    
+   ...##       ...       }}} }..     ###  ####   #    .....    ###  .......  
+       #   .......      }T   ...   ####    ####  +   .......####    .......  
+       ............    }}   .... ....##    ##......   ....           .....   
+        ...T}}}}}}}}}}}}}   ..........     ..........  +    #                
+         }}}}}}}}}}}}}}}}}   .........    ................. +         ....   
+        }}}}}}}}}}}}}}}}}}}    ......   #+.....T.............   #### .....   
+ }}}}}}}}}}}}     T...  }}}}           ..  .......{.....T.....###  ##......  
+ }}}}}}}}}    ..    H    }}}}       T....    ........T.......      # .....   
+ }}}}}}}}   .....   #     }}}}}}}}}}}}}}}}   .............         #  ....   
+            ......###      }}}}}}}}}}}}}}}}   + + + + + +    ...####         
+              ...           }}}}}}}}}}}}}}}}  # # # # # #   ....             
+                                         }}}}                                
+ 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
+                           }                                                 
+           ..      ........}}|.......                                        
+        ##....   ...........}|..........           ......        .......     
+   H#####  ...  ..T.........}|................#+#...........#+##....\..      
+   .             ..........}}|................#+#.....{.....#+##....\.       
+  ...             ......    }        T.......    .........       .......     
+  ...            ....       }          .....        ....                     
+  ....          ...      T}}T         ##..##                     ###.....    
+   ...##       ...       }}          ###  ####   #    .....    ###  .......  
+       #   .......      }T         ####    ####  +   .......####    .......  
+       ............    }}        ....##    ##......   ....           .....   
+        ...T}}}}}}}}}}}}}      .......     ..........  +    #                
+         }}}}}}}}}}}}}}}}}     .......    ................. +         ....   
+        }}}}}}}}}}}}}}}}}}}     .....   #+.....T.............   #### .....   
+ }}}}}}}}}}}}     T...  }}}}           ..  .......{.....T.....###  ##......  
+ }}}}}}}}}    ..    H    }}}}       T....    ........T.......      # .....   
+ }}}}}}}}   .....   #     }}}}}}}}}}}}}}}}   .............         #  ....   
+            ......###      }}}}}}}}}}}}}}}}   + + + + + +    ...####         
+              ...           }}}}}}}}}}}}}}}}  # # # # # #   ....             
+                                         }}}}                                
+ 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
+  ------------------------------------   }}}}              -----             
+  |.............T...........T........|    }}}}             |...|             
+  |TTTT..TTTTT..TTT..TTTTT..TTT..TT..|  ..}}}}..           |...|             
+  |......T...T...........T..T.....T..| ...}}}}...          --+--         ..  
+  |..TTTTTT..T..TTTTTTT..T.....{..T..|...}}}}}}...|  -----   #          .... 
+  |..........T..T.....TTTT..T.....T..|..}}}}}}}}..|  |...|   #        ##.... 
+  |TTTT..TTTTT..TTTT..T..T..TTT..TT..+..}}}}}}}}..+##S...+####        # .... 
+  |..........T........T.....T........|..}}}}}}}}..|  |...|            #  ..  
+  |.T..}}..T.-----------------------S|...}}}}}}...|  -----            ##     
+  |....}}....|.........|..|.|..|.....-------------------  ....         ##    
+  |....}}....|.........|+--+--+|.....|..........|.|....| ..}}}}}}       H    
+  |.T..}}..T.|.........|.......|.....|........\...|....S#.}}}}}}}}}}}   ..   
+  |....}}....|.........|.......|.....|..........|.S....| .}}}}}}}}}}}} ....  
+  |....}}....-----+--------+------+---..........-----+--  }}}}}}}}}}}}}}}}}}}
+  |.T..}}..T.+.......................+.........\..| |.|    }}}}}}T.}}}}}}}}}}
+  |....}}....-----+--------+------+---..........-----+--      .......}}}}}}}}
+  |....}}....|.........|.......|.....|..........|.S....|          #          
+  |.T..}}..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
+  ------------------------------------   }}}}              -----             
+  |..................................|    }}}}             |...|             
+  |..................................|  ..}}}}..           |...|             
+  |..................................| ...}}}}...          --+--         ..  
+  |..................................|...}}}}}}...|  -----   #          .... 
+  |..................................|..}}}}}}}}..|  |...|   #        ##.... 
+  |..................................+..}}}}}}}}..+##S...+####        # .... 
+  |..................................|..}}}}}}}}..|  |...|            #  ..  
+  |..........-----------------------S|...}}}}}}...|  -----            ##     
+  |....}}....|.........|..|.|..|.....-------------------  ....         ##    
+  |....}}....|.........|+--+--+|.....|..........|.|....| ..}}}}}}       H    
+  |....}}....|.........|.......|.....|........\...|....S#.}}}}}}}}}}}   ..   
+  |....}}....|.........|.......|.....|..........|.S....| .}}}}}}}}}}}} ....  
+  |....}}....-----+--------+------+---..........-----+--  }}}}}}}}}}}}}}}}}}}
+  |....}}....+.......................+.........\..| |.|    }}}}}}..}}}}}}}}}}
+  |....}}....-----+--------+------+---..........-----+--      .......}}}}}}}}
+  |....}}....|.........|.......|.....|..........|.S....|          #          
+  |....}}....|.........|.......|.....|........\...|....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               }}}}                        
+            ...         -----###-----            }}}}   .........            
+           ....         |...|###|...|            }}}} .............          
+        ##.....###      |....###....|           }}}}} ..............####     
+        #  ....  #      |....###....|          }}}}}}  ............    # ... 
+   ...  #   ...  #      |...|###|...|         }}}}}}}    ........      ##... 
+  .....##        #      -----###-----        }}}}}}}.        #           ..  
+   ...         ###         TT###TT      }}}}}}}}}}}...      ##  ...          
+               #           T.###.T     }}}}}}}}}}}.T #     ##   ....###....  
+             ......######....###...   }}}}}}}}}}     ##    #    ...  #  ...  
+            .......      ..  ###  .. }}}}}}}T...      #### #         #  ...  
+           .........    ...  ###  ..}}}}}}}...#      ##  ######     ...      
+          .......T}}}}}}}}}}}###}}}}}}}}}}    ###   ##        ###  ......    
+ }}}}}}}}}}}.T...}}}}}}}}}}}}###}}}}}}}}}       #  ##   .....   ##.........  
+ }}}}}}}}}}}}}}}}}}}}}}}}}}}}###}}}}}}}}      ######   .......     ........  
+ }}}}}}}}}}}}}}}}}}}}}}....  ###  T...      ###           H        ......    
+        }}}}}}}}}}}}}    ....###....     ####       ........     #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.............------
+     ..................}}}}}}}}}}}}}}}    ..}..     ..T........T....T....    
+   .................}}}}}}}}}}}}}}}}}}}    ...       ............T....}}}}}}}
+  .....T.....T....}}}}}}}}}}}}}}}}}}}}}}     ###      ....T.........}}}}}}}}}
+  ....T.........}}}}}}}}  ...... }}}}}}}}      #       .......T...}}}}}}}}}}}
+   ............}}}}}}}}    ..  #  }}}}}}}}}    ##...    ...T....}}}}}}}}}}}} 
+    .......T..}}}}}}}}         ##  }}}}}}}}}}    ....    .....}}}}}}}}}}     
+      ..T.....}}}}}}}}}.        ###.}}}..}}}}..   ....    T..}}}}}}}}        
+        .......}}}}}}}}}.           .}}}..}}}}}.. # ...    }}}}}}    ------- 
+        #   ....T.}}}}}}..           .}}.T.}}}}}...       }}}}}      |.....| 
+       ##   # ......}}}}}.            ..}}..}}}.}}T..    }}}}}  --------S--- 
+      ##    #        }}}}..       ###  }}.}}}}..}}}}}.} }}}}}   |...{....|   
+      #   #H##  ....  }}}}.#####  H ##  .}.}}}.}.}}}}}.}}}}}    |..{.{...|   
+     ....H#  ##.....  }}}}.    .. .  ###..}.}.}}}.}}}}}.}}..####+...{....|   
+   .....       ....   }}}}   ......      ..}. T}}}.}}}}}..      ----------   
+    .....       ...  }}}}    .....                                           
+                    }}}}                                                     
+ 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
+   ---------   ---     ---      ---      ---    ---    ---    ---      ------
+   |.......|----.-------}--------.--------.------.------.------.-------|....|
+   |.......+...........}}}}}}}}........................................+....|
+   |.......|----.-------}}-------.--------.------.------.------.-------|....|
+   ---------   -S-     -}}}     ---      ---    -S-    ---    ---      ------
+                # ...}}}}}}}}                    H                 }}}       
+                ...}}}}}}}}}}}}}     ###      .......             }}}}}}...  
+               ..}}}}}}}}}}}}}}}}.   H ######..........        ..}}}}}}}}}.. 
+               }}.}}}}}}}}}}}}}}}}....        .........H##### ..}}}}}}}}}}}} 
+            }}}}}}.}...    }}}}}}}}....        ......       ...}}}}}}}}}}}}}}
+        }}}}}}}}}....       ..}}}}}.}...         #         ..}}}}}}}}}}}}}}}}
+   }}}}}}}}}}}     H         ...}}.}}}}}         H         }}.}}}}}}}}}}}}}}}
+ }}}}}}}}}}}    ####          ....}}}}}}}}}}}  ......  }}}}}}}.}}}}}}}}....  
+ }}}}}}}}}}   ###              #   }}}}}}}}}}}}}}}}}}}}}}}}}}}}.}..      #   
+ }}}}}}}}}   ##        ...     ##  .}}}}}}}}}}}}}}}}}}}}}}}}}}....      ##   
+   }}}}... ###      ........    #   .}}}}}}}}}}}}}}}}}}}}}}    H       ##    
+     ....### H     ..........H###   .}}}}}}}}}}}}}}}}}}}}}    ........H#     
+      ..     ###  #..........     ##..}}}}}}}}}}}}}}}}}}}}   .........   ..  
+               ####  ...  ...H#####  ....}}}}}}}}}}}}}}}}      .......H#...  
+                                           }}}}}}}}}}}}                      
+ 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 Gehennom.
+ #
+ #	The river flows through an impressive gates guarded by angels and
+ #	demons and thence into he depths of Gehennom itself.
+ #
+ MAZE: "lethe-z",' '
+ FLAGS: hardfloor,lethe
+ GEOMETRY:center,center
+ MAP
+                                                         ---------           
+         .....                                           |.......|    }      
+       .....T...                                   }     |.......|   }}}     
+      .........T..........T..              .      .}}    |.......|  .}}      
+     ..T........................           ...   ...}}}  |.......| ...}      
+     ......T....          .T.....T..      ..T.. .....}...|.......|....       
+ -----........    -------      .........T...... .........--+-+-+--....       
+ |...|......      |..\..|         ..T........-----...................        
+ |...+.....   ----|.....---------  .......T..|   |................-----------
+ |...|...T    |...+.....+.......|   .........-----........}.......|.....|...|
+ -----....    |...------|.......|    T...T...............}}}......+.....S.}.|
+     .....H###S...+.....|.......+####....................}}.......|.....|...|
+     .T...    |...|\....+.......|    ..T.....-----.........}......-----------
+    .......   ----|.....|.......|    T.....T.|   |.............}}}}}}}}      
+ }}}}}}}}}}}}     ---------------   }}}}}}}}}-----}}}}}}}}}}}}}}}}}}}}}}}    
+ }}}}}}}}}}}}}}                   }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}   
+ }}}}}}}}}}}}}}}}}}}           }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}   
+         }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-----}}}}}}}}}}}}}}}}}}}}}}}    
+             }}}}}}}}}}}}}}}}}}}}}}}}        |   |             }}}}}}}}      
+                }}}}}}}}}}}}}}}}}}}          -----                           
+ 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
+ BRANCH:(74,10,74,10),(0,0,0,0)
+ 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 --recursive -P -C3 slashem-0.0.7E7F2/dat/medusa.des slethe-0.0.7E7F2/dat/medusa.des
*** slashem-0.0.7E7F2/dat/medusa.des	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/medusa.des	2006-05-28 15:31:15.712994448 +0200
***************
*** 95,100 ****
--- 95,104 ----
  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,207 ****
--- 206,215 ----
  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 --recursive -P -C3 slashem-0.0.7E7F2/dat/oracles.txt slethe-0.0.7E7F2/dat/oracles.txt
*** slashem-0.0.7E7F2/dat/oracles.txt	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/oracles.txt	2006-05-28 15:31:15.715993992 +0200
***************
*** 84,96 ****
  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.
  -----
  Upon a level before all maze
  There lies a woman who kills with gaze.
--- 84,96 ----
  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 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,104 ****
--- 102,111 ----
  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 --recursive -P -C3 slashem-0.0.7E7F2/dat/rumors.fal slethe-0.0.7E7F2/dat/rumors.fal
*** slashem-0.0.7E7F2/dat/rumors.fal	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/rumors.fal	2006-05-28 15:31:15.718993536 +0200
***************
*** 18,23 ****
--- 18,25 ----
  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,160 ****
--- 151,165 ----
  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,376 ****
--- 371,383 ----
  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 --recursive -P -C3 slashem-0.0.7E7F2/dat/rumors.tru slethe-0.0.7E7F2/dat/rumors.tru
*** slashem-0.0.7E7F2/dat/rumors.tru	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/rumors.tru	2006-05-28 15:31:15.721993080 +0200
***************
*** 31,41 ****
--- 31,43 ----
  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,73 ****
--- 70,76 ----
  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,107 ****
--- 103,112 ----
  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,118 ****
--- 118,125 ----
  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,140 ****
--- 142,148 ----
  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,166 ****
--- 161,179 ----
  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,186 ****
--- 194,200 ----
  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,348 ****
--- 357,363 ----
  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,361 ****
--- 371,377 ----
  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 --recursive -P -C3 slashem-0.0.7E7F2/dat/yendor.des slethe-0.0.7E7F2/dat/yendor.des
*** slashem-0.0.7E7F2/dat/yendor.des	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/dat/yendor.des	2006-05-28 15:34:23.379464808 +0200
***************
*** 5,36 ****
  #
  # The top (real) wizard level.
  # Keeping the Moat for old-time's sake
! MAZE:"wizard1",random
  FLAGS:noteleport,hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------.
! |.......|..|.........|.....|.
! |.......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)
  # 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
  # Non diggable walls
  # Walls inside the moat stay diggable
--- 5,36 ----
  #
  # The top (real) wizard level.
  # Keeping the Moat for old-time's sake
! MAZE:"wizard1",' '
  FLAGS:noteleport,hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------
! |.......|..|.........|.....|
! |.......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,26,12)
  # 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
  # Non diggable walls
  # Walls inside the moat stay diggable
***************
*** 89,120 ****
  
  
  # The middle wizard level.
! MAZE:"wizard2",random
  FLAGS:noteleport,hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------.
! |.....|.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
  # Non diggable walls everywhere
--- 89,120 ----
  
  
  # The middle wizard level.
! MAZE:"wizard2",' '
  FLAGS:noteleport,hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------
! |.....|.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,26,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
  # Non diggable walls everywhere
***************
*** 145,170 ****
  FLAGS:noteleport,hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------.
! |..|............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)
! 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"
  # make the entry chamber a real room; it affects monster arrival;
--- 145,171 ----
  FLAGS:noteleport,hardfloor
  GEOMETRY:center,center
  MAP
! ----------------------------
! |..|............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,26,12)
! BRANCH:(25,11,25,11),(00,00,00,00)
! # PORTAL:(25,11,25,11),(0,0,0,0),"nkai-b"
! # MAZEWALK:(28,09),east
  REGION:(07,03,15,11),unlit,"morgue",unfilled
  REGION:(17,06,18,11),unlit,"beehive"
  # make the entry chamber a real room; it affects monster arrival;
***************
*** 214,276 ****
  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)
! # treasures
! OBJECT:'"',random,(04,04)
--- 215,277 ----
  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)
! # # treasures
! # OBJECT:'"',random,(04,04)
diff --recursive -P -C3 slashem-0.0.7E7F2/Files slethe-0.0.7E7F2/Files
*** slashem-0.0.7E7F2/Files	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/Files	2006-05-28 15:31:15.728992016 +0200
***************
*** 24,30 ****
  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
  
  doc:
  (files for all versions)
--- 24,30 ----
  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	lethe.des
  
  doc:
  (files for all versions)
diff --recursive -P -C3 slashem-0.0.7E7F2/include/decl.h slethe-0.0.7E7F2/include/decl.h
*** slashem-0.0.7E7F2/include/decl.h	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/include/decl.h	2006-05-28 15:31:15.732991408 +0200
***************
*** 56,64 ****
--- 56,67 ----
      d_level     d_mineend_level;
      d_level	d_stronghold_level;
      d_level	d_valley_level;
+     d_level	d_ucastle_level;	/* LETHE */
+     d_level	d_lethe_last_level;	/* LETHE */
      d_level	d_wiz1_level;
      d_level	d_wiz2_level;
      d_level	d_wiz3_level;
+     d_level	d_pvalley_level;	/* LETHE */
      d_level	d_juiblex_level;
      d_level	d_orcus_level;
      d_level	d_baalzebub_level;	/* unused */
***************
*** 95,105 ****
--- 98,111 ----
  #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)
  #define wiz2_level		(dungeon_topology.d_wiz2_level)
  #define wiz3_level		(dungeon_topology.d_wiz3_level)
+ #define pvalley_level		(dungeon_topology.d_pvalley_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)
diff --recursive -P -C3 slashem-0.0.7E7F2/include/dungeon.h slethe-0.0.7E7F2/include/dungeon.h
*** slashem-0.0.7E7F2/include/dungeon.h	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/include/dungeon.h	2006-05-28 15:31:15.734991104 +0200
***************
*** 106,111 ****
--- 106,112 ----
  #define Is_medusa_level(x)	(on_level(x, &medusa_level))
  #define Is_oracle_level(x)	(on_level(x, &oracle_level))
  #define Is_valley(x)		(on_level(x, &valley_level))
+ #define Is_pvalley(x)		(on_level(x, &pvalley_level))
  #define Is_juiblex_level(x)	(on_level(x, &juiblex_level))
  #define Is_asmo_level(x)	(on_level(x, &asmodeus_level))
  #define Is_baal_level(x)	(on_level(x, &baalzebub_level))
***************
*** 116,123 ****
  #define Is_portal_level(x)	(on_level(x, &portal_level))
  #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))
--- 117,125 ----
  #define Is_portal_level(x)	(on_level(x, &portal_level))
  #define Is_rogue_level(x)	(on_level(x, &rogue_level))
  #define Is_stronghold(x)	(on_level(x, &stronghold_level))
+ #define Is_ucastle(x)		(on_level(x, &ucastle_level))
+ #define Is_lethe_last(x)	(on_level(x, &lethe_last_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 --recursive -P -C3 slashem-0.0.7E7F2/include/extern.h slethe-0.0.7E7F2/include/extern.h
*** slashem-0.0.7E7F2/include/extern.h	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/include/extern.h	2006-05-28 15:31:15.741990040 +0200
***************
*** 543,548 ****
--- 543,550 ----
  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 *));
***************
*** 1008,1014 ****
  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 struct permonst *NDECL(rndmonst);
  E void FDECL(reset_rndmonst, (int));
  E struct permonst *FDECL(mkclass, (CHAR_P,int));
--- 1010,1016 ----
  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 *,int));
  E struct permonst *NDECL(rndmonst);
  E void FDECL(reset_rndmonst, (int));
  E struct permonst *FDECL(mkclass, (CHAR_P,int));
***************
*** 1691,1696 ****
--- 1693,1699 ----
  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 ### */
***************
*** 1925,1930 ****
--- 1928,1934 ----
  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 --recursive -P -C3 slashem-0.0.7E7F2/include/monflag.h slethe-0.0.7E7F2/include/monflag.h
*** slashem-0.0.7E7F2/include/monflag.h	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/include/monflag.h	2006-05-28 15:31:15.744989584 +0200
***************
*** 235,238 ****
--- 235,247 ----
  /* 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 --recursive -P -C3 slashem-0.0.7E7F2/src/dig.c slethe-0.0.7E7F2/src/dig.c
*** slashem-0.0.7E7F2/src/dig.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/dig.c	2006-05-28 15:31:15.766986240 +0200
***************
*** 678,684 ****
  			d_level tolevel;
  
  			if (Is_stronghold(&u.uz)) {
! 			    assign_level(&tolevel, &valley_level);
  			} else if (Is_botlevel(&u.uz)) {
  			    if (canseemon(mtmp))
  				pline("%s avoids the trap.", Monnam(mtmp));
--- 678,684 ----
  			d_level tolevel;
  
  			if (Is_stronghold(&u.uz)) {
! 			    assign_level(&tolevel, &ucastle_level);
  			} else if (Is_botlevel(&u.uz)) {
  			    if (canseemon(mtmp))
  				pline("%s avoids the trap.", Monnam(mtmp));
diff --recursive -P -C3 slashem-0.0.7E7F2/src/do.c slethe-0.0.7E7F2/src/do.c
*** slashem-0.0.7E7F2/src/do.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/do.c	2006-05-28 15:31:15.771985480 +0200
***************
*** 863,869 ****
  		trap->ttyp == HOLE ? "down the hole" : "through the trap door");
  
  	if (trap && Is_stronghold(&u.uz)) {
! 		goto_hell(FALSE, TRUE);
  	} else {
  		at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
  		next_level(!trap);
--- 863,869 ----
  		trap->ttyp == HOLE ? "down the hole" : "through the trap door");
  
  	if (trap && Is_stronghold(&u.uz)) {
! 		goto_prision(FALSE, TRUE);
  	} else {
  		at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER);
  		next_level(!trap);
***************
*** 1184,1190 ****
  		    u_on_newpos(xdnladder, ydnladder);
  		} else {
  		    if (newdungeon) {
! 			if (Is_stronghold(&u.uz)) {
  			    register xchar x, y;
  
  			    do {
--- 1184,1192 ----
  		    u_on_newpos(xdnladder, ydnladder);
  		} else {
  		    if (newdungeon) {
! 			/* Removed for Lethe - now hero 
! 			arrives at special downstairs */
! 			/* if (Is_stronghold(&u.uz)) {
  			    register xchar x, y;
  
  			    do {
***************
*** 1193,1199 ****
  			    } while(occupied(x, y) ||
  				    IS_WALL(levl[x][y].typ));
  			    u_on_newpos(x, y);
! 			} else u_on_sstairs();
  		    } else u_on_dnstairs();
  		}
  		/* Remove bug which crashes with levitation/punishment  KAA */
--- 1195,1201 ----
  			    } while(occupied(x, y) ||
  				    IS_WALL(levl[x][y].typ));
  			    u_on_newpos(x, y);
! 			} else */ u_on_sstairs();
  		    } else u_on_dnstairs();
  		}
  		/* Remove bug which crashes with levitation/punishment  KAA */
***************
*** 1329,1335 ****
  	check_special_room(FALSE);
  
  	/* Check whether we just entered Gehennom. */
! 	if (!In_hell(&u.uz0) && Inhell) {
  	    if (Is_valley(&u.uz)) {
  		You("arrive at the Valley of the Dead...");
  		pline_The("odor of burnt flesh and decay pervades the air.");
--- 1331,1337 ----
  	check_special_room(FALSE);
  
  	/* Check whether we just entered Gehennom. */
! 	if ((!In_hell(&u.uz0)||Is_pvalley(&u.uz0)) && Inhell) {
  	    if (Is_valley(&u.uz)) {
  		You("arrive at the Valley of the Dead...");
  		pline_The("odor of burnt flesh and decay pervades the air.");
***************
*** 1337,1343 ****
  		display_nhwindow(WIN_MESSAGE, FALSE);
  #endif
  		You_hear("groans and moans everywhere.");
! 	    } else pline("It is hot here.  You smell smoke...");
  	}
  
  	if (familiar) {
--- 1339,1350 ----
  		display_nhwindow(WIN_MESSAGE, FALSE);
  #endif
  		You_hear("groans and moans everywhere.");
! 	    /*} else pline("It is hot here.  You smell smoke...");*/
! 	    } else if (    !In_V_tower(&u.uz0)
! 		      && !Is_pvalley(&u.uz) ) {
! 		pline("It is hot here.  You smell smoke...");
!             }
! 		    
  	}
  
  	if (familiar) {
***************
*** 1375,1382 ****
  	/* Final confrontation */
  	if (In_endgame(&u.uz) && newdungeon && u.uhave.amulet)
  		resurrect();
! 	if (newdungeon && In_V_tower(&u.uz) && In_hell(&u.uz0))
! 		pline_The("heat and smoke are gone.");
  
  	/* the message from your quest leader */
  	if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest") &&
--- 1382,1398 ----
  	/* Final confrontation */
  	if (In_endgame(&u.uz) && newdungeon && u.uhave.amulet)
  		resurrect();
! 	/* Lethe change */
! 	/* if (newdungeon && In_V_tower(&u.uz) && In_hell(&u.uz0))
! 		pline_The("heat and smoke are gone."); */
! 	if ( Is_pvalley(&u.uz)
! 		&& !In_V_tower(&u.uz0)
! 		&& In_hell(&u.uz0) ) {
! 	     pline_The("heat and smoke are gone.");
! 	}
! 	if (newdungeon && On_W_tower_level(&u.uz) && In_hell(&u.uz0))
! 	    pline_The("heat and smoke are gone.");
! 			
  
  	/* the message from your quest leader */
  	if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest") &&
diff --recursive -P -C3 slashem-0.0.7E7F2/src/dog.c slethe-0.0.7E7F2/src/dog.c
*** slashem-0.0.7E7F2/src/dog.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/dog.c	2006-05-28 15:31:15.781983960 +0200
***************
*** 904,910 ****
  	    /* KMH -- Added gypsy */
  	    mtmp->isgyp ||
  	    is_covetous(mtmp->data) || is_human(mtmp->data) ||
! 	    (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;
--- 904,911 ----
  	    /* KMH -- Added gypsy */
  	    mtmp->isgyp ||
  	    is_covetous(mtmp->data) || is_human(mtmp->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 --recursive -P -C3 slashem-0.0.7E7F2/src/dokick.c slethe-0.0.7E7F2/src/dokick.c
*** slashem-0.0.7E7F2/src/dokick.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/dokick.c	2006-05-28 15:31:15.786983200 +0200
***************
*** 1183,1190 ****
  	switch (loc) {
  	 case MIGR_RANDOM:	/* trap door or hole */
  		    if (Is_stronghold(&u.uz)) {
! 			cc->x = valley_level.dnum;
! 			cc->y = valley_level.dlevel;
  			break;
  		    } else if (In_endgame(&u.uz) || Is_botlevel(&u.uz)) {
  			cc->y = cc->x = 0;
--- 1183,1190 ----
  	switch (loc) {
  	 case MIGR_RANDOM:	/* trap door or hole */
  		    if (Is_stronghold(&u.uz)) {
! 			cc->x = ucastle_level.dnum;
! 			cc->y = ucastle_level.dlevel;
  			break;
  		    } else if (In_endgame(&u.uz) || Is_botlevel(&u.uz)) {
  			cc->y = cc->x = 0;
diff --recursive -P -C3 slashem-0.0.7E7F2/src/dungeon.c slethe-0.0.7E7F2/src/dungeon.c
*** slashem-0.0.7E7F2/src/dungeon.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/dungeon.c	2006-05-28 15:33:02.085823320 +0200
***************
*** 608,628 ****
  	{ "bigroom",	&bigroom_level },
  	{ "castle",	&stronghold_level },
  	{ "earth",	&earth_level },
! 	{ "fakewiz1",	&portal_level },
  	{ "fire",	&fire_level },
  	{ "juiblex",	&juiblex_level },
  	{ "knox",	&knox_level },
  #ifdef BLACKMARKET        
  	{ "blkmar",     &blackmarket_level },
  #endif /* BLACKMARKET */
  	{ "medusa",	&medusa_level },
  	{ "mine_end",   &mineend_level },        
  	{ "oracle",	&oracle_level },
  	{ "orcus",	&orcus_level },
  #ifdef REINCARNATION
  	{ "rogue",	&rogue_level },
  #endif
  	{ "sanctum",	&sanctum_level },
  	{ "valley",	&valley_level },
  	{ "water",	&water_level },
  	{ "wizard1",	&wiz1_level },
--- 608,631 ----
  	{ "bigroom",	&bigroom_level },
  	{ "castle",	&stronghold_level },
  	{ "earth",	&earth_level },
! 	{ "nkai-b",	&portal_level },
  	{ "fire",	&fire_level },
  	{ "juiblex",	&juiblex_level },
  	{ "knox",	&knox_level },
  #ifdef BLACKMARKET        
  	{ "blkmar",     &blackmarket_level },
  #endif /* BLACKMARKET */
+ 	{ "lethe-z",	&lethe_last_level },
  	{ "medusa",	&medusa_level },
  	{ "mine_end",   &mineend_level },        
  	{ "oracle",	&oracle_level },
  	{ "orcus",	&orcus_level },
+ 	{ "pvalley",    &pvalley_level },
  #ifdef REINCARNATION
  	{ "rogue",	&rogue_level },
  #endif
  	{ "sanctum",	&sanctum_level },
+ 	{ "ucastle",    &ucastle_level },
  	{ "valley",	&valley_level },
  	{ "water",	&water_level },
  	{ "wizard1",	&wiz1_level },
***************
*** 1202,1208 ****
  Can_fall_thru(lev)
  d_level *lev;
  {
! 	return((boolean)(Can_dig_down(lev) || Is_stronghold(lev)));
  }
  
  /*
--- 1205,1211 ----
  Can_fall_thru(lev)
  d_level *lev;
  {
! 	return((boolean)(Can_dig_down(lev)));
  }
  
  /*
***************
*** 1251,1257 ****
  	} 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;
  	} else {
  	    /* The desired level is in this dungeon or a "higher" one. */
  
--- 1254,1292 ----
  	} 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 - 2) {
! 			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 - ((dgn == 2 && !u.uevent.invoked
! #ifdef WIZARD
! 			&& !wizard
! #endif
! 			)?1:0);
! 		    break;
! 	    }				    
  	} else {
  	    /* The desired level is in this dungeon or a "higher" one. */
  
***************
*** 1405,1410 ****
--- 1440,1463 ----
  #ifdef OVL1
  
  void
+ find_castle_dungeon(lev)      /* sets *lev to be the the castle dungeon... */
+ d_level *lev;
+ {
+     lev->dnum = ucastle_level.dnum;
+     lev->dlevel = 1;
+ }
+ 
+ void
+ goto_prision(at_stairs, falling)      /* go directly to the castle dungeon... */
+ boolean       at_stairs, falling;
+ {
+     d_level lev;
+ 
+     find_castle_dungeon(&lev);
+     goto_level(&lev, at_stairs, falling, FALSE);
+ }
+ 
+ void
  find_hell(lev)	/* sets *lev to be the gateway to Gehennom... */
  d_level *lev;
  {
diff --recursive -P -C3 slashem-0.0.7E7F2/src/end.c slethe-0.0.7E7F2/src/end.c
*** slashem-0.0.7E7F2/src/end.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/end.c	2006-05-28 15:31:15.796981680 +0200
***************
*** 640,645 ****
--- 640,691 ----
  			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 --recursive -P -C3 slashem-0.0.7E7F2/src/gypsy.c slethe-0.0.7E7F2/src/gypsy.c
*** slashem-0.0.7E7F2/src/gypsy.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/gypsy.c	2006-05-28 15:33:02.089822712 +0200
***************
*** 316,322 ****
  			if (u.uevent.udemigod)
  				resurrect();
  			else
! 				fortune_lev(mtmp, "fakewiz1",
  					"an entrance to the Wizard's tower");
  				/*fortune_lev(mtmp, &portal_level);*/
  			break;
--- 316,322 ----
  			if (u.uevent.udemigod)
  				resurrect();
  			else
! 				fortune_lev(mtmp, "nkai-b",
  					"an entrance to the Wizard's tower");
  				/*fortune_lev(mtmp, &portal_level);*/
  			break;
diff --recursive -P -C3 slashem-0.0.7E7F2/src/makemon.c slethe-0.0.7E7F2/src/makemon.c
*** slashem-0.0.7E7F2/src/makemon.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/makemon.c	2006-05-28 15:31:15.803980616 +0200
***************
*** 1728,1743 ****
  /* returns TRUE iff you know monsters have been created */
  
  boolean
! create_critters(cnt, mptr)
  int cnt;
  struct permonst *mptr;		/* usually null; used for confused reading */
  {
  	coord c;
  	int x, y;
! 	struct monst *mon;
  	boolean known = FALSE;
  #ifdef WIZARD
  	boolean ask = wizard;
  #endif
  
  	while (cnt--) {
--- 1728,1749 ----
  /* returns TRUE iff you know monsters have been created */
  
  boolean
! 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, *mon2;
  	boolean known = FALSE;
  #ifdef WIZARD
  	boolean ask = wizard;
+ 
+ 	if (mptr != (struct permonst *)0) {
+ 	    ask = FALSE;
+ 	}
+ 		
  #endif
  
  	while (cnt--) {
***************
*** 1757,1763 ****
  		x = c.x,  y = c.y;
  
  	    mon = makemon(mptr, x, y, NO_MM_FLAGS);
! 	    if (mon && canspotmon(mon)) known = TRUE;
  	}
  	return known;
  }
--- 1763,1791 ----
  		x = c.x,  y = c.y;
  
  	    mon = makemon(mptr, x, y, NO_MM_FLAGS);
! 
! 	    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 --recursive -P -C3 slashem-0.0.7E7F2/src/mkmaze.c slethe-0.0.7E7F2/src/mkmaze.c
*** slashem-0.0.7E7F2/src/mkmaze.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/mkmaze.c	2006-05-28 15:31:15.808979856 +0200
***************
*** 540,551 ****
      } else if (Role_if(PM_PRIEST) && In_quest(&u.uz)) {
  	/* less chance for undead corpses (lured from lower morgues) */
  	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;
  
--- 540,545 ----
***************
*** 573,578 ****
--- 567,621 ----
      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 == 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
+ }
+ 
  void
  makemaz(s)
  register const char *s;
***************
*** 629,634 ****
--- 672,681 ----
  	    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,709 ****
  	    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
  	}
  
  	/* place branch stair or portal */
--- 710,716 ----
  	    mazexy(&mm);
  	    mkstairs(mm.x, mm.y, 0, (struct mkroom *)0);	/* down */
  	} else {	/* choose "vibrating square" location */
! 	    mkvsquare();
  	}
  
  	/* place branch stair or portal */
diff --recursive -P -C3 slashem-0.0.7E7F2/src/mon.c slethe-0.0.7E7F2/src/mon.c
*** slashem-0.0.7E7F2/src/mon.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/mon.c	2006-05-28 15:31:15.817978488 +0200
***************
*** 1794,1810 ****
  		(2 + ((int)(mdat->geno & G_FREQ)<2) + verysmall(mdat))));
  }
  
  /* drop (perhaps) a cadaver and remove monster */
  void
  mondied(mdef)
  register struct monst *mdef;
  {
  	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);
  }
  
  /* monster disappears, not dies */
--- 1794,1848 ----
  		(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 */
  
! 	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,2025 ****
--- 2053,2066 ----
  	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,2123 ****
  		 * if we want both, we have to specify it explicitly.
  		 */
  		if (corpse_chance(mtmp, (struct monst *)0, FALSE))
! 			(void) make_corpse(mtmp);
  	}
  	if(redisp) newsym(x,y);
  cleanup:
--- 2158,2164 ----
  		 * if we want both, we have to specify it explicitly.
  		 */
  		if (corpse_chance(mtmp, (struct monst *)0, FALSE))
! 			corpse = make_corpse(mtmp);
  	}
  	if(redisp) newsym(x,y);
  cleanup:
***************
*** 2172,2177 ****
--- 2213,2227 ----
  
  	/* 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 --recursive -P -C3 slashem-0.0.7E7F2/src/muse.c slethe-0.0.7E7F2/src/muse.c
*** slashem-0.0.7E7F2/src/muse.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/muse.c	2006-05-28 15:31:15.824977424 +0200
***************
*** 245,250 ****
--- 245,254 ----
  #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
***************
*** 546,551 ****
--- 550,565 ----
  			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,785 ****
--- 794,950 ----
  		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
***************
*** 2190,2196 ****
  	    break;
  	case SCROLL_CLASS:
  	    if (typ == SCR_TELEPORTATION || typ == SCR_CREATE_MONSTER
! 		    || typ == SCR_EARTH)
  		return TRUE;
  	    break;
  	case AMULET_CLASS:
--- 2355,2362 ----
  	    break;
  	case SCROLL_CLASS:
  	    if (typ == SCR_TELEPORTATION || typ == SCR_CREATE_MONSTER
! 		    || typ == SCR_EARTH || typ == SCR_DEMONOLOGY
! 		    || typ == SCR_ELEMENTALISM) /* Lethe */
  		return TRUE;
  	    break;
  	case AMULET_CLASS:
***************
*** 2400,2402 ****
--- 2566,2569 ----
  }
  
  /*muse.c*/
+ 
diff --recursive -P -C3 slashem-0.0.7E7F2/src/objects.c slethe-0.0.7E7F2/src/objects.c
*** slashem-0.0.7E7F2/src/objects.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/objects.c	2006-05-28 15:31:15.830976512 +0200
***************
*** 242,248 ****
  
  /* Quarterstaves */
  WEAPON("quarterstaff", "staff",
! 	0, 0, 1, 11, 40,  5,  6,  6, 0, B,   P_QUARTERSTAFF, WOOD, HI_WOOD),
  
  /* Polearms */
  /* (also weptool fishing pole) */
--- 242,250 ----
  
  /* Quarterstaves */
  WEAPON("quarterstaff", "staff",
! 	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,1042 ****
  		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),
  /* Enchantment */
  SCROLL("taming",                "PRIRUTSENIE",          P_ENCHANTMENT_SPELL, 1,  15, 200),
  /* Divination */
! SCROLL("light",                 "VERR YED HORRE",       P_DIVINATION_SPELL, 1,  90,  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("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("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("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("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),
--- 1014,1046 ----
  		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,  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, 180,  20),
  SCROLL("magic mapping",         "ELAM EBOW",            P_DIVINATION_SPELL, 1,  45, 100),
  /* Enchantment */
! 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,  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,  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 --recursive -P -C3 slashem-0.0.7E7F2/src/objnam.c slethe-0.0.7E7F2/src/objnam.c
*** slashem-0.0.7E7F2/src/objnam.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/objnam.c	2006-05-28 15:31:15.840974992 +0200
***************
*** 3042,3050 ****
  		delete_contents(otmp);
  	    obfree(otmp, (struct obj *) 0);
  	    otmp = &zeroobj;
! 	    pline("For a moment, you feel %s in your %s, but it disappears!",
  		  something,
! 		  makeplural(body_part(HAND)));
  	}
  
  	if (halfeaten && otmp->oclass == FOOD_CLASS) {
--- 3042,3052 ----
  		delete_contents(otmp);
  	    obfree(otmp, (struct obj *) 0);
  	    otmp = &zeroobj;
! /*	    pline("For a moment, you feel %s in your %s, but it disappears!",
  		  something,
! 		  makeplural(body_part(HAND))); */
! 	    /* Lethe message looks better for this situation... */
! 	    moloch_denies_you();
  	}
  
  	if (halfeaten && otmp->oclass == FOOD_CLASS) {
diff --recursive -P -C3 slashem-0.0.7E7F2/src/objnam.c.orig slethe-0.0.7E7F2/src/objnam.c.orig
*** slashem-0.0.7E7F2/src/objnam.c.orig	1970-01-01 01:00:00.000000000 +0100
--- slethe-0.0.7E7F2/src/objnam.c.orig	2006-05-28 15:30:23.452939184 +0200
***************
*** 0 ****
--- 1,3145 ----
+ /*	SCCS Id: @(#)objnam.c	3.4	2003/12/04	*/
+ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+ /* NetHack may be freely redistributed.  See license for details. */
+ 
+ #include "hack.h"
+ 
+ 
+ /* "an uncursed greased partly eaten guardian naga hatchling [corpse]" */
+ #define PREFIX	80	/* (56) */
+ #define SCHAR_LIM 127
+ #define NUMOBUF 12
+ 
+ STATIC_DCL char *FDECL(strprepend,(char *,const char *));
+ #ifdef OVLB
+ static boolean FDECL(wishymatch, (const char *,const char *,BOOLEAN_P));
+ #endif
+ static char *NDECL(nextobuf);
+ static void FDECL(add_erosion_words, (struct obj *, char *));
+ 
+ STATIC_DCL char *FDECL(xname2, (struct obj *));
+ 
+ struct Jitem {
+ 	int item;
+ 	const char *name;
+ };
+ 
+ /* true for gems/rocks that should have " stone" appended to their names */
+ #define GemStone(typ)	(typ == FLINT ||				\
+ 			 (objects[typ].oc_material == GEMSTONE &&	\
+ 			  (typ != DILITHIUM_CRYSTAL && typ != RUBY &&	\
+ 			   typ != DIAMOND && typ != SAPPHIRE &&		\
+ 			   typ != BLACK_OPAL && 	\
+ 			   typ != EMERALD && typ != OPAL)))
+ 
+ #ifndef OVLB
+ 
+ STATIC_DCL struct Jitem Japanese_items[];
+ 
+ #else /* OVLB */
+ 
+ STATIC_OVL struct Jitem Japanese_items[] = {
+ 	{ SHORT_SWORD, "wakizashi" },
+ 	{ BROADSWORD, "ninja-to" },
+ 	{ FLAIL, "nunchaku" },
+ 	{ GLAIVE, "naginata" },
+ 	{ LOCK_PICK, "osaku" },
+ 	{ WOODEN_HARP, "koto" },
+ 	{ KNIFE, "shito" },
+ 	{ PLATE_MAIL, "tanko" },
+ 	{ HELMET, "kabuto" },
+ 	{ LEATHER_GLOVES, "yugake" },
+ 	{ FOOD_RATION, "gunyoki" },
+ 	{ POT_BOOZE, "sake" },
+ 	{0, "" }
+ };
+ 
+ #endif /* OVLB */
+ 
+ STATIC_DCL const char *FDECL(Japanese_item_name,(int i));
+ 
+ #ifdef OVL1
+ 
+ STATIC_OVL char *
+ strprepend(s,pref)
+ register char *s;
+ register const char *pref;
+ {
+ 	register int i = (int)strlen(pref);
+ 
+ 	if(i > PREFIX) {
+ 		impossible("PREFIX too short (for %d).", i);
+ 		return(s);
+ 	}
+ 	s -= i;
+ 	(void) strncpy(s, pref, i);	/* do not copy trailing 0 */
+ 	return(s);
+ }
+ 
+ #endif /* OVL1 */
+ #ifdef OVLB
+ 
+ /* manage a pool of BUFSZ buffers, so callers don't have to */
+ static char *
+ nextobuf()
+ {
+ 	static char NEARDATA bufs[NUMOBUF][BUFSZ];
+ 	static int bufidx = 0;
+ 
+ 	bufidx = (bufidx + 1) % NUMOBUF;
+ 	return bufs[bufidx];
+ }
+ 
+ char *
+ obj_typename(otyp)
+ register int otyp;
+ {
+ 	char *buf = nextobuf();
+ 	register struct objclass *ocl = &objects[otyp];
+ 	register const char *actualn = OBJ_NAME(*ocl);
+ 	register const char *dn = OBJ_DESCR(*ocl);
+ 	register const char *un = ocl->oc_uname;
+ 	register int nn = ocl->oc_name_known;
+ 
+ 	if (Role_if(PM_SAMURAI) && Japanese_item_name(otyp))
+ 		actualn = Japanese_item_name(otyp);
+ 	switch(ocl->oc_class) {
+ 	case COIN_CLASS:
+ 		Strcpy(buf, "coin");
+ 		break;
+ 	case POTION_CLASS:
+ 		Strcpy(buf, "potion");
+ 		break;
+ 	case SCROLL_CLASS:
+ 		Strcpy(buf, "scroll");
+ 		break;
+ 	case WAND_CLASS:
+ 		Strcpy(buf, "wand");
+ 		break;
+ 	case SPBOOK_CLASS:
+ 		Strcpy(buf, "spellbook");
+ 		break;
+ 	case RING_CLASS:
+ 		Strcpy(buf, "ring");
+ 		break;
+ 	case AMULET_CLASS:
+ 		if(nn)
+ 			Strcpy(buf,actualn);
+ 		else
+ 			Strcpy(buf,"amulet");
+ 		if(un)
+ 			Sprintf(eos(buf)," called %s",un);
+ 		if(dn)
+ 			Sprintf(eos(buf)," (%s)",dn);
+ 		return(buf);
+ 	default:
+ 		if(nn) {
+ 			Strcpy(buf, actualn);
+ 			if (GemStone(otyp))
+ 				Strcat(buf, " stone");
+ 			if(un)
+ 				Sprintf(eos(buf), " called %s", un);
+ 			if(dn)
+ 				Sprintf(eos(buf), " (%s)", dn);
+ 		} else {
+ 			Strcpy(buf, dn ? dn : actualn);
+ 			if(ocl->oc_class == GEM_CLASS)
+ 				Strcat(buf, (ocl->oc_material == MINERAL) ?
+ 						" stone" : " gem");
+ 			if(un)
+ 				Sprintf(eos(buf), " called %s", un);
+ 		}
+ 		return(buf);
+ 	}
+ 	/* here for ring/scroll/potion/wand */
+ 	if(nn) {
+ 	    if (ocl->oc_unique)
+ 		Strcpy(buf, actualn); /* avoid spellbook of Book of the Dead */
+ 	    /* KMH -- "mood ring" instead of "ring of mood" */
+ 	    else if (otyp == RIN_MOOD)
+ 		Sprintf(buf, "%s ring", actualn);
+ 	    else
+ 		Sprintf(eos(buf), " of %s", actualn);
+ 	}
+ 	if(un)
+ 		Sprintf(eos(buf), " called %s", un);
+ 	if(dn)
+ 		Sprintf(eos(buf), " (%s)", dn);
+ 	return(buf);
+ }
+ 
+ /* less verbose result than obj_typename(); either the actual name
+    or the description (but not both); user-assigned name is ignored */
+ char *
+ simple_typename(otyp)
+ int otyp;
+ {
+     char *bufp, *pp, *save_uname = objects[otyp].oc_uname;
+ 
+     objects[otyp].oc_uname = 0;		/* suppress any name given by user */
+     bufp = obj_typename(otyp);
+     objects[otyp].oc_uname = save_uname;
+     if ((pp = strstri(bufp, " (")) != 0)
+ 	*pp = '\0';		/* strip the appended description */
+     return bufp;
+ }
+ 
+ boolean
+ obj_is_pname(obj)
+ register struct obj *obj;
+ {
+     return((boolean)(obj->dknown && obj->known && obj->onamelth &&
+ 		     /* Since there aren't any objects which are both
+ 		        artifacts and unique, the last check is redundant. */
+ 		     obj->oartifact && !objects[obj->otyp].oc_unique));
+ }
+ 
+ /* Give the name of an object seen at a distance.  Unlike xname/doname,
+  * we don't want to set dknown if it's not set already.  The kludge used is
+  * to temporarily set Blind so that xname() skips the dknown setting.  This
+  * assumes that we don't want to do this too often; if this function becomes
+  * frequently used, it'd probably be better to pass a parameter to xname()
+  * or doname() instead.
+  */
+ char *
+ distant_name(obj, func)
+ register struct obj *obj;
+ char *FDECL((*func), (OBJ_P));
+ {
+ 	char *str;
+ 
+ 	long save_Blinded = Blinded;
+ 	Blinded = 1;
+ 	str = (*func)(obj);
+ 	Blinded = save_Blinded;
+ 	return str;
+ }
+ 
+ /* convert player specified fruit name into corresponding fruit juice name
+    ("slice of pizza" -> "pizza juice" rather than "slice of pizza juice") */
+ char *
+ fruitname(juice)
+ boolean juice;	/* whether or not to append " juice" to the name */
+ {
+     char *buf = nextobuf();
+     const char *fruit_nam = strstri(pl_fruit, " of ");
+ 
+     if (fruit_nam)
+ 	fruit_nam += 4;		/* skip past " of " */
+     else
+ 	fruit_nam = pl_fruit;	/* use it as is */
+ 
+     Sprintf(buf, "%s%s", makesingular(fruit_nam), juice ? " juice" : "");
+     return buf;
+ }
+ 
+ #endif /* OVLB */
+ #ifdef OVL1
+ 
+ char *
+ xname2(obj)
+ register struct obj *obj;
+ {	/* Hallu */
+ 	register char *buf;
+ 	register int typ = obj->otyp;
+ 	register struct objclass *ocl = &objects[typ];
+ 	register int nn = ocl->oc_name_known;
+ 	register const char *actualn = OBJ_NAME(*ocl);
+ 	register const char *dn = OBJ_DESCR(*ocl);
+ 	register const char *un = ocl->oc_uname;
+ 
+ 	buf = nextobuf() + PREFIX;	/* leave room for "17 -3 " */
+ 	if (Role_if(PM_SAMURAI) && Japanese_item_name(typ))
+ 		actualn = Japanese_item_name(typ);
+ 
+ 	buf[0] = '\0';
+ 	/*
+ 	 * clean up known when it's tied to oc_name_known, eg after AD_DRIN
+ 	 * This is only required for unique objects since the article
+ 	 * printed for the object is tied to the combination of the two
+ 	 * and printing the wrong article gives away information.
+ 	 */
+ 	if (!nn && ocl->oc_uses_known && ocl->oc_unique) obj->known = 0;
+ #ifndef INVISIBLE_OBJECTS
+ 	if (!Blind) obj->dknown = TRUE;
+ #else
+ 	if (!Blind && (!obj->oinvis || See_invisible)) obj->dknown = TRUE;
+ #endif
+ 	if (Role_if(PM_PRIEST) || Role_if(PM_NECROMANCER)) obj->bknown = TRUE;
+ 
+ 	/* We could put a switch(obj->oclass) here but currently only this one case exists */
+ 	if (obj->oclass == WEAPON_CLASS && is_poisonable(obj) && obj->opoisoned)
+ 		Strcpy(buf, "poisoned ");
+ 
+ 	if (obj_is_pname(obj))
+ 	    goto nameit;
+ 	switch (obj->oclass) {
+ 	    case AMULET_CLASS:
+ 		if (!obj->dknown)
+ 			Strcpy(buf, "amulet");
+ 		else if (typ == AMULET_OF_YENDOR ||
+ 			 typ == FAKE_AMULET_OF_YENDOR)
+ 			/* each must be identified individually */
+ 			Strcpy(buf, obj->known ? actualn : dn);
+ 		else if (nn)
+ 			Strcpy(buf, actualn);
+ 		else if (un)
+ 			Sprintf(buf,"amulet called %s", un);
+ 		else
+ 			Sprintf(buf,"%s amulet", dn);
+ 		break;
+ 	    case WEAPON_CLASS:
+ 	    case VENOM_CLASS:
+ 	    case TOOL_CLASS:
+ 		if (typ == LENSES)
+ 			Strcpy(buf, "pair of ");
+ 
+ 		if (!obj->dknown)
+ 			Strcat(buf, dn ? dn : actualn);
+ 		else if (nn)
+ 			Strcat(buf, actualn);
+ 		else if (un) {
+ 			Strcat(buf, dn ? dn : actualn);
+ 			Strcat(buf, " called ");
+ 			Strcat(buf, un);
+ 		} else
+ 			Strcat(buf, dn ? dn : actualn);
+ 		/* If we use an() here we'd have to remember never to use */
+ 		/* it whenever calling doname() or xname(). */
+ 		if (typ == FIGURINE)
+ 		    Sprintf(eos(buf), " of a%s %s",
+ 			index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
+ 			mons[obj->corpsenm].mname);
+ 		break;
+ 	    case ARMOR_CLASS:
+ 		/* depends on order of the dragon scales objects */
+ 		if (typ >= GRAY_DRAGON_SCALES && typ <= YELLOW_DRAGON_SCALES) {
+ 			Sprintf(buf, "set of %s", actualn);
+ 			break;
+ 		}
+ 		if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of ");
+ 
+ 		if(obj->otyp >= ELVEN_SHIELD && obj->otyp <= ORCISH_SHIELD
+ 				&& !obj->dknown) {
+ 			Strcpy(buf, "shield");
+ 			break;
+ 		}
+ 		if(obj->otyp == SHIELD_OF_REFLECTION && !obj->dknown) {
+ 			Strcpy(buf, "smooth shield");
+ 			break;
+ 		}
+ 
+ 		if(nn)	Strcat(buf, actualn);
+ 		else if(un) {
+ 			if(is_boots(obj))
+ 				Strcat(buf,"boots");
+ 			else if(is_gloves(obj))
+ 				Strcat(buf,"gloves");
+ 			else if(is_cloak(obj))
+ 				Strcpy(buf,"cloak");
+ 			else if(is_helmet(obj))
+ 				Strcpy(buf,"helmet");
+ 			else if(is_shield(obj))
+ 				Strcpy(buf,"shield");
+ 			else
+ 				Strcpy(buf,"armor");
+ 			Strcat(buf, " called ");
+ 			Strcat(buf, un);
+ 		} else	Strcat(buf, dn);
+ 		break;
+ 	    case FOOD_CLASS:
+ 		if (typ == SLIME_MOLD) {
+ 			register struct fruit *f;
+ 
+ 			for(f=ffruit; f; f = f->nextf) {
+ 				if(f->fid == obj->spe) {
+ 					Strcpy(buf, f->fname);
+ 					break;
+ 				}
+ 			}
+ 			if (!f) impossible("Bad fruit #%d?", obj->spe);
+ 			break;
+ 		}
+ 
+ 		Strcpy(buf, actualn);
+ 		if (typ == TIN && obj->known) {
+ 		    if(obj->spe > 0)
+ 			Strcat(buf, " of spinach");
+ 		    else if (obj->corpsenm == NON_PM)
+ 		        Strcpy(buf, "empty tin");
+ 		    else if (vegetarian(&mons[obj->corpsenm]))
+ 			Sprintf(eos(buf), " of %s", mons[obj->corpsenm].mname);
+ 		    else
+ 			Sprintf(eos(buf), " of %s meat", mons[obj->corpsenm].mname);
+ 		}
+ 		break;
+ 	    case COIN_CLASS:
+ 	    case CHAIN_CLASS:
+ 		Strcpy(buf, actualn);
+ 		break;
+ 	    case ROCK_CLASS:
+ 		if (typ == STATUE)
+ 		    Sprintf(buf, "%s%s of %s%s",
+ 			(Role_if(PM_ARCHEOLOGIST) && (obj->spe & STATUE_HISTORIC)) ? "historic " : "" ,
+ 			actualn,
+ 			type_is_pname(&mons[obj->corpsenm]) ? "" :
+ 			  (mons[obj->corpsenm].geno & G_UNIQ) ? "the " :
+ 			    (index(vowels,*(mons[obj->corpsenm].mname)) ?
+ 								"an " : "a "),
+ 			mons[obj->corpsenm].mname);
+ 		else Strcpy(buf, actualn);
+ 		break;
+ 	    case BALL_CLASS:
+ 		Sprintf(buf, "%sheavy iron ball",
+ 			(obj->owt > ocl->oc_weight) ? "very " : "");
+ 		break;
+ 	    case POTION_CLASS:
+ 		if (obj->dknown && obj->odiluted)
+ 			Strcpy(buf, "diluted ");
+ 		if(nn || un || !obj->dknown) {
+ 			Strcat(buf, "potion");
+ 			if(!obj->dknown) break;
+ 			if(nn) {
+ 			    Strcat(buf, " of ");
+ 			    if (typ == POT_WATER &&
+ 				obj->bknown && (obj->blessed || obj->cursed)) {
+ 				Strcat(buf, obj->blessed ? "holy " : "unholy ");
+ 			    }
+ 			    Strcat(buf, actualn);
+ 			} else {
+ 				Strcat(buf, " called ");
+ 				Strcat(buf, un);
+ 			}
+ 		} else {
+ 			Strcat(buf, dn);
+ 			Strcat(buf, " potion");
+ 		}
+ 		break;
+ 	case SCROLL_CLASS:
+ 		Strcpy(buf, "scroll");
+ 		if(!obj->dknown) break;
+ 		if(nn) {
+ 			Strcat(buf, " of ");
+ 			Strcat(buf, actualn);
+ 		} else if(un) {
+ 			Strcat(buf, " called ");
+ 			Strcat(buf, un);
+ 		} else if (ocl->oc_magic) {
+ 			Strcat(buf, " labeled ");
+ 			Strcat(buf, dn);
+ 		} else {
+ 			Strcpy(buf, dn);
+ 			Strcat(buf, " scroll");
+ 		}
+ 		break;
+ 	case WAND_CLASS:
+ 		if(!obj->dknown)
+ 			Strcpy(buf, "wand");
+ 		else if(nn)
+ 			Sprintf(buf, "wand of %s", actualn);
+ 		else if(un)
+ 			Sprintf(buf, "wand called %s", un);
+ 		else
+ 			Sprintf(buf, "%s wand", dn);
+ 		break;
+ 	case SPBOOK_CLASS:
+ 		if (!obj->dknown) {
+ 			Strcpy(buf, "spellbook");
+ 		} else if (nn) {
+ 			if (typ != SPE_BOOK_OF_THE_DEAD)
+ 			    Strcpy(buf, "spellbook of ");
+ 			Strcat(buf, actualn);
+ 		} else if (un) {
+ 			Sprintf(buf, "spellbook called %s", un);
+ 		} else
+ 			Sprintf(buf, "%s spellbook", dn);
+ 		break;
+ 	case RING_CLASS:
+ 		if(!obj->dknown)
+ 			Strcpy(buf, "ring");
+ 		else if(nn) {
+ 			/* KMH -- "mood ring" instead of "ring of mood" */
+ 			if (typ == RIN_MOOD)
+ 				Sprintf(buf, "%s ring", actualn);
+ 			else
+ 			Sprintf(buf, "ring of %s", actualn);
+ 		} else if(un)
+ 			Sprintf(buf, "ring called %s", un);
+ 		else
+ 			Sprintf(buf, "%s ring", dn);
+ 		break;
+ 	case GEM_CLASS:
+ 	    {
+ 		const char *rock =
+ 			    (ocl->oc_material == MINERAL) ? "stone" : "gem";
+ 		if (!obj->dknown) {
+ 		    Strcpy(buf, rock);
+ 		} else if (!nn) {
+ 		    if (un) Sprintf(buf,"%s called %s", rock, un);
+ 		    else Sprintf(buf, "%s %s", dn, rock);
+ 		} else {
+ 		    Strcpy(buf, actualn);
+ 		    if (GemStone(typ)) Strcat(buf, " stone");
+ 		}
+ 		break;
+ 	    }
+ 	default:
+ 		Sprintf(buf,"glorkum %d %d %d", obj->oclass, typ, obj->spe);
+ 	}
+ 	if (obj->quan != 1L) Strcpy(buf, makeplural(buf));
+ 
+ 	if (obj->onamelth && obj->dknown) {
+ 		Strcat(buf, " named ");
+ nameit:
+ 		Strcat(buf, ONAME(obj));
+ 	}
+ 
+ 	if (!strncmpi(buf, "the ", 4)) buf += 4;
+ 	return(buf);
+ } /* end Hallu */
+ 
+ /* WAC calls the above xname2 */
+ char *
+ xname(obj)
+ register struct obj *obj;
+ {
+ /* WAC moved hallucination here */
+ 	register struct obj *hobj;
+ #ifdef LINT     /* lint may handle static decl poorly -- static char bufr[]; */
+ 	char bufr[BUFSZ];
+ #else
+ 	static char bufr[BUFSZ];
+ #endif
+ 	register char *buf = &(bufr[PREFIX]);   /* leave room for "17 -3 " */
+ 
+ 	if (Hallucination && !program_state.gameover) {
+ 		hobj = mkobj(obj->oclass, 0);
+ 		hobj->quan = obj->quan;
+ 		/* WAC clean up */
+ 		buf = xname2(hobj);
+ 		obj_extract_self(hobj);                
+ 		dealloc_obj(hobj);
+ 
+ 		return (buf);
+ 	} else return xname2(obj);
+ }
+ 
+ /* xname() output augmented for multishot missile feedback */
+ char *
+ mshot_xname(obj)
+ struct obj *obj;
+ {
+     char tmpbuf[BUFSZ];
+     char *onm = xname(obj);
+ 
+     if (m_shot.n > 1 && m_shot.o == obj->otyp) {
+ 	/* copy xname's result so that we can reuse its return buffer */
+ 	Strcpy(tmpbuf, onm);
+ 	/* "the Nth arrow"; value will eventually be passed to an() or
+ 	   The(), both of which correctly handle this "the " prefix */
+ 	Sprintf(onm, "the %d%s %s", m_shot.i, ordin(m_shot.i), tmpbuf);
+     }
+ 
+     return onm;
+ }
+ 
+ #endif /* OVL1 */
+ #ifdef OVL0
+ 
+ /* used for naming "the unique_item" instead of "a unique_item" */
+ boolean
+ the_unique_obj(obj)
+ register struct obj *obj;
+ {
+     if (!obj->dknown)
+ 	return FALSE;
+     else if (obj->otyp == FAKE_AMULET_OF_YENDOR && !obj->known)
+ 	return TRUE;		/* lie */
+     else
+ 	return (boolean)(objects[obj->otyp].oc_unique &&
+ 			 (obj->known || obj->otyp == AMULET_OF_YENDOR));
+ }
+ 
+ static void
+ add_erosion_words(obj,prefix)
+ struct obj *obj;
+ char *prefix;
+ {
+ 	boolean iscrys = (obj->otyp == CRYSKNIFE);
+ 
+ 
+ 	if (!is_damageable(obj) && !iscrys || Hallucination) return;
+ 
+ 	/* The only cases where any of these bits do double duty are for
+ 	 * rotted food and diluted potions, which are all not is_damageable().
+ 	 */
+ 	if (obj->oeroded && !iscrys) {
+ 		switch (obj->oeroded) {
+ 			case 2:	Strcat(prefix, "very "); break;
+ 			case 3:	Strcat(prefix, "thoroughly "); break;
+ 		}			
+ 		Strcat(prefix, is_rustprone(obj) ? "rusty " : "burnt ");
+ 	}
+ 	if (obj->oeroded2 && !iscrys) {
+ 		switch (obj->oeroded2) {
+ 			case 2:	Strcat(prefix, "very "); break;
+ 			case 3:	Strcat(prefix, "thoroughly "); break;
+ 		}			
+ 		Strcat(prefix, is_corrodeable(obj) ? "corroded " :
+ 			"rotted ");
+ 	}
+ 	if (obj->rknown && obj->oerodeproof)
+ 		Strcat(prefix,
+ 		       iscrys ? "fixed " :
+ 		       is_rustprone(obj) ? "rustproof " :
+ 		       is_corrodeable(obj) ? "corrodeproof " :	/* "stainless"? */
+ 		       is_flammable(obj) ? "fireproof " : "");
+ }
+ 
+ char *
+ doname(obj)
+ register struct obj *obj;
+ {
+ 	boolean ispoisoned = FALSE;
+ 	char prefix[PREFIX];
+ 	char tmpbuf[PREFIX+1];
+ 	/* when we have to add something at the start of prefix instead of the
+ 	 * end (Strcat is used on the end)
+ 	 */
+ 	register char *bp = xname(obj);
+ 
+ 	/* When using xname, we want "poisoned arrow", and when using
+ 	 * doname, we want "poisoned +0 arrow".  This kludge is about the only
+ 	 * way to do it, at least until someone overhauls xname() and doname(),
+ 	 * combining both into one function taking a parameter.
+ 	 */
+ 	/* must check opoisoned--someone can have a weirdly-named fruit */
+ 	if (!strncmp(bp, "poisoned ", 9) && obj->opoisoned) {
+ 		bp += 9;
+ 		ispoisoned = TRUE;
+ 	}
+ 
+ 	if(obj->quan != 1L)
+ 		Sprintf(prefix, "%ld ", obj->quan);
+ 	else if (!Hallucination && (obj_is_pname(obj) || the_unique_obj(obj))) {
+ 		if (!strncmpi(bp, "the ", 4))
+ 		    bp += 4;
+ 		Strcpy(prefix, "the ");
+ 	} else Strcpy(prefix, "a ");
+ 
+ #ifdef INVISIBLE_OBJECTS
+ 	if (obj->oinvis) Strcat(prefix,"invisible ");
+ #endif
+ #if defined(WIZARD) && defined(UNPOLYPILE)
+ 	if (wizard && is_hazy(obj)) Strcat(prefix,"hazy ");
+ #endif
+ 
+ 	if ((!Hallucination || Role_if(PM_PRIEST) || Role_if(PM_NECROMANCER)) &&
+ 	    obj->bknown &&
+ 	    obj->oclass != COIN_CLASS &&
+ 	    (obj->otyp != POT_WATER || !objects[POT_WATER].oc_name_known
+ 		|| (!obj->cursed && !obj->blessed) || Hallucination)) {
+ 	    /* allow 'blessed clear potion' if we don't know it's holy water;
+ 	     * always allow "uncursed potion of water"
+ 	     */
+ 	    if (Hallucination ? !rn2(10) : obj->cursed)
+ 		Strcat(prefix, "cursed ");
+ 	    else if (Hallucination ? !rn2(10) : obj->blessed)
+ 		Strcat(prefix, "blessed ");
+ 	    else if ((!obj->known || !objects[obj->otyp].oc_charged ||
+ 		      (obj->oclass == ARMOR_CLASS ||
+ 		       obj->oclass == RING_CLASS))
+ 		/* For most items with charges or +/-, if you know how many
+ 		 * charges are left or what the +/- is, then you must have
+ 		 * totally identified the item, so "uncursed" is unneccesary,
+ 		 * because an identified object not described as "blessed" or
+ 		 * "cursed" must be uncursed.
+ 		 *
+ 		 * If the charges or +/- is not known, "uncursed" must be
+ 		 * printed to avoid ambiguity between an item whose curse
+ 		 * status is unknown, and an item known to be uncursed.
+ 		 */
+ #ifdef MAIL
+ 			&& obj->otyp != SCR_MAIL
+ #endif
+ 			&& obj->otyp != FAKE_AMULET_OF_YENDOR
+ 			&& obj->otyp != AMULET_OF_YENDOR
+ 			&& !Role_if(PM_PRIEST) && !Role_if(PM_NECROMANCER))
+ 		Strcat(prefix, "uncursed ");
+ 	}
+ 
+ 	if (Hallucination ? !rn2(100) : obj->greased) Strcat(prefix, "greased ");
+ 
+ 	switch(obj->oclass) {
+ 	case AMULET_CLASS:
+ 		add_erosion_words(obj, prefix);
+ 		if(obj->owornmask & W_AMUL)
+ 			Strcat(bp, " (being worn)");
+ 		break;
+ 	case WEAPON_CLASS:
+ 		if(ispoisoned)
+ 			Strcat(prefix, "poisoned ");
+ plus:
+ 		add_erosion_words(obj, prefix);
+ 		if (Hallucination)
+ 			break;
+ 		if(obj->known) {
+ 			Strcat(prefix, sitoa(obj->spe));
+ 			Strcat(prefix, " ");
+ 		}
+ #ifdef FIREARMS
+ 		if (
+ # ifdef LIGHTSABERS
+ 			is_lightsaber(obj) ||
+ # endif
+ 			obj->otyp == STICK_OF_DYNAMITE) {
+ 		    if (obj->lamplit) Strcat(bp, " (lit)");
+ #  ifdef DEBUG
+ 		    Sprintf(eos(bp), " (%d)", obj->age);		
+ #  endif
+ 		} else if (is_grenade(obj))
+ 		    if (obj->oarmed) Strcat(bp, " (armed)");
+ #else	/* FIREARMS */
+ # ifdef LIGHTSABERS
+ 		if (is_lightsaber(obj)) {
+ 		    if (obj->lamplit) Strcat(bp, " (lit)");
+ #  ifdef DEBUG
+ 		    Sprintf(eos(bp), " (%d)", obj->age);		
+ #  endif
+ 		}
+ # endif
+ #endif	/* FIREARMS */
+ 		break;
+ 	case ARMOR_CLASS:
+ 		if(obj->owornmask & W_ARMOR)
+ 			Strcat(bp, (obj == uskin) ? " (embedded in your skin)" :
+ 				" (being worn)");
+ 		goto plus;
+ 	case TOOL_CLASS:
+ 		/* weptools already get this done when we go to the +n code */
+ 		if (!is_weptool(obj))
+ 		    add_erosion_words(obj, prefix);
+ 		if (Hallucination)
+ 			break;
+ 		if(obj->owornmask & (W_TOOL /* blindfold */
+ #ifdef STEED
+ 				| W_SADDLE
+ #endif
+ 				)) {
+ 			Strcat(bp, " (being worn)");
+ 			break;
+ 		}
+ 		if (obj->otyp == LEASH && obj->leashmon != 0) {
+ 			Strcat(bp, " (in use)");
+ 			break;
+ 		}
+ 		if (obj->otyp == CANDELABRUM_OF_INVOCATION) {
+ 			if (!obj->spe)
+ 			    Strcpy(tmpbuf, "no");
+ 			else
+ 			    Sprintf(tmpbuf, "%d", obj->spe);
+ 			Sprintf(eos(bp), " (%s candle%s%s)",
+ 				tmpbuf, plur(obj->spe),
+ 				!obj->lamplit ? " attached" : ", lit");
+ 			break;
+ 		} else if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP ||
+ 			obj->otyp == BRASS_LANTERN || obj->otyp == TORCH ||
+ 			   Is_candle(obj)) {
+ 			if (Is_candle(obj) &&
+ 			    /* WAC - magic candles are never "partly used" */
+ 			    obj->otyp != MAGIC_CANDLE &&
+ 			    obj->age < 20L * (long)objects[obj->otyp].oc_cost)
+ 				Strcat(prefix, "partly used ");
+ 			if(obj->lamplit)
+ 				Strcat(bp, " (lit)");
+ 		}
+ 		if (is_weptool(obj))
+ 			goto plus;
+ 		if(objects[obj->otyp].oc_charged)
+ 		    goto charges;
+ 		break;
+ 	case SPBOOK_CLASS: /* WAC spellbooks have charges now */
+ #ifdef WIZARD
+ 		if (wizard) {
+ 		    if (Hallucination)
+ 			break;
+ 		    if (obj->known)
+ 			Sprintf(eos(bp), " (%d:%d,%d)",
+ 			  (int)obj->recharged, obj->spe, obj->spestudied);
+ 		    break;
+ 		} else
+ #endif
+ 		goto charges;
+ 	case WAND_CLASS:
+ 		add_erosion_words(obj, prefix);
+ charges:
+ 		if (Hallucination)
+ 			break;
+ 		if(obj->known)
+ 		    Sprintf(eos(bp), " (%d:%d)", (int)obj->recharged, obj->spe);
+ 		break;
+ 	case POTION_CLASS:
+ 		if (Hallucination)
+ 			break;
+ 		if (obj->otyp == POT_OIL && obj->lamplit)
+ 		    Strcat(bp, " (lit)");
+ 		break;
+ 	case RING_CLASS:
+ 		add_erosion_words(obj, prefix);
+ ring:
+ 		if(obj->owornmask & W_RINGR) Strcat(bp, " (on right ");
+ 		if(obj->owornmask & W_RINGL) Strcat(bp, " (on left ");
+ 		if(obj->owornmask & W_RING) {
+ 		    Strcat(bp, body_part(HAND));
+ 		    Strcat(bp, ")");
+ 		}
+ 		if (Hallucination)
+ 			break;
+ 		if(obj->known && objects[obj->otyp].oc_charged) {
+ 			Strcat(prefix, sitoa(obj->spe));
+ 			Strcat(prefix, " ");
+ 		}
+ 		break;
+ 	case FOOD_CLASS:
+ 		if (obj->otyp == CORPSE && obj->odrained) {
+ #ifdef WIZARD
+ 		    if (wizard && obj->oeaten < drainlevel(obj))
+ 			Strcpy(tmpbuf, "over-drained ");
+ 		    else
+ #endif
+ 		    Sprintf(tmpbuf, "%sdrained ",
+ 		      (obj->oeaten > drainlevel(obj)) ? "partly " : "");
+ 		}
+ 		else if (obj->oeaten)
+ 		    Strcpy(tmpbuf, "partly eaten ");
+ 		else
+ 		    tmpbuf[0] = '\0';
+ 		Strcat(prefix, tmpbuf);
+ 		if (obj->otyp == CORPSE && !Hallucination) {
+ 		    if (mons[obj->corpsenm].geno & G_UNIQ) {
+ 			Sprintf(prefix, "%s%s ",
+ 				(type_is_pname(&mons[obj->corpsenm]) ?
+ 					"" : "the "),
+ 				s_suffix(mons[obj->corpsenm].mname));
+ 			Strcat(prefix, tmpbuf);
+ 		    } else {
+ 			Strcat(prefix, mons[obj->corpsenm].mname);
+ 			Strcat(prefix, " ");
+ 		    }
+ 		} else if (obj->otyp == EGG) {
+ #if 0	/* corpses don't tell if they're stale either */
+ 		    if (obj->known && stale_egg(obj))
+ 			Strcat(prefix, "stale ");
+ #endif
+ 		    if (obj->corpsenm >= LOW_PM &&
+ 			    (obj->known ||
+ 			    mvitals[obj->corpsenm].mvflags & MV_KNOWS_EGG)) {
+ 			Strcat(prefix, mons[obj->corpsenm].mname);
+ 			Strcat(prefix, " ");
+ 			if (obj->spe == 2)
+ 			    Strcat(bp, " (with your markings)");
+ 			else if (obj->spe)
+ 			    Strcat(bp, " (laid by you)");
+ 		    }
+ 		}
+ 		if (obj->otyp == MEAT_RING) goto ring;
+ 		break;
+ 	case BALL_CLASS:
+ 	case CHAIN_CLASS:
+ 		add_erosion_words(obj, prefix);
+ 		if(obj->owornmask & W_BALL)
+ 			Strcat(bp, " (chained to you)");
+ 			break;
+ 	}
+ 	if((obj->owornmask & W_WEP) && !mrg_to_wielded) {
+ 		if (obj->quan != 1L) {
+ 			Strcat(bp, " (wielded)");
+ 		} else {
+ 			const char *hand_s = body_part(HAND);
+ 
+ 			if (bimanual(obj)) hand_s = makeplural(hand_s);
+ 			Sprintf(eos(bp), " (weapon in %s)", hand_s);
+ 		}
+ 	}
+ 	if(obj->owornmask & W_SWAPWEP) {
+ 		if (u.twoweap)
+ 			Sprintf(eos(bp), " (wielded in other %s)",
+ 				body_part(HAND));
+ 		else
+ 			Strcat(bp, " (alternate weapon; not wielded)");
+ 	}
+ 	if(obj->owornmask & W_QUIVER) Strcat(bp, " (in quiver)");
+ 	if (!Hallucination && obj->unpaid) {
+ 		xchar ox, oy; 
+ 		long quotedprice = unpaid_cost(obj);
+ 		struct monst *shkp = (struct monst *)0;
+ 
+ 		if (Has_contents(obj) &&
+ 		    get_obj_location(obj, &ox, &oy, BURIED_TOO|CONTAINED_TOO) &&
+ 		    costly_spot(ox, oy) &&
+ 		    (shkp = shop_keeper(*in_rooms(ox, oy, SHOPBASE))))
+ 			quotedprice += contained_cost(obj, shkp, 0L, FALSE, TRUE);
+ 		Sprintf(eos(bp), " (unpaid, %ld %s)",
+ 			quotedprice, currency(quotedprice));
+ 	}
+ #ifdef WIZARD
+ 	if (wizard && obj->in_use)	/* Can't use "(in use)", see leashes */
+ 		Strcat(bp, " (finishing)");	/* always a bug */
+ #endif
+ 	if (!strncmp(prefix, "a ", 2) &&
+ 			index(vowels, *(prefix+2) ? *(prefix+2) : *bp)
+ 			&& (*(prefix+2) || (strncmp(bp, "uranium", 7)
+ 				&& strncmp(bp, "unicorn", 7)
+ 				&& strncmp(bp, "eucalyptus", 10)))) {
+ 		Strcpy(tmpbuf, prefix);
+ 		Strcpy(prefix, "an ");
+ 		Strcpy(prefix+3, tmpbuf+2);
+ 	}
+ 
+ #ifdef SHOW_WEIGHT
+ 	  /* [max] weight inventory */
+ 	if ((obj->otyp != BOULDER) || !throws_rocks (youmonst.data))
+ 	  if ((obj->otyp < LUCKSTONE) && (obj->otyp != CHEST) && (obj->otyp != LARGE_BOX) &&
+ 	      (obj->otyp != ICE_BOX) && (!Hallucination && flags.invweight))
+ 		        Sprintf (eos(bp), " {%d}", obj->owt);
+ #endif
+ 
+ 	bp = strprepend(bp, prefix);
+ 	return(bp);
+ }
+ 
+ #endif /* OVL0 */
+ #ifdef OVLB
+ 
+ /* used from invent.c */
+ boolean
+ not_fully_identified(otmp)
+ register struct obj *otmp;
+ {
+ #ifdef GOLDOBJ
+     /* gold doesn't have any interesting attributes [yet?] */
+     if (otmp->oclass == COIN_CLASS) return FALSE;	/* always fully ID'd */
+ #endif
+     /* check fundamental ID hallmarks first */
+     if (!otmp->known || !otmp->dknown ||
+ #ifdef MAIL
+ 	    (!otmp->bknown && otmp->otyp != SCR_MAIL) ||
+ #else
+ 	    !otmp->bknown ||
+ #endif
+ 	    !objects[otmp->otyp].oc_name_known)	/* ?redundant? */
+ 	return TRUE;
+     if (otmp->oartifact && undiscovered_artifact(otmp->oartifact))
+ 	return TRUE;
+     /* otmp->rknown is the only item of interest if we reach here */
+        /*
+ 	*  Note:  if a revision ever allows scrolls to become fireproof or
+ 	*  rings to become shockproof, this checking will need to be revised.
+ 	*  `rknown' ID only matters if xname() will provide the info about it.
+ 	*/
+     if (otmp->rknown || (otmp->oclass != ARMOR_CLASS &&
+ 			 otmp->oclass != WEAPON_CLASS &&
+ 			 !is_weptool(otmp) &&		    /* (redunant) */
+ 			 otmp->oclass != BALL_CLASS))	    /* (useless) */
+ 	return FALSE;
+     else	/* lack of `rknown' only matters for vulnerable objects */
+ 	return (boolean)(is_rustprone(otmp) ||
+ 			 is_corrodeable(otmp) ||
+ 			 is_flammable(otmp));
+ }
+ 
+ char *
+ corpse_xname(otmp, ignore_oquan)
+ struct obj *otmp;
+ boolean ignore_oquan;	/* to force singular */
+ {
+ 	char *nambuf = nextobuf();
+ 
+ 	Sprintf(nambuf, "%s corpse",
+ 		mons[Hallucination ? rndmonnum() : otmp->corpsenm].mname);
+ 
+ 	if (ignore_oquan || otmp->quan < 2)
+ 	    return nambuf;
+ 	else
+ 	    return makeplural(nambuf);
+ }
+ 
+ /* xname, unless it's a corpse, then corpse_xname(obj, FALSE) */
+ char *
+ cxname(obj)
+ struct obj *obj;
+ {
+ 	if (obj->otyp == CORPSE)
+ 	    return corpse_xname(obj, FALSE);
+ 	return xname(obj);
+ }
+ 
+ /* treat an object as fully ID'd when it might be used as reason for death */
+ char *
+ killer_xname(obj)
+ struct obj *obj;
+ {
+     struct obj save_obj;
+     unsigned save_ocknown;
+     char *buf, *save_ocuname;
+ 
+     /* remember original settings for core of the object;
+        oname and oattached extensions don't matter here--since they
+        aren't modified they don't need to be saved and restored */
+     save_obj = *obj;
+     /* killer name should be more specific than general xname; however, exact
+        info like blessed/cursed and rustproof makes things be too verbose */
+     obj->known = obj->dknown = 1;
+     obj->bknown = obj->rknown = obj->greased = 0;
+     /* if character is a priest[ess], bknown will get toggled back on */
+     obj->blessed = obj->cursed = 0;
+     /* "killed by poisoned <obj>" would be misleading when poison is
+        not the cause of death and "poisoned by poisoned <obj>" would
+        be redundant when it is, so suppress "poisoned" prefix */
+     obj->opoisoned = 0;
+     /* strip user-supplied name; artifacts keep theirs */
+     if (!obj->oartifact) obj->onamelth = 0;
+     /* temporarily identify the type of object */
+     save_ocknown = objects[obj->otyp].oc_name_known;
+     objects[obj->otyp].oc_name_known = 1;
+     save_ocuname = objects[obj->otyp].oc_uname;
+     objects[obj->otyp].oc_uname = 0;	/* avoid "foo called bar" */
+ 
+     buf = xname2(obj);
+     if (obj->quan == 1L) buf = obj_is_pname(obj) ? the(buf) : an(buf);
+ 
+     objects[obj->otyp].oc_name_known = save_ocknown;
+     objects[obj->otyp].oc_uname = save_ocuname;
+     *obj = save_obj;	/* restore object's core settings */
+ 
+     return buf;
+ }
+ 
+ char *
+ killer_cxname(obj, ignore_oquan)
+ struct obj *obj;
+ boolean ignore_oquan;	/* to force singular */
+ {
+     char *buf;
+     if (obj->otyp == CORPSE) {
+ 	buf = nextobuf();
+ 
+ 	Sprintf(buf, "%s%s corpse",
+ 		Hallucination ? "hallucinogen-distorted " : "",
+ 		mons[obj->corpsenm].mname);
+ 
+ 	if (!ignore_oquan && obj->quan >= 2)
+ 	    buf = makeplural(buf);
+     } else
+ 	buf = killer_xname(obj);
+     return buf;
+ }
+ 
+ /*
+  * Used if only one of a collection of objects is named (e.g. in eat.c).
+  */
+ const char *
+ singular(otmp, func)
+ register struct obj *otmp;
+ char *FDECL((*func), (OBJ_P));
+ {
+ 	long savequan;
+ #ifdef SHOW_WEIGHT
+ 	unsigned saveowt;
+ #endif
+ 	char *nam;
+ 
+ 	/* Note: using xname for corpses will not give the monster type */
+ 	if (otmp->otyp == CORPSE && func == xname && !Hallucination)
+ 		return corpse_xname(otmp, TRUE);
+ 
+ 	savequan = otmp->quan;
+ 	otmp->quan = 1L;
+ #ifdef SHOW_WEIGHT
+ 	saveowt = otmp->owt;
+ 	otmp->owt = weight(otmp);
+ #endif
+ 	nam = (*func)(otmp);
+ 	otmp->quan = savequan;
+ #ifdef SHOW_WEIGHT
+ 	otmp->owt = saveowt;
+ #endif
+ 	return nam;
+ }
+ 
+ char *
+ an(str)
+ register const char *str;
+ {
+ 	char *buf = nextobuf();
+ 
+ 	buf[0] = '\0';
+ 
+ 	if (strncmpi(str, "the ", 4) &&
+ 	    strcmp(str, "molten lava") &&
+ 	    strcmp(str, "iron bars") &&
+ 	    strcmp(str, "ice")) {
+ 		if (index(vowels, *str) &&
+ 		    strncmp(str, "one-", 4) &&
+ 		    strncmp(str, "useful", 6) &&
+ 		    strncmp(str, "unicorn", 7) &&
+ 		    strncmp(str, "uranium", 7) &&
+ 		    strncmp(str, "eucalyptus", 10))
+ 			Strcpy(buf, "an ");
+ 		else
+ 			Strcpy(buf, "a ");
+ 	}
+ 
+ 	Strcat(buf, str);
+ 	return buf;
+ }
+ 
+ char *
+ An(str)
+ const char *str;
+ {
+ 	register char *tmp = an(str);
+ 	*tmp = highc(*tmp);
+ 	return tmp;
+ }
+ 
+ /*
+  * Prepend "the" if necessary; assumes str is a subject derived from xname.
+  * Use type_is_pname() for monster names, not the().  the() is idempotent.
+  */
+ char *
+ the(str)
+ const char *str;
+ {
+ 	char *buf = nextobuf();
+ 	boolean insert_the = FALSE;
+ 
+ 	if (!strncmpi(str, "the ", 4)) {
+ 	    buf[0] = lowc(*str);
+ 	    Strcpy(&buf[1], str+1);
+ 	    return buf;
+ 	} else if (*str < 'A' || *str > 'Z') {
+ 	    /* not a proper name, needs an article */
+ 	    insert_the = TRUE;
+ 	} else {
+ 	    /* Probably a proper name, might not need an article */
+ 	    register char *tmp, *named, *called;
+ 	    int l;
+ 
+ 	    /* some objects have capitalized adjectives in their names */
+ 	    if(((tmp = rindex(str, ' ')) || (tmp = rindex(str, '-'))) &&
+ 	       (tmp[1] < 'A' || tmp[1] > 'Z'))
+ 		insert_the = TRUE;
+ 	    else if (tmp && index(str, ' ') < tmp) {	/* has spaces */
+ 		/* it needs an article if the name contains "of" */
+ 		tmp = strstri(str, " of ");
+ 		named = strstri(str, " named ");
+ 		called = strstri(str, " called ");
+ 		if (called && (!named || called < named)) named = called;
+ 
+ 		if (tmp && (!named || tmp < named))	/* found an "of" */
+ 		    insert_the = TRUE;
+ 		/* stupid special case: lacks "of" but needs "the" */
+ 		else if (!named && (l = strlen(str)) >= 31 &&
+ 		      !strcmp(&str[l - 31], "Platinum Yendorian Express Card"))
+ 		    insert_the = TRUE;
+ 	    }
+ 	}
+ 	if (insert_the)
+ 	    Strcpy(buf, "the ");
+ 	else
+ 	    buf[0] = '\0';
+ 	Strcat(buf, str);
+ 
+ 	return buf;
+ }
+ 
+ char *
+ The(str)
+ const char *str;
+ {
+     register char *tmp = the(str);
+     *tmp = highc(*tmp);
+     return tmp;
+ }
+ 
+ /* returns "count cxname(otmp)" or just cxname(otmp) if count == 1 */
+ char *
+ aobjnam(otmp,verb)
+ register struct obj *otmp;
+ register const char *verb;
+ {
+ 	register char *bp = cxname(otmp);
+ 	char prefix[PREFIX];
+ 
+ 	if(otmp->quan != 1L) {
+ 		Sprintf(prefix, "%ld ", otmp->quan);
+ 		bp = strprepend(bp, prefix);
+ 	}
+ 
+ 	if(verb) {
+ 	    Strcat(bp, " ");
+ 	    Strcat(bp, otense(otmp, verb));
+ 	}
+ 	return(bp);
+ }
+ 
+ /* like aobjnam, but prepend "The", not count, and use xname */
+ char *
+ Tobjnam(otmp, verb)
+ register struct obj *otmp;
+ register const char *verb;
+ {
+ 	char *bp = The(xname(otmp));
+ 
+ 	if(verb) {
+ 	    Strcat(bp, " ");
+ 	    Strcat(bp, otense(otmp, verb));
+ 	}
+ 	return(bp);
+ }
+ 
+ /* return form of the verb (input plural) if xname(otmp) were the subject */
+ char *
+ otense(otmp, verb)
+ register struct obj *otmp;
+ register const char *verb;
+ {
+ 	char *buf;
+ 
+ 	/*
+ 	 * verb is given in plural (without trailing s).  Return as input
+ 	 * if the result of xname(otmp) would be plural.  Don't bother
+ 	 * recomputing xname(otmp) at this time.
+ 	 */
+ 	if (!is_plural(otmp))
+ 	    return vtense((char *)0, verb);
+ 
+ 	buf = nextobuf();
+ 	Strcpy(buf, verb);
+ 	return buf;
+ }
+ 
+ /* various singular words that vtense would otherwise categorize as plural */
+ static const char * const special_subjs[] = {
+ 	"erinys",
+ 	"manes",		/* this one is ambiguous */
+ 	"Cyclops",
+ 	"Hippocrates",
+ 	"Pelias",
+ 	"aklys",
+ 	"amnesia",
+ 	"paralysis",
+ 	0
+ };
+ 
+ /* return form of the verb (input plural) for present tense 3rd person subj */
+ char *
+ vtense(subj, verb)
+ register const char *subj;
+ register const char *verb;
+ {
+ 	char *buf = nextobuf();
+ 	int len, ltmp;
+ 	const char *sp, *spot;
+ 	const char * const *spec;
+ 
+ 	/*
+ 	 * verb is given in plural (without trailing s).  Return as input
+ 	 * if subj appears to be plural.  Add special cases as necessary.
+ 	 * Many hard cases can already be handled by using otense() instead.
+ 	 * If this gets much bigger, consider decomposing makeplural.
+ 	 * Note: monster names are not expected here (except before corpse).
+ 	 *
+ 	 * special case: allow null sobj to get the singular 3rd person
+ 	 * present tense form so we don't duplicate this code elsewhere.
+ 	 */
+ 	if (subj) {
+ 	    if (!strncmpi(subj, "a ", 2) || !strncmpi(subj, "an ", 3))
+ 		goto sing;
+ 	    spot = (const char *)0;
+ 	    for (sp = subj; (sp = index(sp, ' ')) != 0; ++sp) {
+ 		if (!strncmp(sp, " of ", 4) ||
+ 		    !strncmp(sp, " from ", 6) ||
+ 		    !strncmp(sp, " called ", 8) ||
+ 		    !strncmp(sp, " named ", 7) ||
+ 		    !strncmp(sp, " labeled ", 9)) {
+ 		    if (sp != subj) spot = sp - 1;
+ 		    break;
+ 		}
+ 	    }
+ 	    len = (int) strlen(subj);
+ 	    if (!spot) spot = subj + len - 1;
+ 
+ 	    /*
+ 	     * plural: anything that ends in 's', but not '*us' or '*ss'.
+ 	     * Guess at a few other special cases that makeplural creates.
+ 	     */
+ 	    if ((*spot == 's' && spot != subj &&
+ 			(*(spot-1) != 'u' && *(spot-1) != 's')) ||
+ 		((spot - subj) >= 4 && !strncmp(spot-3, "eeth", 4)) ||
+ 		((spot - subj) >= 3 && !strncmp(spot-3, "feet", 4)) ||
+ 		((spot - subj) >= 2 && !strncmp(spot-1, "ia", 2)) ||
+ 		((spot - subj) >= 2 && !strncmp(spot-1, "ae", 2))) {
+ 		/* check for special cases to avoid false matches */
+ 		len = (int)(spot - subj) + 1;
+ 		for (spec = special_subjs; *spec; spec++) {
+ 		    ltmp = strlen(*spec);
+ 		    if (len == ltmp && !strncmpi(*spec, subj, len)) goto sing;
+ 		    /* also check for <prefix><space><special_subj>
+ 		       to catch things like "the invisible erinys" */
+ 		    if (len > ltmp && *(spot - ltmp) == ' ' &&
+ 			   !strncmpi(*spec, spot - ltmp + 1, ltmp)) goto sing;
+ 		}
+ 
+ 		return strcpy(buf, verb);
+ 	    }
+ 	    /*
+ 	     * 3rd person plural doesn't end in telltale 's';
+ 	     * 2nd person singular behaves as if plural.
+ 	     */
+ 	    if (!strcmpi(subj, "they") || !strcmpi(subj, "you"))
+ 		return strcpy(buf, verb);
+ 	}
+ 
+  sing:
+ 	len = strlen(verb);
+ 	spot = verb + len - 1;
+ 
+ 	if (!strcmp(verb, "are"))
+ 	    Strcpy(buf, "is");
+ 	else if (!strcmp(verb, "have"))
+ 	    Strcpy(buf, "has");
+ 	else if (index("zxs", *spot) ||
+ 		 (len >= 2 && *spot=='h' && index("cs", *(spot-1))) ||
+ 		 (len == 2 && *spot == 'o')) {
+ 	    /* Ends in z, x, s, ch, sh; add an "es" */
+ 	    Strcpy(buf, verb);
+ 	    Strcat(buf, "es");
+ 	} else if (*spot == 'y' && (!index(vowels, *(spot-1)))) {
+ 	    /* like "y" case in makeplural */
+ 	    Strcpy(buf, verb);
+ 	    Strcpy(buf + len - 1, "ies");
+ 	} else {
+ 	    Strcpy(buf, verb);
+ 	    Strcat(buf, "s");
+ 	}
+ 
+ 	return buf;
+ }
+ 
+ /* capitalized variant of doname() */
+ char *
+ Doname2(obj)
+ register struct obj *obj;
+ {
+ 	register char *s = doname(obj);
+ 
+ 	*s = highc(*s);
+ 	return(s);
+ }
+ 
+ /* returns "your xname(obj)" or "Foobar's xname(obj)" or "the xname(obj)" */
+ char *
+ yname(obj)
+ struct obj *obj;
+ {
+ 	char *outbuf = nextobuf();
+ 	char *s = shk_your(outbuf, obj);	/* assert( s == outbuf ); */
+ 	int space_left = BUFSZ - strlen(s) - sizeof " ";
+ 
+ 	return strncat(strcat(s, " "), cxname(obj), space_left);
+ }
+ 
+ /* capitalized variant of yname() */
+ char *
+ Yname2(obj)
+ struct obj *obj;
+ {
+ 	char *s = yname(obj);
+ 
+ 	*s = highc(*s);
+ 	return s;
+ }
+ 
+ /* returns "your simple_typename(obj->otyp)"
+  * or "Foobar's simple_typename(obj->otyp)"
+  * or "the simple_typename(obj-otyp)"
+  */
+ char *
+ ysimple_name(obj)
+ struct obj *obj;
+ {
+ 	char *outbuf = nextobuf();
+ 	char *s = shk_your(outbuf, obj);	/* assert( s == outbuf ); */
+ 	int space_left = BUFSZ - strlen(s) - sizeof " ";
+ 
+ 	return strncat(strcat(s, " "), simple_typename(obj->otyp), space_left);
+ }
+ 
+ /* capitalized variant of ysimple_name() */
+ char *
+ Ysimple_name2(obj)
+ struct obj *obj;
+ {
+ 	char *s = ysimple_name(obj);
+ 
+ 	*s = highc(*s);
+ 	return s;
+ }
+ 
+ static const char *wrp[] = {
+ 	"wand", "ring", "potion", "scroll", "gem", "amulet",
+ 	"spellbook", "spell book",
+ 	/* for non-specific wishes */
+ 	"weapon", "armor", "armour", "tool", "food", "comestible",
+ };
+ static const char wrpsym[] = {
+ 	WAND_CLASS, RING_CLASS, POTION_CLASS, SCROLL_CLASS, GEM_CLASS,
+ 	AMULET_CLASS, SPBOOK_CLASS, SPBOOK_CLASS,
+ 	WEAPON_CLASS, ARMOR_CLASS, ARMOR_CLASS, TOOL_CLASS, FOOD_CLASS,
+ 	FOOD_CLASS
+ };
+ 
+ #endif /* OVLB */
+ #ifdef OVL0
+ 
+ /* Plural routine; chiefly used for user-defined fruits.  We have to try to
+  * account for everything reasonable the player has; something unreasonable
+  * can still break the code.  However, it's still a lot more accurate than
+  * "just add an s at the end", which Rogue uses...
+  *
+  * Also used for plural monster names ("Wiped out all homunculi.")
+  * and body parts.
+  *
+  * Also misused by muse.c to convert 1st person present verbs to 2nd person.
+  */
+ char *
+ makeplural(oldstr)
+ const char *oldstr;
+ {
+ 	/* Note: cannot use strcmpi here -- it'd give MATZot, CAVEMeN,... */
+ 	register char *spot;
+ 	char *str = nextobuf();
+ 	const char *excess = (char *)0;
+ 	int len;
+ 
+ 	while (*oldstr==' ') oldstr++;
+ 	if (!oldstr || !*oldstr) {
+ 		impossible("plural of null?");
+ 		Strcpy(str, "s");
+ 		return str;
+ 	}
+ 	Strcpy(str, oldstr);
+ 
+ 	/*
+ 	 * Skip changing "pair of" to "pairs of".  According to Webster, usual
+ 	 * English usage is use pairs for humans, e.g. 3 pairs of dancers,
+ 	 * and pair for objects and non-humans, e.g. 3 pair of boots.  We don't
+ 	 * refer to pairs of humans in this game so just skip to the bottom.
+ 	 */
+ 	if (!strncmp(str, "pair of ", 8))
+ 		goto bottom;
+ 
+ 	/* Search for common compounds, ex. lump of royal jelly */
+ 	for(spot=str; *spot; spot++) {
+ 		if (!strncmp(spot, " of ", 4)
+ 				|| !strncmp(spot, " labeled ", 9)
+ 				|| !strncmp(spot, " called ", 8)
+ 				|| !strncmp(spot, " named ", 7)
+ 				|| !strcmp(spot, " above") /* lurkers above */
+ 				|| !strncmp(spot, " versus ", 8)
+ 				|| !strncmp(spot, " from ", 6)
+ 				|| !strncmp(spot, " in ", 4)
+ 				|| !strncmp(spot, " on ", 4)
+ 				|| !strncmp(spot, " a la ", 6)
+ 				|| !strncmp(spot, " with", 5)	/* " with "? */
+ 				|| !strncmp(spot, " de ", 4)
+ 				|| !strncmp(spot, " d'", 3)
+ 				|| !strncmp(spot, " du ", 4)) {
+ 			excess = oldstr + (int) (spot - str);
+ 			*spot = 0;
+ 			break;
+ 		}
+ 	}
+ 	spot--;
+ 	while (*spot==' ') spot--; /* Strip blanks from end */
+ 	*(spot+1) = 0;
+ 	/* Now spot is the last character of the string */
+ 
+ 	len = strlen(str);
+ 
+ 	/* Single letters */
+ 	if (len==1 || !letter(*spot)) {
+ 		Strcpy(spot+1, "'s");
+ 		goto bottom;
+ 	}
+ 
+ 	/* Same singular and plural; mostly Japanese words except for "manes" */
+ 	if ((len == 2 && !strcmp(str, "ya")) ||
+ 	    (len >= 2 && !strcmp(spot-1, "ai")) || /* samurai, Uruk-hai */
+ 	    (len >= 3 && !strcmp(spot-2, " ya")) ||
+ 	    (len >= 4 &&
+ 	     (!strcmp(spot-3, "fish") || !strcmp(spot-3, "tuna") ||
+ 	      !strcmp(spot-3, "deer") || !strcmp(spot-3, "yaki") ||
+ 	      !strcmp(spot-3, "drow"))) ||
+ 	    (len >= 5 && (!strcmp(spot-4, "sheep") ||
+ 			!strcmp(spot-4, "ninja") ||
+ 			!strcmp(spot-4, "shito") ||
+ 			!strcmp(spot-7, "shuriken") ||
+ 			!strcmp(spot-4, "tengu") ||
+ 			!strcmp(spot-4, "manes"))) ||
+ 	    (len >= 6 && (!strcmp(spot-5, "ki-rin") ||
+ 			!strcmp(spot-5, "Nazgul"))) ||
+ 	    (len >= 7 && !strcmp(spot-6, "gunyoki")))
+ 		goto bottom;
+ 
+ 	/* man/men ("Wiped out all cavemen.") */
+ 	if (len >= 3 && !strcmp(spot-2, "man") &&
+ 			(len<6 || strcmp(spot-5, "shaman")) &&
+ 			(len<5 || strcmp(spot-4, "human"))) {
+ 		*(spot-1) = 'e';
+ 		goto bottom;
+ 	}
+ 
+ 	/* tooth/teeth */
+ 	if (len >= 5 && !strcmp(spot-4, "tooth")) {
+ 		Strcpy(spot-3, "eeth");
+ 		goto bottom;
+ 	}
+ 
+ 	/* knife/knives, etc... */
+ 	if (!strcmp(spot-1, "fe")) {
+ 		Strcpy(spot-1, "ves");
+ 		goto bottom;
+ 	} else if (*spot == 'f') {
+ 		if (index("lr", *(spot-1)) || index(vowels, *(spot-1))) {
+ 			Strcpy(spot, "ves");
+ 			goto bottom;
+ 		} else if (len >= 5 && !strncmp(spot-4, "staf", 4)) {
+ 			Strcpy(spot-1, "ves");
+ 			goto bottom;
+ 		}
+ 	}
+ 
+ 	/* foot/feet (body part) */
+ 	if (len >= 4 && !strcmp(spot-3, "foot")) {
+ 		Strcpy(spot-2, "eet");
+ 		goto bottom;
+ 	}
+ 
+ 	/* ium/ia (mycelia, baluchitheria) */
+ 	if (len >= 3 && !strcmp(spot-2, "ium")) {
+ 		*(spot--) = (char)0;
+ 		*spot = 'a';
+ 		goto bottom;
+ 	}
+ 
+ 	/* algae, larvae, hyphae (another fungus part) */
+ 	if ((len >= 4 && !strcmp(spot-3, "alga")) ||
+ 	    (len >= 5 &&
+ 	     (!strcmp(spot-4, "hypha") || !strcmp(spot-4, "larva")))) {
+ 		Strcpy(spot, "ae");
+ 		goto bottom;
+ 	}
+ 
+ 	/* fungus/fungi, homunculus/homunculi, but buses, lotuses, wumpuses */
+ 	if (len > 3 && !strcmp(spot-1, "us") &&
+ 	    (len < 5 || (strcmp(spot-4, "lotus") &&
+ 			 (len < 6 || strcmp(spot-5, "wumpus"))))) {
+ 		*(spot--) = (char)0;
+ 		*spot = 'i';
+ 		goto bottom;
+ 	}
+ 
+ 	/* vortex/vortices */
+ 	if (len >= 6 && !strcmp(spot-3, "rtex")) {
+ 		Strcpy(spot-1, "ices");
+ 		goto bottom;
+ 	}
+ 
+ 	/* djinni/djinn (note: also efreeti/efreet) */
+ 	if (len >= 6 && !strcmp(spot-5, "djinni")) {
+ 		*spot = (char)0;
+ 		goto bottom;
+ 	}
+ 
+ 	/* mumak/mumakil */
+ 	if (len >= 5 && !strcmp(spot-4, "mumak")) {
+ 		Strcpy(spot+1, "il");
+ 		goto bottom;
+ 	}
+ 
+ 	/* sis/ses (nemesis) */
+ 	if (len >= 3 && !strcmp(spot-2, "sis")) {
+ 		*(spot-1) = 'e';
+ 		goto bottom;
+ 	}
+ 
+ 	/* erinys/erinyes */
+ 	if (len >= 6 && !strcmp(spot-5, "erinys")) {
+ 		Strcpy(spot, "es");
+ 		goto bottom;
+ 	}
+ 
+ 	/* mouse/mice,louse/lice (not a monster, but possible in food names) */
+ 	if (len >= 5 && !strcmp(spot-3, "ouse") && index("MmLl", *(spot-4))) {
+ 		Strcpy(spot-3, "ice");
+ 		goto bottom;
+ 	}
+ 
+ 	/* matzoh/matzot, possible food name */
+ 	if (len >= 6 && (!strcmp(spot-5, "matzoh")
+ 					|| !strcmp(spot-5, "matzah"))) {
+ 		Strcpy(spot-1, "ot");
+ 		goto bottom;
+ 	}
+ 	if (len >= 5 && (!strcmp(spot-4, "matzo")
+ 					|| !strcmp(spot-5, "matza"))) {
+ 		Strcpy(spot, "ot");
+ 		goto bottom;
+ 	}
+ 
+ 	/* child/children (for wise guys who give their food funny names) */
+ 	if (len >= 5 && !strcmp(spot-4, "child")) {
+ 		Strcpy(spot, "dren");
+ 		goto bottom;
+ 	}
+ 
+ 	/* note: -eau/-eaux (gateau, bordeau...) */
+ 	/* note: ox/oxen, VAX/VAXen, goose/geese */
+ 
+ 	/* Ends in z, x, s, ch, sh; add an "es" */
+ 	if (index("zxs", *spot)
+ 			|| (len >= 2 && *spot=='h' && index("cs", *(spot-1)))
+ 	/* Kludge to get "tomatoes" and "potatoes" right */
+ 			|| (len >= 4 && !strcmp(spot-2, "ato"))) {
+ 		Strcpy(spot+1, "es");
+ 		goto bottom;
+ 	}
+ 
+ 	/* Ends in y preceded by consonant (note: also "qu") change to "ies" */
+ 	if (*spot == 'y' &&
+ 	    (!index(vowels, *(spot-1)))) {
+ 		Strcpy(spot, "ies");
+ 		goto bottom;
+ 	}
+ 
+ 	/* Default: append an 's' */
+ 	Strcpy(spot+1, "s");
+ 
+ bottom:	if (excess) Strcpy(eos(str), excess);
+ 	return str;
+ }
+ 
+ #endif /* OVL0 */
+ 
+ struct o_range {
+ 	const char *name, oclass;
+ 	int  f_o_range, l_o_range;
+ };
+ 
+ #ifndef OVLB
+ 
+ STATIC_DCL const struct o_range o_ranges[];
+ 
+ #else /* OVLB */
+ 
+ /* wishable subranges of objects */
+ /* KMH, balance patch -- fixed */
+ STATIC_OVL NEARDATA const struct o_range o_ranges[] = {
+ 	{ "bag",	TOOL_CLASS,   SACK,	      BAG_OF_TRICKS },
+ 	{ "lamp",	TOOL_CLASS,   OIL_LAMP,	      MAGIC_LAMP },
+ 	{ "candle",     TOOL_CLASS,   TALLOW_CANDLE,  MAGIC_CANDLE },
+ 	{ "horn",	TOOL_CLASS,   TOOLED_HORN,    HORN_OF_PLENTY },
+ 	{ "shield",	ARMOR_CLASS,  SMALL_SHIELD,   SHIELD_OF_REFLECTION },
+ 	{ "helm",	ARMOR_CLASS,  ELVEN_LEATHER_HELM, HELM_OF_TELEPATHY },
+ 	{ "gloves",	ARMOR_CLASS,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
+ 	{ "gauntlets",	ARMOR_CLASS,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
+ 	{ "boots",	ARMOR_CLASS,  LOW_BOOTS,      LEVITATION_BOOTS },
+ 	{ "shoes",	ARMOR_CLASS,  LOW_BOOTS,      IRON_SHOES },
+ 	{ "cloak",	ARMOR_CLASS,  MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT },
+ #ifdef TOURIST
+ 	{ "shirt",	ARMOR_CLASS,  HAWAIIAN_SHIRT, T_SHIRT },
+ #endif
+ 	{ "dragon scales",
+ 			ARMOR_CLASS,  GRAY_DRAGON_SCALES, YELLOW_DRAGON_SCALES },
+ 	{ "dragon scale mail",
+ 			ARMOR_CLASS,  GRAY_DRAGON_SCALE_MAIL, YELLOW_DRAGON_SCALE_MAIL },
+ 	{ "sword",      WEAPON_CLASS, ORCISH_SHORT_SWORD,    TSURUGI },
+ 	{ "polearm",    WEAPON_CLASS, PARTISAN, LANCE },
+ #ifdef LIGHTSABERS
+ 	{ "lightsaber", WEAPON_CLASS, GREEN_LIGHTSABER, RED_DOUBLE_LIGHTSABER },
+ #endif
+ #ifdef FIREARMS
+ 	{ "firearm", 	WEAPON_CLASS, PISTOL, AUTO_SHOTGUN },
+ 	{ "gun", 	WEAPON_CLASS, PISTOL, AUTO_SHOTGUN },
+ 	{ "grenade", 	WEAPON_CLASS, FRAG_GRENADE, GAS_GRENADE },
+ #endif
+ #ifdef WIZARD
+ 	{ "venom",	VENOM_CLASS,  BLINDING_VENOM, ACID_VENOM },
+ #endif
+ 	{ "gray stone",	GEM_CLASS,    LUCKSTONE,      FLINT },
+ 	{ "grey stone",	GEM_CLASS,    LUCKSTONE,      FLINT },
+ };
+ 
+ #define BSTRCMP(base,ptr,string) ((ptr) < base || strcmp((ptr),string))
+ #define BSTRCMPI(base,ptr,string) ((ptr) < base || strcmpi((ptr),string))
+ #define BSTRNCMP(base,ptr,string,num) ((ptr)<base || strncmp((ptr),string,num))
+ #define BSTRNCMPI(base,ptr,string,num) ((ptr)<base||strncmpi((ptr),string,num))
+ 
+ /*
+  * Singularize a string the user typed in; this helps reduce the complexity
+  * of readobjnam, and is also used in pager.c to singularize the string
+  * for which help is sought.
+  * WAC made most of the STRCMP ==> STRCMPI so that they are case insensitive
+  * catching things like "bag of Tricks"
+  */
+ char *
+ makesingular(oldstr)
+ const char *oldstr;
+ {
+ 	register char *p, *bp;
+ 	char *str = nextobuf();
+ 
+ 	if (!oldstr || !*oldstr) {
+ 		impossible("singular of null?");
+ 		str[0] = 0;
+ 		return str;
+ 	}
+ 	Strcpy(str, oldstr);
+ 	bp = str;
+ 
+ 	while (*bp == ' ') bp++;
+ 	/* find "cloves of garlic", "worthless pieces of blue glass" */
+ 	if ((p = strstri(bp, "s of ")) != 0) {
+ 	    /* but don't singularize "gauntlets", "boots", "Eyes of the.." */
+ 	    if (BSTRNCMPI(bp, p-3, "Eye", 3) &&
+ 		BSTRNCMP(bp, p-4, "boot", 4) &&
+ 		BSTRNCMP(bp, p-8, "gauntlet", 8))
+ 		while ((*p = *(p+1)) != 0) p++;
+ 	    return bp;
+ 	}
+ 
+ 	/* remove -s or -es (boxes) or -ies (rubies) */
+ 	p = eos(bp);
+ 	if (p >= bp+1 && p[-1] == 's') {
+ 		if (p >= bp+2 && p[-2] == 'e') {
+ 			if (p >= bp+3 && p[-3] == 'i') {
+ 				if(!BSTRCMPI(bp, p-7, "cookies") ||
+ 				   !BSTRCMPI(bp, p-4, "pies"))
+ 					goto mins;
+ 				Strcpy(p-3, "y");
+ 				return bp;
+ 			}
+ 
+ 			/* note: cloves / knives from clove / knife */
+ 			if(!BSTRCMPI(bp, p-6, "knives")) {
+ 				Strcpy(p-3, "fe");
+ 				return bp;
+ 			}
+ 			if(!BSTRCMPI(bp, p-6, "staves")) {
+ 				Strcpy(p-3, "ff");
+ 				return bp;
+ 			}
+ 			if (!BSTRCMPI(bp, p-6, "leaves")) {
+ 				Strcpy(p-3, "f");
+ 				return bp;
+ 			}
+ 			if (!BSTRCMP(bp, p-8, "vortices")) {
+ 				Strcpy(p-4, "ex");
+ 				return bp;
+ 			}
+ 
+ 			/* note: nurses, axes but boxes */
+ 			if (!BSTRCMP(bp, p-5, "boxes") ||
+ 			    !BSTRCMP(bp, p-4, "ches") ) {
+ 				p[-2] = 0;
+ 				return bp;
+ 			}
+ 
+ 			if (!BSTRCMPI(bp, p-6, "gloves") ||
+ 			    !BSTRCMP(bp, p-6, "lenses") ||
+                             !BSTRCMPI(bp, p-5, "shoes") ||
+                             !BSTRCMPI(bp, p-6, "scales"))
+ 				return bp;
+ 
+ 		} else if (!BSTRCMPI(bp, p-5, "boots") ||
+ 			   !BSTRCMP(bp, p-9, "gauntlets") ||
+                            !BSTRCMPI(bp, p-6, "tricks") ||
+                            !BSTRCMPI(bp, p-9, "paralysis") ||
+                            !BSTRCMPI(bp, p-5, "glass") ||
+                            !BSTRCMPI(bp, p-4, "ness") ||
+                            !BSTRCMPI(bp, p-14, "shape changers") ||
+                            !BSTRCMPI(bp, p-15, "detect monsters") ||
+                            !BSTRCMPI(bp, p-21, "Medallion of Shifters") ||
+                                 /* WAC added */
+                            !BSTRCMPI(bp, p-12, "Key of Chaos") ||
+ #ifdef WALLET_O_P
+                            !BSTRCMPI(bp, p-7, "Perseus") || /* WAC added */
+ #endif
+ 			   !BSTRCMPI(bp, p-11, "Aesculapius") || /* staff */
+ 			   !BSTRCMP(bp, p-10, "eucalyptus") ||
+ #ifdef WIZARD
+ 			   !BSTRCMP(bp, p-9, "iron bars") ||
+ #endif
+ 			   !BSTRCMP(bp, p-5, "aklys") ||
+ 			   !BSTRCMP(bp, p-6, "fungus"))
+ 				return bp;
+ 	mins:
+ 		p[-1] = 0;
+ 
+ 	} else {
+ 
+                 if(!BSTRCMPI(bp, p-5, "teeth")) {
+ 			Strcpy(p-5, "tooth");
+ 			return bp;
+ 		}
+ 
+ 		if (!BSTRCMP(bp, p-5, "fungi")) {
+ 			Strcpy(p-5, "fungus");
+ 			return bp;
+ 		}
+ 
+ 		/* here we cannot find the plural suffix */
+ 	}
+ 	return bp;
+ }
+ 
+ /* compare user string against object name string using fuzzy matching */
+ static boolean
+ wishymatch(u_str, o_str, retry_inverted)
+ const char *u_str;	/* from user, so might be variant spelling */
+ const char *o_str;	/* from objects[], so is in canonical form */
+ boolean retry_inverted;	/* optional extra "of" handling */
+ {
+ 	/* special case: wizards can wish for traps.  The object is "beartrap"
+ 	 * and the trap is "bear trap", so to let wizards wish for both we
+ 	 * must not fuzzymatch.
+ 	 */
+ #ifdef WIZARD
+ 	if (wizard && !strcmp(o_str, "beartrap"))
+ 	    return !strncmpi(o_str, u_str, 8);
+ #endif
+ 
+ 	/* ignore spaces & hyphens and upper/lower case when comparing */
+ 	if (fuzzymatch(u_str, o_str, " -", TRUE)) return TRUE;
+ 
+ 	if (retry_inverted) {
+ 	    const char *u_of, *o_of;
+ 	    char *p, buf[BUFSZ];
+ 
+ 	    /* when just one of the strings is in the form "foo of bar",
+ 	       convert it into "bar foo" and perform another comparison */
+ 	    u_of = strstri(u_str, " of ");
+ 	    o_of = strstri(o_str, " of ");
+ 	    if (u_of && !o_of) {
+ 		Strcpy(buf, u_of + 4);
+ 		p = eos(strcat(buf, " "));
+ 		while (u_str < u_of) *p++ = *u_str++;
+ 		*p = '\0';
+ 		return fuzzymatch(buf, o_str, " -", TRUE);
+ 	    } else if (o_of && !u_of) {
+ 		Strcpy(buf, o_of + 4);
+ 		p = eos(strcat(buf, " "));
+ 		while (o_str < o_of) *p++ = *o_str++;
+ 		*p = '\0';
+ 		return fuzzymatch(u_str, buf, " -", TRUE);
+ 	    }
+ 	}
+ 
+ 	/* [note: if something like "elven speed boots" ever gets added, these
+ 	   special cases should be changed to call wishymatch() recursively in
+ 	   order to get the "of" inversion handling] */
+ 	if (!strncmp(o_str, "dwarvish ", 9)) {
+ 	    if (!strncmpi(u_str, "dwarven ", 8))
+ 		return fuzzymatch(u_str + 8, o_str + 9, " -", TRUE);
+ 	} else if (!strncmp(o_str, "elven ", 6)) {
+ 	    if (!strncmpi(u_str, "elvish ", 7))
+ 		return fuzzymatch(u_str + 7, o_str + 6, " -", TRUE);
+ 	    else if (!strncmpi(u_str, "elfin ", 6))
+ 		return fuzzymatch(u_str + 6, o_str + 6, " -", TRUE);
+ 	} else if (!strcmp(o_str, "aluminum")) {
+ 		/* this special case doesn't really fit anywhere else... */
+ 		/* (note that " wand" will have been stripped off by now) */
+ 	    if (!strcmpi(u_str, "aluminium"))
+ 		return fuzzymatch(u_str + 9, o_str + 8, " -", TRUE);
+ 	}
+ 
+ 	return FALSE;
+ }
+ 
+ /* alternate spellings; if the difference is only the presence or
+    absence of spaces and/or hyphens (such as "pickaxe" vs "pick axe"
+    vs "pick-axe") then there is no need for inclusion in this list;
+    likewise for ``"of" inversions'' ("boots of speed" vs "speed boots") */
+ struct alt_spellings {
+ 	const char *sp;
+ 	int ob;
+ } spellings[] = {
+ 	{ "pickax", PICK_AXE },
+ 	{ "whip", BULLWHIP },
+ 	{ "saber", SILVER_SABER },
+ 	{ "silver sabre", SILVER_SABER },
+ 	{ "smooth shield", SHIELD_OF_REFLECTION },
+ 	{ "grey dragon scale mail", GRAY_DRAGON_SCALE_MAIL },
+ 	{ "grey dragon scales", GRAY_DRAGON_SCALES },
+ 	{ "enchant armour", SCR_ENCHANT_ARMOR },
+ 	{ "destroy armour", SCR_DESTROY_ARMOR },
+ 	{ "scroll of enchant armour", SCR_ENCHANT_ARMOR },
+ 	{ "scroll of destroy armour", SCR_DESTROY_ARMOR },
+ 	{ "leather armour", LEATHER_ARMOR },
+ 	{ "studded leather armour", STUDDED_LEATHER_ARMOR },
+ 	{ "iron ball", HEAVY_IRON_BALL },
+ 	{ "lantern", BRASS_LANTERN },
+ 	{ "mattock", DWARVISH_MATTOCK },
+ 	{ "amulet of poison resistance", AMULET_VERSUS_POISON },
+ 	{ "stone", ROCK },
+ 	{ "can", TIN },
+ 	{ "can opener", TIN_OPENER },
+ 	{ "kelp", KELP_FROND },
+ 	{ "eucalyptus", EUCALYPTUS_LEAF },
+ 	{ "grapple", GRAPPLING_HOOK },
+ 	/* KMH, balance patch -- new items */
+ 	{ "amulet versus stoning", AMULET_VERSUS_STONE },
+ 	{ "amulet of stone resistance", AMULET_VERSUS_STONE },
+ 	{ "health stone", HEALTHSTONE },
+ #ifdef FIREARMS
+ 	{ "handgun", PISTOL },
+ 	{ "hand gun", PISTOL },
+ 	{ "revolver", PISTOL },
+ 	{ "bazooka", ROCKET_LAUNCHER },
+ 	{ "hand grenade", FRAG_GRENADE },
+ 	{ "dynamite", STICK_OF_DYNAMITE },
+ #endif
+ #ifdef ZOUTHERN
+ 	{ "kiwifruit", APPLE },
+ 	{ "kiwi fruit", APPLE },
+ 	{ "kiwi", APPLE }, /* Actually refers to the bird */
+ #endif
+ #ifdef WIZARD
+ /* KMH, balance patch -- How lazy are we going to let the players get? */
+ /* WAC Added Abbreviations */
+ /* Tools */
+     { "BoH", BAG_OF_HOLDING },
+     { "BoO", BELL_OF_OPENING },
+     { "ML", MAGIC_LAMP },
+     { "MM", MAGIC_MARKER },
+     { "UH", UNICORN_HORN },
+ /* Rings */
+     { "RoC", RIN_CONFLICT },
+     { "RoPC", RIN_POLYMORPH_CONTROL },
+     { "RoTC", RIN_TELEPORT_CONTROL },
+ /* Scrolls */
+     { "SoC", SCR_CHARGING },
+     { "SoEA", SCR_ENCHANT_ARMOR },
+     { "SoEW", SCR_ENCHANT_WEAPON },
+     { "SoG", SCR_GENOCIDE },
+     { "SoI", SCR_IDENTIFY },
+     { "SoRC", SCR_REMOVE_CURSE },
+ /* Potions */
+     { "PoEH",  POT_EXTRA_HEALING},
+     { "PoGL",  POT_GAIN_LEVEL},
+     { "PoW",  POT_WATER},
+ /* Amulet */
+     { "AoESP",  AMULET_OF_ESP},
+     { "AoLS",  AMULET_OF_LIFE_SAVING},
+     { "AoY",  AMULET_OF_YENDOR},
+ /* Wands */
+     { "WoW",  WAN_WISHING},
+     { "WoCM",  WAN_CREATE_MONSTER},
+     { "WoT",  WAN_TELEPORTATION},
+     { "WoUT",  WAN_UNDEAD_TURNING},
+ /* Armour */
+     { "BoL",  LEVITATION_BOOTS},
+     { "BoS",  SPEED_BOOTS},
+     { "SB",  SPEED_BOOTS},
+     { "BoWW",  WATER_WALKING_BOOTS},
+     { "WWB",  WATER_WALKING_BOOTS},
+     { "CoD",  CLOAK_OF_DISPLACEMENT},
+     { "CoI",  CLOAK_OF_INVISIBILITY},
+     { "CoMR",  CLOAK_OF_MAGIC_RESISTANCE},
+     { "GoD",  GAUNTLETS_OF_DEXTERITY},
+     { "GoP",  GAUNTLETS_OF_POWER},
+     { "HoB",  HELM_OF_BRILLIANCE},
+     { "HoOA",  HELM_OF_OPPOSITE_ALIGNMENT},
+     { "HoT",  HELM_OF_TELEPATHY},
+     { "SoR",  SHIELD_OF_REFLECTION},
+ #endif
+ #ifdef TOURIST
+ 	{ "camera", EXPENSIVE_CAMERA },
+ 	{ "T shirt", T_SHIRT },
+ 	{ "tee shirt", T_SHIRT },
+ #endif
+ 	{ (const char *)0, 0 },
+ };
+ 
+ /*
+  * Return something wished for.  Specifying a null pointer for
+  * the user request string results in a random object.  Otherwise,
+  * if asking explicitly for "nothing" (or "nil") return no_wish;
+  * if not an object return &zeroobj; if an error (no matching object),
+  * return null.
+  * If from_user is false, we're reading from the wizkit, nothing was typed in.
+  */
+ struct obj *
+ readobjnam(bp, no_wish, from_user)
+ register char *bp;
+ struct obj *no_wish;
+ boolean from_user;
+ {
+ 	register char *p;
+ 	register int i;
+ 	register struct obj *otmp;
+ 	int cnt, spe, spesgn, typ, very, rechrg;
+ 	int blessed, uncursed, iscursed, ispoisoned, isgreased, isdrained;
+ 	int eroded, eroded2, erodeproof;
+ #ifdef INVISIBLE_OBJECTS
+ 	int isinvisible;
+ #endif
+ 	int halfeaten, halfdrained, mntmp, contents;
+ 	int islit, unlabeled, ishistoric, isdiluted;
+ 	struct fruit *f;
+ 	int ftype = current_fruit;
+ 	char fruitbuf[BUFSZ];
+ 	/* Fruits may not mess up the ability to wish for real objects (since
+ 	 * you can leave a fruit in a bones file and it will be added to
+ 	 * another person's game), so they must be checked for last, after
+ 	 * stripping all the possible prefixes and seeing if there's a real
+ 	 * name in there.  So we have to save the full original name.  However,
+ 	 * it's still possible to do things like "uncursed burnt Alaska",
+ 	 * or worse yet, "2 burned 5 course meals", so we need to loop to
+ 	 * strip off the prefixes again, this time stripping only the ones
+ 	 * possible on food.
+ 	 * We could get even more detailed so as to allow food names with
+ 	 * prefixes that _are_ possible on food, so you could wish for
+ 	 * "2 3 alarm chilis".  Currently this isn't allowed; options.c
+ 	 * automatically sticks 'candied' in front of such names.
+ 	 */
+ 
+ 	char oclass;
+ 	char *un, *dn, *actualn;
+ 	const char *name=0;
+ 
+ 
+ 	cnt = spe = spesgn = typ = very = rechrg =
+ 		blessed = uncursed = iscursed = isdrained = halfdrained =
+ #ifdef INVISIBLE_OBJECTS
+ 		isinvisible =
+ #endif
+ 		ispoisoned = isgreased = eroded = eroded2 = erodeproof =
+ 		halfeaten = islit = unlabeled = ishistoric = isdiluted = 0;
+ 	mntmp = NON_PM;
+ #define UNDEFINED 0
+ #define EMPTY 1
+ #define SPINACH 2
+ 	contents = UNDEFINED;
+ 	oclass = 0;
+ 	actualn = dn = un = 0;
+ 
+ 	if (!bp) goto any;
+ 	/* first, remove extra whitespace they may have typed */
+ 	(void)mungspaces(bp);
+ 	/* allow wishing for "nothing" to preserve wishless conduct...
+ 	   [now requires "wand of nothing" if that's what was really wanted] */
+ 	if (!strcmpi(bp, "nothing") || !strcmpi(bp, "nil") ||
+ 	    !strcmpi(bp, "none")) return no_wish;
+ 	/* save the [nearly] unmodified choice string */
+ 	Strcpy(fruitbuf, bp);
+ 
+ 	for(;;) {
+ 		register int l;
+ 
+ 		if (!bp || !*bp) goto any;
+ 		if (!strncmpi(bp, "an ", l=3) ||
+ 		    !strncmpi(bp, "a ", l=2)) {
+ 			cnt = 1;
+ 		} else if (!strncmpi(bp, "the ", l=4)) {
+ 			;	/* just increment `bp' by `l' below */
+ 		} else if (!cnt && digit(*bp) && strcmp(bp, "0")) {
+ 			cnt = atoi(bp);
+ 			while(digit(*bp)) bp++;
+ 			while(*bp == ' ') bp++;
+ 			l = 0;
+ 		} else if (*bp == '+' || *bp == '-') {
+ 			spesgn = (*bp++ == '+') ? 1 : -1;
+ 			spe = atoi(bp);
+ 			while(digit(*bp)) bp++;
+ 			while(*bp == ' ') bp++;
+ 			l = 0;
+ 		} else if (!strncmpi(bp, "blessed ", l=8)
+ /*WAC removed this.  Holy is in some artifact weapon names
+                 || !strncmpi(bp, "holy ", l=5)
+ */
+                            ) {
+ 			blessed = 1;
+ 		} else if (!strncmpi(bp, "cursed ", l=7) ||
+ 			   !strncmpi(bp, "unholy ", l=7)) {
+ 			iscursed = 1;
+ 		} else if (!strncmpi(bp, "uncursed ", l=9)) {
+ 			uncursed = 1;
+ #ifdef INVISIBLE_OBJECTS
+ 		} else if (!strncmpi(bp, "visible ", l=8)) {
+ 			isinvisible = -1;
+ 		} else if (!strncmpi(bp, "invisible ", l=10)) {
+ 			isinvisible = 1;
+ #endif
+ 		} else if (!strncmpi(bp, "rustproof ", l=10) ||
+ 			   !strncmpi(bp, "erodeproof ", l=11) ||
+ 			   !strncmpi(bp, "corrodeproof ", l=13) ||
+ 			   !strncmpi(bp, "fixed ", l=6) ||
+ 			   !strncmpi(bp, "fireproof ", l=10) ||
+ 			   !strncmpi(bp, "rotproof ", l=9)) {
+ 			erodeproof = 1;
+ 		} else if (!strncmpi(bp,"lit ", l=4) ||
+ 			   !strncmpi(bp,"burning ", l=8)) {
+ 			islit = 1;
+ 		} else if (!strncmpi(bp,"unlit ", l=6) ||
+ 			   !strncmpi(bp,"extinguished ", l=13)) {
+ 			islit = 0;
+ 		/* "unlabeled" and "blank" are synonymous */
+ 		} else if (!strncmpi(bp,"unlabeled ", l=10) ||
+ 			   !strncmpi(bp,"unlabelled ", l=11) ||
+ 			   !strncmpi(bp,"blank ", l=6)) {
+ 			unlabeled = 1;
+ 		} else if(!strncmpi(bp, "poisoned ",l=9)
+ #ifdef WIZARD
+ 			  || (wizard && !strncmpi(bp, "trapped ",l=8))
+ #endif
+ 			  ) {
+ 			ispoisoned=1;
+ 		} else if(!strncmpi(bp, "greased ",l=8)) {
+ 			isgreased=1;
+ 		} else if (!strncmpi(bp, "very ", l=5)) {
+ 			/* very rusted very heavy iron ball */
+ 			very = 1;
+ 		} else if (!strncmpi(bp, "thoroughly ", l=11)) {
+ 			very = 2;
+ 		} else if (!strncmpi(bp, "rusty ", l=6) ||
+ 			   !strncmpi(bp, "rusted ", l=7) ||
+ 			   !strncmpi(bp, "burnt ", l=6) ||
+ 			   !strncmpi(bp, "burned ", l=7)) {
+ 			eroded = 1 + very;
+ 			very = 0;
+ 		} else if (!strncmpi(bp, "corroded ", l=9) ||
+ 			   !strncmpi(bp, "rotted ", l=7)) {
+ 			eroded2 = 1 + very;
+ 			very = 0;
+ 		} else if (!strncmpi(bp, "partly drained ", l=15)) {
+ 			isdrained = 1;
+ 			halfdrained = 1;
+ 		} else if (!strncmpi(bp, "drained ", l=8)) {
+ 			isdrained = 1;
+ 			halfdrained = 0;
+ 		} else if (!strncmpi(bp, "partly eaten ", l=13)) {
+ 			halfeaten = 1;
+ 		} else if (!strncmpi(bp, "historic ", l=9)) {
+ 			ishistoric = 1;
+ 		} else if (!strncmpi(bp, "diluted ", l=8)) {
+ 			isdiluted = 1;
+ 		} else if(!strncmpi(bp, "empty ", l=6)) {
+ 			contents = EMPTY;
+ 		} else break;
+ 		bp += l;
+ 	}
+ 	if(!cnt) cnt = 1;		/* %% what with "gems" etc. ? */
+ 	if (strlen(bp) > 1) {
+ 	    if ((p = rindex(bp, '(')) != 0) {
+ 		if (p > bp && p[-1] == ' ') p[-1] = 0;
+ 		else *p = 0;
+ 		p++;
+ 		if (!strcmpi(p, "lit)")) {
+ 		    islit = 1;
+ 		} else {
+ 		    spe = atoi(p);
+ 		    while(digit(*p)) p++;
+ 		    if (*p == ':') {
+ 			p++;
+ 			rechrg = spe;
+ 			spe = atoi(p);
+ 			while (digit(*p)) p++;
+ 		    }
+ 		    if (*p != ')') {
+ 			spe = rechrg = 0;
+ 		    } else {
+ 			spesgn = 1;
+ 			p++;
+ 			if (*p) Strcat(bp, p);
+ 		    }
+ 		}
+ 	    }
+ 	}
+ /*
+    otmp->spe is type schar; so we don't want spe to be any bigger or smaller.
+    also, spe should always be positive  -- some cheaters may try to confuse
+    atoi()
+ */
+ 	if (spe < 0) {
+ 		spesgn = -1;	/* cheaters get what they deserve */
+ 		spe = abs(spe);
+ 	}
+ 	if (spe > SCHAR_LIM)
+ 		spe = SCHAR_LIM;
+ 	if (rechrg < 0 || rechrg > 7) rechrg = 7;	/* recharge_limit */
+ 
+ 	/* now we have the actual name, as delivered by xname, say
+ 		green potions called whisky
+ 		scrolls labeled "QWERTY"
+ 		egg
+ 		fortune cookies
+ 		very heavy iron ball named hoei
+ 		wand of wishing
+ 		elven cloak
+ 	*/
+ 	if ((p = strstri(bp, " named ")) != 0) {
+ 		*p = 0;
+ 		name = p+7;
+ 	}
+ 	if ((p = strstri(bp, " called ")) != 0) {
+ 		*p = 0;
+ 		un = p+8;
+ 		/* "helmet called telepathy" is not "helmet" (a specific type)
+ 		 * "shield called reflection" is not "shield" (a general type)
+ 		 */
+ 		for(i = 0; i < SIZE(o_ranges); i++)
+ 		    if(!strcmpi(bp, o_ranges[i].name)) {
+ 			oclass = o_ranges[i].oclass;
+ 			goto srch;
+ 		    }
+ 	}
+ 	if ((p = strstri(bp, " labeled ")) != 0) {
+ 		*p = 0;
+ 		dn = p+9;
+ 	} else if ((p = strstri(bp, " labelled ")) != 0) {
+ 		*p = 0;
+ 		dn = p+10;
+ 	}
+ 	if ((p = strstri(bp, " of spinach")) != 0) {
+ 		*p = 0;
+ 		contents = SPINACH;
+ 	}
+ 
+ 	/*
+ 	Skip over "pair of ", "pairs of", "set of" and "sets of".
+ 
+ 	Accept "3 pair of boots" as well as "3 pairs of boots". It is valid
+ 	English either way.  See makeplural() for more on pair/pairs.
+ 
+ 	We should only double count if the object in question is not
+ 	refered to as a "pair of".  E.g. We should double if the player
+ 	types "pair of spears", but not if the player types "pair of
+ 	lenses".  Luckily (?) all objects that are refered to as pairs
+ 	-- boots, gloves, and lenses -- are also not mergable, so cnt is
+ 	ignored anyway.
+ 	*/
+ 	if(!strncmpi(bp, "pair of ",8)) {
+ 		bp += 8;
+ 		cnt *= 2;
+ 	} else if(cnt > 1 && !strncmpi(bp, "pairs of ",9)) {
+ 		bp += 9;
+ 		cnt *= 2;
+ 	} else if (!strncmpi(bp, "set of ",7)) {
+ 		bp += 7;
+ 	} else if (!strncmpi(bp, "sets of ",8)) {
+ 		bp += 8;
+ 	}
+ 
+ 	/*
+ 	 * Find corpse type using "of" (figurine of an orc, tin of orc meat)
+ 	 * Don't check if it's a wand or spellbook.
+ 	 * (avoid "wand/finger of death" confusion).
+ 	 * (WAC avoid "hand/eye of vecna", "wallet of perseus" 
+ 	 *  "medallion of shifters", "stake of van helsing" similarly
+ 	 *  ALI "potion of vampire blood" also).
+ 	 */
+ 	if (!strstri(bp, "wand ")
+ 	 && !strstri(bp, "spellbook ")
+          && !strstri(bp, "hand ")
+          && !strstri(bp, "eye ")
+          && !strstri(bp, "medallion ")
+          && !strstri(bp, "stake ")
+          && !strstri(bp, "potion ")
+ 	 && !strstri(bp, "finger ")) {
+ 	    if ((p = strstri(bp, " of ")) != 0
+ 		&& (mntmp = name_to_mon(p+4)) >= LOW_PM)
+ 		*p = 0;
+ 	}
+ 
+ 	/* Find corpse type w/o "of" (red dragon scale mail, yeti corpse) */
+ 	if (strncmpi(bp, "samurai sword", 13)) /* not the "samurai" monster! */
+ 	if (strncmpi(bp, "wizard lock", 11)) /* not the "wizard" monster! */
+ 	if (strncmpi(bp, "ninja-to", 8)) /* not the "ninja" rank */
+ 	if (strncmpi(bp, "master key", 10)) /* not the "master" rank */
+ 	if (strncmpi(bp, "magenta", 7)) /* not the "mage" rank */
+         if (strncmpi(bp, "Thiefbane", 9)) /* not the "thief" rank */
+         if (strncmpi(bp, "Ogresmasher", 11)) /* not the "ogre" monster */
+         if (strncmpi(bp, "Bat from Hell", 13)) /* not the "bat" monster */
+         if (strncmpi(bp, "vampire blood", 13)) /* not the "vampire" monster */
+ 	if (mntmp < LOW_PM && strlen(bp) > 2 &&
+ 	    (mntmp = name_to_mon(bp)) >= LOW_PM) {
+ 		int mntmptoo, mntmplen;	/* double check for rank title */
+ 		char *obp = bp;
+ 		mntmptoo = title_to_mon(bp, (int *)0, &mntmplen);
+ 		bp += mntmp != mntmptoo ? (int)strlen(mons[mntmp].mname) : mntmplen;
+ 		if (*bp == ' ') bp++;
+ 		else if (!strncmpi(bp, "s ", 2)) bp += 2;
+ 		else if (!strncmpi(bp, "es ", 3)) bp += 3;
+ 		else if (!*bp && !actualn && !dn && !un && !oclass) {
+ 		    /* no referent; they don't really mean a monster type */
+ 		    bp = obp;
+ 		    mntmp = NON_PM;
+ 		}
+ 	}
+ 
+ 	/* first change to singular if necessary */
+ 	if (*bp) {
+ 		char *sng = makesingular(bp);
+ 		if (strcmp(bp, sng)) {
+ 			if (cnt == 1) cnt = 2;
+ 			Strcpy(bp, sng);
+ 		}
+ 	}
+ 
+ 	/* Alternate spellings (pick-ax, silver sabre, &c) */
+     {
+ 	struct alt_spellings *as = spellings;
+ 
+ 		while(as->sp) {
+ 		if (fuzzymatch(bp, as->sp, " -", TRUE)) {
+ 			typ = as->ob;
+ 			goto typfnd;
+ 		}
+ 		as++;
+ 	}
+ 	/* can't use spellings list for this one due to shuffling */
+ 	if (!strncmpi(bp, "grey spell", 10))
+ 		*(bp + 2) = 'a';
+     }
+ 
+ 	/* dragon scales - assumes order of dragons */
+ 	if(!strcmpi(bp, "scales") &&
+ 			mntmp >= PM_GRAY_DRAGON && mntmp <= PM_YELLOW_DRAGON) {
+ 		typ = GRAY_DRAGON_SCALES + mntmp - PM_GRAY_DRAGON;
+ 		mntmp = NON_PM;	/* no monster */
+ 		goto typfnd;
+ 	}
+ 
+ 	p = eos(bp);
+ 	if(!BSTRCMPI(bp, p-10, "holy water")) {
+ 		typ = POT_WATER;
+ 		if ((p-bp) >= 12 && *(p-12) == 'u')
+ 			iscursed = 1; /* unholy water */
+ 		else blessed = 1;
+ 		goto typfnd;
+ 	}
+ 	if(unlabeled && !BSTRCMPI(bp, p-6, "scroll")) {
+ 		typ = SCR_BLANK_PAPER;
+ 		goto typfnd;
+ 	}
+ 	if(unlabeled && !BSTRCMPI(bp, p-9, "spellbook")) {
+ 		typ = SPE_BLANK_PAPER;
+ 		goto typfnd;
+ 	}
+ 	/*
+ 	 * NOTE: Gold pieces are handled as objects nowadays, and therefore
+ 	 * this section should probably be reconsidered as well as the entire
+ 	 * gold/money concept.  Maybe we want to add other monetary units as
+ 	 * well in the future. (TH)
+ 	 */
+ 	if(!BSTRCMPI(bp, p-10, "gold piece") || !BSTRCMPI(bp, p-7, "zorkmid") ||
+ 	   !strcmpi(bp, "gold") || !strcmpi(bp, "money") ||
+ 	   !strcmpi(bp, "coin") || *bp == GOLD_SYM) {
+ 			if (cnt > 5000
+ #ifdef WIZARD
+ 					&& !wizard
+ #endif
+ 						) cnt=5000;
+ 		if (cnt < 1) cnt=1;
+ #ifndef GOLDOBJ
+ 		if (from_user)
+ 		    pline("%d gold piece%s.", cnt, plur(cnt));
+ 		u.ugold += cnt;
+ 		flags.botl=1;
+ 		return (&zeroobj);
+ #else
+                 otmp = mksobj(GOLD_PIECE, FALSE, FALSE);
+ 		otmp->quan = cnt;
+                 otmp->owt = weight(otmp);
+ 		flags.botl=1;
+ 		return (otmp);
+ #endif
+ 	}
+ 	if (strlen(bp) == 1 &&
+ 	   (i = def_char_to_objclass(*bp)) < MAXOCLASSES && i > ILLOBJ_CLASS
+ #ifdef WIZARD
+ 	    && (wizard || i != VENOM_CLASS)
+ #else
+ 	    && i != VENOM_CLASS
+ #endif
+ 	    ) {
+ 		oclass = i;
+ 		goto any;
+ 	}
+ 
+ 	/* Search for class names: XXXXX potion, scroll of XXXXX.  Avoid */
+ 	/* false hits on, e.g., rings for "ring mail". */
+     /* false hits on "GrayWAND", "Staff of WitheRING"  -- WAC */
+ 	if(strncmpi(bp, "enchant ", 8) &&
+ 	   strncmpi(bp, "destroy ", 8) &&
+ 	   strncmpi(bp, "food detection", 14) &&
+ 	   strncmpi(bp, "ring mail", 9) &&
+ 	   strncmpi(bp, "studded leather arm", 19) &&
+ 	   strncmpi(bp, "leather arm", 11) &&
+ 	   strncmpi(bp, "tooled horn", 11) &&
+        strncmpi(bp, "graywand", 8) &&
+        strncmpi(bp, "staff of withering", 18) &&
+        strncmpi(bp, "one ring", 8) &&
+ 	   strncmpi(bp, "food ration", 11) &&
+ 	   strncmpi(bp, "meat ring", 9)
+ 	)
+ 	for (i = 0; i < (int)(sizeof wrpsym); i++) {
+ 		register int j = strlen(wrp[i]);
+ 		if(!strncmpi(bp, wrp[i], j)){
+ 			oclass = wrpsym[i];
+ 			if(oclass != AMULET_CLASS) {
+ 			    bp += j;
+ 			    if(!strncmpi(bp, " of ", 4)) actualn = bp+4;
+ 			    /* else if(*bp) ?? */
+ 			} else
+ 			    actualn = bp;
+ 			goto srch;
+ 		}
+ 		if(!BSTRCMPI(bp, p-j, wrp[i])){
+ 			oclass = wrpsym[i];
+ 			p -= j;
+ 			*p = 0;
+ 			if(p > bp && p[-1] == ' ') p[-1] = 0;
+ 			actualn = dn = bp;
+ 			goto srch;
+ 		}
+ 	}
+ 
+ 	/* "grey stone" check must be before general "stone" */
+ 	for (i = 0; i < SIZE(o_ranges); i++)
+ 	    if(!strcmpi(bp, o_ranges[i].name)) {
+ 		typ = rnd_class(o_ranges[i].f_o_range, o_ranges[i].l_o_range);
+ 		goto typfnd;
+ 	    }
+ 
+ 	if (!BSTRCMPI(bp, p-6, " stone")) {
+ 		p[-6] = 0;
+ 		oclass = GEM_CLASS;
+ 		dn = actualn = bp;
+ 		goto srch;
+ 	} else if (!strcmpi(bp, "looking glass")) {
+ 		;	/* avoid false hit on "* glass" */
+ 	} else if (!BSTRCMPI(bp, p-6, " glass") || !strcmpi(bp, "glass")) {
+ 		register char *g = bp;
+ 		if (strstri(g, "broken")) return (struct obj *)0;
+ 		if (!strncmpi(g, "worthless ", 10)) g += 10;
+ 		if (!strncmpi(g, "piece of ", 9)) g += 9;
+ 		if (!strncmpi(g, "colored ", 8)) g += 8;
+ 		else if (!strncmpi(g, "coloured ", 9)) g += 9;
+ 		if (!strcmpi(g, "glass")) {	/* choose random color */
+ 			/* 9 different kinds */
+ 			typ = LAST_GEM + rnd(9);
+ 			if (objects[typ].oc_class == GEM_CLASS) goto typfnd;
+ 			else typ = 0;	/* somebody changed objects[]? punt */
+ 		} else {		/* try to construct canonical form */
+ 			char tbuf[BUFSZ];
+ 			Strcpy(tbuf, "worthless piece of ");
+ 			Strcat(tbuf, g);  /* assume it starts with the color */
+ 			Strcpy(bp, tbuf);
+ 		}
+ 	}
+ 
+ 	actualn = bp;
+ 	if (!dn) dn = actualn; /* ex. "skull cap" */
+ srch:
+ 	/* check real names of gems first */
+ 	if(!oclass && actualn) {
+ 	    for(i = bases[GEM_CLASS]; i <= LAST_GEM; i++) {
+ 		register const char *zn;
+ 
+ 		if((zn = OBJ_NAME(objects[i])) && !strcmpi(actualn, zn)) {
+ 		    typ = i;
+ 		    goto typfnd;
+ 		}
+ 	    }
+ 	}
+ 	i = oclass ? bases[(int)oclass] : 1;
+ 	while(i < NUM_OBJECTS && (!oclass || objects[i].oc_class == oclass)){
+ 		register const char *zn;
+ 
+ 		if (actualn && (zn = OBJ_NAME(objects[i])) != 0 &&
+ 			    wishymatch(actualn, zn, TRUE)) {
+ 			typ = i;
+ 			goto typfnd;
+ 		}
+ 		if (dn && (zn = OBJ_DESCR(objects[i])) != 0 &&
+ 			    wishymatch(dn, zn, FALSE)) {
+ 			/* don't match extra descriptions (w/o real name) */
+ 			if (!OBJ_NAME(objects[i])) return (struct obj *)0;
+ 			typ = i;
+ 			goto typfnd;
+ 		}
+ 		if (un && (zn = objects[i].oc_uname) != 0 &&
+ 			    wishymatch(un, zn, FALSE)) {
+ 			typ = i;
+ 			goto typfnd;
+ 		}
+ 		i++;
+ 	}
+ 	if (actualn) {
+ 		struct Jitem *j = Japanese_items;
+ 		while(j->item) {
+ 			if (actualn && !strcmpi(actualn, j->name)) {
+ 				typ = j->item;
+ 				goto typfnd;
+ 			}
+ 			j++;
+ 		}
+ 	}
+ 	if (!strcmpi(bp, "spinach")) {
+ 		contents = SPINACH;
+ 		typ = TIN;
+ 		goto typfnd;
+ 	}
+ 	/* Note: not strncmpi.  2 fruits, one capital, one not, are possible. */
+ 	{
+ 	    char *fp;
+ 	    int l, cntf;
+ 	    int blessedf, iscursedf, uncursedf, halfeatenf;
+ 
+ 	    blessedf = iscursedf = uncursedf = halfeatenf = 0;
+ 	    cntf = 0;
+ 
+ 	    fp = fruitbuf;
+ 	    for(;;) {
+ 		if (!fp || !*fp) break;
+ 		if (!strncmpi(fp, "an ", l=3) ||
+ 		    !strncmpi(fp, "a ", l=2)) {
+ 			cntf = 1;
+ 		} else if (!cntf && digit(*fp)) {
+ 			cntf = atoi(fp);
+ 			while(digit(*fp)) fp++;
+ 			while(*fp == ' ') fp++;
+ 			l = 0;
+ 		} else if (!strncmpi(fp, "blessed ", l=8)) {
+ 			blessedf = 1;
+ 		} else if (!strncmpi(fp, "cursed ", l=7)) {
+ 			iscursedf = 1;
+ 		} else if (!strncmpi(fp, "uncursed ", l=9)) {
+ 			uncursedf = 1;
+ 		} else if (!strncmpi(fp, "partly eaten ", l=13)) {
+ 			halfeatenf = 1;
+ 		} else break;
+ 		fp += l;
+ 	    }
+ 
+ 	    for(f=ffruit; f; f = f->nextf) {
+ 		char *f1 = f->fname, *f2 = makeplural(f->fname);
+ 
+ 		if(!strncmp(fp, f1, strlen(f1)) ||
+ 					!strncmp(fp, f2, strlen(f2))) {
+ 			typ = SLIME_MOLD;
+ 			blessed = blessedf;
+ 			iscursed = iscursedf;
+ 			uncursed = uncursedf;
+ 			halfeaten = halfeatenf;
+ 			cnt = cntf;
+ 			ftype = f->fid;
+ 			goto typfnd;
+ 		}
+ 	    }
+ 	}
+ 
+ 	if(!oclass && actualn) {
+ 	    short objtyp;
+ 
+ 	    /* Perhaps it's an artifact specified by name, not type */
+ 	    name = artifact_name(actualn, &objtyp);
+ 	    if(name) {
+ 		typ = objtyp;
+ 		goto typfnd;
+ 	    }
+ 	}
+ #ifdef WIZARD
+ 	/* Let wizards wish for traps --KAA */
+ 	/* must come after objects check so wizards can still wish for
+ 	 * trap objects like beartraps
+ 	 */
+ 	if (wizard && from_user) {
+ 		int trap;
+ 
+ 		for (trap = NO_TRAP+1; trap < TRAPNUM; trap++) {
+ 			const char *tname;
+ 
+ 			tname = defsyms[trap_to_defsym(trap)].explanation;
+ 			if (!strncmpi(tname, bp, strlen(tname))) {
+ 				/* avoid stupid mistakes */
+ 				if((trap == TRAPDOOR || trap == HOLE)
+ 				      && !Can_fall_thru(&u.uz)) trap = ROCKTRAP;
+ 				(void) maketrap(u.ux, u.uy, trap);
+ 				pline("%s.", An(tname));
+ 				return(&zeroobj);
+ 			}
+ 		}
+ 		/* or some other dungeon features -dlc */
+ 		p = eos(bp);
+ 		if(!BSTRCMP(bp, p-8, "fountain")) {
+ 			levl[u.ux][u.uy].typ = FOUNTAIN;
+ 			level.flags.nfountains++;
+ 			if(!strncmpi(bp, "magic ", 6))
+ 				levl[u.ux][u.uy].blessedftn = 1;
+ 			pline("A %sfountain.",
+ 			      levl[u.ux][u.uy].blessedftn ? "magic " : "");
+ 			newsym(u.ux, u.uy);
+ 			return(&zeroobj);
+ 		}
+ 		if(!BSTRCMP(bp, p-6, "throne")) {
+ 			levl[u.ux][u.uy].typ = THRONE;
+ 			pline("A throne.");
+ 			newsym(u.ux, u.uy);
+ 			return(&zeroobj);
+ 		}
+ 		if(!BSTRCMP(bp, p-9, "headstone") || !BSTRCMP(bp, p-5, "grave")) {
+ 			levl[u.ux][u.uy].typ = GRAVE;
+ 			make_grave(u.ux, u.uy, (char *) 0);
+ 			pline("A grave.");
+ 			newsym(u.ux, u.uy);
+ 			return(&zeroobj);
+ 		}
+ 		if(!BSTRCMP(bp, p-4, "tree")) {
+ 			levl[u.ux][u.uy].typ = TREE;
+ 			pline("A tree.");
+ 			newsym(u.ux, u.uy);
+ 			return &zeroobj;
+ 		}
+ # ifdef SINKS
+ 		if(!BSTRCMP(bp, p-4, "sink")) {
+ 			levl[u.ux][u.uy].typ = SINK;
+ 			level.flags.nsinks++;
+ 			pline("A sink.");
+ 			newsym(u.ux, u.uy);
+ 			return &zeroobj;
+ 		}
+ 		if(!BSTRCMP(bp, p-6, "toilet")) {
+ 			levl[u.ux][u.uy].typ = TOILET;
+ 			level.flags.nsinks++;
+ 			pline("A toilet.");
+ 			newsym(u.ux, u.uy);
+ 			return &zeroobj;
+ 		}
+ # endif
+ 		if(!BSTRCMP(bp, p-4, "pool")) {
+ 			levl[u.ux][u.uy].typ = POOL;
+ 			del_engr_at(u.ux, u.uy);
+ 			pline("A pool.");
+ 			/* Must manually make kelp! */
+ 			water_damage(level.objects[u.ux][u.uy], FALSE, TRUE);
+ 			newsym(u.ux, u.uy);
+ 			return &zeroobj;
+ 		}
+ 		if (!BSTRCMP(bp, p-4, "lava")) {  /* also matches "molten lava" */
+ 			levl[u.ux][u.uy].typ = LAVAPOOL;
+ 			del_engr_at(u.ux, u.uy);
+ 			pline("A pool of molten lava.");
+ 			if (!(Levitation || Flying)) (void) lava_effects();
+ 			newsym(u.ux, u.uy);
+ 			return &zeroobj;
+ 		}
+ 
+ 		if(!BSTRCMP(bp, p-5, "altar")) {
+ 		    aligntyp al;
+ 
+ 		    levl[u.ux][u.uy].typ = ALTAR;
+ 		    if(!strncmpi(bp, "chaotic ", 8))
+ 			al = A_CHAOTIC;
+ 		    else if(!strncmpi(bp, "neutral ", 8))
+ 			al = A_NEUTRAL;
+ 		    else if(!strncmpi(bp, "lawful ", 7))
+ 			al = A_LAWFUL;
+ 		    else if(!strncmpi(bp, "unaligned ", 10))
+ 			al = A_NONE;
+ 		    else /* -1 - A_CHAOTIC, 0 - A_NEUTRAL, 1 - A_LAWFUL */
+ 			al = (!rn2(6)) ? A_NONE : rn2((int)A_LAWFUL+2) - 1;
+ 		    levl[u.ux][u.uy].altarmask = Align2amask( al );
+ 		    pline("%s altar.", An(align_str(al)));
+ 		    newsym(u.ux, u.uy);
+ 		    return(&zeroobj);
+ 		}
+ 
+ 		if(!BSTRCMP(bp, p-5, "grave") || !BSTRCMP(bp, p-9, "headstone")) {
+ 		    make_grave(u.ux, u.uy, (char *) 0);
+ 		    pline("A grave.");
+ 		    newsym(u.ux, u.uy);
+ 		    return(&zeroobj);
+ 		}
+ 
+ 		if(!BSTRCMP(bp, p-4, "tree")) {
+ 		    levl[u.ux][u.uy].typ = TREE;
+ 		    pline("A tree.");
+ 		    newsym(u.ux, u.uy);
+ 		    block_point(u.ux, u.uy);
+ 		    return &zeroobj;
+ 		}
+ 
+ 		if(!BSTRCMP(bp, p-4, "bars")) {
+ 		    levl[u.ux][u.uy].typ = IRONBARS;
+ 		    pline("Iron bars.");
+ 		    newsym(u.ux, u.uy);
+ 		    return &zeroobj;
+ 		}
+ 	}
+ #endif
+ 	if(!oclass) return((struct obj *)0);
+ any:
+ 	if(!oclass) oclass = wrpsym[rn2((int)sizeof(wrpsym))];
+ typfnd:
+ 	if (typ) oclass = objects[typ].oc_class;
+ 
+ 	/* check for some objects that are not allowed */
+ 	if (typ && objects[typ].oc_unique) {
+ #ifdef WIZARD
+ 	    if (wizard)
+ 		;	/* allow unique objects */
+ 	    else
+ #endif
+ 	    switch (typ) {
+ 		case AMULET_OF_YENDOR:
+ 		    typ = FAKE_AMULET_OF_YENDOR;
+ 		    break;
+ 		case CANDELABRUM_OF_INVOCATION:
+ 		    typ = rnd_class(TALLOW_CANDLE, WAX_CANDLE);
+ 		    break;
+ 		case BELL_OF_OPENING:
+ 		    typ = BELL;
+ 		    break;
+ 		case SPE_BOOK_OF_THE_DEAD:
+ 		    typ = SPE_BLANK_PAPER;
+ 		    break;
+ 	    }
+ 	}
+ 
+ 	/* catch any other non-wishable objects */
+ 	if (objects[typ].oc_nowish
+ #ifdef WIZARD
+ 	    && !wizard
+ #endif
+ 	    )
+ 	    return((struct obj *)0);
+ 
+ 	/* convert magic lamps to regular lamps before lighting them or setting
+ 	   the charges */
+ 	if (typ == MAGIC_LAMP
+ #ifdef WIZARD
+ 				&& !wizard
+ #endif
+ 						)
+ 	    typ = OIL_LAMP;
+ 
+ 	if(typ) {
+ 		otmp = mksobj(typ, TRUE, FALSE);
+ 	} else {
+ 		otmp = mkobj(oclass, FALSE);
+ 		if (otmp) typ = otmp->otyp;
+ 	}
+ 
+ 	if (islit &&
+ 		(typ == OIL_LAMP || typ == MAGIC_LAMP || 
+ 		 typ == BRASS_LANTERN || typ == TORCH || 
+ 		 Is_candle(otmp) || typ == POT_OIL)) {
+ 	    place_object(otmp, u.ux, u.uy);  /* make it viable light source */
+ 	    begin_burn(otmp, FALSE);
+ 	    obj_extract_self(otmp);	 /* now release it for caller's use */
+ 	}
+ 
+ 	if(cnt > 0 && objects[typ].oc_merge && oclass != SPBOOK_CLASS &&
+ 		(typ != CORPSE || !is_reviver(&mons[mntmp])) &&
+ 		(cnt < rnd(6) ||
+ #ifdef WIZARD
+ 		wizard ||
+ #endif
+ 		 (cnt <= 7 && Is_candle(otmp)) ||
+ 		 (cnt <= 20 &&
+ 		  ((oclass == WEAPON_CLASS && is_ammo(otmp))
+ 				|| typ == ROCK || is_missile(otmp)))))
+ 			otmp->quan = (long) cnt;
+ 
+ #ifdef WIZARD
+ 	if (oclass == VENOM_CLASS) otmp->spe = 1;
+ #endif
+ 
+ 	if (spesgn == 0) spe = otmp->spe;
+ #ifdef WIZARD
+ 	else if (wizard) /* no alteration to spe */ ;
+ #endif
+ 	else if (oclass == ARMOR_CLASS || oclass == WEAPON_CLASS ||
+ 		 is_weptool(otmp) ||
+ 			(oclass==RING_CLASS && objects[typ].oc_charged)) {
+ 		if(spe > rnd(5) && spe > otmp->spe) spe = 0;
+ 		if(spe > 2 && Luck < 0) spesgn = -1;
+ 	} else {
+ 		if (oclass == WAND_CLASS) {
+ 			if (spe > 1 && spesgn == -1) spe = 1;
+ 		} else {
+ 			if (spe > 0 && spesgn == -1) spe = 0;
+ 		}
+ 		if (spe > otmp->spe) spe = otmp->spe;
+ 	}
+ 
+ 	if (spesgn == -1) spe = -spe;
+ 
+ 	/* set otmp->spe.  This may, or may not, use spe... */
+ 	switch (typ) {
+ 		case TIN: if (contents==EMPTY) {
+ 				otmp->corpsenm = NON_PM;
+ 				otmp->spe = 0;
+ 			} else if (contents==SPINACH) {
+ 				otmp->corpsenm = NON_PM;
+ 				otmp->spe = 1;
+ 			}
+ 			break;
+ 		case SLIME_MOLD: otmp->spe = ftype;
+ 			/* Fall through */
+ 		case SKELETON_KEY: case CHEST: case LARGE_BOX:
+ 		case HEAVY_IRON_BALL: case IRON_CHAIN: case STATUE:
+ 			/* otmp->cobj already done in mksobj() */
+ 				break;
+ #ifdef MAIL
+ 		case SCR_MAIL: otmp->spe = 1; break;
+ #endif
+ 		case WAN_WISHING:
+ #ifdef WIZARD
+ 			if (!wizard) {
+ #endif
+ 				otmp->spe = (rn2(10) ? -1 : 0);
+ 				break;
+ #ifdef WIZARD
+ 			}
+ 			/* fall through, if wizard */
+ #endif
+ 		default: otmp->spe = spe;
+ 	}
+ 
+ 	/* set otmp->corpsenm or dragon scale [mail] */
+ 	if (mntmp >= LOW_PM) {
+ 		if (mntmp == PM_LONG_WORM_TAIL) mntmp = PM_LONG_WORM;
+ 
+ 		switch (typ) {
+ 		case TIN:
+ 			otmp->spe = 0; /* No spinach */
+ 			if (dead_species(mntmp, FALSE)) {
+ 			    otmp->corpsenm = NON_PM;	/* it's empty */
+ 			} else if (!(mons[mntmp].geno & G_UNIQ) &&
+ 				   !(mvitals[mntmp].mvflags & G_NOCORPSE) &&
+ 				   mons[mntmp].cnutrit != 0) {
+ 			    otmp->corpsenm = mntmp;
+ 			}
+ 			break;
+ 		case CORPSE:
+                         if
+ # ifdef WIZARD
+                                 ((wizard) ||
+ # endif /* WIZARD */
+                                 (!(mons[mntmp].geno & G_UNIQ) &&
+                                 !(mvitals[mntmp].mvflags & G_NOCORPSE))
+ # ifdef WIZARD
+                                 )
+ # endif /* WIZARD */
+                                 {
+ 			    /* beware of random troll or lizard corpse,
+ 			       or of ordinary one being forced to such */
+ 			    if (otmp->timed) obj_stop_timers(otmp);
+ 			    if (mons[mntmp].msound == MS_GUARDIAN)
+ 			    	otmp->corpsenm = genus(mntmp,1);
+ 			    else
+ 				otmp->corpsenm = mntmp;
+ 			    start_corpse_timeout(otmp);
+ 			}
+ 			break;
+ 		case FIGURINE:
+                         if
+ # ifdef WIZARD
+                                 ((wizard) ||
+ # endif /* WIZARD */
+                                 ((!(mons[mntmp].geno & G_UNIQ)
+ 			    && !is_human(&mons[mntmp])
+ # ifdef WIZARD
+                                 )
+ # endif /* WIZARD */
+ #ifdef MAIL
+ 			    && mntmp != PM_MAIL_DAEMON
+ #endif
+ 							))
+ 				otmp->corpsenm = mntmp;
+ 			break;
+ 		case EGG:
+ 			mntmp = can_be_hatched(mntmp);
+ 			if (mntmp != NON_PM) {
+ 			    otmp->corpsenm = mntmp;
+ 			    if (!dead_species(mntmp, TRUE))
+ 				attach_egg_hatch_timeout(otmp);
+ 			    else
+ 				kill_egg(otmp);
+ 			}
+ 			break;
+ 		case STATUE: otmp->corpsenm = mntmp;
+ 			if (Has_contents(otmp) && verysmall(&mons[mntmp]))
+ 			    delete_contents(otmp);	/* no spellbook */
+ 			otmp->spe = ishistoric ? STATUE_HISTORIC : 0;
+ 			break;
+ 		case SCALE_MAIL:
+ 			/* Dragon mail - depends on the order of objects */
+ 			/*		 & dragons.			 */
+ 			if (mntmp >= PM_GRAY_DRAGON &&
+ 						mntmp <= PM_YELLOW_DRAGON)
+ 			    otmp->otyp = GRAY_DRAGON_SCALE_MAIL +
+ 						    mntmp - PM_GRAY_DRAGON;
+ 			break;
+ 		}
+ 	}
+ 
+ 	/* set blessed/cursed -- setting the fields directly is safe
+ 	 * since weight() is called below and addinv() will take care
+ 	 * of luck */
+ 	if (iscursed) {
+ 		curse(otmp);
+ 	} else if (uncursed) {
+ 		otmp->blessed = 0;
+ 		otmp->cursed = (Luck < 0
+ #ifdef WIZARD
+ 					 && !wizard
+ #endif
+ 							);
+ 	} else if (blessed) {
+ 		otmp->blessed = (Luck >= 0
+ #ifdef WIZARD
+ 					 || wizard
+ #endif
+ 							);
+ 		otmp->cursed = (Luck < 0
+ #ifdef WIZARD
+ 					 && !wizard
+ #endif
+ 							);
+ 	} else if (spesgn < 0) {
+ 		curse(otmp);
+ 	}
+ 
+ #ifdef INVISIBLE_OBJECTS
+ 	if (isinvisible)
+ 	    otmp->oinvis = isinvisible > 0 && !always_visible(otmp);
+ #endif
+ 
+ 	/* set eroded */
+ 	if (is_damageable(otmp) || otmp->otyp == CRYSKNIFE) {
+ 	    if (eroded && (is_flammable(otmp) || is_rustprone(otmp)))
+ 		    otmp->oeroded = eroded;
+ 	    if (eroded2 && (is_corrodeable(otmp) || is_rottable(otmp)))
+ 		    otmp->oeroded2 = eroded2;
+ 
+ 	    /* set erodeproof */
+ 	    if (erodeproof && !eroded && !eroded2)
+ 		    otmp->oerodeproof = (Luck >= 0
+ #ifdef WIZARD
+ 					     || wizard
+ #endif
+ 					);
+ 	}
+ 
+ 	/* set otmp->recharged */
+ 	if (oclass == WAND_CLASS) {
+ 	    /* prevent wishing abuse */
+ 	    if (otmp->otyp == WAN_WISHING
+ #ifdef WIZARD
+ 		    && !wizard
+ #endif
+ 		) rechrg = 1;
+ 	    otmp->recharged = (unsigned)rechrg;
+ 	}
+ 
+ 	/* set poisoned */
+ 	if (ispoisoned) {
+ 	    if (is_poisonable(otmp))
+ 		otmp->opoisoned = (Luck >= 0);
+ 	    else if (Is_box(otmp) || typ == TIN)
+ 		otmp->otrapped = 1;
+ 	    else if (oclass == FOOD_CLASS)
+ 		/* try to taint by making it as old as possible */
+ 		otmp->age = 1L;
+ 	}
+ 
+ 	if (isgreased) otmp->greased = 1;
+ 
+ 	if (isdiluted && otmp->oclass == POTION_CLASS &&
+ 			otmp->otyp != POT_WATER)
+ 		otmp->odiluted = 1;
+ 
+ 	if (name) {
+ 		const char *aname;
+ 		short objtyp;
+ 		char nname[256];
+ 		strcpy(nname,name);
+ 
+ 		/* an artifact name might need capitalization fixing */
+ 		aname = artifact_name(name, &objtyp);
+ 		if (aname && objtyp == otmp->otyp) name = aname;
+ 
+ # ifdef NOARTIFACTWISH
+ 		/* Tom -- not always getting what you're wishing for... */                
+ 		if (restrict_name(otmp, nname) && !rn2(3) && !wizard) {
+ 		    int n = rn2((int)strlen(nname));
+ 		    register char c1, c2;
+ 		    c1 = lowc(nname[n]);
+ 		    do c2 = 'a' + rn2('z'-'a'); while (c1 == c2);
+ 		    nname[n] = (nname[n] == c1) ? c2 : highc(c2);  /* keep same case */
+ 		}
+ # endif
+ 		otmp = oname(otmp, nname);
+ 		if (otmp->oartifact) {
+ 			otmp->quan = 1L;
+ 			u.uconduct.wisharti++;	/* KMH, conduct */
+ 		}
+ 	}
+ 
+ 	/* more wishing abuse: don't allow wishing for certain artifacts */
+ 	/* and make them pay; charge them for the wish anyway! */
+ 	if ((is_quest_artifact(otmp) ||
+ 	    /* [ALI] Can't wish for artifacts which have a set location */
+ 	    (otmp->oartifact &&
+ 	       (otmp->oartifact == ART_KEY_OF_CHAOS ||
+ 	        otmp->oartifact == ART_KEY_OF_NEUTRALITY ||
+ 	        otmp->oartifact == ART_KEY_OF_LAW ||
+ 	        otmp->oartifact == ART_HAND_OF_VECNA ||
+ 	        otmp->oartifact == ART_EYE_OF_THE_BEHOLDER ||
+ 	        otmp->oartifact == ART_NIGHTHORN ||
+ 	        otmp->oartifact == ART_THIEFBANE)) ||
+ # ifdef NOARTIFACTWISH
+ /* Wishing for a "weak" artifact is easier than for a stronger one */
+ 	(otmp->oartifact &&
+ 	       (otmp->oartifact != ART_STING &&
+ 		otmp->oartifact != ART_ELFRIST &&
+ 		otmp->oartifact != ART_ORCRIST &&
+ 		otmp->oartifact != ART_WEREBANE &&
+ 		otmp->oartifact != ART_GRIMTOOTH &&
+ 		otmp->oartifact != ART_DISRUPTER &&
+ 		otmp->oartifact != ART_DEMONBANE &&
+ 		otmp->oartifact != ART_DRAGONBANE &&
+ 		otmp->oartifact != ART_TROLLSBANE &&
+ 		otmp->oartifact != ART_GIANTKILLER &&
+ 		otmp->oartifact != ART_OGRESMASHER &&
+ 		otmp->oartifact != ART_SWORD_OF_BALANCE)) ||
+ # endif
+ 	     (otmp->oartifact && rn2(nartifact_exist()) > 1))
+ #ifdef WIZARD
+ 	    && !wizard
+ #endif
+ 	    ) {
+ 	    artifact_exists(otmp, ONAME(otmp), FALSE);
+ 	    if (Has_contents(otmp))
+ 		delete_contents(otmp);
+ 	    obfree(otmp, (struct obj *) 0);
+ 	    otmp = &zeroobj;
+ 	    pline("For a moment, you feel %s in your %s, but it disappears!",
+ 		  something,
+ 		  makeplural(body_part(HAND)));
+ 	}
+ 
+ 	if (halfeaten && otmp->oclass == FOOD_CLASS) {
+ 		if (otmp->otyp == CORPSE)
+ 			otmp->oeaten = mons[otmp->corpsenm].cnutrit;
+ 		else otmp->oeaten = objects[otmp->otyp].oc_nutrition;
+ 		/* (do this adjustment before setting up object's weight) */
+ 		consume_oeaten(otmp, 1);
+ 	}
+ 	if (isdrained && otmp->otyp == CORPSE) {
+ 		int amt;
+ 		otmp->odrained = 1;
+ 		amt = mons[otmp->corpsenm].cnutrit - drainlevel(otmp);
+ 		if (halfdrained) {
+ 		    amt /= 2;
+ 		    if (amt == 0)
+ 			amt++;
+ 		}
+ 		/* (do this adjustment before setting up object's weight) */
+ 		consume_oeaten(otmp, -amt);
+ 	}
+ 	otmp->owt = weight(otmp);
+ 	if (very && otmp->otyp == HEAVY_IRON_BALL) otmp->owt += 160;
+ 
+ 	return(otmp);
+ }
+ 
+ int
+ rnd_class(first,last)
+ int first,last;
+ {
+ 	int i, x, sum=0;
+ 
+ 	if (first == last)
+ 	    return (first);
+ 	for(i=first; i<=last; i++)
+ 		sum += objects[i].oc_prob;
+ 	if (!sum) /* all zero */
+ 		return first + rn2(last-first+1);
+ 	x = rnd(sum);
+ 	for(i=first; i<=last; i++)
+ 		if (objects[i].oc_prob && (x -= objects[i].oc_prob) <= 0)
+ 			return i;
+ 	return 0;
+ }
+ 
+ STATIC_OVL const char *
+ Japanese_item_name(i)
+ int i;
+ {
+ 	struct Jitem *j = Japanese_items;
+ 
+ 	while(j->item) {
+ 		if (i == j->item)
+ 			return j->name;
+ 		j++;
+ 	}
+ 	return (const char *)0;
+ }
+ 
+ const char *
+ cloak_simple_name(cloak)
+ struct obj *cloak;
+ {
+     if (cloak) {
+ 	switch (cloak->otyp) {
+ 	case ROBE:
+ 	    return "robe";
+ 	case MUMMY_WRAPPING:
+ 	    return "wrapping";
+ 	case LAB_COAT:
+ 	    return "coat";
+ #ifdef ALCHEMY_SMOCK
+ 	case ALCHEMY_SMOCK:
+ 	    return (objects[cloak->otyp].oc_name_known &&
+ 			cloak->dknown) ? "smock" : "apron";
+ #endif
+ 	default:
+ 	    break;
+ 	}
+     }
+     return "cloak";
+ }
+ 
+ const char *
+ mimic_obj_name(mtmp)
+ struct monst *mtmp;
+ {
+ 	if (mtmp->m_ap_type == M_AP_OBJECT && mtmp->mappearance != STRANGE_OBJECT) {
+ 		int idx = objects[mtmp->mappearance].oc_descr_idx;
+ 		if (mtmp->mappearance == GOLD_PIECE) return "gold";
+ 		return obj_descr[idx].oc_name;
+ 	}
+ 	return "whatcha-may-callit";
+ }
+ #endif /* OVLB */
+ 
+ /*objnam.c*/
diff --recursive -P -C3 slashem-0.0.7E7F2/src/pray.c slethe-0.0.7E7F2/src/pray.c
*** slashem-0.0.7E7F2/src/pray.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/pray.c	2006-05-28 15:31:15.847973928 +0200
***************
*** 467,472 ****
--- 467,498 ----
  	}
  }
  
+ 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 --recursive -P -C3 slashem-0.0.7E7F2/src/priest.c slethe-0.0.7E7F2/src/priest.c
*** slashem-0.0.7E7F2/src/priest.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/priest.c	2006-05-28 15:31:15.850973472 +0200
***************
*** 183,188 ****
--- 183,190 ----
  }
  
  /* 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,204 ****
  	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);
  	if (priest) {
  		EPRI(priest)->shroom = (sroom - rooms) + ROOMOFFSET;
  		EPRI(priest)->shralign = Amask2align(levl[sx][sy].altarmask);
--- 199,205 ----
  	if(MON_AT(sx+1, sy))
  		(void) rloc(m_at(sx+1, sy), FALSE); /* insurance */
  
! 	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,221 ****
  		set_malign(priest); /* mpeaceful may have changed */
  
  		/* now his/her goodies... */
! 		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));
--- 213,222 ----
  		set_malign(priest); /* mpeaceful may have changed */
  
  		/* now his/her goodies... */
! 		/* 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,353 ****
  	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)));
  		can_speak = (priest->mcanmove && !priest->msleeping &&
  			     flags.soundok);
  		if (can_speak) {
--- 347,353 ----
  	if(!temple_occupied(u.urooms0)) {
  	    if(tended) {
  		shrined = has_shrine(priest);
! 		sanctum = (Is_sanctum(&u.uz) || In_endgame(&u.uz));
  		can_speak = (priest->mcanmove && !priest->msleeping &&
  			     flags.soundok);
  		if (can_speak) {
diff --recursive -P -C3 slashem-0.0.7E7F2/src/read.c slethe-0.0.7E7F2/src/read.c
*** slashem-0.0.7E7F2/src/read.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/read.c	2006-05-28 15:31:15.858972256 +0200
***************
*** 1168,1179 ****
  	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))
  		known = TRUE;
  	    /* 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;
--- 1168,1348 ----
  	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,
! 			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 --recursive -P -C3 slashem-0.0.7E7F2/src/shk.c slethe-0.0.7E7F2/src/shk.c
*** slashem-0.0.7E7F2/src/shk.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/shk.c	2006-05-28 15:31:15.871970280 +0200
***************
*** 2977,2982 ****
--- 2977,3002 ----
  	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;
***************
*** 3034,3039 ****
--- 3054,3072 ----
  
  	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 --recursive -P -C3 slashem-0.0.7E7F2/src/teleport.c slethe-0.0.7E7F2/src/teleport.c
*** slashem-0.0.7E7F2/src/teleport.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/teleport.c	2006-05-28 15:31:15.876969520 +0200
***************
*** 1059,1071 ****
  	    /* [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 &&
  	    newlev >= dungeons[u.uz.dnum].depth_start +
  						dunlevs_in_dungeon(&u.uz)) {
  #ifdef WIZARD
  	    if (!(wizard && force_dest))
  #endif
! 	    find_hell(&newlevel);
  	} else {
  	    /* if invocation did not yet occur, teleporting into
  	     * the last level of Gehennom is forbidden.
--- 1059,1072 ----
  	    /* [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] */
! /* 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); */
  	} else {
  	    /* if invocation did not yet occur, teleporting into
  	     * the last level of Gehennom is forbidden.
diff --recursive -P -C3 slashem-0.0.7E7F2/src/trap.c slethe-0.0.7E7F2/src/trap.c
*** slashem-0.0.7E7F2/src/trap.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/trap.c	2006-05-28 15:31:15.886968000 +0200
***************
*** 377,383 ****
  
  	if(*u.ushops) shopdig(1);
  	if (Is_stronghold(&u.uz)) {
! 	    find_hell(&dtmp);
  	} else {
  	    dtmp.dnum = u.uz.dnum;
  	    dtmp.dlevel = newlevel;
--- 377,383 ----
  
  	if(*u.ushops) shopdig(1);
  	if (Is_stronghold(&u.uz)) {
! 	    find_castle_dungeon(&dtmp);
  	} else {
  	    dtmp.dnum = u.uz.dnum;
  	    dtmp.dlevel = newlevel;
diff --recursive -P -C3 slashem-0.0.7E7F2/src/zap.c slethe-0.0.7E7F2/src/zap.c
*** slashem-0.0.7E7F2/src/zap.c	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/src/zap.c	2006-05-28 15:31:15.900965872 +0200
***************
*** 2078,2087 ****
  			break;
  		case WAN_CREATE_MONSTER:
  			known = create_critters(rn2(23) ? 1 : rn1(7,2),
! 					(struct permonst *)0);
  			break;
  		case WAN_CREATE_HORDE:
! 			known = create_critters(rn1(7,6), (struct permonst *)0);
  			break;
  		case WAN_WISHING:
  			known = TRUE;
--- 2078,2088 ----
  			break;
  		case WAN_CREATE_MONSTER:
  			known = create_critters(rn2(23) ? 1 : rn1(7,2),
! 					(struct permonst *)0, MAKE_EM_NATURAL);
  			break;
  		case WAN_CREATE_HORDE:
! 			known = create_critters(rn1(7,6), (struct permonst *)0,
! 					MAKE_EM_NATURAL);
  			break;
  		case WAN_WISHING:
  			known = TRUE;
diff --recursive -P -C3 slashem-0.0.7E7F2/src/zap.c.orig slethe-0.0.7E7F2/src/zap.c.orig
*** slashem-0.0.7E7F2/src/zap.c.orig	1970-01-01 01:00:00.000000000 +0100
--- slethe-0.0.7E7F2/src/zap.c.orig	2006-05-28 15:30:23.535926568 +0200
***************
*** 0 ****
--- 1,4975 ----
+ /*	SCCS Id: @(#)zap.c	3.4	2003/08/24	*/
+ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+ /* NetHack may be freely redistributed.  See license for details. */
+ 
+ #include "hack.h"
+ 
+ /* Disintegration rays have special treatment; corpses are never left.
+  * But the routine which calculates the damage is separate from the routine
+  * which kills the monster.  The damage routine returns this cookie to
+  * indicate that the monster should be disintegrated.
+  */
+ #define MAGIC_COOKIE 1000
+ 
+ #ifdef OVLB
+ static NEARDATA boolean obj_zapped;
+ static NEARDATA int poly_zapped;
+ #endif
+ 
+ extern boolean notonhead;	/* for long worms */
+ 
+ /* kludge to use mondied instead of killed */
+ extern boolean m_using;
+ 
+ STATIC_DCL void FDECL(costly_cancel, (struct obj *));
+ STATIC_DCL void FDECL(polyuse, (struct obj*, int, int));
+ STATIC_DCL void FDECL(create_polymon, (struct obj *, int));
+ STATIC_DCL boolean FDECL(zap_updown, (struct obj *));
+ STATIC_DCL int FDECL(zhitm, (struct monst *,int,int, struct obj **));
+ STATIC_DCL void FDECL(zhitu, (int,int,const char *,XCHAR_P,XCHAR_P));
+ STATIC_DCL void FDECL(revive_egg, (struct obj *));
+ STATIC_DCL void FDECL(throwstorm, (struct obj *, int, int, int));
+ #ifdef STEED
+ STATIC_DCL boolean FDECL(zap_steed, (struct obj *));
+ #endif
+ 
+ #ifdef OVLB
+ STATIC_DCL int FDECL(zap_hit, (int,int));
+ #endif
+ #ifdef OVL0
+ STATIC_DCL void FDECL(backfire, (struct obj *));
+ STATIC_DCL int FDECL(spell_hit_bonus, (int));
+ #endif
+ 
+ /* WAC -- ZT_foo #defines moved to spell.h, since explode uses these types */
+ 
+ #define is_hero_spell(type)	((type) >= 10 && (type) < 20)
+ #define is_mega_spell(type)	(type >= ZT_MEGA(ZT_FIRST) && \
+ 				 type <= ZT_MEGA(ZT_LAST))
+ 
+ #ifndef OVLB
+ STATIC_VAR const char are_blinded_by_the_flash[];
+ extern const char * const flash_types[];
+ #else
+ STATIC_VAR const char are_blinded_by_the_flash[] = "are blinded by the flash!";
+ 
+ const char * const flash_types[] = {	/* also used in buzzmu(mcastu.c) */
+ 	"magic missile",	/* Wands must be 0-9 */
+ 	"bolt of fire",
+ 	"bolt of cold",
+ 	"sleep ray",
+ 	"death ray",
+ 	"bolt of lightning",
+ 	"",
+ 	"",
+ 	"",
+ 	"",
+ 
+ 	"magic missile",	/* Spell equivalents must be 10-19 */
+ 	"fireball",
+ 	"cone of cold",
+ 	"sleep ray",
+ 	"finger of death",
+ 	"bolt of lightning",    /* New spell & used for retribution */
+ 	"blast of poison gas",  /*WAC New spells acid + poison*/
+ 	"stream of acid",
+ 	"",
+ 	"",
+ 
+ 	"blast of missiles",	/* Dragon breath equivalents 20-29*/
+ 	"blast of fire",
+ 	"blast of frost",
+ 	"blast of sleep gas",
+ 	"blast of disintegration",
+ 	"blast of lightning",
+ 	"blast of poison gas",
+ 	"blast of acid",
+ 	"",
+ 	"",
+ 
+ 	"magical blast",        /* Megaspell equivalents must be 30-39 */
+ 	"fireball",             /*Should be same as explosion names*/
+ 	"ball of cold",
+ 	"",
+ 	"",
+ 	"ball lightning",
+ 	"poison gas cloud",
+ 	"splash of acid",
+ 	"",
+ 	""
+ };
+ 
+ /* Yells for Megaspells*/
+ const char *yell_types[] = {    /*10 different beam types*/
+ 	"With the wisdom of Merlin!",  /* Magic */ 
+ 		/* Merlin was the wizard who advised King Arthur */ 
+ 	"The rage of Huitzilopochtli!", /* Fire */ 
+ 		/* Huitzilopochtli is the god of the Sun of Aztec myth */ 
+ 	"The sorrow of Demeter!", /* Frost */
+ 		/* Demeter - when she is without her daughter Persephone
+ 		 * 	she caused winter
+ 		 */
+ 	"The rest of Hypnos", /* Sleep */ 
+ 		/* Hypnos - Greek god of sleep */
+ 	"The wrath of Kali", /* Disint */
+ 		/* Kali is the Hindu god of dissolution and destruction */
+ 	"From the forge of Vulcan!", /* Lightning*/ 
+ 		/* Vulcan forged Zeus' lightning bolts [Greek] */
+ 	"From the Fangs of Jormungand", /* Poison gas */ 
+ 		/* Serpent of Viking Mythology.  Poisons the skies/seas during 
+ 		 * Ragnarok 
+ 		 */
+ 	"The anger of the Mad Chemist!", /* Acid */
+ 	"",
+ 	""
+ };
+ 
+ 
+ /* Routines for IMMEDIATE wands and spells. */
+ /* bhitm: monster mtmp was hit by the effect of wand or spell otmp */
+ int
+ bhitm(mtmp, otmp)
+ struct monst *mtmp;
+ struct obj *otmp;
+ {
+ 	boolean wake = TRUE;	/* Most 'zaps' should wake monster */
+ 	boolean reveal_invis = FALSE;
+ 	boolean dbldam = Role_if(PM_KNIGHT) && u.uhave.questart;
+ 	int dmg, otyp = otmp->otyp;
+ 	const char *zap_type_text = "spell";
+ 	struct obj *obj;
+ 	boolean disguised_mimic = (mtmp->data->mlet == S_MIMIC &&
+ 				   mtmp->m_ap_type != M_AP_NOTHING);
+ 	int pm_index;
+ 	int skilldmg = 0;
+ 
+ 	if (objects[otyp].oc_class == SPBOOK_CLASS) {
+ 	    /* Is a spell */
+ 	    skilldmg = spell_damage_bonus(otyp);  
+ 	    zap_type_text = "spell";
+ 	} else zap_type_text = "wand";
+ 
+ 	if (u.uswallow && mtmp == u.ustuck)
+ 	    reveal_invis = FALSE;
+ 
+ 	switch(otyp) {
+ 	case WAN_STRIKING:
+ 		zap_type_text = "wand";
+ 		/* fall through */
+ 	case SPE_FORCE_BOLT:
+ 		reveal_invis = TRUE;
+ 		if (resists_magm(mtmp)) {	/* match effect on player */
+ 			shieldeff(mtmp->mx, mtmp->my);
+ 			break;	/* skip makeknown */
+ 		} else if (u.uswallow || rnd(20) < 10 + find_mac(mtmp)) {
+ 			dmg = d(2,12);
+ 			if(dbldam) dmg *= 2;
+ 			dmg += skilldmg;
+ 			hit(zap_type_text, mtmp, exclam(dmg));
+ 			(void) resist(mtmp, otmp->oclass, dmg, TELL);
+ 		} else miss(zap_type_text, mtmp);
+ 		makeknown(otyp);
+ 		break;
+ 	case WAN_SLOW_MONSTER:
+ 	case SPE_SLOW_MONSTER:
+ 		if (!resist(mtmp, otmp->oclass, 0, NOTELL)) {
+ 			mon_adjust_speed(mtmp, -1, otmp);
+ 			m_dowear(mtmp, FALSE); /* might want speed boots */
+ 			if (u.uswallow && (mtmp == u.ustuck) &&
+ 			    is_whirly(mtmp->data)) {
+ 				You("disrupt %s!", mon_nam(mtmp));
+ 				pline("A huge hole opens up...");
+ 				expels(mtmp, mtmp->data, TRUE);
+ 			}
+ 		}
+ 		break;
+ 	case WAN_SPEED_MONSTER:
+ 		if (!resist(mtmp, otmp->oclass, 0, NOTELL)) {
+ 			mon_adjust_speed(mtmp, 1, otmp);
+ 			m_dowear(mtmp, FALSE); /* might want speed boots */
+ 		}
+ 		break;
+ 	case SPE_TURN_UNDEAD:
+ 	case WAN_UNDEAD_TURNING:
+ 		wake = FALSE;
+ 		if (unturn_dead(mtmp)) wake = TRUE;
+ 		if (is_undead(mtmp->data)) {
+ 			reveal_invis = TRUE;
+ 			wake = TRUE;
+ 			dmg = rnd(8);
+ 			if(dbldam) dmg *= 2;
+ 			dmg += skilldmg;
+ 			flags.bypasses = TRUE;	/* for make_corpse() */
+ 			if (!resist(mtmp, otmp->oclass, dmg, NOTELL)) {
+ 			    if (mtmp->mhp > 0) monflee(mtmp, 0, FALSE, TRUE);
+ 			}
+ 		}
+ 		break;
+ 	case WAN_POLYMORPH:
+ 	case SPE_POLYMORPH:
+ 	case POT_POLYMORPH:
+ 		if (resists_magm(mtmp)) {
+ 		    /* magic resistance protects from polymorph traps, so make
+ 		       it guard against involuntary polymorph attacks too... */
+ 		    shieldeff(mtmp->mx, mtmp->my);
+ 		} else if (!resist(mtmp, otmp->oclass, 0, NOTELL)) {
+ 		    /* natural shapechangers aren't affected by system shock
+ 		       (unless protection from shapechangers is interfering
+ 		       with their metabolism...) */
+ 		    if (mtmp->cham == CHAM_ORDINARY && !rn2(25)) {
+ 			if (canseemon(mtmp)) {
+ 			    pline("%s shudders!", Monnam(mtmp));
+ 			    makeknown(otyp);
+ 			}
+ 			/* dropped inventory shouldn't be hit by this zap */
+ 			for (obj = mtmp->minvent; obj; obj = obj->nobj)
+ 			    bypass_obj(obj);
+ 			/* flags.bypasses = TRUE; ## for make_corpse() */
+ 			/* no corpse after system shock */
+ 			xkilled(mtmp, 3);
+ 		    } else if (mon_spec_poly(mtmp, (struct permonst *)0, 0L,
+ 			    (otyp != POT_POLYMORPH), canseemon(mtmp), FALSE,
+ 			    TRUE)) {
+ 			if (!Hallucination && canspotmon(mtmp))
+ 			    makeknown(otyp);
+ 		    }
+ 		}
+ 		break;
+ 	case WAN_CANCELLATION:
+ 	case SPE_CANCELLATION:
+ 		(void) cancel_monst(mtmp, otmp, TRUE, TRUE, FALSE);
+ 		break;
+ 	case WAN_TELEPORTATION:
+ 	case SPE_TELEPORT_AWAY:
+ 		reveal_invis = !u_teleport_mon(mtmp, TRUE);
+ 		break;
+ 	case WAN_MAKE_INVISIBLE:
+ 	    {
+ 		int oldinvis = mtmp->minvis;
+ 		char nambuf[BUFSZ];
+ 
+ 		/* format monster's name before altering its visibility */
+ 		Strcpy(nambuf, Monnam(mtmp));
+ 		mon_set_minvis(mtmp);
+ 		if (!oldinvis && knowninvisible(mtmp)) {
+ 		    pline("%s turns transparent!", nambuf);
+ 		    makeknown(otyp);
+ 		}
+ 		break;
+ 	    }
+ 	case WAN_NOTHING:
+ 	case WAN_LOCKING:
+ 	case SPE_WIZARD_LOCK:
+ 		wake = FALSE;
+ 		reveal_invis = TRUE;
+ 		break;
+ 	case WAN_FEAR:
+ 		if (!is_undead(mtmp->data) &&
+ 		    !resist(mtmp, otmp->oclass, 0, NOTELL) &&
+ 		    (!mtmp->mflee || mtmp->mfleetim)) {
+ 		     if (canseemon(mtmp))
+ 			 pline("%s suddenly panics!", Monnam(mtmp));
+ 		     monflee(mtmp, 0, FALSE, TRUE);
+ 		}
+ 		break;
+ 	case WAN_PROBING:
+ 		reveal_invis = TRUE;
+ 		wake = FALSE;
+ 		probe_monster(mtmp);
+ 		makeknown(otyp);
+ 		break;
+ 	case WAN_OPENING:
+ 	case SPE_KNOCK:
+ 		wake = FALSE;	/* don't want immediate counterattack */
+ 		if (u.uswallow && mtmp == u.ustuck) {
+ 			if (is_animal(mtmp->data)) {
+ 				if (Blind) You_feel("a sudden rush of air!");
+ 				else pline("%s opens its mouth!", Monnam(mtmp));
+ 			}
+ 			expels(mtmp, mtmp->data, TRUE);
+ #ifdef STEED
+ 		} else if (!!(obj = which_armor(mtmp, W_SADDLE))) {
+ 			mtmp->misc_worn_check &= ~obj->owornmask;
+ 			update_mon_intrinsics(mtmp, obj, FALSE, FALSE);
+ 			obj->owornmask = 0L;
+ 			obj_extract_self(obj);
+ 			place_object(obj, mtmp->mx, mtmp->my);
+ 			/* call stackobj() if we ever drop anything that can merge */
+ 			newsym(mtmp->mx, mtmp->my);
+ #endif
+ 		}
+ 		break;
+ 	case WAN_HEALING:
+ 	case WAN_EXTRA_HEALING:
+ 	case SPE_HEALING:
+ 	case SPE_EXTRA_HEALING:
+ 		reveal_invis = TRUE;
+ 	    if (mtmp->data != &mons[PM_PESTILENCE]) {
+ 		wake = FALSE;		/* wakeup() makes the target angry */
+ 		mtmp->mhp +=
+ 		  /* [ALI] FIXME: Makes no sense that cursed wands are more
+ 		   * effective than uncursed wands. This behaviour dates
+ 		   * right back to Slash v3 (and probably to v1).
+ 		   */
+ 		  otyp == WAN_HEALING ?  d(5,2) + 5 * !!bcsign(otmp) :
+ 		  otyp == WAN_EXTRA_HEALING ?  d(5,4) + 10 * !!bcsign(otmp) :
+ 		  otyp == SPE_HEALING ? rnd(10) +4 : d(3,8)+6;
+ 		if (mtmp->mhp > mtmp->mhpmax) {
+ 		    if (otmp->oclass == WAND_CLASS)
+ 			mtmp->mhpmax++;
+ 		    mtmp->mhp = mtmp->mhpmax;
+ 		}
+ 		if (otmp->oclass == WAND_CLASS && !otmp->cursed)
+ 		    mtmp->mcansee = 1;
+ 		if (mtmp->mblinded) {
+ 		    mtmp->mblinded = 0;
+ 		    mtmp->mcansee = 1;
+ 		}
+ 		if (canseemon(mtmp)) {
+ 		    if (disguised_mimic) {
+ 			if (mtmp->m_ap_type == M_AP_OBJECT &&
+ 			    mtmp->mappearance == STRANGE_OBJECT) {
+ 			    /* it can do better now */
+ 			    set_mimic_sym(mtmp);
+ 			    newsym(mtmp->mx, mtmp->my);
+ 			} else
+ 			    mimic_hit_msg(mtmp, otyp);
+ 		    } else pline("%s %s%s better.", Monnam(mtmp),
+ 			  otmp->oclass == SPBOOK_CLASS ?
+ 			    "looks" : "begins to look",
+ 			  (otyp == SPE_EXTRA_HEALING ||
+ 			   otyp == WAN_EXTRA_HEALING) ? " much" : "" );
+ 		    makeknown(otyp);
+ 		}
+ 		/* Healing pets is a good thing ... */
+ 		if (mtmp->mtame || mtmp->mpeaceful) {
+ 		    adjalign(Role_if(PM_HEALER) ? 1 : sgn(u.ualign.type));
+ 		}
+ 	    } else if (otmp->oclass == SPBOOK_CLASS) {	/* Pestilence */
+ 	        /* [ALI] FIXME: Makes no sense that Pestilence is not
+ 		 * affected by wands of (extra) healing, but that raises
+ 		 * whole new questions of what damage should be done.
+ 		 * In vanilla NetHack, 3d{4,8} is half of the normal
+ 		 * 6d{4,8} healing power of spells of (extra) healing.
+ 		 */
+ 		/* Pestilence will always resist; damage is half of 3d{4,8} */
+ 		(void) resist(mtmp, otmp->oclass,
+ 			      d(3, otyp == SPE_EXTRA_HEALING ? 8 : 4), TELL);
+ 	    }
+ 		break;
+ 	case WAN_LIGHT:	/* (broken wand) */
+ 		if (flash_hits_mon(mtmp, otmp)) {
+ 		    makeknown(WAN_LIGHT);
+ 		    reveal_invis = TRUE;
+ 		}
+ 		break;
+ 	case WAN_SLEEP:	/* (broken wand) */
+ 		/* [wakeup() doesn't rouse victims of temporary sleep,
+ 		    so it's okay to leave `wake' set to TRUE here] */
+ 		reveal_invis = TRUE;
+ 		if (sleep_monst(mtmp, d(1 + otmp->spe, 12), WAND_CLASS))
+ 		    slept_monst(mtmp);
+ 		if (!Blind) makeknown(WAN_SLEEP);
+ 		break;
+ 	case SPE_STONE_TO_FLESH:
+ 		if (monsndx(mtmp->data) == PM_STONE_GOLEM)
+ 		    pm_index = PM_FLESH_GOLEM;
+ 		else if (monsndx(mtmp->data) == PM_STATUE_GARGOYLE)
+ 		    pm_index = PM_GARGOYLE;
+ 		else
+ 		    pm_index = NON_PM;
+ 		if (pm_index != NON_PM) {
+ 		    char *name = Monnam(mtmp);
+ 		    /* turn into flesh equivalent */
+ 		    if (newcham(mtmp, &mons[pm_index], FALSE, FALSE)) {
+ 			if (canseemon(mtmp))
+ 			    pline("%s turns to flesh!", name);
+ 		    } else {
+ 			if (canseemon(mtmp))
+ 			    pline("%s looks rather fleshy for a moment.",
+ 				  name);
+ 		    }
+ 		} else
+ 		    wake = FALSE;
+ 		break;
+ 	case SPE_DRAIN_LIFE:
+ 	case WAN_DRAINING:	/* KMH */
+ 		dmg = rnd(8);
+ 		if(dbldam) dmg *= 2;
+ 		dmg += skilldmg;
+ 		
+ 		if (resists_drli(mtmp)) {
+ 			shieldeff(mtmp->mx, mtmp->my);
+ 			break;	/* skip makeknown */
+ 		}else if (!resist(mtmp, otmp->oclass, dmg, NOTELL) &&
+ 				mtmp->mhp > 0) {
+ 			mtmp->mhp -= dmg;
+ 			mtmp->mhpmax -= dmg;
+ 			if (mtmp->mhp <= 0 || mtmp->mhpmax <= 0 || mtmp->m_lev < 1)
+ 				xkilled(mtmp, 1);
+ 			else {
+ 				mtmp->m_lev--;
+ 				if (canseemon(mtmp))
+ 					pline("%s suddenly seems weaker!", Monnam(mtmp));
+ 			}
+ 		}
+ 		makeknown(otyp);
+ 		break;
+ 	default:
+ 		impossible("What an interesting effect (%d)", otyp);
+ 		break;
+ 	}
+ 	if(wake) {
+ 	    if(mtmp->mhp > 0) {
+ 		wakeup(mtmp);
+ 		m_respond(mtmp);
+ 		if(mtmp->isshk && !*u.ushops) hot_pursuit(mtmp);
+ 	    } else if(mtmp->m_ap_type)
+ 		seemimic(mtmp); /* might unblock if mimicing a boulder/door */
+ 	}
+ 	/* note: bhitpos won't be set if swallowed, but that's okay since
+ 	 * reveal_invis will be false.  We can't use mtmp->mx, my since it
+ 	 * might be an invisible worm hit on the tail.
+ 	 */
+ 	if (reveal_invis) {
+ 	    if (mtmp->mhp > 0 && cansee(bhitpos.x, bhitpos.y) &&
+ 							!canspotmon(mtmp))
+ 		map_invisible(bhitpos.x, bhitpos.y);
+ 	}
+ 	return 0;
+ }
+ 
+ void
+ probe_monster(mtmp)
+ struct monst *mtmp;
+ {
+ 	struct obj *otmp;
+ 
+ 	mstatusline(mtmp);
+ 	if (notonhead) return;	/* don't show minvent for long worm tail */
+ 
+ #ifndef GOLDOBJ
+ 	if (mtmp->minvent || mtmp->mgold) {
+ #else
+ 	if (mtmp->minvent) {
+ #endif
+ 	    for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj)
+ 		otmp->dknown = 1;	/* treat as "seen" */
+ 	    (void) display_minventory(mtmp, MINV_ALL, (char *)0);
+ 	} else {
+ 	    pline("%s is not carrying anything.", noit_Monnam(mtmp));
+ 	}
+ }
+ 
+ #endif /*OVLB*/
+ #ifdef OVL1
+ 
+ /*
+  * Return the object's physical location.  This only makes sense for
+  * objects that are currently on the level (i.e. migrating objects
+  * are nowhere).  By default, only things that can be seen (in hero's
+  * inventory, monster's inventory, or on the ground) are reported.
+  * By adding BURIED_TOO and/or CONTAINED_TOO flags, you can also get
+  * the location of buried and contained objects.  Note that if an
+  * object is carried by a monster, its reported position may change
+  * from turn to turn.  This function returns FALSE if the position
+  * is not available or subject to the constraints above.
+  */
+ boolean
+ get_obj_location(obj, xp, yp, locflags)
+ struct obj *obj;
+ xchar *xp, *yp;
+ int locflags;
+ {
+ 	switch (obj->where) {
+ 	    case OBJ_INVENT:
+ 		*xp = u.ux;
+ 		*yp = u.uy;
+ 		return TRUE;
+ 	    case OBJ_FLOOR:
+ 		*xp = obj->ox;
+ 		*yp = obj->oy;
+ 		return TRUE;
+ 	    case OBJ_MINVENT:
+ 		if (obj->ocarry->mx) {
+ 		    *xp = obj->ocarry->mx;
+ 		    *yp = obj->ocarry->my;
+ 		    return TRUE;
+ 		}
+ 		break;	/* !mx => migrating monster */
+ 	    case OBJ_BURIED:
+ 		if (locflags & BURIED_TOO) {
+ 		    *xp = obj->ox;
+ 		    *yp = obj->oy;
+ 		    return TRUE;
+ 		}
+ 		break;
+ 	    case OBJ_CONTAINED:
+ 		if (locflags & CONTAINED_TOO)
+ 		    return get_obj_location(obj->ocontainer, xp, yp, locflags);
+ 		break;
+ 	}
+ 	*xp = *yp = 0;
+ 	return FALSE;
+ }
+ 
+ boolean
+ get_mon_location(mon, xp, yp, locflags)
+ struct monst *mon;
+ xchar *xp, *yp;
+ int locflags;	/* non-zero means get location even if monster is buried */
+ {
+ 	if (mon == &youmonst) {
+ 	    *xp = u.ux;
+ 	    *yp = u.uy;
+ 	    return TRUE;
+ 	} else if (mon->mx > 0 && (!mon->mburied || locflags)) {
+ 	    *xp = mon->mx;
+ 	    *yp = mon->my;
+ 	    return TRUE;
+ 	} else {	/* migrating or buried */
+ 	    *xp = *yp = 0;
+ 	    return FALSE;
+ 	}
+ }
+ 
+ /* used by revive() and animate_statue() */
+ struct monst *
+ montraits(obj,cc)
+ struct obj *obj;
+ coord *cc;
+ {
+ 	struct monst *mtmp = (struct monst *)0;
+ 	struct monst *mtmp2 = (struct monst *)0;
+ 
+ 	if (obj->oxlth && (obj->oattached == OATTACHED_MONST))
+ 		mtmp2 = get_mtraits(obj, TRUE);
+ 	if (mtmp2) {
+ 		/* save_mtraits() validated mtmp2->mnum */
+ 		mtmp2->data = &mons[mtmp2->mnum];
+ 		if (mtmp2->mhpmax <= 0 && !is_rider(mtmp2->data))
+ 			return (struct monst *)0;
+ 		mtmp = makemon(mtmp2->data,
+ 				cc->x, cc->y, NO_MINVENT|MM_NOWAIT|MM_NOCOUNTBIRTH);
+ 		if (!mtmp) return mtmp;
+ 
+ 		/* heal the monster */
+ 		if (mtmp->mhpmax > mtmp2->mhpmax && is_rider(mtmp2->data))
+ 			mtmp2->mhpmax = mtmp->mhpmax;
+ 		mtmp2->mhp = mtmp2->mhpmax;
+ 		/* Get these ones from mtmp */
+ 		mtmp2->minvent = mtmp->minvent; /*redundant*/
+ 		/* monster ID is available if the monster died in the current
+ 		   game, but should be zero if the corpse was in a bones level
+ 		   (we cleared it when loading bones) */
+ 		if (!mtmp2->m_id)
+ 		    mtmp2->m_id = mtmp->m_id;
+ 		mtmp2->mx   = mtmp->mx;
+ 		mtmp2->my   = mtmp->my;
+ 		mtmp2->mux  = mtmp->mux;
+ 		mtmp2->muy  = mtmp->muy;
+ 		mtmp2->mw   = mtmp->mw;
+ 		mtmp2->wormno = mtmp->wormno;
+ 		mtmp2->misc_worn_check = mtmp->misc_worn_check;
+ 		mtmp2->weapon_check = mtmp->weapon_check;
+ 		mtmp2->mtrapseen = mtmp->mtrapseen;
+ 		mtmp2->mflee = mtmp->mflee;
+ 		mtmp2->mburied = mtmp->mburied;
+ 		mtmp2->mundetected = mtmp->mundetected;
+ 		mtmp2->mfleetim = mtmp->mfleetim;
+ 		mtmp2->mlstmv = mtmp->mlstmv;
+ 		mtmp2->m_ap_type = mtmp->m_ap_type;
+ #ifdef INVISIBLE_OBJECTS
+ 		mtmp2->minvis = obj->oinvis;
+ #endif
+ 		/* set these ones explicitly */
+ 		mtmp2->mavenge = 0;
+ 		mtmp2->meating = 0;
+ 		mtmp2->mleashed = 0;
+ 		mtmp2->mtrapped = 0;
+ 		mtmp2->msleeping = 0;
+ 		mtmp2->mfrozen = 0;
+ 		mtmp2->mcanmove = 1;
+ 		/* most cancelled monsters return to normal,
+ 		   but some need to stay cancelled */
+ 		if (!dmgtype(mtmp2->data, AD_SEDU)
+ #ifdef SEDUCE
+ 			&& !dmgtype(mtmp2->data, AD_SSEX)
+ #endif
+ 			&& mtmp2->mnum != PM_GYPSY
+ 			/* Gypsies use mcan to enforce the rule that they only
+ 			* ever grant one wish.
+ 			*/
+ 		    ) mtmp2->mcan = 0;
+ 		mtmp2->mcansee = 1;	/* set like in makemon */
+ 		mtmp2->mblinded = 0;
+ 		mtmp2->mstun = 0;
+ 		mtmp2->mconf = 0;
+ 		replmon(mtmp,mtmp2);
+ 		newsym(mtmp2->mx, mtmp2->my);	/* Might now be invisible */
+ 	}
+ 	return mtmp2;
+ }
+ 
+ /*
+  * get_container_location() returns the following information
+  * about the outermost container:
+  * loc argument gets set to: 
+  *	OBJ_INVENT	if in hero's inventory; return 0.
+  *	OBJ_FLOOR	if on the floor; return 0.
+  *	OBJ_BURIED	if buried; return 0.
+  *	OBJ_MINVENT	if in monster's inventory; return monster.
+  * container_nesting is updated with the nesting depth of the containers
+  * if applicable.
+  */
+ struct monst *
+ get_container_location(obj, loc, container_nesting)
+ struct obj *obj;
+ int *loc;
+ int *container_nesting;
+ {
+ 	if (!obj || !loc)
+ 		return 0;
+ 
+ 	if (container_nesting) *container_nesting = 0;
+ 	while (obj && obj->where == OBJ_CONTAINED) {
+ 		if (container_nesting) *container_nesting += 1;
+ 		obj = obj->ocontainer;
+ 	}
+ 	if (obj) {
+ 	    *loc = obj->where;	/* outermost container's location */
+ 	    if (obj->where == OBJ_MINVENT) return obj->ocarry;
+ 	}
+ 	return (struct monst *)0;
+ }
+ 
+ /*
+  * Attempt to revive the given corpse, return the revived monster if
+  * successful.  Note: this does NOT use up the corpse if it fails.
+  */
+ struct monst *
+ revive(obj)
+ register struct obj *obj;
+ {
+ 	register struct monst *mtmp = (struct monst *)0;
+ 	struct obj *container = (struct obj *)0;
+ 	int container_nesting = 0;
+ 	schar savetame = 0;
+ 	boolean recorporealization = FALSE;
+ 	boolean in_container = FALSE;
+ 	if(obj->otyp == CORPSE) {
+ 		int montype = obj->corpsenm;
+ 		xchar x, y;
+ 
+ 		if (obj->where == OBJ_CONTAINED) {
+ 			/* deal with corpses in [possibly nested] containers */
+ 			struct monst *carrier;
+ 			int holder = 0;
+ 
+ 			container = obj->ocontainer;
+ 			carrier = get_container_location(container, &holder,
+ 							&container_nesting);
+ 			switch(holder) {
+ 			    case OBJ_MINVENT:
+ 				x = carrier->mx; y = carrier->my;
+ 				in_container = TRUE;
+ 				break;
+ 			    case OBJ_INVENT:
+ 				x = u.ux; y = u.uy;
+ 				in_container = TRUE;
+ 				break;
+ 			    case OBJ_FLOOR:
+ 				if (!get_obj_location(obj, &x, &y, CONTAINED_TOO))
+ 					return (struct monst *) 0;
+ 				in_container = TRUE;
+ 				break;
+ 			    default:
+ 			    	return (struct monst *)0;
+ 			}
+ 		} else {
+ 			/* only for invent, minvent, or floor */
+ 			if (!get_obj_location(obj, &x, &y, 0))
+ 			    return (struct monst *) 0;
+ 		}
+ 		if (in_container) {
+ 			/* Rules for revival from containers:
+ 			   - the container cannot be locked
+ 			   - the container cannot be heavily nested (>2 is arbitrary)
+ 			   - the container cannot be a statue or bag of holding
+ 			     (except in very rare cases for the latter)
+ 			*/
+ 			if (!x || !y || container->olocked || container_nesting > 2 ||
+ 			    container->otyp == STATUE ||
+ 			    (container->otyp == BAG_OF_HOLDING && rn2(40)))
+ 				return (struct monst *)0;
+ 		}
+ 
+ 		if (MON_AT(x,y)) {
+ 		    coord new_xy;
+ 
+ 		    if (enexto(&new_xy, x, y, &mons[montype]))
+ 			x = new_xy.x,  y = new_xy.y;
+ 		}
+ 
+ 		if(cant_create(&montype, TRUE)) {
+ 			/* make a zombie or worm instead */
+ 			mtmp = makemon(&mons[montype], x, y,
+ 				       NO_MINVENT|MM_NOWAIT);
+ 			if (mtmp) {
+ 				mtmp->mhp = mtmp->mhpmax = 100;
+ 				mon_adjust_speed(mtmp, 2, (struct obj *)0); /* MFAST */
+ 			}
+ 		} else {
+ 		    if (obj->oxlth && (obj->oattached == OATTACHED_MONST)) {
+ 			    coord xy;
+ 			    xy.x = x; xy.y = y;
+ 		    	    mtmp = montraits(obj, &xy);
+ 		    	    if (mtmp && mtmp->mtame && !mtmp->isminion)
+ 				wary_dog(mtmp, TRUE);
+ 		    } else
+  		            mtmp = makemon(&mons[montype], x, y,
+ 				       NO_MINVENT|MM_NOWAIT|MM_NOCOUNTBIRTH);
+ 		    if (mtmp) {
+ 			if (obj->oxlth && (obj->oattached == OATTACHED_M_ID)) {
+ 			    unsigned m_id;
+ 			    struct monst *ghost;
+ 			    (void) memcpy((genericptr_t)&m_id,
+ 				    (genericptr_t)obj->oextra, sizeof(m_id));
+ 			    ghost = find_mid(m_id, FM_FMON);
+ 		    	    if (ghost && ghost->data == &mons[PM_GHOST]) {
+ 		    		    int x2, y2;
+ 		    		    x2 = ghost->mx; y2 = ghost->my;
+ 		    		    if (ghost->mtame)
+ 		    		    	savetame = ghost->mtame;
+ 		    		    if (canseemon(ghost))
+ 		    		  	pline("%s is suddenly drawn into its former body!",
+ 						Monnam(ghost));
+ 				    mondead(ghost);
+ 				    recorporealization = TRUE;
+ 				    newsym(x2, y2);
+ 			    }
+ 			    /* don't mess with obj->oxlth here */
+ 			    obj->oattached = OATTACHED_NOTHING;
+ 			}
+ 			/* Monster retains its name */
+ 			if (obj->onamelth)
+ 			    mtmp = christen_monst(mtmp, ONAME(obj));
+ 			/* flag the quest leader as alive. */
+ 			if (mtmp->data->msound == MS_LEADER || mtmp->m_id ==
+ 				quest_status.leader_m_id)
+ 			    quest_status.leader_is_dead = FALSE;
+ 		    }
+ 		}
+ 		if (mtmp) {
+ 			if (obj->oeaten)
+ 				mtmp->mhp = eaten_stat(mtmp->mhp, obj);
+ 			/* track that this monster was revived at least once */
+ 			mtmp->mrevived = 1;
+ 
+ 			if (recorporealization) {
+ 				/* If mtmp is revivification of former tame ghost*/
+ 				if (savetame) {
+ 				    struct monst *mtmp2 = tamedog(mtmp, (struct obj *)0);
+ 				    if (mtmp2) {
+ 					mtmp2->mtame = savetame;
+ 					mtmp = mtmp2;
+ 				    }
+ 				}
+ 				/* was ghost, now alive, it's all very confusing */
+ 				mtmp->mconf = 1;
+ 			}
+ 
+ 			switch (obj->where) {
+ 			    case OBJ_INVENT:
+ 				useup(obj);
+ 				break;
+ 			    case OBJ_FLOOR:
+ 				/* in case MON_AT+enexto for invisible mon */
+ 				x = obj->ox,  y = obj->oy;
+ 				/* not useupf(), which charges */
+ 				if (obj->quan > 1L)
+ 				    obj = splitobj(obj, 1);
+ 				delobj(obj);
+ 				newsym(x, y);
+ 				break;
+ 			    case OBJ_MINVENT:
+ 				m_useup(obj->ocarry, obj);
+ 				break;
+ 			    case OBJ_CONTAINED:
+ 				obj_extract_self(obj);
+ 				obfree(obj, (struct obj *) 0);
+ 				break;
+ 			    default:
+ 				panic("revive");
+ 			}
+ 		}
+ 	}
+ 	return mtmp;
+ }
+ 
+ STATIC_OVL void
+ revive_egg(obj)
+ struct obj *obj;
+ {
+ 	/*
+ 	 * Note: generic eggs with corpsenm set to NON_PM will never hatch.
+ 	 */
+ 	if (obj->otyp != EGG) return;
+ 	if (obj->corpsenm != NON_PM && !dead_species(obj->corpsenm, TRUE))
+ 	    attach_egg_hatch_timeout(obj);
+ }
+ 
+ /* try to revive all corpses and eggs carried by `mon' */
+ int
+ unturn_dead(mon)
+ struct monst *mon;
+ {
+ 	struct obj *otmp, *otmp2;
+ 	struct monst *mtmp2;
+ 	char owner[BUFSZ], corpse[BUFSZ];
+ 	boolean youseeit;
+ 	int once = 0, res = 0;
+ 
+ 	youseeit = (mon == &youmonst) ? TRUE : canseemon(mon);
+ 	otmp2 = (mon == &youmonst) ? invent : mon->minvent;
+ 
+ 	while ((otmp = otmp2) != 0) {
+ 	    otmp2 = otmp->nobj;
+ 	    if (otmp->otyp == EGG)
+ 		revive_egg(otmp);
+ 	    if (otmp->otyp != CORPSE) continue;
+ 	    /* save the name; the object is liable to go away */
+ 	    if (youseeit) Strcpy(corpse, corpse_xname(otmp, TRUE));
+ 
+ 	    /* for a merged group, only one is revived; should this be fixed? */
+ 	    if ((mtmp2 = revive(otmp)) != 0) {
+ 		++res;
+ 		if (youseeit) {
+ 		    if (!once++) Strcpy(owner,
+ 					(mon == &youmonst) ? "Your" :
+ 					s_suffix(Monnam(mon)));
+ 		    pline("%s %s suddenly comes alive!", owner, corpse);
+ 		} else if (canseemon(mtmp2))
+ 		    pline("%s suddenly appears!", Amonnam(mtmp2));
+ 	    }
+ 	}
+ 	return res;
+ }
+ #endif /*OVL1*/
+ 
+ #ifdef OVLB
+ static const char charged_objs[] = { WAND_CLASS, WEAPON_CLASS, ARMOR_CLASS,
+ 				     SPBOOK_CLASS, 0 };
+ 
+ STATIC_OVL void
+ costly_cancel(obj)
+ register struct obj *obj;
+ {
+ 	char objroom;
+ 	struct monst *shkp = (struct monst *)0;
+ 
+ 	if (obj->no_charge) return;
+ 
+ 	switch (obj->where) {
+ 	case OBJ_INVENT:
+ 		if (obj->unpaid) {
+ 		    shkp = shop_keeper(*u.ushops);
+ 		    if (!shkp) return;
+ 		    Norep("You cancel an unpaid object, you pay for it!");
+ 		    bill_dummy_object(obj);
+ 		}
+ 		break;
+ 	case OBJ_FLOOR:
+ 		objroom = *in_rooms(obj->ox, obj->oy, SHOPBASE);
+ 		shkp = shop_keeper(objroom);
+ 		if (!shkp || !inhishop(shkp)) return;
+ 		if (costly_spot(u.ux, u.uy) && objroom == *u.ushops) {
+ 		    Norep("You cancel it, you pay for it!");
+ 		    bill_dummy_object(obj);
+ 		} else
+ 		    (void) stolen_value(obj, obj->ox, obj->oy, FALSE, FALSE,
+ 			    FALSE);
+ 		break;
+ 	}
+ }
+ 
+ 
+ /* cancel obj, possibly carried by you or a monster */
+ void
+ cancel_item(obj)
+ register struct obj *obj;
+ {
+ 	boolean	u_ring = (obj == uleft) || (obj == uright);
+ 	register boolean holy = (obj->otyp == POT_WATER && obj->blessed);
+ 
+ 	switch(obj->otyp) {
+ 		case RIN_GAIN_STRENGTH:
+ 			if ((obj->owornmask & W_RING) && u_ring) {
+ 				ABON(A_STR) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case RIN_GAIN_DEXTERITY:
+ 			if ((obj->owornmask & W_RING) && u_ring) {
+ 				ABON(A_DEX) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case RIN_GAIN_CONSTITUTION:
+ 			if ((obj->owornmask & W_RING) && u_ring) {
+ 				ABON(A_CON) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case RIN_GAIN_INTELLIGENCE:
+ 			if ((obj->owornmask & W_RING) && u_ring) {
+ 				ABON(A_INT) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case RIN_GAIN_WISDOM:
+ 			if ((obj->owornmask & W_RING) && u_ring) {
+ 				ABON(A_WIS) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case RIN_ADORNMENT:
+ 			if ((obj->owornmask & W_RING) && u_ring) {
+ 				ABON(A_CHA) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case RIN_INCREASE_ACCURACY:
+ 			if ((obj->owornmask & W_RING) && u_ring)
+ 				u.uhitinc -= obj->spe;
+ 			break;
+ 		case RIN_INCREASE_DAMAGE:
+ 			if ((obj->owornmask & W_RING) && u_ring)
+ 				u.udaminc -= obj->spe;
+ 			break;
+ 		case HELM_OF_BRILLIANCE:
+ 			if ((obj->owornmask & W_ARMH) && (obj == uarmh)) {
+ 				ABON(A_INT) -= obj->spe;
+ 				ABON(A_WIS) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		case GAUNTLETS_OF_DEXTERITY:
+ 			if ((obj->owornmask & W_ARMG) && (obj == uarmg)) {
+ 				ABON(A_DEX) -= obj->spe;
+ 				flags.botl = 1;
+ 			}
+ 			break;
+ 		/* case RIN_PROTECTION:  not needed */
+ 	}
+ 	if (objects[obj->otyp].oc_magic
+ 	    || (obj->spe && (obj->oclass == ARMOR_CLASS ||
+ 			     obj->oclass == WEAPON_CLASS || is_weptool(obj)))
+ 	    || obj->otyp == POT_ACID || obj->otyp == POT_SICKNESS) {
+ 	    if (obj->spe != ((obj->oclass == WAND_CLASS) ? -1 : 0) &&
+ 	       obj->otyp != WAN_CANCELLATION &&
+ 		 /* can't cancel cancellation */
+ 		 obj->otyp != MAGIC_LAMP &&
+ 		 obj->otyp != MAGIC_CANDLE &&
+ 		 obj->otyp != CANDELABRUM_OF_INVOCATION) {
+ 		costly_cancel(obj);
+ 		obj->spe = (obj->oclass == WAND_CLASS) ? -1 : 0;
+ 	    }
+ 	    switch (obj->oclass) {
+ 	      case SCROLL_CLASS:
+ 		costly_cancel(obj);
+ 		obj->otyp = SCR_BLANK_PAPER;
+ 		obj->spe = 0;
+ 		break;
+ 	      case SPBOOK_CLASS:
+ 		if (obj->otyp != SPE_CANCELLATION &&
+ 			obj->otyp != SPE_BOOK_OF_THE_DEAD) {
+ 		    costly_cancel(obj);
+ 		    obj->otyp = SPE_BLANK_PAPER;
+ 		}
+ 		break;
+ 	      case POTION_CLASS:
+ 		/* Potions of amnesia are uncancelable. */
+ 		if (obj->otyp == POT_AMNESIA) break;
+ 
+ 		costly_cancel(obj);
+ 		if (obj->otyp == POT_SICKNESS ||
+ 		    obj->otyp == POT_SEE_INVISIBLE) {
+ 	    /* sickness is "biologically contaminated" fruit juice; cancel it
+ 	     * and it just becomes fruit juice... whereas see invisible
+ 	     * tastes like "enchanted" fruit juice, it similarly cancels.
+ 	     */
+ 		    obj->otyp = POT_FRUIT_JUICE;
+ 		} else {
+ 	            obj->otyp = POT_WATER;
+ 		    obj->odiluted = 0; /* same as any other water */
+ 		}
+ 		break;
+ 	    }
+ 	}
+ 	if (holy) costly_cancel(obj);
+ 	unbless(obj);
+ 	uncurse(obj);
+ #ifdef INVISIBLE_OBJECTS
+ 	if (obj->oinvis) obj->oinvis = 0;
+ #endif
+ 	return;
+ }
+ 
+ /* Remove a positive enchantment or charge from obj,
+  * possibly carried by you or a monster
+  */
+ boolean
+ drain_item(obj)
+ register struct obj *obj;
+ {
+ 	boolean u_ring;
+ 
+ 	/* Is this a charged/enchanted object? */
+ 	if (!obj || (!objects[obj->otyp].oc_charged &&
+ 			obj->oclass != WEAPON_CLASS &&
+ 			obj->oclass != ARMOR_CLASS && !is_weptool(obj)) ||
+ 			obj->spe <= 0)
+ 	    return (FALSE);
+ 	if (obj_resists(obj, 10, 90))
+ 	    return (FALSE);
+ 
+ 	/* Charge for the cost of the object */
+ 	costly_cancel(obj);	/* The term "cancel" is okay for now */
+ 
+ 	/* Drain the object and any implied effects */
+ 	obj->spe--;
+ 	u_ring = (obj == uleft) || (obj == uright);
+ 	switch(obj->otyp) {
+ 	case RIN_GAIN_STRENGTH:
+ 	    if ((obj->owornmask & W_RING) && u_ring) {
+ 	    	ABON(A_STR)--;
+ 	    	flags.botl = 1;
+ 	    }
+ 	    break;
+ 	case RIN_GAIN_CONSTITUTION:
+ 	    if ((obj->owornmask & W_RING) && u_ring) {
+ 	    	ABON(A_CON)--;
+ 	    	flags.botl = 1;
+ 	    }
+ 	    break;
+ 	case RIN_ADORNMENT:
+ 	    if ((obj->owornmask & W_RING) && u_ring) {
+ 	    	ABON(A_CHA)--;
+ 	    	flags.botl = 1;
+ 	    }
+ 	    break;
+ 	case RIN_INCREASE_ACCURACY:
+ 	    if ((obj->owornmask & W_RING) && u_ring)
+ 	    	u.uhitinc--;
+ 	    break;
+ 	case RIN_INCREASE_DAMAGE:
+ 	    if ((obj->owornmask & W_RING) && u_ring)
+ 	    	u.udaminc--;
+ 	    break;
+ 	case HELM_OF_BRILLIANCE:
+ 	    if ((obj->owornmask & W_ARMH) && (obj == uarmh)) {
+ 	    	ABON(A_INT)--;
+ 	    	ABON(A_WIS)--;
+ 	    	flags.botl = 1;
+ 	    }
+ 	    break;
+ 	case GAUNTLETS_OF_DEXTERITY:
+ 	    if ((obj->owornmask & W_ARMG) && (obj == uarmg)) {
+ 	    	ABON(A_DEX)--;
+ 	    	flags.botl = 1;
+ 	    }
+ 	    break;
+ 	case RIN_PROTECTION:
+ 	    flags.botl = 1;
+ 	    break;
+ 	}
+ 	if (carried(obj)) update_inventory();
+ 	return (TRUE);
+ }
+ 
+ #endif /*OVLB*/
+ #ifdef OVL0
+ 
+ boolean
+ obj_resists(obj, ochance, achance)
+ struct obj *obj;
+ int ochance, achance;	/* percent chance for ordinary objects, artifacts */
+ {
+ 	/* [ALI] obj_resists(obj, 0, 0) is used to test for objects resisting
+ 	 * containment (see bury_an_obj() and monstone() for details).
+ 	 */
+ 	if (evades_destruction(obj) && (ochance || achance))
+ 		return TRUE;
+ 	if (obj->otyp == AMULET_OF_YENDOR ||
+ 	    obj->otyp == SPE_BOOK_OF_THE_DEAD ||
+ 	    obj->otyp == CANDELABRUM_OF_INVOCATION ||
+ 	    obj->otyp == BELL_OF_OPENING ||
+ 	    (obj->otyp == CORPSE && is_rider(&mons[obj->corpsenm]))) {
+ 		return TRUE;
+ 	} else {
+ 		int chance = rn2(100);
+ 
+ 		return((boolean)(chance < (obj->oartifact ? achance : ochance)));
+ 	}
+ }
+ 
+ boolean
+ obj_shudders(obj)
+ struct obj *obj;
+ {
+ 	int	zap_odds;
+ 
+ 	if (obj->oclass == WAND_CLASS)
+ 		zap_odds = 3;	/* half-life = 2 zaps */
+ 	else if (obj->cursed)
+ 		zap_odds = 3;	/* half-life = 2 zaps */
+ 	else if (obj->blessed)
+ 		zap_odds = 12;	/* half-life = 8 zaps */
+ 	else
+ 		zap_odds = 8;	/* half-life = 6 zaps */
+ 
+ 	/* adjust for "large" quantities of identical things */
+ 	if(obj->quan > 4L) zap_odds /= 2;
+ 
+ 	return((boolean)(! rn2(zap_odds)));
+ }
+ #endif /*OVL0*/
+ #ifdef OVLB
+ 
+ /* Use up at least minwt number of things made of material mat.
+  * There's also a chance that other stuff will be used up.  Finally,
+  * there's a random factor here to keep from always using the stuff
+  * at the top of the pile.
+  */
+ STATIC_OVL void
+ polyuse(objhdr, mat, minwt)
+     struct obj *objhdr;
+     int mat, minwt;
+ {
+     register struct obj *otmp, *otmp2;
+ 
+     for(otmp = objhdr; minwt > 0 && otmp; otmp = otmp2) {
+ 	otmp2 = otmp->nexthere;
+ 	if (otmp == uball || otmp == uchain) continue;
+ 	if (obj_resists(otmp, 0, 0)) continue;	/* preserve unique objects */
+ 	if (evades_destruction(otmp)) continue;
+ #ifdef MAIL
+ 	if (otmp->otyp == SCR_MAIL) continue;
+ #endif
+ 
+ 	if (((int) objects[otmp->otyp].oc_material == mat) ==
+ 		(rn2(minwt + 1) != 0)) {
+ 	    /* appropriately add damage to bill */
+ 	    if (costly_spot(otmp->ox, otmp->oy)) {
+ 		if (*u.ushops)
+ 			addtobill(otmp, FALSE, FALSE, FALSE);
+ 		else
+ 			(void)stolen_value(otmp,
+ 					   otmp->ox, otmp->oy, FALSE, FALSE,
+ 					   TRUE);
+ 	    }
+ 	    if (otmp->quan < LARGEST_INT)
+ 		minwt -= (int)otmp->quan;
+ 	    else
+ 		minwt = 0;
+ 	    delobj(otmp);
+ 	}
+     }
+ }
+ 
+ /*
+  * Polymorph some of the stuff in this pile into a monster, preferably
+  * a golem of the kind okind.
+  */
+ STATIC_OVL void
+ create_polymon(obj, okind)
+     struct obj *obj;
+     int okind;
+ {
+ 	struct permonst *mdat = (struct permonst *)0;
+ 	struct monst *mtmp;
+ 	const char *material;
+ 	int pm_index;
+ 
+ 	/* no golems if you zap only one object -- not enough stuff */
+ 	if(!obj || (!obj->nexthere && obj->quan == 1L)) return;
+ 
+ 	/* some of these choices are arbitrary */
+ 	switch(okind) {
+ 	case IRON:
+ 	case METAL:
+ 	case MITHRIL:
+ 	    pm_index = PM_IRON_GOLEM;
+ 	    material = "metal ";
+ 	    break;
+ 	case COPPER:
+ 	case SILVER:
+ 	case PLATINUM:
+ 	case GEMSTONE:
+ 	case MINERAL:
+ 	    pm_index = rn2(2) ? PM_STONE_GOLEM : PM_CLAY_GOLEM;
+ 	    material = "lithic ";
+ 	    break;
+ 	case 0:
+ 	case FLESH:
+ 	    /* there is no flesh type, but all food is type 0, so we use it */
+ 	    pm_index = PM_FLESH_GOLEM;
+ 	    material = "organic ";
+ 	    break;
+ 	case WAX:
+ 		pm_index = PM_WAX_GOLEM;
+ 		material = "wax ";
+ 		break;
+ 	case WOOD:
+ 	    pm_index = PM_WOOD_GOLEM;
+ 	    material = "wood ";
+ 	    break;
+ 	case LEATHER:
+ 	    pm_index = PM_LEATHER_GOLEM;
+ 	    material = "leather ";
+ 	    break;
+ 	case CLOTH:
+ 	    pm_index = PM_ROPE_GOLEM;
+ 	    material = "cloth ";
+ 	    break;
+ 	case PLASTIC:
+ 	    pm_index = PM_PLASTIC_GOLEM;
+ 	    material = "plastic ";
+ 	    break;
+ 	case BONE:
+ 	    pm_index = PM_SKELETON;     /* nearest thing to "bone golem" */
+ 	    material = "bony ";
+ 	    break;
+ 	case GOLD:
+ 	    pm_index = PM_GOLD_GOLEM;
+ 	    material = "gold ";
+ 	    break;
+ 	case GLASS:
+ 	    pm_index = PM_GLASS_GOLEM;
+ 	    material = "glassy ";
+ 	    break;
+ 	case PAPER:
+ 	    pm_index = PM_PAPER_GOLEM;
+ 	    material = "paper ";
+ 	    break;
+ 	default:
+ 	    /* if all else fails... */
+ 	    pm_index = PM_STRAW_GOLEM;
+ 	    material = "";
+ 	    break;
+ 	}
+ 
+ 	if (!(mvitals[pm_index].mvflags & G_GENOD))
+ 		mdat = &mons[pm_index];
+ 
+ 	mtmp = makemon(mdat, obj->ox, obj->oy, NO_MM_FLAGS);
+ 	polyuse(obj, okind, (int)mons[pm_index].cwt);
+ 
+ 	if(mtmp && cansee(mtmp->mx, mtmp->my)) {
+ 	    pline("Some %sobjects meld, and %s arises from the pile!",
+ 		  material, a_monnam(mtmp));
+ 	}
+ }
+ 
+ /* Assumes obj is on the floor. */
+ void
+ do_osshock(obj)
+ struct obj *obj;
+ {
+ 	long i;
+ 
+ #ifdef MAIL
+ 	if (obj->otyp == SCR_MAIL) return;
+ #endif
+ 	obj_zapped = TRUE;
+ 
+ 	if(poly_zapped < 0) {
+ 	    /* some may metamorphosize */
+ 	    for(i=obj->quan; i; i--)
+ 		if (! rn2(Luck + 45)) {
+ 		    poly_zapped = objects[obj->otyp].oc_material;
+ 		    break;
+ 		}
+ 	}
+ 
+ 	/* if quan > 1 then some will survive intact */
+ 	if (obj->quan > 1L) {
+ 	    if (obj->quan > LARGEST_INT)
+ 		obj = splitobj(obj, (long)rnd(30000));
+ 	    else
+ 		obj = splitobj(obj, (long)rnd((int)obj->quan - 1));
+ 	}
+ 
+ 	/* appropriately add damage to bill */
+ 	if (costly_spot(obj->ox, obj->oy)) {
+ 		if (*u.ushops)
+ 			addtobill(obj, FALSE, FALSE, FALSE);
+ 		else
+ 			(void)stolen_value(obj, obj->ox, obj->oy,
+ 					   FALSE, FALSE, TRUE);
+ 	}
+ 
+ 	/* zap the object */
+ 	delobj(obj);
+ }
+ 
+ /* [ALI] Deal with any special effects after "wearing" an object. */
+ void
+ puton_worn_item(obj)
+ struct obj *obj;
+ {
+     if (!obj->owornmask)
+ 	return;
+     switch (obj->oclass) {
+ 	case TOOL_CLASS:
+ 	    if (obj == ublindf) Blindf_on(obj);
+ 	    break;
+ 	case AMULET_CLASS:
+ 	    Amulet_on();
+ 	    break;
+ 	case RING_CLASS:
+ 	case FOOD_CLASS: /* meat ring */
+ 	    Ring_on(obj);
+ 	    break;
+ 	case ARMOR_CLASS:
+ 	    if (obj == uarm) (void) Armor_on();
+ 	    else if (obj == uarmc) (void) Cloak_on();
+ 	    else if (obj == uarmf) (void) Boots_on();
+ 	    else if (obj == uarmg) (void) Gloves_on();
+ 	    else if (obj == uarmh) (void) Helmet_on();
+ /*	    else if (obj == uarms) (void) Shield_on(); */
+ 	    break;
+     }
+ }
+ 
+ /*
+  * Polymorph the object to the given object ID.  If the ID is STRANGE_OBJECT
+  * then pick random object from the source's class (this is the standard
+  * "polymorph" case).  If ID is set to a specific object, inhibit fusing
+  * n objects into 1.  This could have been added as a flag, but currently
+  * it is tied to not being the standard polymorph case. The new polymorphed
+  * object replaces obj in its link chains.  Return value is a pointer to
+  * the new object.
+  *
+  * This should be safe to call for an object anywhere.
+  */
+ struct obj *
+ poly_obj(obj, id)
+ 	struct obj *obj;
+ 	int id;
+ {
+ 	struct obj *otmp;
+ 	xchar ox, oy;
+ 	boolean can_merge = (id == STRANGE_OBJECT);
+ 	int obj_location = obj->where;
+ 	int old_nutrit, new_nutrit;
+ 
+ #ifdef UNPOLYPILE
+ 	boolean unpoly = (id == STRANGE_OBJECT);
+ #endif
+ 
+ 	/* WAC Amulets of Unchanging shouldn't change */
+ 	if (obj->otyp == AMULET_OF_UNCHANGING)
+ 	    return obj;
+ 
+ 	if (obj->otyp == BOULDER && In_sokoban(&u.uz))
+ 	    change_luck(-1);    /* Sokoban guilt */
+ #ifdef WIZARD
+ 	otmp = (struct obj *)0;
+ 	if (id == STRANGE_OBJECT && wizard && Polymorph_control) {
+ 	    int typ;
+ 	    char buf[BUFSZ];
+ 	    getlin("Polymorph into what? [type the name]", buf);
+ 	    otmp = readobjnam(buf, (struct obj *)0, TRUE);
+ 	    if (otmp && otmp->oclass != obj->oclass) {
+ 		delobj(otmp);
+ 		otmp = (struct obj *)0;
+ 	    }
+ 	    else if (otmp) {
+ 		typ = otmp->otyp;
+ 		delobj(otmp);
+ 		otmp = mksobj(typ, TRUE, FALSE);
+ 	    }
+ 	}
+ 	if (!otmp)
+ #endif
+ 	if (id == STRANGE_OBJECT) { /* preserve symbol */
+ 	    int try_limit = 3;
+ 	    /* Try up to 3 times to make the magic-or-not status of
+ 	       the new item be the same as it was for the old one. */
+ 	    otmp = (struct obj *)0;
+ 	    do {
+ 		if (otmp) delobj(otmp);
+ 		otmp = mkobj(obj->oclass, FALSE);
+ 	    } while (--try_limit > 0 &&
+ 		  objects[obj->otyp].oc_magic != objects[otmp->otyp].oc_magic);
+ 	} else {
+ 	    /* literally replace obj with this new thing */
+ 	    otmp = mksobj(id, FALSE, FALSE);
+ 	/* Actually more things use corpsenm but they polymorph differently */
+ #define USES_CORPSENM(typ) ((typ)==CORPSE || (typ)==STATUE || (typ)==FIGURINE)
+ 	    if (USES_CORPSENM(obj->otyp) && USES_CORPSENM(id))
+ 		otmp->corpsenm = obj->corpsenm;
+ #undef USES_CORPSENM
+ 	}
+ 
+ 	/* preserve quantity */
+ 	otmp->quan = obj->quan;
+ 	/* preserve the shopkeepers (lack of) interest */
+ 	otmp->no_charge = obj->no_charge;
+ 	/* preserve inventory letter if in inventory */
+ 	if (obj_location == OBJ_INVENT)
+ 	    otmp->invlet = obj->invlet;
+ #ifdef MAIL
+ 	/* You can't send yourself 100 mail messages and then
+ 	 * polymorph them into useful scrolls
+ 	 */
+ 	if (obj->otyp == SCR_MAIL) {
+ 		otmp->otyp = SCR_MAIL;
+ 		otmp->spe = 1;
+ #ifdef UNPOLYPILE
+ 		unpoly = FALSE;	/* WAC -- no change! */
+ #endif
+ 	}
+ #endif
+ 
+ 	/* avoid abusing eggs laid by you */
+ 	if (obj->otyp == EGG && obj->spe) {
+ 		int mnum, tryct = 100;
+ 
+ 
+ #ifdef UNPOLYPILE
+ 		unpoly = FALSE;	/* WAC no unpolying eggs */
+ #endif
+ 		/* first, turn into a generic egg */
+ 		if (otmp->otyp == EGG)
+ 		    kill_egg(otmp);
+ 		else {
+ 		    otmp->otyp = EGG;
+ 		    otmp->owt = weight(otmp);
+ 		}
+ 		otmp->corpsenm = NON_PM;
+ 		otmp->spe = 0;
+ 
+ 		/* now change it into something layed by the hero */
+ 		while (tryct--) {
+ 		    mnum = can_be_hatched(random_monster());
+ 		    if (mnum != NON_PM && !dead_species(mnum, TRUE)) {
+ 			otmp->spe = 1;	/* layed by hero */
+ 			otmp->corpsenm = mnum;
+ 			attach_egg_hatch_timeout(otmp);
+ 			break;
+ 		    }
+ 		}
+ 	}
+ 
+ 	/* keep special fields (including charges on wands) */
+ 	if (index(charged_objs, otmp->oclass)) otmp->spe = obj->spe;
+ 	otmp->recharged = obj->recharged;
+ 
+ 	otmp->cursed = obj->cursed;
+ 	otmp->blessed = obj->blessed;
+ 	otmp->oeroded = obj->oeroded;
+ 	otmp->oeroded2 = obj->oeroded2;
+ 	if (!is_flammable(otmp) && !is_rustprone(otmp)) otmp->oeroded = 0;
+ 	if (!is_corrodeable(otmp) && !is_rottable(otmp)) otmp->oeroded2 = 0;
+ 	if (is_damageable(otmp))
+ 	    otmp->oerodeproof = obj->oerodeproof;
+ 
+ 	/* Keep chest/box traps and poisoned ammo if we may */
+ 	if (obj->otrapped && Is_box(otmp)) otmp->otrapped = TRUE;
+ 
+ 	/* KMH, balance patch -- new macro */
+ 	if (obj->opoisoned && is_poisonable(otmp))
+ 		otmp->opoisoned = TRUE;
+ 
+ 	if (id == STRANGE_OBJECT && obj->otyp == CORPSE) {
+ #ifdef UNPOLYPILE
+ 		unpoly = FALSE;	/* WAC - don't bother */
+ #endif
+ 	/* turn crocodile corpses into shoes */
+ 	    if (obj->corpsenm == PM_CROCODILE) {
+ 		otmp->otyp = LOW_BOOTS;
+ 		otmp->oclass = ARMOR_CLASS;
+ 		otmp->spe = 0;
+ 		otmp->oeroded = 0;
+ 		otmp->oerodeproof = TRUE;
+ 		otmp->quan = 1L;
+ 		otmp->cursed = FALSE;
+ 	    }
+ 	}
+ 
+ 	/* no box contents --KAA */
+ 	if (Has_contents(otmp)) delete_contents(otmp);
+ 
+ 	/* 'n' merged objects may be fused into 1 object */
+ 	if (otmp->quan > 1L && (!objects[otmp->otyp].oc_merge ||
+ 				(can_merge && otmp->quan > (long)rn2(1000))))
+ 	    otmp->quan = 1L;
+ 
+ 	switch (otmp->oclass) {
+ 
+ 	case TOOL_CLASS:
+ 	    if(otmp->otyp == MAGIC_LAMP) {
+ 		otmp->otyp = OIL_LAMP;
+ 		otmp->age = 1500L;	/* "best" oil lamp possible */
+ #ifdef UNPOLYPILE
+ 		unpoly = FALSE;
+ #endif
+ 	    } else if (otmp->otyp == MAGIC_MARKER) {
+ 		otmp->recharged = 1;	/* degraded quality */
+ 	    }
+ #ifdef UNPOLYPILE
+ 	    else if (otmp->otyp == LAND_MINE || otmp->otyp == BEARTRAP) {
+ 		/* Avoid awkward questions about traps set using hazy objs */
+ 		unpoly = FALSE;
+ 	    }
+ #endif
+ 	    /* don't care about the recharge count of other tools */
+ 	    break;
+ 
+ 	case WAND_CLASS:
+ 	    while(otmp->otyp == WAN_WISHING || otmp->otyp == WAN_POLYMORPH)
+ 		otmp->otyp = rnd_class(WAN_LIGHT, WAN_FIREBALL);
+ 	    /* altering the object tends to degrade its quality
+ 	       (analogous to spellbook `read count' handling) */
+ 	    if ((int)otmp->recharged < rn2(7))	/* recharge_limit */
+ 		otmp->recharged++;
+ 	    break;
+ 
+ 	case POTION_CLASS:
+ 	    while (otmp->otyp == POT_POLYMORPH)
+ 		otmp->otyp = rnd_class(POT_GAIN_ABILITY, POT_WATER);
+ 	    break;
+ 
+ 	case SPBOOK_CLASS:
+ 	    while (otmp->otyp == SPE_POLYMORPH)
+ 		otmp->otyp = rnd_class(SPE_DIG, SPE_BLANK_PAPER);
+ 	    /* reduce spellbook abuse */
+ 	    if ((int)otmp->recharged < rn2(7))	/* recharge_limit */
+ 		otmp->recharged++;
+ 	    otmp->spestudied = obj->spestudied + 1;
+ 	    break;
+ 
+ 	case GEM_CLASS:
+ 	    if (otmp->quan > (long) rnd(4) &&
+ 		    objects[obj->otyp].oc_material == MINERAL &&
+ 		    objects[otmp->otyp].oc_material != MINERAL) {
+ 		otmp->otyp = ROCK;	/* transmutation backfired */
+ 		otmp->quan /= 2L;	/* some material has been lost */
+ 	    }
+ 	    break;
+ 
+ 	case FOOD_CLASS:
+ 	    if (otmp->otyp == SLIME_MOLD)
+ 		otmp->spe = current_fruit;
+ 	    /* Preserve percentage eaten (except for tins) */
+ 	    old_nutrit = objects[obj->otyp].oc_nutrition;
+ 	    if (obj->oeaten && otmp->otyp != TIN && old_nutrit) {
+ 		new_nutrit = objects[otmp->otyp].oc_nutrition;
+ 		otmp->oeaten = obj->oeaten * new_nutrit / old_nutrit;
+ 		if (otmp->oeaten == 0)
+ 		    otmp->oeaten++;
+ 		if (otmp->oeaten >= new_nutrit)
+ 		    otmp->oeaten = new_nutrit - 1;
+ 	    }
+ 	    break;
+ 	}
+ 
+ 	/* update the weight */
+ 	otmp->owt = weight(otmp);
+ 
+ 	/* for now, take off worn items being polymorphed */
+ 	/* [ALI] In Slash'EM only take off worn items if no longer compatible */
+ 	if (obj_location == OBJ_INVENT || obj_location == OBJ_MINVENT) {
+ 		/* This is called only for stone to flesh.  It's a lot simpler
+ 		 * than it otherwise might be.  We don't need to check for
+ 		 * special effects when putting them on (no meat objects have
+ 		 * any) and only three worn masks are possible.
+ 		 */
+ 	    /* [ALI] Unfortunately, hazy polymorphs means that this
+ 	     * is not true for Slash'EM, and we need to be a little more
+ 	     * careful.
+ 	     */
+ 	    if (obj == uskin) rehumanize();
+ 		otmp->owornmask = obj->owornmask;
+ 	    /* Quietly remove worn item if no longer compatible --ALI */
+ 	    if (otmp->owornmask & W_ARM && !is_suit(otmp))
+ 		otmp->owornmask &= ~W_ARM;
+ 	    if (otmp->owornmask & W_ARMC && !is_cloak(otmp))
+ 		otmp->owornmask &= ~W_ARMC;
+ 	    if (otmp->owornmask & W_ARMH && !is_helmet(otmp))
+ 		otmp->owornmask &= ~W_ARMH;
+ 	    if (otmp->owornmask & W_ARMS && !is_shield(otmp))
+ 		otmp->owornmask &= ~W_ARMS;
+ 	    if (otmp->owornmask & W_ARMG && !is_gloves(otmp))
+ 		otmp->owornmask &= ~W_ARMG;
+ 	    if (otmp->owornmask & W_ARMF && !is_boots(otmp))
+ 		otmp->owornmask &= ~W_ARMF;
+ #ifdef TOURIST
+ 	    if (otmp->owornmask & W_ARMU && !is_shirt(otmp))
+ 		otmp->owornmask &= ~W_ARMU;
+ #endif
+ 	    if (otmp->owornmask & W_TOOL && otmp->otyp != BLINDFOLD &&
+ 	      otmp->otyp != TOWEL && otmp->otyp != LENSES)
+ 		otmp->owornmask &= ~W_TOOL;
+ 	    if (obj->otyp == LEASH && obj->leashmon) o_unleash(obj);
+ 	    if (obj_location == OBJ_INVENT) {
+ 		remove_worn_item(obj, TRUE);
+ 		setworn(otmp, otmp->owornmask);
+ 		puton_worn_item(otmp);
+ 		if (otmp->owornmask & LEFT_RING)
+ 		    uleft = otmp;
+ 		if (otmp->owornmask & RIGHT_RING)
+ 		    uright = otmp;
+ 		if (otmp->owornmask & W_WEP)
+ 		    uwep = otmp;
+ 		if (otmp->owornmask & W_SWAPWEP)
+ 		    uswapwep = otmp;
+ 		if (otmp->owornmask & W_QUIVER)
+ 		    uquiver = otmp;
+ 	    }
+ 	    /* (We have to pend updating monster intrinsics until later) */
+ 	}
+ 	else {
+ 	/* preserve the mask in case being used by something else */
+ 	otmp->owornmask = obj->owornmask;
+ #ifdef STEED
+ 	    if (otmp->owornmask & W_SADDLE && otmp->otyp != SADDLE) {
+ 		struct monst *mtmp = obj->ocarry;
+ 		dismount_steed(DISMOUNT_THROWN);
+ 		otmp->owornmask &= ~W_SADDLE;
+ 		/* The ex-saddle slips to the floor */
+ 		mtmp->misc_worn_check &= ~obj->owornmask;
+ 		otmp->owornmask = obj->owornmask = 0;
+ 		update_mon_intrinsics(mtmp, obj, FALSE, FALSE);
+ 		obj_extract_self(obj);
+ 		place_object(obj, mtmp->mx, mtmp->my);
+ 		stackobj(obj);
+ 		newsym(mtmp->mx, mtmp->my);
+ 		obj_location = OBJ_FLOOR;
+ 	    }
+ #endif
+ 	}
+ 
+ 	if (obj_location == OBJ_FLOOR && obj->otyp == BOULDER &&
+ 		otmp->otyp != BOULDER)
+ 	    unblock_point(obj->ox, obj->oy);
+ 
+ #ifdef UNPOLYPILE
+ 	/* WAC -- Attach unpoly timer if this is a standard poly */
+ 	if (unpoly /* && !rn2(20) */) {
+ 		set_obj_poly(otmp, obj);
+ 		if (is_hazy(otmp) && !Blind && carried(obj))
+ 			pline("%s seems hazy.", Yname2(otmp));
+ 	}
+ #endif
+ 
+ 	/* ** we are now done adjusting the object ** */
+ 
+ 	/* swap otmp for obj */
+ 	replace_object(obj, otmp);
+ 	if (obj_location == OBJ_INVENT) {
+ 	    /*
+ 	     * We may need to do extra adjustments for the hero if we're
+ 	     * messing with the hero's inventory.  The following calls are
+ 	     * equivalent to calling freeinv on obj and addinv on otmp,
+ 	     * while doing an in-place swap of the actual objects.
+ 	     */
+ 	    freeinv_core(obj);
+ 	    addinv_core1(otmp);
+ 	    addinv_core2(otmp);
+ 	}
+ 	else if (obj_location == OBJ_MINVENT) {
+ 	    /* Pended update of monster intrinsics */
+ 	    update_mon_intrinsics(obj->ocarry, obj, FALSE, FALSE);
+ 	    if (otmp->owornmask)
+ 		update_mon_intrinsics(otmp->ocarry, otmp, TRUE, FALSE);
+ 	}
+ 
+ 	if ((!carried(otmp) || obj->unpaid) &&
+ #if defined(UNPOLYPILE)
+ 		!is_hazy(obj) &&
+ #endif
+ 		get_obj_location(otmp, &ox, &oy, BURIED_TOO|CONTAINED_TOO) &&
+ 		costly_spot(ox, oy)) {
+ 	    char objroom = *in_rooms(ox, oy, SHOPBASE);
+ 	    register struct monst *shkp = shop_keeper(objroom);
+ 
+ 	    if ((!obj->no_charge ||
+ 		 (Has_contents(obj) &&
+ 		    (contained_cost(obj, shkp, 0L, FALSE, FALSE) != 0L)))
+ 	       && inhishop(shkp)) {
+ 		if(shkp->mpeaceful) {
+ 		    if(*u.ushops && *in_rooms(u.ux, u.uy, 0) ==
+ 			    *in_rooms(shkp->mx, shkp->my, 0) &&
+ 			    !costly_spot(u.ux, u.uy))
+ 			make_angry_shk(shkp, ox, oy);
+ 		    else {
+ 			pline("%s gets angry!", Monnam(shkp));
+ 			hot_pursuit(shkp);
+ 		    }
+ 		} else Norep("%s is furious!", Monnam(shkp));
+ 		if (!carried(otmp)) {
+ 		    if (costly_spot(u.ux, u.uy) && objroom == *u.ushops)
+ 			bill_dummy_object(obj);
+ 		    else
+ 			(void) stolen_value(obj, ox, oy, FALSE, FALSE, TRUE);
+ 		}
+ 	    }
+ 	}
+ 	delobj(obj);
+ 	return otmp;
+ }
+ 
+ /*
+  * Object obj was hit by the effect of the wand/spell otmp.  Return
+  * non-zero if the wand/spell had any effect.
+  */
+ int
+ bhito(obj, otmp)
+ struct obj *obj, *otmp;
+ {
+ 	int res = 1;	/* affected object by default */
+ 	xchar refresh_x, refresh_y;
+ 
+ 	if (obj->bypass) {
+ 		/* The bypass bit is currently only used as follows:
+ 		 *
+ 		 * POLYMORPH - When a monster being polymorphed drops something
+ 		 *             from its inventory as a result of the change.
+ 		 *             If the items fall to the floor, they are not
+ 		 *             subject to direct subsequent polymorphing
+ 		 *             themselves on that same zap. This makes it
+ 		 *             consistent with items that remain in the
+ 		 *             monster's inventory. They are not polymorphed
+ 		 *             either.
+ 		 * UNDEAD_TURNING - When an undead creature gets killed via
+ 		 *	       undead turning, prevent its corpse from being
+ 		 *	       immediately revived by the same effect.
+ 		 *
+ 		 * The bypass bit on all objects is reset each turn, whenever
+ 		 * flags.bypasses is set.
+ 		 *
+ 		 * We check the obj->bypass bit above AND flags.bypasses
+ 		 * as a safeguard against any stray occurrence left in an obj
+ 		 * struct someplace, although that should never happen.
+ 		 */
+ 		if (flags.bypasses)
+ 			return 0;
+ 		else {
+ #ifdef DEBUG
+ 			pline("%s for a moment.", Tobjnam(obj, "pulsate"));
+ #endif
+ 			obj->bypass = 0;
+ 		}
+ 	}
+ 
+ 	/*
+ 	 * Some parts of this function expect the object to be on the floor
+ 	 * obj->{ox,oy} to be valid.  The exception to this (so far) is
+ 	 * for the STONE_TO_FLESH spell.
+ 	 */
+ 	if (!(obj->where == OBJ_FLOOR || otmp->otyp == SPE_STONE_TO_FLESH))
+ 	    impossible("bhito: obj is not floor or Stone To Flesh spell");
+ 
+ 	if (obj == uball) {
+ 		res = 0;
+ 	} else if (obj == uchain) {
+ 		if (otmp->otyp == WAN_OPENING || otmp->otyp == SPE_KNOCK) {
+ 		    unpunish();
+ 		    makeknown(otmp->otyp);
+ 		} else
+ 		    res = 0;
+ 	} else
+ 	switch(otmp->otyp) {
+ 	case WAN_POLYMORPH:
+ 	case SPE_POLYMORPH:
+ 		if (obj->otyp == WAN_POLYMORPH ||
+ 			obj->otyp == SPE_POLYMORPH ||
+ 			obj->otyp == POT_POLYMORPH ||
+ 			obj_resists(obj, 5, 95)) {
+ 		    res = 0;
+ 		    break;
+ 		}
+ 
+ 		/* KMH, conduct */
+ 		u.uconduct.polypiles++;
+ 		/* any saved lock context will be dangerously obsolete */
+ 		if (Is_box(obj)) (void) boxlock(obj, otmp);
+ 
+ 		if (obj_shudders(obj)) {
+ 		    if (cansee(obj->ox, obj->oy))
+ 			makeknown(otmp->otyp);
+ 		    do_osshock(obj);
+ 		    break;
+ 		}
+ 		obj = poly_obj(obj, STRANGE_OBJECT);
+ 		newsym(obj->ox,obj->oy);
+ 		break;
+ 	case WAN_PROBING:
+ 		res = !obj->dknown;
+ 		/* target object has now been "seen (up close)" */
+ 		obj->dknown = 1;
+ 		if (Is_container(obj) || obj->otyp == STATUE) {
+ 		    if (!obj->cobj)
+ 			pline("%s empty.", Tobjnam(obj, "are"));
+ 		    else {
+ 			struct obj *o;
+ 			/* view contents (not recursively) */
+ 			for (o = obj->cobj; o; o = o->nobj)
+ 			    o->dknown = 1;	/* "seen", even if blind */
+ 			(void) display_cinventory(obj);
+ 		    }
+ 		    res = 1;
+ 		}
+ 		if (res) makeknown(WAN_PROBING);
+ 		break;
+ 	case WAN_STRIKING:
+ 	case SPE_FORCE_BOLT:
+ 		if (obj->otyp == BOULDER)
+ 			fracture_rock(obj);
+ 		else if (obj->otyp == STATUE)
+ 			(void) break_statue(obj);
+ 		else {
+ 			if (!flags.mon_moving)
+ 			    (void)hero_breaks(obj, obj->ox, obj->oy, FALSE);
+ 			else
+ 			    (void)breaks(obj, obj->ox, obj->oy);
+ 			res = 0;
+ 		}
+ 		/* BUG[?]: shouldn't this depend upon you seeing it happen? */
+ 		makeknown(otmp->otyp);
+ 		break;
+ 	case WAN_CANCELLATION:
+ 	case SPE_CANCELLATION:
+ 		cancel_item(obj);
+ #ifdef TEXTCOLOR
+ 		newsym(obj->ox,obj->oy);	/* might change color */
+ #endif
+ 		break;
+ 	case SPE_DRAIN_LIFE:
+ 	case WAN_DRAINING:	/* KMH */
+ 		(void) drain_item(obj);
+ 		break;
+ 	case WAN_TELEPORTATION:
+ 	case SPE_TELEPORT_AWAY:
+ 		rloco(obj);
+ 		break;
+ 	case WAN_MAKE_INVISIBLE:
+ #ifdef INVISIBLE_OBJECTS
+ 		if (!always_visible(obj)) {
+ 		    obj->oinvis = TRUE;
+ 		    newsym(obj->ox,obj->oy);	/* make object disappear */
+ 		}
+ #endif
+ 		break;
+ 	case WAN_UNDEAD_TURNING:
+ 	case SPE_TURN_UNDEAD:
+ 		if (obj->otyp == EGG)
+ 			revive_egg(obj);
+ 		else
+ 			res = !!revive(obj);
+ 		break;
+ 	case WAN_OPENING:
+ 	case SPE_KNOCK:
+ 	case WAN_LOCKING:
+ 	case SPE_WIZARD_LOCK:
+ 		if(Is_box(obj))
+ 			res = boxlock(obj, otmp);
+ 		else
+ 			res = 0;
+ 		if (res /* && otmp->oclass == WAND_CLASS */)
+ 			makeknown(otmp->otyp);
+ 		break;
+ 
+ 	case WAN_SLOW_MONSTER:		/* no effect on objects */
+ 	case SPE_SLOW_MONSTER:
+ 	case WAN_SPEED_MONSTER:
+ 	case WAN_NOTHING:
+ 	case SPE_HEALING:
+ 	case SPE_EXTRA_HEALING:
+ 	case WAN_HEALING:
+ 	case WAN_EXTRA_HEALING:
+ 	case WAN_FEAR:
+ 	case WAN_FIREBALL:
+ 		res = 0;
+ 		break;
+ 	case SPE_STONE_TO_FLESH:
+ 		refresh_x = obj->ox; refresh_y = obj->oy;
+ 		if (objects[obj->otyp].oc_material != MINERAL &&
+ 			objects[obj->otyp].oc_material != GEMSTONE) {
+ 		    res = 0;
+ 		    break;
+ 		}
+ 		/* add more if stone objects are added.. */
+ 		switch (objects[obj->otyp].oc_class) {
+ 		    case ROCK_CLASS:	/* boulders and statues */
+ 			if (obj->otyp == BOULDER) {
+ 			    obj = poly_obj(obj, HUGE_CHUNK_OF_MEAT);
+ 			    goto smell;
+ 			} else if (obj->otyp == STATUE) {
+ 			    xchar oox, ooy;
+ 
+ 			    (void) get_obj_location(obj, &oox, &ooy, 0);
+ 			    refresh_x = oox; refresh_y = ooy;
+ 			    if (vegetarian(&mons[obj->corpsenm])) {
+ 				/* Don't animate monsters that aren't flesh */
+ 				obj = poly_obj(obj, MEATBALL);
+ 			    	goto smell;
+ 			    }
+ 			    if (!animate_statue(obj, oox, ooy,
+ 						ANIMATE_SPELL, (int *)0)) {
+ 				struct obj *item;
+ makecorpse:			if (mons[obj->corpsenm].geno &
+ 							(G_NOCORPSE|G_UNIQ)) {
+ 				    res = 0;
+ 				    break;
+ 				}
+ 				/* Unlikely to get here since genociding
+ 				 * monsters also sets the G_NOCORPSE flag.
+ 				 * Drop the contents, poly_obj looses them.
+ 				 */
+ 				while ((item = obj->cobj) != 0) {
+ 				    obj_extract_self(item);
+ 				    place_object(item, oox, ooy);
+ 				}
+ 				obj = poly_obj(obj, CORPSE);
+ 				break;
+ 			    }
+ 			} else { /* new rock class object... */
+ 			    /* impossible? */
+ 			    res = 0;
+ 			}
+ 			break;
+ 		    case TOOL_CLASS:	/* figurine */
+ 		    {
+ 			struct monst *mon;
+ 			xchar oox, ooy;
+ 
+ 			if (obj->otyp != FIGURINE) {
+ 			    res = 0;
+ 			    break;
+ 			}
+ 			if (vegetarian(&mons[obj->corpsenm])) {
+ 			    /* Don't animate monsters that aren't flesh */
+ 			    obj = poly_obj(obj, MEATBALL);
+ 			    goto smell;
+ 			}
+ 			(void) get_obj_location(obj, &oox, &ooy, 0);
+ 			refresh_x = oox; refresh_y = ooy;
+ 			mon = makemon(&mons[obj->corpsenm],
+ 				      oox, ooy, NO_MM_FLAGS);
+ 			if (mon) {
+ 			    delobj(obj);
+ 			    if (cansee(mon->mx, mon->my))
+ 				pline_The("figurine animates!");
+ 			    break;
+ 			}
+ 			goto makecorpse;
+ 		    }
+ 		    /* maybe add weird things to become? */
+ 		    case RING_CLASS:	/* some of the rings are stone */
+ 			obj = poly_obj(obj, MEAT_RING);
+ 			goto smell;
+ 		    case WAND_CLASS:	/* marble wand */
+ 			obj = poly_obj(obj, MEAT_STICK);
+ 			goto smell;
+ 		    case GEM_CLASS:	/* rocks & gems */
+ 			obj = poly_obj(obj, MEATBALL);
+ smell:
+ 			if (herbivorous(youmonst.data) &&
+ 			    (!carnivorous(youmonst.data) ||
+ 			     Role_if(PM_MONK) || !u.uconduct.unvegetarian))
+ 			    Norep("You smell the odor of meat.");
+ 			else
+ 			    Norep("You smell a delicious smell.");
+ 			break;
+ 		    case WEAPON_CLASS:	/* crysknife */
+ 		    	/* fall through */
+ 		    default:
+ 			res = 0;
+ 			break;
+ 		}
+ 		newsym(refresh_x, refresh_y);
+ 		break;
+ 	default:
+ 		impossible("What an interesting effect (%d)", otmp->otyp);
+ 		break;
+ 	}
+ 	return res;
+ }
+ 
+ /* returns nonzero if something was hit */
+ int
+ bhitpile(obj,fhito,tx,ty)
+     struct obj *obj;
+     int FDECL((*fhito), (OBJ_P,OBJ_P));
+     int tx, ty;
+ {
+     int hitanything = 0;
+     register struct obj *otmp, *next_obj;
+ 
+     if (obj->otyp == SPE_FORCE_BOLT || obj->otyp == WAN_STRIKING) {
+ 	struct trap *t = t_at(tx, ty);
+ 
+ 	/* We can't settle for the default calling sequence of
+ 	   bhito(otmp) -> break_statue(otmp) -> activate_statue_trap(ox,oy)
+ 	   because that last call might end up operating on our `next_obj'
+ 	   (below), rather than on the current object, if it happens to
+ 	   encounter a statue which mustn't become animated. */
+ 	if (t && t->ttyp == STATUE_TRAP &&
+ 	    activate_statue_trap(t, tx, ty, TRUE) && obj->otyp == WAN_STRIKING)
+ 	    makeknown(obj->otyp);
+     }
+ 
+     poly_zapped = -1;
+     for(otmp = level.objects[tx][ty]; otmp; otmp = next_obj) {
+ 	/* Fix for polymorph bug, Tim Wright */
+ 	next_obj = otmp->nexthere;
+ 	hitanything += (*fhito)(otmp, obj);
+     }
+     if(poly_zapped >= 0)
+ 	create_polymon(level.objects[tx][ty], poly_zapped);
+ 
+     return hitanything;
+ }
+ #endif /*OVLB*/
+ #ifdef OVL1
+ 
+ /*
+  * zappable - returns 1 if zap is available, 0 otherwise.
+  *	      it removes a charge from the wand if zappable.
+  * added by GAN 11/03/86
+  */
+ int
+ zappable(wand)
+ register struct obj *wand;
+ {
+ 	if(wand->spe < 0 || (wand->spe == 0 && rn2(121)))
+ 		return 0;
+ 	if(wand->spe == 0)
+ 		You("wrest one last charge from the worn-out wand.");
+ 	wand->spe--;
+ 	return 1;
+ }
+ 
+ /*
+  * zapnodir - zaps a NODIR wand/spell.
+  * added by GAN 11/03/86
+  */
+ void
+ zapnodir(obj)
+ register struct obj *obj;
+ {
+ 	boolean known = FALSE;
+ 
+ 	switch(obj->otyp) {
+ 		case WAN_LIGHT:
+ 		case SPE_LIGHT:
+ 			litroom(TRUE,obj);
+ 			if (!Blind) known = TRUE;
+ 			break;
+ 		case WAN_SECRET_DOOR_DETECTION:
+ 		case SPE_DETECT_UNSEEN:
+ 			if(!findit()) return;
+ 			if (!Blind) known = TRUE;
+ 			break;
+ 		case WAN_CREATE_MONSTER:
+ 			known = create_critters(rn2(23) ? 1 : rn1(7,2),
+ 					(struct permonst *)0);
+ 			break;
+ 		case WAN_CREATE_HORDE:
+ 			known = create_critters(rn1(7,6), (struct permonst *)0);
+ 			break;
+ 		case WAN_WISHING:
+ 			known = TRUE;
+ 			if(Luck + rn2(5) < 0) {
+ 				pline("Unfortunately, nothing happens.");
+ 				break;
+ 			}
+ 			makewish();
+ 			break;
+ 		case WAN_ENLIGHTENMENT:
+ 			known = TRUE;
+ 			You_feel("self-knowledgeable...");
+ 			display_nhwindow(WIN_MESSAGE, FALSE);
+ 			enlightenment(FALSE);
+ 			pline_The("feeling subsides.");
+ 			exercise(A_WIS, TRUE);
+ 			break;
+ 	}
+ 	if (known && !objects[obj->otyp].oc_name_known) {
+ 		makeknown(obj->otyp);
+ 		more_experienced(0,10);
+ 	}
+ }
+ #endif /*OVL1*/
+ #ifdef OVL0
+ 
+ STATIC_OVL void
+ backfire(otmp)
+ struct obj *otmp;
+ {
+ 	otmp->in_use = TRUE;	/* in case losehp() is fatal */
+ 	/* KMH, balance patch -- spells (not spellbooks) explode */
+ 	if (otmp->oclass != SPBOOK_CLASS)
+ 	pline("%s suddenly explodes!", The(xname(otmp)));
+ /*        losehp(d(otmp->spe+2,6), "exploding wand", KILLED_BY_AN);
+         useup(otmp);*/
+ 	wand_explode (otmp, FALSE);
+ }
+ 
+ static NEARDATA const char zap_syms[] = { WAND_CLASS, 0 };
+ 
+ int
+ dozap()
+ {
+ 	register struct obj *obj;
+ 	int	damage;
+ 
+ 	if(check_capacity((char *)0)) return(0);
+ 	obj = getobj(zap_syms, "zap");
+ 	if(!obj) return(0);
+ 
+ 	check_unpaid(obj);
+ 
+ 	/* zappable addition done by GAN 11/03/86 */
+ 	if(!zappable(obj)) pline(nothing_happens);
+ 	else if(obj->cursed && !rn2(5)) {
+ 		/* WAC made this rn2(5) from rn2(100)*/
+ 		backfire(obj);  /* the wand blows up in your face! */
+ 		exercise(A_STR, FALSE);
+ 		return(1);
+     /* WAC wands of lightning will also explode in your face*/
+     } else if ((obj->otyp == WAN_LIGHTNING || obj->otyp == SPE_LIGHTNING)
+                    && (Underwater) && (!obj->blessed))   {
+ 		backfire(obj);	/* the wand blows up in your face! */
+ 		exercise(A_STR, FALSE);
+ 		return(1);
+ 	} else if(!(objects[obj->otyp].oc_dir == NODIR) && !getdir((char *)0)) {
+ 		if (!Blind)
+ 		    pline("%s glows and fades.", The(xname(obj)));
+ 		/* make him pay for knowing !NODIR */
+ 	} else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].oc_dir == NODIR)) {
+ 	    if ((damage = zapyourself(obj, TRUE)) != 0) {
+ 		char buf[BUFSZ];
+ 		Sprintf(buf, "zapped %sself with a wand", uhim());
+ 		losehp(damage, buf, NO_KILLER_PREFIX);
+ 	    }
+ 	} else {
+ 
+ 		/*	Are we having fun yet?
+ 		 * weffects -> buzz(obj->otyp) -> zhitm (temple priest) ->
+ 		 * attack -> hitum -> known_hitum -> ghod_hitsu ->
+ 		 * buzz(AD_ELEC) -> destroy_item(WAND_CLASS) ->
+ 		 * useup -> obfree -> dealloc_obj -> free(obj)
+ 		 */
+ 		current_wand = obj;
+ 		weffects(obj);
+ 		obj = current_wand;
+ 		current_wand = 0;
+ 	}
+ 	if (obj && obj->spe < 0) {
+ 	    pline("%s to dust.", Tobjnam(obj, "turn"));
+ 	    useup(obj);
+ 	}
+ 	update_inventory();	/* maybe used a charge */
+ 	return(1);
+ }
+ 
+ 
+ /* WAC lightning strike effect. */
+ void
+ zap_strike_fx(x,y, type)
+ xchar x,y;
+ int type;
+ {
+         xchar row;
+         boolean otherrow = FALSE;
+ 
+         if (!cansee(x, y) || IS_STWALL(levl[x][y].typ))
+                 return;
+         /* Zapdir is always downward ;B */
+         tmp_at(DISP_BEAM_ALWAYS, zapdir_to_glyph(0, -1, abs(type) % 10));
+ 
+         for (row = 0; row <= y; row++){
+                 tmp_at(x,row);
+                 if (otherrow) delay_output();
+                 otherrow = (!otherrow);
+         }
+         delay_output();
+         tmp_at(DISP_END, 0);
+ }
+ 
+ 
+ STATIC_OVL void
+ throwstorm(obj, skilldmg, min, range)
+ register struct obj	*obj;
+ int min, range, skilldmg;
+ {
+ 	boolean didblast = FALSE;
+ 	int failcheck;
+ 	int sx, sy;
+ 	int type = ZT_SPELL(obj->otyp - SPE_MAGIC_MISSILE);
+ 	int expl_type;
+ 	int num = 2 + rn2(3);
+ 
+ 
+ 	if (tech_inuse(T_SIGIL_CONTROL)) {
+ 	    throwspell();
+ 	    sx = u.dx; sy = u.dy;
+ 	} else {
+ 	    sx = u.ux; sy = u.uy;
+ 	}
+ 
+ 
+ 	if (sx != u.ux || sy != u.uy) min = 0;
+ 	if (tech_inuse(T_SIGIL_DISCHARGE)) num *= 2;
+ 
+ /*WAC Based off code that used to be the wizard patch mega fireball */
+ 	if (u.uinwater) {
+ 	    pline("You joking! In this weather?");
+ 	    return; 
+ 	} else if (Is_waterlevel(&u.uz)) { 
+ 	    You("better wait for the sun to come out.");
+ 	    return;
+ 	}
+ 	switch (abs(type) % 10)
+ 	{
+ 	case ZT_MAGIC_MISSILE:
+ 	case ZT_DEATH:
+ 	    expl_type = EXPL_MAGICAL;
+ 	    break;
+ 	case ZT_FIRE:
+ 	case ZT_LIGHTNING:
+ 	    expl_type = EXPL_FIERY;
+ 	    break;
+ 	case ZT_COLD:
+ 	    expl_type = EXPL_FROSTY;
+ 	    break;
+ 	case ZT_SLEEP:
+ 	case ZT_POISON_GAS:
+ 	case ZT_ACID:
+ 	    expl_type = EXPL_NOXIOUS;
+ 	    break;
+ 	}
+ 	while(num--) {
+ 	    failcheck = 0;
+ 	    do {
+ 		confdir(); /* Random Dir */
+ 		u.dx *= (rn2(range) + min);
+ 		u.dx += sx;
+ 		u.dy *= (rn2(range) + min);
+ 		u.dy += sy;
+ 		failcheck++;
+ 	    } while (failcheck < 3 &&
+ 		    (!cansee(u.dx, u.dy) || IS_STWALL(levl[u.dx][u.dy].typ)));
+ 	    if (failcheck >= 3)
+ 		continue;
+ 	    if (abs(type) % 10 == ZT_LIGHTNING)
+ 		zap_strike_fx(u.dx,u.dy,type);
+ 	    explode(u.dx, u.dy, type, u.ulevel/4 + 1 + skilldmg, 0, expl_type);
+ 	    delay_output();
+ 	    didblast = TRUE;
+ 	}
+ 	if (!didblast) {
+ 	    explode(u.dx, u.dy, type, u.ulevel/2 + 1 + skilldmg, 0, expl_type);
+ 	    delay_output();
+ 	}
+ 	return;
+ }
+ 
+ int
+ zapyourself(obj, ordinary)
+ struct obj *obj;
+ boolean ordinary;
+ {
+ 	int	damage = 0;
+ 	char buf[BUFSZ];
+ 
+ 	switch(obj->otyp) {
+ 		case WAN_STRIKING:
+ 		    makeknown(WAN_STRIKING);
+ 		case SPE_FORCE_BOLT:
+ 		    if(Antimagic) {
+ 			shieldeff(u.ux, u.uy);
+ 			pline("Boing!");
+ 		    } else {
+ 			if (ordinary) {
+ 			    You("bash yourself!");
+ 			    damage = d(2,12);
+ 			} else
+ 			    damage = d(1 + obj->spe,6);
+ 			exercise(A_STR, FALSE);
+ 		    }
+ 		    break;
+ 
+ 		/*WAC Add Spell Acid, Poison*/
+ 		case SPE_POISON_BLAST:
+ 		    poisoned("blast", A_DEX, "poisoned blast", 15);
+ 		    break;
+ 		case SPE_ACID_STREAM:
+         	    /* KMH, balance patch -- new intrinsic */
+         	    if (Acid_resistance) {
+ 			damage = 0;
+         	    } else {
+ 			pline_The("acid burns!");
+ 			damage = d(12,6);
+ 			exercise(A_STR, FALSE);
+         	    }
+         	    if (!rn2(u.twoweap ? 3 : 6)) erode_obj(uwep, TRUE, TRUE);
+         	    if (u.twoweap && !rn2(3)) erode_obj(uswapwep, TRUE, TRUE);
+         	    if (!rn2(6)) erode_armor(&youmonst, TRUE);
+         	    break;
+ 		case WAN_LIGHTNING:
+ 		    makeknown(WAN_LIGHTNING);
+ 		/*WAC Added Spell Lightning*/
+ 		case SPE_LIGHTNING:
+ 		    if (!Shock_resistance) {
+ 			You("shock yourself!");
+ 			damage = d(12,6);
+ 			exercise(A_CON, FALSE);
+ 		    } else {
+ 			shieldeff(u.ux, u.uy);
+ 			You("zap yourself, but seem unharmed.");
+ 			ugolemeffects(AD_ELEC, d(12,6));
+ 		    }
+ 		    destroy_item(WAND_CLASS, AD_ELEC);
+ 		    destroy_item(RING_CLASS, AD_ELEC);
+ 		    if (!resists_blnd(&youmonst)) {
+ 			    You(are_blinded_by_the_flash);
+ 			    make_blinded((long)rnd(100),FALSE);
+ 			    if (!Blind) Your(vision_clears);
+ 		    }
+ 		    break;
+ 
+ 		case WAN_FIREBALL:
+ 		    makeknown(WAN_FIREBALL);
+ 		case SPE_FIREBALL:
+ 		    You("explode a fireball on top of yourself!");
+ 		    explode(u.ux, u.uy, 11, d(6,6), WAND_CLASS, EXPL_FIERY);
+ 		    break;
+ 
+ 		case WAN_FIRE:
+ 		    makeknown(WAN_FIRE);
+ 		case FIRE_HORN:
+ 		    if (Fire_resistance) {
+ 			shieldeff(u.ux, u.uy);
+ 			You_feel("rather warm.");
+ 			ugolemeffects(AD_FIRE, d(12,6));
+ 		    } else {
+ 			pline("You've set yourself afire!");
+ 			damage = d(12,6);
+ 		    }
+ 		    if (Slimed) {                    
+ 			pline("The slime is burned away!");
+ 			Slimed = 0;
+ 		    }
+ 		    burn_away_slime();
+ 		    (void) burnarmor(&youmonst);
+ 		    destroy_item(SCROLL_CLASS, AD_FIRE);
+ 		    destroy_item(POTION_CLASS, AD_FIRE);
+ 		    destroy_item(SPBOOK_CLASS, AD_FIRE);
+ 		    break;
+ 
+ 
+ 		case WAN_COLD:
+ 		    makeknown(WAN_COLD);
+ 		case SPE_CONE_OF_COLD:
+ 		case FROST_HORN:
+ 		    if (Cold_resistance) {
+ 			shieldeff(u.ux, u.uy);
+ 			You_feel("a little chill.");
+ 			ugolemeffects(AD_COLD, d(12,6));
+ 		    } else {
+ 			You("imitate a popsicle!");
+ 			damage = d(12,6);
+ 		    }
+ 		    destroy_item(POTION_CLASS, AD_COLD);
+ 
+ 		    break;
+ 
+ 		case WAN_MAGIC_MISSILE:
+ 		    makeknown(WAN_MAGIC_MISSILE);
+ 		case SPE_MAGIC_MISSILE:
+ 		    if(Antimagic) {
+ 			shieldeff(u.ux, u.uy);
+ 			pline_The("missiles bounce!");
+ 		    } else {
+ 			damage = d(4,6);
+ 			pline("Idiot!  You've shot yourself!");
+ 		    }
+ 		    break;
+ 		case WAN_POLYMORPH:
+ 		    if (!Unchanging)
+ 		    	makeknown(WAN_POLYMORPH);
+ 		case SPE_POLYMORPH:
+ 		    if (!Unchanging)
+ 		    	polyself(FALSE);
+ 		    break;
+ 		case WAN_CANCELLATION:
+ 		case SPE_CANCELLATION:
+ 		    (void) cancel_monst(&youmonst, obj, TRUE, FALSE, TRUE);
+ 		    break;
+ 		case WAN_DRAINING:	/* KMH */
+ 			makeknown(obj->otyp);
+ 		case SPE_DRAIN_LIFE:
+ 			if (!Drain_resistance) {
+ 				losexp("life drainage", FALSE);
+ 			} else {
+ 				shieldeff(u.ux, u.uy);
+ 				pline("Boing!");
+ 			}
+ 			damage = 0;	/* No additional damage */
+ 			break;
+ 		case WAN_MAKE_INVISIBLE: {
+ 		    /* have to test before changing HInvis but must change
+ 		     * HInvis before doing newsym().
+ 		     */
+ 		    int msg = !Invis && !Blind && !BInvis;
+ 
+ 		    if (BInvis && uarmc->otyp == MUMMY_WRAPPING) {
+ 			/* A mummy wrapping absorbs it and protects you */
+ 		        You_feel("rather itchy under your %s.", xname(uarmc));
+ 		        break;
+ 		    }
+ 		    if (ordinary || !rn2(10)) {	/* permanent */
+ 			HInvis |= FROMOUTSIDE;
+ 		    } else {			/* temporary */
+ 		    	incr_itimeout(&HInvis, d(obj->spe, 250));
+ 		    }
+ 		    if (msg) {
+ 			makeknown(WAN_MAKE_INVISIBLE);
+ 			newsym(u.ux, u.uy);
+ 			self_invis_message();
+ 		    }
+ 		    break;
+ 		}
+ 		case WAN_SPEED_MONSTER:
+ 		    if (!(HFast & INTRINSIC)) {
+ 			if (!Fast)
+ 			    You("speed up.");
+ 			else
+ 			    Your("quickness feels more natural.");
+ 			makeknown(WAN_SPEED_MONSTER);
+ 			exercise(A_DEX, TRUE);
+ 		    }
+ 		    /* KMH, balance patch -- Make it permanent, like NetHack */
+ 		    /* Note that this is _not_ very fast */
+ 		    HFast |= FROMOUTSIDE;
+ 		    break;
+ 		case WAN_HEALING:
+ 		   You("begin to feel better.");
+ 		   healup(d(5,6),0,0,0);
+ 		   exercise(A_STR, TRUE);
+ 		   makeknown(WAN_HEALING);
+ 		break;
+ 		case WAN_EXTRA_HEALING:
+ 		   You("feel much better.");
+ 		   healup(d(6,8),0,0,0);
+ 		   make_hallucinated(0L,TRUE,0L);
+ 		   exercise(A_STR, TRUE);
+ 		   exercise(A_CON, TRUE);
+ 		   makeknown(WAN_EXTRA_HEALING);
+ 		break;
+ 
+ 		case WAN_FEAR:
+ 			You("suddenly panic!");
+ 			if(!HConfusion)
+ 				make_confused(HConfusion + rnd(10),FALSE);
+ 			break;
+ 
+ 		case WAN_SLEEP:
+ 		    makeknown(WAN_SLEEP);
+ 		case SPE_SLEEP:
+ 		    if(Sleep_resistance) {
+ 			shieldeff(u.ux, u.uy);
+ 			You("don't feel sleepy!");
+ 		    } else {
+ 			pline_The("sleep ray hits you!");
+ 			fall_asleep(-rnd(50), TRUE);
+ 		    }
+ 		    break;
+ 
+ 		case WAN_SLOW_MONSTER:
+ 		case SPE_SLOW_MONSTER:
+ 		    if(HFast & (TIMEOUT | INTRINSIC)) {
+ 			u_slow_down();
+ 			makeknown(obj->otyp);
+ 		    }
+ 		    break;
+ 		case WAN_TELEPORTATION:
+ 		case SPE_TELEPORT_AWAY:
+ 		    tele();
+ 			makeknown(obj->otyp);
+ 		    break;
+ 		case WAN_DEATH:
+ 		case SPE_FINGER_OF_DEATH:
+ 		    if (nonliving(youmonst.data) || is_demon(youmonst.data)) {
+ 			pline((obj->otyp == WAN_DEATH) ?
+ 			  "The wand shoots an apparently harmless beam at you."
+ 			  : "You seem no deader than before.");
+ 			break;
+ 		    }
+ 		    if (Invulnerable) {
+ 			pline("You are unharmed!");
+ 			break;
+ 		    }
+ 		    killer_format = NO_KILLER_PREFIX;
+ 		    Sprintf(buf, "shot %sself with a death ray", uhim());
+ 		    killer = buf;
+ 		    You("irradiate yourself with pure energy!");
+ 		    You("die.");
+ 		    makeknown(obj->otyp);
+ 			/* They might survive with an amulet of life saving */
+ 		    done(DIED);
+ 		    break;
+ 
+ 		case WAN_UNDEAD_TURNING:
+ 		    makeknown(WAN_UNDEAD_TURNING);
+ 		case SPE_TURN_UNDEAD:
+ 		    (void) unturn_dead(&youmonst);
+ 		    if (is_undead(youmonst.data)) {
+ 			You_feel("frightened and %sstunned.",
+ 			     Stunned ? "even more " : "");
+ 			make_stunned(HStun + rnd(30), FALSE);
+ 		    } else
+ 			You("shudder in dread.");
+ 		    break;
+ 
+ 		case SPE_HEALING:
+ 		case SPE_EXTRA_HEALING:
+ 		    healup(obj->otyp == SPE_HEALING ? rnd(10) + 4 : d(3,8)+6,
+ 			   0, FALSE, FALSE);
+ 		    You_feel("%sbetter.",
+ 			obj->otyp == SPE_EXTRA_HEALING ? "much " : "");
+ 		    break;
+ 
+ 		case WAN_LIGHT:	/* (broken wand) */
+ 		 /* assert( !ordinary ); */
+ 		    damage = d(obj->spe, 25);
+ #ifdef TOURIST
+ 		case EXPENSIVE_CAMERA:
+ #endif
+ 		    damage += rnd(25);
+ 		    if (!resists_blnd(&youmonst)) {
+ 			You(are_blinded_by_the_flash);
+ 			make_blinded((long)damage, FALSE);
+ 			makeknown(obj->otyp);
+ 			if (!Blind) Your(vision_clears);
+ 		    }
+ 		    damage = 0;	/* reset */
+ 		    break;
+ 
+ 		case WAN_OPENING:
+ 		    if (Punished) makeknown(WAN_OPENING);
+ 		case SPE_KNOCK:
+ 		    if (Punished) Your("chain quivers for a moment.");
+ 		    break;
+ 		case WAN_DIGGING:
+ 		case SPE_DIG:
+ 		case SPE_DETECT_UNSEEN:
+ 		case WAN_NOTHING:
+ 		case WAN_LOCKING:
+ 		case SPE_WIZARD_LOCK:
+ 		    break;
+ 		case WAN_PROBING:
+ 		    for (obj = invent; obj; obj = obj->nobj)
+ 			obj->dknown = 1;
+ 		    /* note: `obj' reused; doesn't point at wand anymore */
+ 		    makeknown(WAN_PROBING);
+ 		    ustatusline();
+ 		    break;
+ 		case SPE_STONE_TO_FLESH:
+ 		    {
+ 		    struct obj *otemp, *onext;
+ 		    boolean didmerge;
+ 
+ 		    if (u.umonnum == PM_STONE_GOLEM)
+ 			(void) polymon(PM_FLESH_GOLEM);
+ 		    if (Stoned) fix_petrification();	/* saved! */
+ 		    /* but at a cost.. */
+ 		    for (otemp = invent; otemp; otemp = onext) {
+ 			onext = otemp->nobj;
+ 			(void) bhito(otemp, obj);
+ 			}
+ 		    /*
+ 		     * It is possible that we can now merge some inventory.
+ 		     * Do a higly paranoid merge.  Restart from the beginning
+ 		     * until no merges.
+ 		     */
+ 		    do {
+ 			didmerge = FALSE;
+ 			for (otemp = invent; !didmerge && otemp; otemp = otemp->nobj)
+ 			    for (onext = otemp->nobj; onext; onext = onext->nobj)
+ 			    	if (merged(&otemp, &onext)) {
+ 			    		didmerge = TRUE;
+ 			    		break;
+ 			    		}
+ 		    } while (didmerge);
+ 		    }
+ 		    break;
+ 		default: impossible("object %d used?",obj->otyp);
+ 		    break;
+ 	}
+ 	return(damage);
+ }
+ 
+ #ifdef STEED
+ /* you've zapped a wand downwards while riding
+  * Return TRUE if the steed was hit by the wand.
+  * Return FALSE if the steed was not hit by the wand.
+  */
+ STATIC_OVL boolean
+ zap_steed(obj)
+ struct obj *obj;	/* wand or spell */
+ {
+ 	int steedhit = FALSE;
+ 	
+ 	switch (obj->otyp) {
+ 
+ 	   /*
+ 	    * Wands that are allowed to hit the steed
+ 	    * Carefully test the results of any that are
+ 	    * moved here from the bottom section.
+ 	    */
+ 		case WAN_PROBING:
+ 		    probe_monster(u.usteed);
+ 		    makeknown(WAN_PROBING);
+ 		    steedhit = TRUE;
+ 		    break;
+ 		case WAN_TELEPORTATION:
+ 		case SPE_TELEPORT_AWAY:
+ 		    /* you go together */
+ 		    tele();
+ 		    if(Teleport_control || !couldsee(u.ux0, u.uy0) ||
+ 			(distu(u.ux0, u.uy0) >= 16))
+ 				makeknown(obj->otyp);
+ 		    steedhit = TRUE;
+ 		    break;
+ 
+ 		/* Default processing via bhitm() for these */
+ 		case SPE_CURE_SICKNESS:
+ 		case WAN_MAKE_INVISIBLE:
+ 		case WAN_CANCELLATION:
+ 		case SPE_CANCELLATION:
+ 		case WAN_POLYMORPH:
+ 		case SPE_POLYMORPH:
+ 		case WAN_STRIKING:
+ 		case SPE_FORCE_BOLT:
+ 		case WAN_SLOW_MONSTER:
+ 		case SPE_SLOW_MONSTER:
+ 		case WAN_SPEED_MONSTER:
+ 		case SPE_HEALING:
+ 		case SPE_EXTRA_HEALING:
+ 		case WAN_HEALING:
+ 		case WAN_EXTRA_HEALING:
+ 		case WAN_DRAINING:
+ 		case SPE_DRAIN_LIFE:
+ 		case WAN_OPENING:
+ 		case SPE_KNOCK:
+ 		    (void) bhitm(u.usteed, obj);
+ 		    steedhit = TRUE;
+ 		    break;
+ 
+ 		default:
+ 		    steedhit = FALSE;
+ 		    break;
+ 	}
+ 	return steedhit;
+ }
+ #endif
+ 
+ 
+ #endif /*OVL0*/
+ #ifdef OVL3
+ 
+ /*
+  * cancel a monster (possibly the hero).  inventory is cancelled only
+  * if the monster is zapping itself directly, since otherwise the
+  * effect is too strong.  currently non-hero monsters do not zap
+  * themselves with cancellation.
+  */
+ boolean
+ cancel_monst(mdef, obj, youattack, allow_cancel_kill, self_cancel)
+ register struct monst	*mdef;
+ register struct obj	*obj;
+ boolean			youattack, allow_cancel_kill, self_cancel;
+ {
+ 	boolean	youdefend = (mdef == &youmonst);
+ 	static const char writing_vanishes[] =
+ 				"Some writing vanishes from %s head!";
+ 	static const char your[] = "your";	/* should be extern */
+ 
+ 	if (youdefend) 
+ 	    You(!Hallucination? "are covered in sparkling lights!"
+ 			      : "are enveloped by psychedelic fireworks!");
+ 
+ 	if (youdefend ? (!youattack && Antimagic)
+ 		      : resist(mdef, obj->oclass, 0, NOTELL))
+ 		return FALSE;	/* resisted cancellation */
+ 
+ 	/* 1st cancel inventory */
+ 	/* Lethe allows monsters to zap you with /oCanc, which has a small
+ 	 * chance of affecting hero's inventory; for parity, /oCanc zapped by
+ 	 * the hero also have a small chance of affecting the monster's
+ 	 * inventory
+ 	 */
+ 	if (!(youdefend? Antimagic : resists_magm(mdef)) || !rn2(6)) {
+ 	    struct obj *otmp;
+ 	    boolean did_cancel = FALSE;
+ 
+ 	    for (otmp = (youdefend ? invent : mdef->minvent);
+ 			    otmp; otmp = otmp->nobj)
+ 		if (self_cancel || !rn2(24)) {
+ 		    cancel_item(otmp);
+ 		    did_cancel = TRUE;
+ 		}
+ 	    if (youdefend && did_cancel) {
+ 		flags.botl = 1;	/* potential AC change */
+ 		find_ac();
+ 	    }
+ 	    /* Indicate to the hero that something happened */
+ 	    if (did_cancel && !self_cancel && youdefend)
+ 		You_feel("a strange sense of loss.");
+ 	}
+ 
+ 	/* now handle special cases */
+ 	if (youdefend) {
+ 	    if (Upolyd) {
+ 		if ((u.umonnum == PM_CLAY_GOLEM) && !Blind)
+ 		    pline(writing_vanishes, your);
+ 		if (Unchanging)
+ 		    Your("amulet grows hot for a moment, then cools.");
+ 		else {
+ 		    u.uhp -= mons[u.umonnum].mlevel;
+ 		    u.uhpmax -= mons[u.umonnum].mlevel;
+ 		    if (u.uhpmax < 1) u.uhpmax = 1;
+ 		    u.mh = 0;
+ 		    rehumanize();
+ 		}
+ 	    }
+ 	} else {
+ 	    mdef->mcan = TRUE;
+ 
+ 	    if (is_were(mdef->data) && mdef->data->mlet != S_HUMAN)
+ 		were_change(mdef);
+ 
+ 	    if (mdef->data == &mons[PM_CLAY_GOLEM]) {
+ 		if (canseemon(mdef))
+ 		    pline(writing_vanishes, s_suffix(mon_nam(mdef)));
+ 
+ 		if (allow_cancel_kill) {
+ 		    if (youattack)
+ 			killed(mdef);
+ 		    else
+ 			monkilled(mdef, "", AD_SPEL);
+ 		}
+ 	    }
+ 	}
+ 	return TRUE;
+ }
+ 
+ /* you've zapped an immediate type wand up or down */
+ STATIC_OVL boolean
+ zap_updown(obj)
+ struct obj *obj;	/* wand or spell */
+ {
+ 	boolean striking = FALSE, disclose = FALSE;
+ 	int x, y, xx, yy, ptmp;
+ 	struct obj *otmp;
+ 	struct engr *e;
+ 	struct trap *ttmp;
+ 	char buf[BUFSZ];
+ 
+ 	/* some wands have special effects other than normal bhitpile */
+ 	/* drawbridge might change <u.ux,u.uy> */
+ 	x = xx = u.ux;	/* <x,y> is zap location */
+ 	y = yy = u.uy;	/* <xx,yy> is drawbridge (portcullis) position */
+ 	ttmp = t_at(x, y); /* trap if there is one */
+ 
+ 	switch (obj->otyp) {
+ 	case WAN_PROBING:
+ 	    ptmp = 0;
+ 	    if (u.dz < 0) {
+ 		You("probe towards the %s.", ceiling(x,y));
+ 	    } else {
+ 		ptmp += bhitpile(obj, bhito, x, y);
+ 		You("probe beneath the %s.", surface(x,y));
+ 		ptmp += display_binventory(x, y, TRUE);
+ 	    }
+ 	    if (!ptmp) Your("probe reveals nothing.");
+ 	    return TRUE;	/* we've done our own bhitpile */
+ 	case WAN_OPENING:
+ 	case SPE_KNOCK:
+ 	    /* up or down, but at closed portcullis only */
+ 	    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) &&
+ 			/* 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()) {
+ 		pline_The("stairs seem to ripple momentarily.");
+ 		disclose = TRUE;
+ 	    }
+ 	    break;
+ 	case WAN_STRIKING:
+ 	case SPE_FORCE_BOLT:
+ 	    striking = TRUE;
+ 	    /*FALLTHRU*/
+ 	case WAN_LOCKING:
+ 	case SPE_WIZARD_LOCK:
+ 	    /* down at open bridge or up or down at open portcullis */
+ 	    if ((levl[x][y].typ == DRAWBRIDGE_DOWN) ? (u.dz > 0) :
+ 			(is_drawbridge_wall(x,y) && !is_db_wall(x,y)) &&
+ 		    find_drawbridge(&xx, &yy)) {
+ 		if (!striking)
+ 		    close_drawbridge(xx, yy);
+ 		else
+ 		    destroy_drawbridge(xx, yy);
+ 		disclose = TRUE;
+ 	    } else if (striking && u.dz < 0 && rn2(3) &&
+ 			!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) &&
+ 			!Underwater && !Is_qstart(&u.uz)) {
+ 		/* similar to zap_dig() */
+ 		pline("A rock is dislodged from the %s and falls on your %s.",
+ 		      ceiling(x, y), body_part(HEAD));
+ 		losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6),
+ 		       "falling rock", KILLED_BY_AN);
+ 		if ((otmp = mksobj_at(ROCK, x, y, FALSE, FALSE)) != 0) {
+ 		    (void)xname(otmp);	/* set dknown, maybe bknown */
+ 		    stackobj(otmp);
+ 		}
+ 		newsym(x, y);
+ 	    } else if (!striking && ttmp && ttmp->ttyp == TRAPDOOR && u.dz > 0) {
+ 		if (!Blind) {
+ 			if (ttmp->tseen) {
+ 				pline("A trap door beneath you closes up then vanishes.");
+ 				disclose = TRUE;
+ 			} else {
+ 				You("see a swirl of %s beneath you.",
+ 					is_ice(x,y) ? "frost" : "dust");
+ 			}
+ 		} else {
+ 			You_hear("a twang followed by a thud.");
+ 		}
+ 		deltrap(ttmp);
+ 		ttmp = (struct trap *)0;
+ 		newsym(x, y);
+ 	    }
+ 	    break;
+ 	case SPE_STONE_TO_FLESH:
+ 	    if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) ||
+ 		     Underwater || (Is_qstart(&u.uz) && u.dz < 0)) {
+ 		pline(nothing_happens);
+ 	    } else if (u.dz < 0) {	/* we should do more... */
+ 		pline("Blood drips on your %s.", body_part(FACE));
+ 	    } else if (u.dz > 0 && !OBJ_AT(u.ux, u.uy)) {
+ 		/*
+ 		Print this message only if there wasn't an engraving
+ 		affected here.  If water or ice, act like waterlevel case.
+ 		*/
+ 		e = engr_at(u.ux, u.uy);
+ 		if (!(e && e->engr_type == ENGRAVE)) {
+ 		    if (is_pool(u.ux, u.uy) || is_ice(u.ux, u.uy))
+ 			pline(nothing_happens);
+ 		    else
+ 			pline("Blood %ss %s your %s.",
+ 			      is_lava(u.ux, u.uy) ? "boil" : "pool",
+ 			      Levitation ? "beneath" : "at",
+ 			      makeplural(body_part(FOOT)));
+ 		}
+ 	    }
+ 	    break;
+ 	default:
+ 	    break;
+ 	}
+ 
+ 	if (u.dz > 0) {
+ 	    /* zapping downward */
+ 	    (void) bhitpile(obj, bhito, x, y);
+ 
+ 	    /* subset of engraving effects; none sets `disclose' */
+ 	    if ((e = engr_at(x, y)) != 0 && e->engr_type != HEADSTONE) {
+ 		switch (obj->otyp) {
+ 		case WAN_POLYMORPH:
+ 		case SPE_POLYMORPH:
+ 		    del_engr(e);
+ 		    make_engr_at(x, y, random_engraving(buf), moves, (xchar)0);
+ 		    break;
+ 		case WAN_CANCELLATION:
+ 		case SPE_CANCELLATION:
+ 		case WAN_MAKE_INVISIBLE:
+ 		    del_engr(e);
+ 		    break;
+ 		case WAN_TELEPORTATION:
+ 		case SPE_TELEPORT_AWAY:
+ 		    rloc_engr(e);
+ 		    break;
+ 		case SPE_STONE_TO_FLESH:
+ 		    if (e->engr_type == ENGRAVE) {
+ 			/* only affects things in stone */
+ 			pline_The(Hallucination ?
+ 			    "floor runs like butter!" :
+ 			    "edges on the floor get smoother.");
+ 			wipe_engr_at(x, y, d(2,4));
+ 			}
+ 		    break;
+ 		case WAN_STRIKING:
+ 		case SPE_FORCE_BOLT:
+ 		    wipe_engr_at(x, y, d(2,4));
+ 		    break;
+ 		default:
+ 		    break;
+ 		}
+ 	    }
+ 	}
+ 
+ 	return disclose;
+ }
+ 
+ #endif /*OVL3*/
+ #ifdef OVLB
+ 
+ /* called for various wand and spell effects - M. Stephenson */
+ void
+ weffects(obj)
+ struct obj *obj;
+ {
+ 	int otyp = obj->otyp;
+ 	boolean disclose = FALSE, was_unkn = !objects[otyp].oc_name_known;
+ 	int skilldmg = 0; /*WAC - Skills damage bonus*/
+ 
+ 	if (otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_ACID_STREAM)
+ 		skilldmg = spell_damage_bonus(obj->otyp);
+ 
+ 
+ 	exercise(A_WIS, TRUE);
+ #ifdef STEED
+ 	if (u.usteed && (objects[otyp].oc_dir != NODIR) &&
+ 	    !u.dx && !u.dy && (u.dz > 0) && zap_steed(obj)) {
+ 		disclose = TRUE;
+ 	} else
+ #endif
+ 	if (objects[otyp].oc_dir == IMMEDIATE) {
+ 	    obj_zapped = FALSE;
+ 
+ 	    if (u.uswallow) {
+ 		(void) bhitm(u.ustuck, obj);
+ 		/* [how about `bhitpile(u.ustuck->minvent)' effect?] */
+ 	    } else if (u.dz) {
+ 		disclose = zap_updown(obj);
+ 	    } else {
+ 		(void) bhit(u.dx,u.dy, rn1(8,6), ZAPPED_WAND,
+ 			    bhitm, bhito, &obj);
+ 	    }
+ 	    /* give a clue if obj_zapped */
+ 	    if (obj_zapped)
+ 		You_feel("shuddering vibrations.");
+ 
+ 	} else if (objects[otyp].oc_dir == NODIR) {
+ 	    zapnodir(obj);
+ 
+ 	} else {
+ 	    /* neither immediate nor directionless */
+ 	    if (otyp == WAN_DIGGING || otyp == SPE_DIG)
+ 		zap_dig();
+ /*		else if (otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_FINGER_OF_DEATH)*/
+ 		else if (otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_ACID_STREAM)
+ 			/* WAC --
+ 			 * Include effect for Mega Large Fireball/Cones of Cold.
+ 			 * Include effect for Lightning cast.
+ 			 * Include Yell...atmospheric.
+ 			 * Added slight delay before fireworks. */
+ 
+ 			if (((otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_CONE_OF_COLD)
+ 		            || (otyp >= SPE_LIGHTNING && otyp <= SPE_ACID_STREAM))
+ 		            && (tech_inuse(T_SIGIL_TEMPEST))) {
+ 				/* sigil of tempest */                     
+ 				throwstorm(obj, skilldmg, 2 , 2);
+ 			} else if (((otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_CONE_OF_COLD)
+ 		            || (otyp >= SPE_LIGHTNING && otyp <= SPE_ACID_STREAM))
+ 					/*WAC - use sigil of discharge */
+ 		            && (tech_inuse(T_SIGIL_DISCHARGE))) {
+ 				You("yell \"%s\"",yell_types[otyp - SPE_MAGIC_MISSILE]);
+ 				display_nhwindow(WIN_MESSAGE, TRUE);    /* --More-- */
+ 				buzz(ZT_MEGA(otyp - SPE_MAGIC_MISSILE),
+ 						u.ulevel/2 + 1 + skilldmg,
+ 						u.ux, u.uy, u.dx, u.dy);
+ 			} else buzz(ZT_SPELL(otyp - SPE_MAGIC_MISSILE),
+ 					u.ulevel / 2 + 1 + skilldmg,
+ 		     u.ux, u.uy, u.dx, u.dy);
+ 
+ 	    else if (otyp >= WAN_MAGIC_MISSILE && otyp <= WAN_FIREBALL)
+         {
+ 		buzz(otyp - WAN_MAGIC_MISSILE,
+ 		     (otyp == WAN_MAGIC_MISSILE) ? 2 : 6,
+ 		     u.ux, u.uy, u.dx, u.dy);
+         }
+ 
+ 	    else
+ 		impossible("weffects: unexpected spell or wand");
+ 	    disclose = TRUE;
+ 	}
+ 	if (disclose && was_unkn) {
+ 	    makeknown(otyp);
+ 	    more_experienced(0,10);
+ 	}
+ 	return;
+ }
+ #endif /*OVLB*/
+ #ifdef OVL0
+ 
+ /*
+  * LSZ/WWA The Wizard Patch July '96 -
+  * Generate the to damage bonus for a spell. Based on the hero's intelligence
+  */
+ /*  WAC now also depends on skill level.  Returns -2 to 5 */
+ int
+ spell_damage_bonus(booktype)
+ register int booktype;
+ {
+ 	register int intell = ACURR(A_INT);
+ 	int tmp;
+ 
+ 
+ 	if (intell < 10) tmp = -1;      /* Punish low intell. before level else low */
+ 	else if (u.ulevel < 5) tmp = 0; /* intell. gets punished only when high level*/
+ 	else if (intell < 14)  tmp = 1;
+ 	else if (intell <= 18) tmp = 2;            
+ 	else tmp = 3;                   /* Hero may have helm of brilliance on */
+ 
+ 	switch (P_SKILL(spell_skilltype(booktype))) {
+ 		case P_ISRESTRICTED:
+ 		case P_UNSKILLED:   tmp -= 1; break;
+ 		case P_BASIC:       break;
+ 		case P_SKILLED:     tmp +=  1; break;
+ 		case P_EXPERT:      tmp +=  2; break;
+ 	}
+ 
+     return tmp;
+ }
+ 
+ /*
+  * Generate the to hit bonus for a spell.  Based on the hero's skill in
+  * spell class and dexterity.
+  */
+ STATIC_OVL int
+ spell_hit_bonus(skill)
+ int skill;
+ {
+     int hit_bon = 0;
+     int dex = ACURR(A_DEX);
+ 
+     switch (P_SKILL(spell_skilltype(skill))) {
+ 	case P_ISRESTRICTED:
+ 	case P_UNSKILLED:   hit_bon = -4; break;
+ 	case P_BASIC:       hit_bon =  0; break;
+ 	case P_SKILLED:     hit_bon =  2; break;
+ 	case P_EXPERT:      hit_bon =  3; break;
+     }
+ 
+     if (dex < 4)
+ 	hit_bon -= 3;
+     else if (dex < 6)
+ 	hit_bon -= 2;
+     else if (dex < 8)
+ 	hit_bon -= 1;
+     else if (dex < 14)
+ 	hit_bon -= 0;		/* Will change when print stuff below removed */
+     else
+ 	hit_bon += dex - 14; /* Even increment for dextrous heroes (see weapon.c abon) */
+ 
+     return hit_bon;
+ }
+ 
+ const char *
+ exclam(force)
+ register int force;
+ {
+ 	/* force == 0 occurs e.g. with sleep ray */
+ 	/* note that large force is usual with wands so that !! would
+ 		require information about hand/weapon/wand */
+ 	return (const char *)((force < 0) ? "?" : (force <= 4) ? "." : "!");
+ }
+ 
+ void
+ hit(str,mtmp,force)
+ register const char *str;
+ register struct monst *mtmp;
+ register const char *force;		/* usually either "." or "!" */
+ {
+ 	if((!cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp) &&
+ 	     !(u.uswallow && mtmp == u.ustuck))
+ 	   || !flags.verbose)
+ 	    pline("%s %s it.", The(str), vtense(str, "hit"));
+ 	else pline("%s %s %s%s", The(str), vtense(str, "hit"),
+ 		   mon_nam(mtmp), force);
+ }
+ 
+ void
+ miss(str,mtmp)
+ register const char *str;
+ register struct monst *mtmp;
+ {
+ 	pline("%s %s %s.", The(str), vtense(str, "miss"),
+ 	      ((cansee(bhitpos.x,bhitpos.y) || canspotmon(mtmp))
+ 	       && flags.verbose) ?
+ 	      mon_nam(mtmp) : "it");
+ }
+ #endif /*OVL0*/
+ #ifdef OVL1
+ 
+ /*
+  *  Called for the following distance effects:
+  *	when a weapon is thrown (weapon == THROWN_WEAPON)
+  *	when an object is kicked (KICKED_WEAPON)
+  *	when an IMMEDIATE wand is zapped (ZAPPED_WAND)
+  *	when a light beam is flashed (FLASHED_LIGHT)
+  *	when a mirror is applied (INVIS_BEAM)
+  *  A thrown/kicked object falls down at the end of its range or when a monster
+  *  is hit.  The variable 'bhitpos' is set to the final position of the weapon
+  *  thrown/zapped.  The ray of a wand may affect (by calling a provided
+  *  function) several objects and monsters on its path.  The return value
+  *  is the monster hit (weapon != ZAPPED_WAND), or a null monster pointer.
+  *  Thrown and kicked objects (THROWN_WEAPON or KICKED_WEAPON) may be
+  *  destroyed and *obj_p set to NULL to indicate this.
+  *
+  *  Check !u.uswallow before calling bhit().
+  *  This function reveals the absence of a remembered invisible monster in
+  *  necessary cases (throwing or kicking weapons).  The presence of a real
+  *  one is revealed for a weapon, but if not a weapon is left up to fhitm().
+  */
+ struct monst *
+ bhit(ddx,ddy,range,weapon,fhitm,fhito,obj_p)
+ register int ddx,ddy,range;		/* direction and range */
+ int weapon;				/* see values in hack.h */
+ int FDECL((*fhitm), (MONST_P, OBJ_P)),	/* fns called when mon/obj hit */
+     FDECL((*fhito), (OBJ_P, OBJ_P));
+ struct obj **obj_p;			/* object tossed/used */
+ {
+ 	struct monst *mtmp;
+ 	struct obj *obj = *obj_p;
+ 	uchar typ;
+ 	boolean shopdoor = FALSE, point_blank = TRUE;
+ #ifdef LIGHT_SRC_SPELL
+         int lits = 0;
+         boolean use_lights = FALSE;
+ #endif
+ 
+ 	if (weapon == KICKED_WEAPON) {
+ 	    /* object starts one square in front of player */
+ 	    bhitpos.x = u.ux + ddx;
+ 	    bhitpos.y = u.uy + ddy;
+ 	    range--;
+ 	} else {
+ 	    bhitpos.x = u.ux;
+ 	    bhitpos.y = u.uy;
+ 	}
+ 
+ 	if (weapon == FLASHED_LIGHT) {
+ #ifdef LIGHT_SRC_SPELL
+ 	    use_lights = TRUE;
+ #endif
+ 	    tmp_at(DISP_BEAM, cmap_to_glyph(S_flashbeam));
+ 	} else if (weapon != ZAPPED_WAND && weapon != INVIS_BEAM) {
+ #ifdef LIGHT_SRC_SPELL
+ 	    use_lights = obj->lamplit;
+ #endif
+ 	    tmp_at(DISP_FLASH, obj_to_glyph(obj));
+ 	}
+ 
+ 	while(range-- > 0) {
+ 	    int x,y;
+ 
+ 	    bhitpos.x += ddx;
+ 	    bhitpos.y += ddy;
+ 	    x = bhitpos.x; y = bhitpos.y;
+ 
+ 	    if(!isok(x, y)) {
+ 		bhitpos.x -= ddx;
+ 		bhitpos.y -= ddy;
+ 		break;
+ 	    }
+ 
+ 	    if(is_pick(obj) && inside_shop(x, y) &&
+ 					   (mtmp = shkcatch(obj, x, y))) {
+ 		tmp_at(DISP_END, 0);
+ 		return(mtmp);
+ 	    }
+ 
+ 	    typ = levl[bhitpos.x][bhitpos.y].typ;
+ 
+ 	    /* iron bars will block anything big enough */
+ 	    if ((weapon == THROWN_WEAPON || weapon == KICKED_WEAPON) &&
+ 		    typ == IRONBARS &&
+ 		    hits_bars(obj_p, x - ddx, y - ddy,
+ 			      point_blank ? 0 : !rn2(5), 1)) {
+ 		/* caveat: obj might now be null... */
+ 		obj = *obj_p;
+ 		bhitpos.x -= ddx;
+ 		bhitpos.y -= ddy;
+ 		break;
+ 	    }
+ 
+ 	    if (weapon == ZAPPED_WAND && find_drawbridge(&x,&y))
+ 		switch (obj->otyp) {
+ 		    case WAN_OPENING:
+ 		    case SPE_KNOCK:
+ 			if (is_db_wall(bhitpos.x, bhitpos.y)) {
+ 			    if (cansee(x,y) || cansee(bhitpos.x,bhitpos.y))
+ 				makeknown(obj->otyp);
+ 			    open_drawbridge(x,y);
+ 			}
+ 			break;
+ 		    case WAN_LOCKING:
+ 		    case SPE_WIZARD_LOCK:
+ 			if ((cansee(x,y) || cansee(bhitpos.x, bhitpos.y))
+ 			    && levl[x][y].typ == DRAWBRIDGE_DOWN)
+ 			    makeknown(obj->otyp);
+ 			close_drawbridge(x,y);
+ 			break;
+ 		    case WAN_STRIKING:
+ 		    case SPE_FORCE_BOLT:
+ 			if (typ != DRAWBRIDGE_UP)
+ 			    destroy_drawbridge(x,y);
+ 			makeknown(obj->otyp);
+ 			break;
+ 		}
+ 
+ 	    if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) {
+ 		notonhead = (bhitpos.x != mtmp->mx ||
+ 			     bhitpos.y != mtmp->my);
+ 		if (weapon != FLASHED_LIGHT) {
+ 			if(weapon != ZAPPED_WAND) {
+ 			    if(weapon != INVIS_BEAM) {
+ 				tmp_at(DISP_END, 0);
+ #ifdef LIGHT_SRC_SPELL
+ 				if (use_lights) {
+ 				    while (lits) {
+ 					del_light_source(LS_TEMP,
+ 						(genericptr_t) lits);
+ 					lits--;
+ 				    }
+ 				    vision_full_recalc = 1;
+ 				    vision_recalc(0);	/* clean up vision */
+ 				}
+ #endif
+ 			    }
+ 			    if (cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp)) {
+ 				if (weapon != INVIS_BEAM) {
+ 				    map_invisible(bhitpos.x, bhitpos.y);
+ 				    return(mtmp);
+ 				}
+ 			    } else
+ 				return(mtmp);
+ 			}
+ 			if (weapon != INVIS_BEAM) {
+ 			    (*fhitm)(mtmp, obj);
+ 			    range -= 3;
+ 			}
+ 		} else {
+ 		    /* FLASHED_LIGHT hitting invisible monster
+ 		       should pass through instead of stop so
+ 		       we call flash_hits_mon() directly rather
+ 		       than returning mtmp back to caller. That
+ 		       allows the flash to keep on going. Note
+ 		       that we use mtmp->minvis not canspotmon()
+ 		       because it makes no difference whether
+ 		       the hero can see the monster or not.*/
+ 		    if (mtmp->minvis) {
+ 			obj->ox = u.ux,  obj->oy = u.uy;
+ 			(void) flash_hits_mon(mtmp, obj);
+ 		    } else {
+ 			tmp_at(DISP_END, 0);
+ 		    	return(mtmp); 	/* caller will call flash_hits_mon */
+ 		    }
+ 		}
+ 	    } else {
+ 		if (weapon == ZAPPED_WAND && obj->otyp == WAN_PROBING &&
+ 		   memory_is_invisible(bhitpos.x, bhitpos.y)) {
+ 		    unmap_object(bhitpos.x, bhitpos.y);
+ 		    newsym(x, y);
+ 		}
+ 	    }
+ 	    if(fhito) {
+ 		if(bhitpile(obj,fhito,bhitpos.x,bhitpos.y))
+ 		    range--;
+ 	    } else {
+ 		if(weapon == KICKED_WEAPON &&
+ 		      ((obj->oclass == COIN_CLASS &&
+ 			 OBJ_AT(bhitpos.x, bhitpos.y)) ||
+ 			    ship_object(obj, bhitpos.x, bhitpos.y,
+ 					costly_spot(bhitpos.x, bhitpos.y)))) {
+ 			tmp_at(DISP_END, 0);
+ 			return (struct monst *)0;
+ 		}
+ 	    }
+ 	    if(weapon == ZAPPED_WAND && (IS_DOOR(typ) || typ == SDOOR)) {
+ 		switch (obj->otyp) {
+ 		case WAN_OPENING:
+ 		case WAN_LOCKING:
+ 		case WAN_STRIKING:
+ 		case SPE_KNOCK:
+ 		case SPE_WIZARD_LOCK:
+ 		case SPE_FORCE_BOLT:
+ 		    if (doorlock(obj, bhitpos.x, bhitpos.y)) {
+ 			if (cansee(bhitpos.x, bhitpos.y) ||
+ 			    (obj->otyp == WAN_STRIKING))
+ 			    makeknown(obj->otyp);
+ 			if (levl[bhitpos.x][bhitpos.y].doormask == D_BROKEN
+ 			    && *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE)) {
+ 			    shopdoor = TRUE;
+ 			    add_damage(bhitpos.x, bhitpos.y, 400L);
+ 			}
+ 		    }
+ 		    break;
+ 		}
+ 	    }
+ 	    if(!ZAP_POS(typ) || closed_door(bhitpos.x, bhitpos.y)) {
+ 		bhitpos.x -= ddx;
+ 		bhitpos.y -= ddy;
+ 		break;
+ 	    }
+ 	    if(weapon != ZAPPED_WAND && weapon != INVIS_BEAM) {
+ 		/* 'I' present but no monster: erase */
+ 		/* do this before the tmp_at() */
+ 		if (memory_is_invisible(bhitpos.x, bhitpos.y)
+ 			&& cansee(x, y)) {
+ 		    unmap_object(bhitpos.x, bhitpos.y);
+ 		    newsym(x, y);
+ 		}
+ #ifdef LIGHT_SRC_SPELL
+ 		if (use_lights) {
+ 		    lits++;
+ 		    new_light_source(bhitpos.x, bhitpos.y, 1,
+ 				LS_TEMP, (genericptr_t) lits);
+ 		    vision_full_recalc = 1;
+ 		    vision_recalc(0);
+ 		}
+ #endif
+ 		tmp_at(bhitpos.x, bhitpos.y);
+ 		delay_output();
+ 		/* kicked objects fall in pools */
+ 		if((weapon == KICKED_WEAPON) &&
+ 		   (is_pool(bhitpos.x, bhitpos.y) ||
+ 		   is_lava(bhitpos.x, bhitpos.y)))
+ 		    break;
+ #ifdef SINKS
+ 		if(IS_SINK(typ) && weapon != FLASHED_LIGHT)
+ 		    break;	/* physical objects fall onto sink */
+ #endif
+ 	    }
+ 	    /* limit range of ball so hero won't make an invalid move */
+ 	    if (weapon == THROWN_WEAPON && range > 0 &&
+ 		obj->otyp == HEAVY_IRON_BALL) {
+ 		struct obj *bobj;
+ 		struct trap *t;
+ 		if ((bobj = sobj_at(BOULDER, x, y)) != 0) {
+ 		    if (cansee(x,y))
+ 			pline("%s hits %s.",
+ 			      The(distant_name(obj, xname)), an(xname(bobj)));
+ 		    range = 0;
+ 		} else if (obj == uball) {
+ 		    if (!test_move(x - ddx, y - ddy, ddx, ddy, TEST_MOVE)) {
+ 			/* nb: it didn't hit anything directly */
+ 			if (cansee(x,y))
+ 			    pline("%s jerks to an abrupt halt.",
+ 				  The(distant_name(obj, xname))); /* lame */
+ 			range = 0;
+ 		    } else if (In_sokoban(&u.uz) && (t = t_at(x, y)) != 0 &&
+ 			       (t->ttyp == PIT || t->ttyp == SPIKED_PIT ||
+ 				t->ttyp == HOLE || t->ttyp == TRAPDOOR)) {
+ 			/* hero falls into the trap, so ball stops */
+ 			range = 0;
+ 		    }
+ 		}
+ 	    }
+ 
+ 	    /* thrown/kicked missile has moved away from its starting spot */
+ 	    point_blank = FALSE;	/* affects passing through iron bars */
+ 	}
+ 
+         if (weapon != ZAPPED_WAND && weapon != INVIS_BEAM) {
+                 tmp_at(DISP_END, 0);
+ #ifdef LIGHT_SRC_SPELL
+                 while (lits) {
+                         del_light_source(LS_TEMP, (genericptr_t) lits);
+                         lits--;
+                 }
+                 vision_full_recalc = 1;
+                 vision_recalc(0); /*clean up vision*/
+ #endif
+         }
+ 
+ 	if(shopdoor)
+ 	    pay_for_damage("destroy", FALSE);
+ 
+ 	return (struct monst *)0;
+ }
+ 
+ struct monst *
+ boomhit(dx, dy)
+ int dx, dy;
+ {
+ 	register int i, ct;
+ 	int boom = S_boomleft;	/* showsym[] index  */
+ 	struct monst *mtmp;
+ 
+ 	bhitpos.x = u.ux;
+ 	bhitpos.y = u.uy;
+ 
+ 	for(i=0; i<8; i++) if(xdir[i] == dx && ydir[i] == dy) break;
+ 	tmp_at(DISP_FLASH, cmap_to_glyph(boom));
+ 	for(ct=0; ct<10; ct++) {
+ 		if(i == 8) i = 0;
+ 		boom = (boom == S_boomleft) ? S_boomright : S_boomleft;
+ 		tmp_at(DISP_CHANGE, cmap_to_glyph(boom));/* change glyph */
+ 		dx = xdir[i];
+ 		dy = ydir[i];
+ 		bhitpos.x += dx;
+ 		bhitpos.y += dy;
+ 		if(MON_AT(bhitpos.x, bhitpos.y)) {
+ 			mtmp = m_at(bhitpos.x,bhitpos.y);
+ 			m_respond(mtmp);
+ 			tmp_at(DISP_END, 0);
+ 			return(mtmp);
+ 		}
+ 		if(!ZAP_POS(levl[bhitpos.x][bhitpos.y].typ) ||
+ 		   closed_door(bhitpos.x, bhitpos.y)) {
+ 			bhitpos.x -= dx;
+ 			bhitpos.y -= dy;
+ 			break;
+ 		}
+ 		if(bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */
+ 			if(Fumbling || rn2(20) >= ACURR(A_DEX)) {
+ 				/* we hit ourselves */
+ 				(void) thitu(10, rnd(10), (struct obj *)0,
+ 					"boomerang");
+ 				break;
+ 			} else {	/* we catch it */
+ 				tmp_at(DISP_END, 0);
+ 				You("skillfully catch the boomerang.");
+ 				return(&youmonst);
+ 			}
+ 		}
+ 		tmp_at(bhitpos.x, bhitpos.y);
+ 		delay_output();
+ 		if(ct % 5 != 0) i++;
+ #ifdef SINKS
+ 		if(IS_SINK(levl[bhitpos.x][bhitpos.y].typ))
+ 			break;	/* boomerang falls on sink */
+ #endif
+ 	}
+ 	tmp_at(DISP_END, 0);	/* do not leave last symbol */
+ 	return (struct monst *)0;
+ }
+ 
+ STATIC_OVL int
+ zhitm(mon, type, nd, ootmp)			/* returns damage to mon */
+ register struct monst *mon;
+ register int type, nd;
+ struct obj **ootmp;	/* to return worn armor for caller to disintegrate */
+ {
+ 	register int tmp = 0;
+ 	register int abstype = abs(type) % 10;
+ 	boolean sho_shieldeff = FALSE;
+ 	boolean spellcaster = (is_hero_spell(type) || is_mega_spell(type)); 
+ 				/* maybe get a bonus! */
+     	int skilldmg = 0;
+ 
+ 	*ootmp = (struct obj *)0;
+ 	switch(abstype) {
+ 	case ZT_MAGIC_MISSILE:
+ 		if (resists_magm(mon)) {
+ 		    sho_shieldeff = TRUE;
+ 		    break;
+ 		}
+ 		tmp = d(nd,6);
+ 		if (spellcaster)
+ 		    skilldmg = spell_damage_bonus(SPE_MAGIC_MISSILE);
+ 		break;
+ 	case ZT_FIRE:
+ 		if (resists_fire(mon)) {
+ 		    sho_shieldeff = TRUE;
+ 		    break;
+ 		}
+ 		tmp = d(nd,6);
+ 		if (resists_cold(mon)) tmp += 7;
+ 		if (spellcaster)
+ 		    skilldmg = spell_damage_bonus(SPE_FIREBALL);
+ 		if (burnarmor(mon)) {
+ 		    if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_FIRE);
+ 		    if (!rn2(3)) (void)destroy_mitem(mon, SCROLL_CLASS, AD_FIRE);
+ 		    if (!rn2(5)) (void)destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE);
+ 		}
+ 		break;
+ 	case ZT_COLD:
+ 		if (resists_cold(mon)) {
+ 		    sho_shieldeff = TRUE;
+ 		    break;
+ 		}
+ 		tmp = d(nd,6);
+ 		if (resists_fire(mon)) tmp += d(nd, 3);
+ 		if (spellcaster)
+ 		    skilldmg = spell_damage_bonus(SPE_CONE_OF_COLD);
+ 		if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_COLD);
+ 		break;
+ 	case ZT_SLEEP:
+ 		tmp = 0;
+ 		(void)sleep_monst(mon, d(nd, 25),
+ 				type == ZT_WAND(ZT_SLEEP) ? WAND_CLASS : '\0');
+ 		break;
+ 	case ZT_DEATH:		/* death/disintegration */
+ 		if(abs(type) != ZT_BREATH(ZT_DEATH)) {	/* death */
+ 		    if(mon->data == &mons[PM_DEATH]) {
+ 			mon->mhpmax += mon->mhpmax/2;
+ 			if (mon->mhpmax >= MAGIC_COOKIE)
+ 			    mon->mhpmax = MAGIC_COOKIE - 1;
+ 			mon->mhp = mon->mhpmax;
+ 			break;
+ 		    }
+ 		    if (nonliving(mon->data) || is_demon(mon->data) ||
+ 			    resists_death(mon) ||
+ 			    resists_magm(mon)) {	/* similar to player */
+ 			sho_shieldeff = TRUE;
+ 			break;
+ 		    }
+ 		    type = -1; /* so they don't get saving throws */
+ 		} else {
+ 		    struct obj *otmp2;
+ 
+ 		    if (resists_disint(mon)) {
+ 			sho_shieldeff = TRUE;
+ 		    } else if (mon->misc_worn_check & W_ARMS) {
+ 			/* destroy shield; victim survives */
+ 			*ootmp = which_armor(mon, W_ARMS);
+ 		    } else if (mon->misc_worn_check & W_ARM) {
+ 			/* destroy body armor, also cloak if present */
+ 			*ootmp = which_armor(mon, W_ARM);
+ 			if ((otmp2 = which_armor(mon, W_ARMC)) != 0)
+ 			    m_useup(mon, otmp2);
+ 			break;
+ 		    } else {
+ 			/* no body armor, victim dies; destroy cloak
+ 			   and shirt now in case target gets life-saved */
+ 			tmp = MAGIC_COOKIE;
+ 			if ((otmp2 = which_armor(mon, W_ARMC)) != 0)
+ 			    m_useup(mon, otmp2);
+ #ifdef TOURIST
+ 			if ((otmp2 = which_armor(mon, W_ARMU)) != 0)
+ 			    m_useup(mon, otmp2);
+ #endif
+ 		    }
+ 		    type = -1;	/* no saving throw wanted */
+ 		    break;	/* not ordinary damage */
+ 		}
+ 		tmp = mon->mhp+1;
+ 		break;
+ 	case ZT_LIGHTNING:
+ 		if (resists_elec(mon)) {
+ 		    sho_shieldeff = TRUE;
+ 		    tmp = 0;
+ 		    /* can still blind the monster */
+ 		} else
+ 		    tmp = d(nd,6);
+ 		if (spellcaster)
+ 		    skilldmg = spell_damage_bonus(SPE_LIGHTNING);
+ 		if (!resists_blnd(mon) &&
+ 				!(type > 0 && u.uswallow && mon == u.ustuck)) {
+ 			register unsigned rnd_tmp = rnd(50);
+ 			mon->mcansee = 0;
+ 			if((mon->mblinded + rnd_tmp) > 127)
+ 				mon->mblinded = 127;
+ 			else mon->mblinded += rnd_tmp;
+ 		}
+ 		if (!rn2(3)) (void)destroy_mitem(mon, WAND_CLASS, AD_ELEC);
+ 		/* not actually possible yet */
+ 		if (!rn2(3)) (void)destroy_mitem(mon, RING_CLASS, AD_ELEC);
+ 		break;
+ 	case ZT_POISON_GAS:
+ 		if (resists_poison(mon)) {
+ 		    sho_shieldeff = TRUE;
+ 		    break;
+ 		}
+ 		tmp = d(nd,6);
+ 		break;
+ 	case ZT_ACID:
+ 		if (resists_acid(mon)) {
+ 		    sho_shieldeff = TRUE;
+ 		    break;
+ 		}
+ 		tmp = d(nd,6);
+ 		if (!rn2(6)) erode_obj(MON_WEP(mon), TRUE, TRUE);
+ 		if (!rn2(6)) erode_armor(mon, TRUE);
+ 		break;
+ 	}
+ 	if (sho_shieldeff) shieldeff(mon->mx, mon->my);
+ 	if (spellcaster && (Role_if(PM_KNIGHT) && u.uhave.questart))
+ 	    tmp *= 2;
+ 
+ #ifdef WIZ_PATCH_DEBUG
+ 	if (spellcaster)
+ 	    pline("Damage = %d + %d", tmp, skilldmg);
+ #endif
+ 	tmp += skilldmg;
+ 	    
+ 	if (tmp > 0 && type >= 0 &&
+ 		resist(mon, type < ZT_SPELL(0) ? WAND_CLASS : '\0', 0, NOTELL))
+ 	    tmp /= 2;
+ 	if (tmp < 0) tmp = 0;		/* don't allow negative damage */
+ #ifdef WIZ_PATCH_DEBUG
+ 	pline("zapped monster hp = %d (= %d - %d)", mon->mhp-tmp,mon->mhp,tmp);
+ #endif
+ 
+ 	mon->mhp -= tmp;
+ 
+ #ifdef SHOW_DMG
+ 	if (mon->mhp > 0) showdmg(tmp);
+ #endif
+ 
+ 	return(tmp);
+ }
+ 
+ STATIC_OVL void
+ zhitu(type, nd, fltxt, sx, sy)
+ int type, nd;
+ const char *fltxt;
+ xchar sx, sy;
+ {
+ 	int dam = 0;
+ 
+ 	/* KMH -- Don't bother checking if the ray hit our steed.
+ 	 * 1.  Assume monsters aim to hit you.
+ 	 * 2.  If hit by own beam, let the hero suffer.
+ 	 * 3.  Falling off of the steed could relocate the hero
+ 	 *     so he is hit twice, which is unrealistic.
+ 	 */
+ 
+ 	switch (abs(type) % 10) {
+ 	case ZT_MAGIC_MISSILE:
+ 	    if (Antimagic) {
+ 		shieldeff(sx, sy);
+ 		pline_The("missiles bounce off!");
+ 	    } else {
+ 		dam = d(nd,6);
+ 		exercise(A_STR, FALSE);
+ 	    }
+ 	    break;
+ 	case ZT_FIRE:
+ 	    if (Fire_resistance) {
+ 		shieldeff(sx, sy);
+ 		You("don't feel hot!");
+ 		ugolemeffects(AD_FIRE, d(nd, 6));
+ 	    } else {
+ 		dam = d(nd, 6);
+ 	    }
+ 	    if (Slimed) {            
+ 		pline("The slime is burned away!");
+ 		Slimed = 0;
+ 	    }
+ 	    burn_away_slime();
+ 	    if (burnarmor(&youmonst)) {	/* "body hit" */
+ 		if (!rn2(3)) destroy_item(POTION_CLASS, AD_FIRE);
+ 		if (!rn2(3)) destroy_item(SCROLL_CLASS, AD_FIRE);
+ 		if (!rn2(5)) destroy_item(SPBOOK_CLASS, AD_FIRE);
+ 	    }
+ 	    break;
+ 	case ZT_COLD:
+ 	    if (Cold_resistance) {
+ 		shieldeff(sx, sy);
+ 		You("don't feel cold.");
+ 		ugolemeffects(AD_COLD, d(nd, 6));
+ 	    } else {
+ 		dam = d(nd, 6);
+ 	    }
+ 	    if (!rn2(3)) destroy_item(POTION_CLASS, AD_COLD);
+ 	    break;
+ 	case ZT_SLEEP:
+ 	    if (Sleep_resistance) {
+ 		shieldeff(u.ux, u.uy);
+ 		You("don't feel sleepy.");
+ 	    } else {
+ 		fall_asleep(-d(nd,25), TRUE); /* sleep ray */
+ 	    }
+ 	    break;
+ 	case ZT_DEATH:
+ 	    if (abs(type) == ZT_BREATH(ZT_DEATH)) {
+ 		if (Disint_resistance) {
+ 		    You("are not disintegrated.");
+ 		    break;
+ 		} else if (uarms) {
+ 		    /* destroy shield; other possessions are safe */
+ 		    (void) destroy_arm(uarms);
+ 		    break;
+ 		} else if (uarm) {
+ 		    /* destroy suit; if present, cloak goes too */
+ 		    if (uarmc) (void) destroy_arm(uarmc);
+ 		    (void) destroy_arm(uarm);
+ 		    break;
+ 		}
+ 		/* no shield or suit, you're dead; wipe out cloak
+ 		   and/or shirt in case of life-saving or bones */
+ 		if (uarmc) (void) destroy_arm(uarmc);
+ #ifdef TOURIST
+ 		if (uarmu) (void) destroy_arm(uarmu);
+ #endif
+                 if (Invulnerable) {
+                         pline("You are unharmed!");
+                         break;
+                 }
+ 	    } else if (nonliving(youmonst.data) || is_demon(youmonst.data)) {
+ 		shieldeff(sx, sy);
+ 		You("seem unaffected.");
+ 		break;
+ 	    } else if (Antimagic) {
+ 		shieldeff(sx, sy);
+ 		You("aren't affected.");
+ 		break;
+             } else if (Invulnerable) {
+                 dam = 0;
+                 pline("You are unharmed!");
+                 break;
+ 	    }
+ 	    killer_format = KILLED_BY_AN;
+ 	    killer = fltxt;
+ 	    /* when killed by disintegration breath, don't leave corpse */
+ 	    u.ugrave_arise = (type == -ZT_BREATH(ZT_DEATH)) ? -3 : NON_PM;
+ 	    done(DIED);
+ 	    return; /* lifesaved */
+ 	case ZT_LIGHTNING:
+ 	    if (Shock_resistance) {
+ 		shieldeff(sx, sy);
+ 		You("aren't affected.");
+ 		ugolemeffects(AD_ELEC, d(nd, 6));
+ 	    } else {
+ 		dam = d(nd, 6);
+ 		exercise(A_CON, FALSE);
+ 	    }
+ 	    if (!rn2(3)) destroy_item(WAND_CLASS, AD_ELEC);
+ 	    if (!rn2(3)) destroy_item(RING_CLASS, AD_ELEC);
+ 	    break;
+ 	case ZT_POISON_GAS:
+ 	    poisoned("blast", A_DEX, "poisoned blast", 15);
+ 	    break;
+ 	case ZT_ACID:
+ 		/* KMH, balance patch -- new intrinsic */
+ 	    if (Acid_resistance) {
+ 		dam = 0;
+ 	    } else {
+ 		pline_The("acid burns!");
+ 		dam = d(nd,6);
+ 		exercise(A_STR, FALSE);
+ 	    }
+ 	    /* using two weapons at once makes both of them more vulnerable */
+ 	    if (!rn2(u.twoweap ? 3 : 6)) erode_obj(uwep, TRUE, TRUE);
+ 	    if (u.twoweap && !rn2(3)) erode_obj(uswapwep, TRUE, TRUE);
+ 	    if (!rn2(6)) erode_armor(&youmonst, TRUE);
+ 	    break;
+ 	}
+ 
+ 	if (Half_spell_damage && dam &&
+ 	   type < 0 && (type > -20 || type < -29)) /* !Breath */
+ 	    dam = (dam + 1) / 2;
+ 	/* when killed by disintegration breath, don't leave corpse */
+ 	u.ugrave_arise = (type == -ZT_BREATH(ZT_DEATH)) ? -3 : -1;
+ 	losehp(dam, fltxt, KILLED_BY_AN);
+ 	return;
+ }
+ 
+ #endif /*OVL1*/
+ #ifdef OVLB
+ 
+ /*
+  * burn scrolls and spell books on floor at position x,y
+  * return the number of scrolls and spell books burned
+  */
+ int
+ burn_floor_paper(x, y, give_feedback, u_caused)
+ int x, y;
+ boolean give_feedback;	/* caller needs to decide about visibility checks */
+ boolean u_caused;
+ {
+ 	struct obj *obj, *obj2;
+ 	long i, scrquan, delquan;
+ 	char buf1[BUFSZ], buf2[BUFSZ];
+ 	int cnt = 0;
+ 
+ 	for (obj = level.objects[x][y]; obj; obj = obj2) {
+ 	    obj2 = obj->nexthere;
+ 	    if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS) {
+ 		if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL ||
+ 			obj_resists(obj, 2, 100))
+ 		    continue;
+ 		scrquan = obj->quan;	/* number present */
+ 		delquan = 0;		/* number to destroy */
+ 		for (i = scrquan; i > 0; i--)
+ 		    if (!rn2(3)) delquan++;
+ 		if (delquan) {
+ 		    /* save name before potential delobj() */
+ 		    if (give_feedback) {
+ 			obj->quan = 1;
+ 			Strcpy(buf1, (x == u.ux && y == u.uy) ?
+ 				xname(obj) : distant_name(obj, xname));
+ 			obj->quan = 2;
+ 		    	Strcpy(buf2, (x == u.ux && y == u.uy) ?
+ 				xname(obj) : distant_name(obj, xname));
+ 			obj->quan = scrquan;
+ 		    }
+ 		    /* useupf(), which charges, only if hero caused damage */
+ 		    if (u_caused) useupf(obj, delquan);
+ 		    else if (delquan < scrquan) obj->quan -= delquan;
+ 		    else delobj(obj);
+ 		    cnt += delquan;
+ 		    if (give_feedback) {
+ 			if (delquan > 1)
+ 			    pline("%ld %s burn.", delquan, buf2);
+ 			else
+ 			    pline("%s burns.", An(buf1));
+ 		    }
+ 		}
+ 	    }
+ 	}
+ 	return cnt;
+ }
+ 
+ /* will zap/spell/breath attack score a hit against armor class `ac'? */
+ STATIC_OVL int
+ zap_hit(ac, type)
+ int ac;
+ int type;
+ {
+     int chance = rn2(20);
+     int spell_bonus = type ? spell_hit_bonus(type) : 0;
+ 
+     /* small chance for naked target to avoid being hit */
+     if (!chance) return rnd(10) < ac+spell_bonus;
+ 
+     /* very high armor protection does not achieve invulnerability */
+     ac = AC_VALUE(ac);
+ 
+     return (3 - chance) < ac+spell_bonus;
+ }
+ /* #endif */
+ /* type ==   0 to   9 : you shooting a wand */
+ /* type ==  10 to  19 : you casting a spell */
+ /* type ==  20 to  29 : you breathing as a monster */
+ /* type ==  30 to  39 : you casting Super spell -- WAC */
+ /*                      currently only fireball, cone of cold*/
+ /* type == -10 to -19 : monster casting spell */
+ /* type == -20 to -29 : monster breathing at you */
+ /* type == -30 to -39 : monster shooting a wand */
+ /* called with dx = dy = 0 with vertical bolts */
+ void
+ buzz(type,nd,sx,sy,dx,dy)
+ register int type, nd;
+ register xchar sx,sy;
+ register int dx,dy;
+ {
+     int range, abstype;
+     struct rm *lev;
+     register xchar lsx, lsy;
+     struct monst *mon;
+     coord save_bhitpos;
+     boolean shopdamage = FALSE;
+     register const char *fltxt;
+     struct obj *otmp;
+ #ifdef LIGHT_SRC_SPELL
+     int lits = 0;
+ #endif
+ /*for mega crude hack to keep from blowing up in face --WAC*/
+     int away=0;
+     struct monst *mblamed = m_at(sx, sy);	/* Apparent aggressor */
+     int spell_type = 0;
+ 
+ 
+       /* LSZ/WWA The Wizard Patch July 96
+        * If its a Hero Spell then get its SPE_TYPE
+        */
+     /* horrible kludge for wands of fireball... */    
+     if (type == ZT_WAND(ZT_LIGHTNING+1)) type = ZT_SPELL(ZT_FIRE);
+     /*WAC kludge for monsters zapping wands of fireball*/
+     if  ((type <= ZT_MONWAND(ZT_FIRST) && type >=ZT_MONWAND(ZT_LAST)) &&
+         ( (abs(type) % 10) == ZT_WAND(ZT_LIGHTNING+1))) type = - ZT_SPELL(ZT_FIRE);
+ 
+     /*WAC bugfix - should show right color stream now (for wands of fireball) */
+     abstype = abs(type) % 10;
+ 
+     if (is_hero_spell(type)  || is_mega_spell(type))
+         spell_type = abstype + SPE_MAGIC_MISSILE;
+ 
+     /*  WAC Whoops...this just catches monster wands ;B */
+     fltxt = flash_types[(type <= ZT_MONWAND(ZT_FIRST)) ? abstype : abs(type)];
+     if(u.uswallow) {
+ 	register int tmp;
+ 
+ 	if(type < 0) return;
+ 	tmp = zhitm(u.ustuck, type, nd, &otmp);
+ 	if(!u.ustuck)	u.uswallow = 0;
+ 	else	pline("%s rips into %s%s",
+ 		      The(fltxt), mon_nam(u.ustuck), exclam(tmp));
+ 	/* Using disintegration from the inside only makes a hole... */
+ 	if (tmp == MAGIC_COOKIE)
+ 	    u.ustuck->mhp = 0;
+ 	if (u.ustuck->mhp < 1)
+ 	    killed(u.ustuck);
+ 	return;
+     }
+     if(type < 0) newsym(u.ux,u.uy);
+     range = rn1(7,7);
+     if(dx == 0 && dy == 0) range = 1;
+     save_bhitpos = bhitpos;
+ 
+     if (!is_mega_spell(type)) {
+ 	tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype));
+     }
+ 
+     while(range-- > 0) {
+         /*hack to keep mega spells from blowing up in your face WAC*/
+         away++;
+ 
+ 	/* Control sigil */
+ 	if ((away > 4 && !rn2(4)) && tech_inuse(T_SIGIL_CONTROL)) {
+ 		getdir((char *)0);
+ 		if(u.dx || u.dy) {
+ 			/* Change dir! */
+ 			dx = u.dx; dy = u.dy;
+ 		}
+ 	}
+ 
+ 	lsx = sx; sx += dx;
+ 	lsy = sy; sy += dy;
+         lev = &levl[sx][sy];
+ /*new zap code*/
+ /*        if(isok(sx,sy) && (lev = &levl[sx][sy])->typ) {*/
+ 
+         if(isok(sx,sy) && (ZAP_POS(lev->typ))) {
+ 
+ #ifdef LIGHT_SRC_SPELL
+         /*WAC added light sourcing for the zap...*/
+             if (((abstype == ZT_FIRE) || (abstype == ZT_LIGHTNING))
+               && (!(type >= ZT_MEGA(ZT_FIRST) && type <= ZT_MEGA(ZT_LAST)))) {
+                 lits++;
+                 new_light_source(sx, sy, 1, LS_TEMP, (genericptr_t) lits);
+                 vision_full_recalc = 1;
+                 vision_recalc(0);
+             }
+ #endif
+ 	    /*Actual Megablast:right now only mag missile to cone of cold WAC*/
+ 	    if (is_mega_spell(type) && away != 1) {
+ 		/*explode takes care of vision stuff*/
+ 		int expl_type;
+ 		expl_type = abstype == ZT_FIRE ? EXPL_FIERY :
+ 			abstype == ZT_COLD ? EXPL_FROSTY : EXPL_MAGICAL;
+ 		explode(sx, sy, type, nd, 0, expl_type);
+ 		delay_output(); /* wait a little */
+ 	    }
+ 	    mon = m_at(sx, sy);
+ 	    /* Normal Zap */
+ 	    if (!is_mega_spell(type) && cansee(sx,sy)) {
+ 		/* reveal/unreveal invisible monsters before tmp_at() */
+ 		if (mon && !canspotmon(mon))
+ 		    map_invisible(sx, sy);
+ 		else if (!mon && memory_is_invisible(sx, sy)) {
+ 		    unmap_object(sx, sy);
+ 		    newsym(sx, sy);
+ 		}
+ 		if(ZAP_POS(lev->typ) || cansee(lsx,lsy)) {
+ 		    tmp_at(sx,sy);
+ 		    delay_output(); /* wait a little */
+ 		}
+             }
+ 
+             /*Clear blast for Megablasts + Fireball*/
+             /*Clean for fireball*/
+ #ifdef LIGHT_SRC_SPELL
+ 	    if (abs(type) == ZT_SPELL(ZT_FIRE)) {
+ 		del_light_source(LS_TEMP, (genericptr_t) lits);
+ 		lits--;
+ 	    }
+ #endif
+ 	} else
+ 	    goto make_bounce;
+ 
+ 	/* hit() and miss() need bhitpos to match the target */
+ 	bhitpos.x = sx,  bhitpos.y = sy;
+ 
+ 	/* Fireballs only damage when they explode */
+         if (abs(type) != ZT_SPELL(ZT_FIRE))
+ 	    range += zap_over_floor(sx, sy, type, &shopdamage);
+ 
+ 	if (mon) {
+         /* WAC Player/Monster Fireball */
+             if (abs(type) == ZT_SPELL(ZT_FIRE)) break;
+ 	    if (type >= 0) mon->mstrategy &= ~STRAT_WAITMASK;
+ #ifdef STEED
+ 	    buzzmonst:
+ #endif
+ 	    if (zap_hit(find_mac(mon), spell_type)) {
+ 		if (mon_reflects(mon, (char *)0)) {
+ 		    if(cansee(mon->mx,mon->my)) {
+ 			hit(fltxt, mon, exclam(0));
+ 			shieldeff(mon->mx, mon->my);
+ 			(void) mon_reflects(mon, "But it reflects from %s %s!");
+ 		    }
+ 		    dx = -dx;
+ 		    dy = -dy;
+ 		    /* WAC clear the beam so you can see it bounce back ;B */
+ 		    if (!is_mega_spell(type)) {
+                     	tmp_at(DISP_END,0);
+                     	tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype));
+ 		    }
+                     delay_output();
+ 		} else {
+ 		    boolean mon_could_move = mon->mcanmove;
+ 		    int tmp = zhitm(mon, type, nd, &otmp);
+ 
+ /*WAC Since Death is a rider, check for death before disint*/
+                     if (mon->data == &mons[PM_DEATH] && abstype == ZT_DEATH && tmp != MAGIC_COOKIE) {
+ 			if (canseemon(mon)) {
+ 			    hit(fltxt, mon, ".");
+ 			    pline("%s absorbs the deadly %s!", Monnam(mon),
+ /*make this abs(type) rather than just type to catch those monsters*/
+ /*actually,  breath should always be disintegration....*/
+                                   abs(type) == ZT_BREATH(ZT_DEATH) ?
+ 					"blast" : "ray");
+ 			    pline("It seems even stronger than before.");
+ /*It heals to max hitpoints.  Max hp is raised in zhitm */
+ 			}
+ 			mon->mhp = mon->mhpmax;
+ 			break; /* Out of while loop */
+ 		    }
+ 
+ /*                    if (is_rider(mon->data) && abs(type) && type == ZT_BREATH(ZT_DEATH)) {*/
+ /*WAC rider and disintegration check*/
+                     if (is_rider(mon->data) && abstype == ZT_DEATH && tmp == MAGIC_COOKIE) {
+ 			if (canseemon(mon)) {
+ 			    hit(fltxt, mon, ".");
+ 			    pline("%s disintegrates.", Monnam(mon));
+ 			    pline("%s body reintegrates before your %s!",
+ 				  s_suffix(Monnam(mon)),
+ 				  (eyecount(youmonst.data) == 1) ?
+ 				  	body_part(EYE) : makeplural(body_part(EYE)));
+ 			    pline("%s resurrects!", Monnam(mon));
+ 			}
+ 			mon->mhp = mon->mhpmax;
+ 			break; /* Out of while loop */
+                     } else if (tmp == MAGIC_COOKIE) { /* disintegration */
+ 			struct obj *otmp2, *m_amulet = mlifesaver(mon);
+ 
+ 			if (canseemon(mon)) {
+ 			    if (!m_amulet)
+ 				pline("%s is disintegrated!", Monnam(mon));
+ 			    else
+ 				hit(fltxt, mon, "!");
+ 			}
+ #ifndef GOLDOBJ
+ 			mon->mgold = 0L;
+ #endif
+ 
+ /* note: worn amulet of life saving must be preserved in order to operate */
+ #define oresist_disintegration(obj) \
+ 		(objects[obj->otyp].oc_oprop == DISINT_RES || \
+ 		 obj_resists(obj, 5, 50) || is_quest_artifact(obj) || \
+ 		 obj == m_amulet)
+ 
+ 			for (otmp = mon->minvent; otmp; otmp = otmp2) {
+ 			    otmp2 = otmp->nobj;
+ 			    if (!oresist_disintegration(otmp)) {
+ 				if (Has_contents(otmp)) delete_contents(otmp);
+ 				obj_extract_self(otmp);
+ 				obfree(otmp, (struct obj *)0);
+ 			    }
+ 			}
+ 
+ 			if (type < 0)
+ 			    monkilled(mon, (char *)0, -AD_RBRE);
+ 			else
+ 			    xkilled(mon, 2);
+ 		    } else if(mon->mhp < 1) {
+ 			if(type < 0)
+ 			    monkilled(mon, fltxt, AD_RBRE);
+ 			else
+ 			    killed(mon);
+ 		    } else {
+ 			if (!otmp) {
+ 			    /* normal non-fatal hit */
+ 			    hit(fltxt, mon, exclam(tmp));
+ 			    if (mblamed && mblamed != mon &&
+ 				    !DEADMONSTER(mblamed) &&
+ 				    mon->movement >= NORMAL_SPEED && rn2(4)) {
+ 				/* retaliate */
+ 				mon->movement -= NORMAL_SPEED;
+ 				mattackm(mon, mblamed);
+ 			    }
+ 			} else {
+ 			    /* some armor was destroyed; no damage done */
+ 			    if (canseemon(mon))
+ 				pline("%s %s is disintegrated!",
+ 				      s_suffix(Monnam(mon)),
+ 				      distant_name(otmp, xname));
+ 			    m_useup(mon, otmp);
+ 			}
+ 			if (mon_could_move && !mon->mcanmove)	/* ZT_SLEEP */
+ 			    slept_monst(mon);
+ 		    }
+ 		}
+ 		range -= 2;
+ 	    } else {
+ 		miss(fltxt,mon);
+ 	    }
+ 	} else if (sx == u.ux && sy == u.uy && range >= 0) {
+ 	    nomul(0);
+ #ifdef STEED
+ 	    if (u.usteed && !rn2(3) && !mon_reflects(u.usteed, (char *)0)) {
+ 		    mon = u.usteed;
+ 		    goto buzzmonst;
+ 	    } else
+ #endif
+ 	    if (zap_hit((int) u.uac, 0)) {
+ 		range -= 2;
+ 		pline("%s hits you!", The(fltxt));
+ 		if (Reflecting && abs(type) != ZT_SPELL(ZT_FIRE)) {
+ 		    if (!Blind) {
+ 		    	(void) ureflects("But %s reflects from your %s!", "it");
+ 		    } else
+ 			pline("For some reason you are not affected.");
+ 		    dx = -dx;
+ 		    dy = -dy;
+ 		    shieldeff(sx, sy);
+ 		    /* WAC clear the beam so you can see it bounce back ;B */
+ 		    if (!is_mega_spell(type)) {
+ 			tmp_at(DISP_END,0);
+ 			tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype));
+ 		    }
+ 		} else {
+ 		    if (abs(type) != ZT_SPELL(ZT_FIRE))
+ 		    zhitu(type, nd, fltxt, sx, sy);
+ 		    else
+ 			range = 0;
+ 		}
+ 	    } else {
+ 		pline("%s whizzes by you!", The(fltxt));
+ 	    }
+ 	    if (abstype == ZT_LIGHTNING && !resists_blnd(&youmonst)) {
+ 		You(are_blinded_by_the_flash);
+ 		make_blinded((long)d(nd,50),FALSE);
+ 		if (!Blind) Your(vision_clears);
+ 	    }
+ 	    stop_occupation();
+ 	    nomul(0);
+ 	}
+ 
+ 	if(!ZAP_POS(lev->typ) || (closed_door(sx, sy) && (range >= 0))) {
+ 	    int bounce;
+ 	    uchar rmn;
+ 
+  make_bounce:
+         /* WAC Player/Monster Fireball */
+             if (abs(type) == ZT_SPELL(ZT_FIRE)) {
+ 		sx = lsx;
+ 		sy = lsy;
+ 		break; /* fireballs explode before the wall */
+ 	    }
+ 	    bounce = 0;
+ /*            range--;*/   
+ 	    if(range && isok(lsx, lsy) && cansee(lsx,lsy))
+ 		pline("%s bounces!", The(fltxt));
+ 	    if(!dx || !dy || !rn2(20)) {
+ 		dx = -dx;
+ 		dy = -dy;
+ 		/* WAC clear the beam so you can see it bounce back ;B */
+ 		if (!is_mega_spell(type)) {
+ 		    tmp_at(DISP_END,0);
+ 		    tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype));
+                 }
+                 delay_output();
+ 	    } else {
+ 		if(isok(sx,lsy) && ZAP_POS(rmn = levl[sx][lsy].typ) &&
+ 		   !closed_door(sx,lsy) &&
+ 		   (IS_ROOM(rmn) || (isok(sx+dx,lsy) &&
+ 				     ZAP_POS(levl[sx+dx][lsy].typ))))
+ 		    bounce = 1;
+ 		if(isok(lsx,sy) && ZAP_POS(rmn = levl[lsx][sy].typ) &&
+ 		   !closed_door(lsx,sy) &&
+ 		   (IS_ROOM(rmn) || (isok(lsx,sy+dy) &&
+ 				     ZAP_POS(levl[lsx][sy+dy].typ))))
+ 		    if(!bounce || rn2(2))
+ 			bounce = 2;
+ 
+ 		switch(bounce) {
+                 case 0: dx = -dx;
+                         dy = -dy;
+ 			/* WAC clear the beam so you can see it bounce back ;B */
+ 			if (!is_mega_spell(type)) {
+ 			    tmp_at(DISP_END,0);
+ 			    tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype));
+ 			}
+                         delay_output();
+ 			break;
+                 case 1: dy = -dy;
+                         sx = lsx; break;
+ 		case 2: dx = -dx;
+                         sy = lsy; break;
+ 		}
+                 if (!is_mega_spell(type))
+ 		tmp_at(DISP_CHANGE, zapdir_to_glyph(dx,dy,abstype));
+ 	    }
+ 	}
+     }
+ 
+     /* Let you enjoy the beam */
+     display_nhwindow(WIN_MESSAGE, TRUE);    /* --More-- */
+ 
+ /*WAC clear the light source*/
+ #ifdef LIGHT_SRC_SPELL
+     if (((abstype == ZT_FIRE) || (abstype == ZT_LIGHTNING))
+         && (!(type >= ZT_MEGA(ZT_FIRST) && type <= ZT_MEGA(ZT_LAST))))
+         {
+         while (lits) {
+                 del_light_source(LS_TEMP, (genericptr_t) lits);
+                 lits--;
+                 }
+         vision_full_recalc = 1;
+         vision_recalc(0); /*clean up vision*/
+         }
+ #endif
+ 
+     if (!is_mega_spell(type))
+     tmp_at(DISP_END,0);
+ 
+     /*WAC Player/Monster fireball*/
+     if (abs(type) == ZT_SPELL(ZT_FIRE))
+ 	explode(sx, sy, type, d(12,6), 0, EXPL_FIERY);
+     if (shopdamage)
+ 	pay_for_damage(abstype == ZT_FIRE ?  "burn away" :
+ 		       abstype == ZT_COLD ?  "shatter" :
+ 		       abstype == ZT_DEATH ? "disintegrate" : "destroy", FALSE);
+     bhitpos = save_bhitpos;
+ }
+ #endif /*OVLB*/
+ #ifdef OVL0
+ 
+ void
+ melt_ice(x, y)
+ xchar x, y;
+ {
+ 	struct rm *lev = &levl[x][y];
+ 	struct obj *otmp;
+ 
+ 	if (lev->typ == DRAWBRIDGE_UP)
+ 	    lev->drawbridgemask &= ~DB_ICE;	/* revert to DB_MOAT */
+ 	else {	/* lev->typ == ICE */
+ #ifdef STUPID
+ 	    if (lev->icedpool == ICED_POOL) lev->typ = POOL;
+ 	    else lev->typ = MOAT;
+ #else
+ 	    lev->typ = (lev->icedpool == ICED_POOL ? POOL : MOAT);
+ #endif
+ 	    lev->icedpool = 0;
+ 	}
+ 	obj_ice_effects(x, y, FALSE);
+ 	unearth_objs(x, y);
+ 	if (Underwater) vision_recalc(1);
+ 	newsym(x,y);
+ 	if (cansee(x,y)) Norep("The ice crackles and melts.");
+ 	if ((otmp = sobj_at(BOULDER, x, y)) != 0) {
+ 	    if (cansee(x,y)) pline("%s settles...", An(xname(otmp)));
+ 	    do {
+ 		obj_extract_self(otmp);	/* boulder isn't being pushed */
+ 		if (!boulder_hits_pool(otmp, x, y, FALSE))
+ 		    impossible("melt_ice: no pool?");
+ 		/* try again if there's another boulder and pool didn't fill */
+ 	    } while (is_pool(x,y) && (otmp = sobj_at(BOULDER, x, y)) != 0);
+ 	    newsym(x,y);
+ 	}
+ 	if (x == u.ux && y == u.uy)
+ 		spoteffects(TRUE);	/* possibly drown, notice objects */
+ }
+ 
+ /* Burn floor scrolls, evaporate pools, etc...  in a single square.  Used
+  * both for normal bolts of fire, cold, etc... and for fireballs.
+  * Sets shopdamage to TRUE if a shop door is destroyed, and returns the
+  * amount by which range is reduced (the latter is just ignored by fireballs)
+  */
+ int
+ zap_over_floor(x, y, type, shopdamage)
+ xchar x, y;
+ int type;
+ boolean *shopdamage;
+ {
+ 	struct monst *mon;
+ 	int abstype = abs(type) % 10;
+ 	struct rm *lev = &levl[x][y];
+ 	int rangemod = 0;
+ 
+ 	if(abstype == ZT_FIRE) {
+ 	    struct trap *t = t_at(x, y);
+ 
+ 	    if (t && t->ttyp == WEB) {
+ 		/* a burning web is too flimsy to notice if you can't see it */
+ 		if (cansee(x,y)) Norep("A web bursts into flames!");
+ 		(void) delfloortrap(t);
+ 		if (cansee(x,y)) newsym(x,y);
+ 	    }
+ 	    if(is_ice(x, y)) {
+ 		melt_ice(x, y);
+ 	    } else if(is_pool(x,y)) {
+ 		const char *msgtxt = "You hear hissing gas.";
+ 		if(lev->typ != POOL) {	/* MOAT or DRAWBRIDGE_UP */
+ 		    if (cansee(x,y)) msgtxt = "Some water evaporates.";
+ 		} else {
+ 		    register struct trap *ttmp;
+ 
+ 		    rangemod -= 3;
+ 		    lev->typ = ROOM;
+ 		    ttmp = maketrap(x, y, PIT);
+ 		    if (ttmp) ttmp->tseen = 1;
+ 		    if (cansee(x,y)) msgtxt = "The water evaporates.";
+ 		}
+ 		Norep(msgtxt);
+ 		if (lev->typ == ROOM) newsym(x,y);
+ 	    } else if(IS_FOUNTAIN(lev->typ)) {
+ 		    if (cansee(x,y))
+ 			pline("Steam billows from the fountain.");
+ 		    rangemod -= 1;
+ 		    dryup(x, y, type > 0);
+ 	    }
+ 	}
+ 	else if(abstype == ZT_COLD && (is_pool(x,y) || is_lava(x,y))) {
+ 		boolean lava = is_lava(x,y);
+ 		boolean moat = (!lava && (lev->typ != POOL) &&
+ 				(lev->typ != WATER) &&
+ 				!Is_medusa_level(&u.uz) &&
+ 				!Is_waterlevel(&u.uz));
+ 
+ 		if (lev->typ == WATER) {
+ 		    /* For now, don't let WATER freeze. */
+ 		    if (cansee(x,y))
+ 			pline_The("water freezes for a moment.");
+ 		    else
+ 			You_hear("a soft crackling.");
+ 		    rangemod -= 1000;	/* stop */
+ 		} else {
+ 		    rangemod -= 3;
+ 		    if (lev->typ == DRAWBRIDGE_UP) {
+ 			lev->drawbridgemask &= ~DB_UNDER;  /* clear lava */
+ 			lev->drawbridgemask |= (lava ? DB_FLOOR : DB_ICE);
+ 		    } else {
+ 			if (!lava)
+ 			    lev->icedpool =
+ 				    (lev->typ == POOL ? ICED_POOL : ICED_MOAT);
+ 			lev->typ = (lava ? ROOM : ICE);
+ 		    }
+ 		    bury_objs(x,y);
+ 		    if(cansee(x,y)) {
+ 			if(moat)
+ 				Norep("The moat is bridged with ice!");
+ 			else if(lava)
+ 				Norep("The lava cools and solidifies.");
+ 			else
+ 				Norep("The water freezes.");
+ 			newsym(x,y);
+ 		    } else if(flags.soundok && !lava)
+ 			You_hear("a crackling sound.");
+ 
+ 		    if (x == u.ux && y == u.uy) {
+ 			if (u.uinwater) {   /* not just `if (Underwater)' */
+ 			    /* leave the no longer existent water */
+ 			    u.uinwater = 0;
+ 			    u.uundetected = 0;
+ 			    docrt();
+ 			    vision_full_recalc = 1;
+ 			} else if (u.utrap && u.utraptype == TT_LAVA) {
+ 			    if (Passes_walls) {
+ 				You("pass through the now-solid rock.");
+ 			    } else {
+ 				u.utrap = rn1(50,20);
+ 				u.utraptype = TT_INFLOOR;
+ 				You("are firmly stuck in the cooling rock.");
+ 			    }
+ 			}
+ 		    } else if ((mon = m_at(x,y)) != 0) {
+ 			/* probably ought to do some hefty damage to any
+ 			   non-ice creature caught in freezing water;
+ 			   at a minimum, eels are forced out of hiding */
+ 			if (is_swimmer(mon->data) && mon->mundetected) {
+ 			    mon->mundetected = 0;
+ 			    newsym(x,y);
+ 			}
+ 		    }
+ 		}
+ 		obj_ice_effects(x,y,TRUE);
+ 	}
+ 	if(closed_door(x, y)) {
+ 		int new_doormask = -1;
+ 		const char *see_txt = 0, *sense_txt = 0, *hear_txt = 0;
+ 		rangemod = -1000;
+ 		/* ALI - Artifact doors */
+ 		if (artifact_door(x, y))
+ 		    goto def_case;
+ 		switch(abstype) {
+ 		case ZT_FIRE:
+ 		    new_doormask = D_NODOOR;
+ 		    see_txt = "The door is consumed in flames!";
+ 		    sense_txt = "smell smoke.";
+ 		    break;
+ 		case ZT_COLD:
+ 		    new_doormask = D_NODOOR;
+ 		    see_txt = "The door freezes and shatters!";
+ 		    sense_txt = "feel cold.";
+ 		    break;
+ 		case ZT_DEATH:
+ 		    /* death spells/wands don't disintegrate */
+ 		    if(abs(type) != ZT_BREATH(ZT_DEATH))
+ 			goto def_case;
+ 		    new_doormask = D_NODOOR;
+ 		    see_txt = "The door disintegrates!";
+ 		    hear_txt = "crashing wood.";
+ 		    break;
+ 		case ZT_LIGHTNING:
+ 		    new_doormask = D_BROKEN;
+ 		    see_txt = "The door splinters!";
+ 		    hear_txt = "crackling.";
+ 		    break;
+                 case ZT_ACID:
+                     new_doormask = D_NODOOR;
+                     see_txt = "The door melts!";
+                     hear_txt = "sizzling.";
+ 		    break;
+ 		default:
+ 		def_case:
+ 		    if(cansee(x,y)) {
+ 			pline_The("door absorbs %s %s!",
+ 			      (type < 0) ? "the" : "your",
+ 			      abs(type) < ZT_SPELL(0) ? "bolt" :
+ 			      abs(type) < ZT_BREATH(0) ? "spell" :
+ 			      "blast");
+ 		    } else You_feel("vibrations.");
+ 		    break;
+ 		}
+ 		if (new_doormask >= 0) {	/* door gets broken */
+ 		    if (*in_rooms(x, y, SHOPBASE)) {
+ 			if (type >= 0) {
+ 			    add_damage(x, y, 400L);
+ 			    *shopdamage = TRUE;
+ 			} else	/* caused by monster */
+ 			    add_damage(x, y, 0L);
+ 		    }
+ 		    lev->doormask = new_doormask;
+ 		    unblock_point(x, y);	/* vision */
+ 		    if (cansee(x, y)) {
+ 			pline(see_txt);
+ 			newsym(x, y);
+ 		    } else if (sense_txt) {
+ 			You(sense_txt);
+ 		    } else if (hear_txt) {
+ 			if (flags.soundok) You_hear(hear_txt);
+ 		    }
+ 		    if (picking_at(x, y)) {
+ 			stop_occupation();
+ 			reset_pick();
+ 		    }
+ 		}
+ 	}
+ 
+ 	if(OBJ_AT(x, y) && abstype == ZT_FIRE)
+ 		if (burn_floor_paper(x, y, FALSE, type > 0) && couldsee(x, y)) {
+ 		    newsym(x,y);
+ 		    You("%s of smoke.",
+ 			!Blind ? "see a puff" : "smell a whiff");
+ 		}
+ 	if ((mon = m_at(x,y)) != 0) {
+ 		/* Cannot use wakeup() which also angers the monster */
+ 		mon->msleeping = 0;
+ 		if(mon->m_ap_type) seemimic(mon);
+ 		if(type >= 0) {
+ 		    setmangry(mon);
+ 		    if(mon->ispriest && *in_rooms(mon->mx, mon->my, TEMPLE))
+ 			ghod_hitsu(mon);
+ 		    if(mon->isshk && !*u.ushops)
+ 			hot_pursuit(mon);
+ 		}
+ 	}
+ 	return rangemod;
+ }
+ 
+ #endif /*OVL0*/
+ #ifdef OVL3
+ 
+ void
+ fracture_rock(obj)	/* fractured by pick-axe or wand of striking */
+ register struct obj *obj;		   /* no texts here! */
+ {
+ 	/* A little Sokoban guilt... */
+ 	if (obj->otyp == BOULDER && In_sokoban(&u.uz) && !flags.mon_moving)
+ 	    change_luck(-1);
+ 
+ 	obj->otyp = ROCK;
+ 	obj->quan = (long) rn1(60, 7);
+ 	obj->owt = weight(obj);
+ 	obj->oclass = GEM_CLASS;
+ 	obj->known = FALSE;
+ 	obj->onamelth = 0;		/* no names */
+ 	obj->oxlth = 0;			/* no extra data */
+ 	obj->oattached = OATTACHED_NOTHING;
+ 	if (obj->where == OBJ_FLOOR) {
+ 		obj_extract_self(obj);		/* move rocks back on top */
+ 		place_object(obj, obj->ox, obj->oy);
+ 		if(!does_block(obj->ox,obj->oy,&levl[obj->ox][obj->oy]))
+ 	    		unblock_point(obj->ox,obj->oy);
+ 		if(cansee(obj->ox,obj->oy))
+ 		    newsym(obj->ox,obj->oy);
+ 	}
+ }
+ 
+ /* handle statue hit by striking/force bolt/pick-axe */
+ boolean
+ break_statue(obj)
+ register struct obj *obj;
+ {
+ 	/* [obj is assumed to be on floor, so no get_obj_location() needed] */
+ 	struct trap *trap = t_at(obj->ox, obj->oy);
+ 	struct obj *item;
+ 
+ 	if (trap && trap->ttyp == STATUE_TRAP &&
+ 		activate_statue_trap(trap, obj->ox, obj->oy, TRUE))
+ 	    return FALSE;
+ 	/* drop any objects contained inside the statue */
+ 	while ((item = obj->cobj) != 0) {
+ 	    obj_extract_self(item);
+ 	    place_object(item, obj->ox, obj->oy);
+ 	}
+ 	if (Role_if(PM_ARCHEOLOGIST) && !flags.mon_moving && (obj->spe & STATUE_HISTORIC)) {
+ 	    You_feel("guilty about damaging such a historic statue.");
+ 	    adjalign(-1);
+ 	}
+ 	obj->spe = 0;
+ 	fracture_rock(obj);
+ 	return TRUE;
+ }
+ 
+ const char * const destroy_strings[] = {	/* also used in trap.c */
+ 	"freezes and shatters", "freeze and shatter", "shattered potion",
+ 	"boils and explodes", "boil and explode", "boiling potion",
+ 	"catches fire and burns", "catch fire and burn", "burning scroll",
+ 	"catches fire and burns", "catch fire and burn", "burning book",
+ 	"turns to dust and vanishes", "turn to dust and vanish", "",
+ 	"breaks apart and explodes", "break apart and explode", "exploding wand"
+ };
+ 
+ void
+ destroy_item(osym, dmgtyp)
+ register int osym, dmgtyp;
+ {
+ 	register struct obj *obj;
+ 	register int dmg, xresist, skip;
+ 	register long i, cnt, quan;
+ 	register int dindx;
+ 	const char *mult;
+ 	/*
+ 	 * [ALI] Because destroy_item() can call wand_explode() which can
+ 	 * call explode() which can call destroy_item() again, we need to
+ 	 * be able to deal with the possibility of not only the current
+ 	 * object we are looking at no longer being in the inventory, but
+ 	 * also the next object (and the one after that, etc.).
+ 	 * We do this by taking advantage of the fact that objects in the
+ 	 * inventory destroyed as a result of calling wand_explode() will
+ 	 * always be destroyed by this same function. This allows us to
+ 	 * maintain a list of "next" pointers and to adjust these pointers
+ 	 * as required when we destroy an object that they might be pointing
+ 	 * at.
+ 	 */
+ 	struct destroy_item_frame {
+ 	    struct obj *next_obj;
+ 	    struct destroy_item_frame *next_frame;
+ 	} frame;
+ 	static struct destroy_item_frame *destroy_item_stack;
+ 
+ 	/* this is to deal with gas spores -- they don't really
+ 	   destroy objects, but this routine is called a lot in
+ 	   explode.c for them... hmph... */
+ 	if (dmgtyp == AD_PHYS) return;
+ 
+ 	frame.next_frame = destroy_item_stack;
+ 	destroy_item_stack = &frame;
+ 
+ 	for(obj = invent; obj; obj = frame.next_obj) {
+ 	    frame.next_obj = obj->nobj;
+ 	    if(obj->oclass != osym) continue; /* test only objs of type osym */
+ 	    if(obj->oartifact) continue; /* don't destroy artifacts */
+ 	    if(obj->in_use && obj->quan == 1) continue; /* not available */
+ 	    xresist = skip = 0;
+ #ifdef GCC_WARN
+ 	    dmg = dindx = 0;
+ 	    quan = 0L;
+ #endif
+ 	    switch(dmgtyp) {
+ 		case AD_COLD:
+ 		    if(osym == POTION_CLASS && obj->otyp != POT_OIL) {
+ 			quan = obj->quan;
+ 			dindx = 0;
+ 			dmg = rnd(4);
+ 		    } else skip++;
+ 		    break;
+ 		case AD_FIRE:
+ 		    xresist = (Fire_resistance && obj->oclass != POTION_CLASS);
+ 
+ 		    if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL)
+ 			skip++;
+ 		    if (obj->otyp == SPE_BOOK_OF_THE_DEAD) {
+ 			skip++;
+ 			if (!Blind)
+ 			    pline("%s glows a strange %s, but remains intact.",
+ 				The(xname(obj)), hcolor("dark red"));
+ 		    }
+ 		    quan = obj->quan;
+ 		    switch(osym) {
+ 			case POTION_CLASS:
+ 			    dindx = 1;
+ 			    dmg = rnd(6);
+ 			    break;
+ 			case SCROLL_CLASS:
+ 			    dindx = 2;
+ 			    dmg = 1;
+ 			    break;
+ 			case SPBOOK_CLASS:
+ 			    dindx = 3;
+ 			    dmg = 1;
+ 			    break;
+ 			default:
+ 			    skip++;
+ 			    break;
+ 		    }
+ 		    break;
+ 		case AD_ELEC:
+ 		    xresist = (Shock_resistance && obj->oclass != RING_CLASS);
+ 		    quan = obj->quan;
+ 		    switch(osym) {
+ 			case RING_CLASS:
+ 			    if(obj->otyp == RIN_SHOCK_RESISTANCE)
+ 				    { skip++; break; }
+ 			    dindx = 4;
+ 			    dmg = 0;
+ 			    break;
+ 			case WAND_CLASS:
+ 			    if(obj->otyp == WAN_LIGHTNING) { skip++; break; }
+ #if 0
+ 			    if (obj == current_wand) { skip++; break; }
+ #endif
+ 			    dindx = 5;
+ 			    dmg = rnd(10);
+ 			    break;
+ 			default:
+ 			    skip++;
+ 			    break;
+ 		    }
+ 		    break;
+ 		default:
+ 		    skip++;
+ 		    break;
+ 	    }
+ 	    if(!skip) {
+ 		if (obj->in_use) --quan; /* one will be used up elsewhere */
+ 		for(i = cnt = 0L; i < quan; i++)
+ 		    if(!rn2(3)) cnt++;
+ 
+ 		if(!cnt) continue;
+ 		if(cnt == quan)	mult = "Your";
+ 		else	mult = (cnt == 1L) ? "One of your" : "Some of your";
+ 		pline("%s %s %s!", mult, xname(obj),
+ 			(cnt > 1L) ? destroy_strings[dindx*3 + 1]
+ 				  : destroy_strings[dindx*3]);
+ 		if(osym == POTION_CLASS && dmgtyp != AD_COLD) {
+ 		    if (!breathless(youmonst.data) || haseyes(youmonst.data))
+ 		    	potionbreathe(obj);
+ 		}
+ 		if (obj->owornmask) {
+ 		    if (obj->owornmask & W_RING) /* ring being worn */
+ 			Ring_gone(obj);
+ 		    else
+ 			setnotworn(obj);
+ 		}
+ 		if (obj == current_wand) current_wand = 0;	/* destroyed */
+ 		if (cnt == obj->quan && frame.next_frame) {
+ 		    /* Before removing an object from the inventory, adjust
+ 		     * any "next" pointers that would otherwise become invalid.
+ 		     */
+ 		    struct destroy_item_frame *fp;
+ 		    for(fp = frame.next_frame; fp; fp = fp->next_frame) {
+ 			if (fp->next_obj == obj)
+ 			    fp->next_obj = frame.next_obj;
+ 		    }
+ 		}
+ 		if(osym == WAND_CLASS && dmgtyp == AD_ELEC) {
+ 		    /* MAR use a continue since damage and stuff is taken care of
+ 		     *  in wand_explode */
+                     wand_explode(obj, FALSE);
+                     continue;
+ 		}
+ 		/* Use up the object */
+ 		for (i = 0; i < cnt; i++)
+ 		    useup(obj);
+ 		/* Do the damage if not resisted */
+ 		if(dmg) {
+ 		    if(xresist)	You("aren't hurt!");
+ 		    else {
+ 			const char *how = destroy_strings[dindx * 3 + 2];
+ 			boolean one = (cnt == 1L);
+ 
+ 			losehp(dmg, one ? how : (const char *)makeplural(how),
+ 			       one ? KILLED_BY_AN : KILLED_BY);
+ 			exercise(A_STR, FALSE);
+ 		    }
+ 		}
+ 	    }
+ 	}
+ 	destroy_item_stack = frame.next_frame;
+ 	return;
+ }
+ 
+ int
+ destroy_mitem(mtmp, osym, dmgtyp)
+ struct monst *mtmp;
+ int osym, dmgtyp;
+ {
+ 	struct obj *obj, *obj2;
+ 	int skip, tmp = 0;
+ 	long i, cnt, quan;
+ 	int dindx;
+ 	boolean vis;
+ 
+ 	if (mtmp == &youmonst) {	/* this simplifies artifact_hit() */
+ 	    destroy_item(osym, dmgtyp);
+ 	    return 0;	/* arbitrary; value doesn't matter to artifact_hit() */
+ 	}
+ 
+ 	vis = canseemon(mtmp);
+ 	for(obj = mtmp->minvent; obj; obj = obj2) {
+ 	    obj2 = obj->nobj;
+ 	    if(obj->oclass != osym) continue; /* test only objs of type osym */
+ 	    skip = 0;
+ 	    quan = 0L;
+ 	    dindx = 0;
+ 
+ 	    switch(dmgtyp) {
+ 		case AD_COLD:
+ 		    if(osym == POTION_CLASS && obj->otyp != POT_OIL) {
+ 			quan = obj->quan;
+ 			dindx = 0;
+ 			tmp++;
+ 		    } else skip++;
+ 		    break;
+ 		case AD_FIRE:
+ 		    if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL)
+ 			skip++;
+ 		    if (obj->otyp == SPE_BOOK_OF_THE_DEAD) {
+ 			skip++;
+ 			if (vis)
+ 			    pline("%s glows a strange %s, but remains intact.",
+ 				The(distant_name(obj, xname)),
+ 				hcolor("dark red"));
+ 		    }
+ 		    quan = obj->quan;
+ 		    switch(osym) {
+ 			case POTION_CLASS:
+ 			    dindx = 1;
+ 			    tmp++;
+ 			    break;
+ 			case SCROLL_CLASS:
+ 			    dindx = 2;
+ 			    tmp++;
+ 			    break;
+ 			case SPBOOK_CLASS:
+ 			    dindx = 3;
+ 			    tmp++;
+ 			    break;
+ 			default:
+ 			    skip++;
+ 			    break;
+ 		    }
+ 		    break;
+ 		case AD_ELEC:
+ 		    quan = obj->quan;
+ 		    switch(osym) {
+ 			case RING_CLASS:
+ 			    if(obj->otyp == RIN_SHOCK_RESISTANCE)
+ 				    { skip++; break; }
+ 			    dindx = 4;
+ 			    break;
+ 			case WAND_CLASS:
+ 			    if(obj->otyp == WAN_LIGHTNING) { skip++; break; }
+ 			    dindx = 5;
+ 			    tmp++;
+ 			    break;
+ 			default:
+ 			    skip++;
+ 			    break;
+ 		    }
+ 		    break;
+ 		default:
+ 		    skip++;
+ 		    break;
+ 	    }
+ 	    if(!skip) {
+ 		for(i = cnt = 0L; i < quan; i++)
+ 		    if(!rn2(3)) cnt++;
+ 
+ 		if(!cnt) continue;
+ 		if (vis) pline("%s %s %s!",
+ 			s_suffix(Monnam(mtmp)), xname(obj),
+ 			(cnt > 1L) ? destroy_strings[dindx*3 + 1]
+ 				  : destroy_strings[dindx*3]);
+ 		for(i = 0; i < cnt; i++) m_useup(mtmp, obj);
+ 	    }
+ 	}
+ 	return(tmp);
+ }
+ 
+ #endif /*OVL3*/
+ #ifdef OVL2
+ 
+ int
+ resist(mtmp, oclass, damage, tell)
+ struct monst *mtmp;
+ char oclass;
+ int damage, tell;
+ {
+ 	int resisted;
+ 	int alev, dlev;
+ 
+ 	/* attack level */
+ 	switch (oclass) {
+ 	    case WAND_CLASS:	alev = 12;	 break;
+ 	    case TOOL_CLASS:	alev = 10;	 break;	/* instrument */
+ 	    case WEAPON_CLASS:	alev = 10;	 break;	/* artifact */
+ 	    case SCROLL_CLASS:	alev =  9;	 break;
+ 	    case POTION_CLASS:	alev =  6;	 break;
+ 	    case RING_CLASS:	alev =  5;	 break;
+ 	    default:		alev = u.ulevel; break;	/* spell */
+ 	}
+ 	/* defense level */
+ 	dlev = (int)mtmp->m_lev;
+ 	if (dlev > 50) dlev = 50;
+ 	else if (dlev < 1) dlev = is_mplayer(mtmp->data) ? u.ulevel : 1;
+ 
+ 	resisted = rn2(100 + alev - dlev) < mtmp->data->mr;
+ 	if (resisted) {
+ 	    if (tell) {
+ 		shieldeff(mtmp->mx, mtmp->my);
+ 		pline("%s resists!", Monnam(mtmp));
+ 	    }
+ 	    damage = (damage + 1) / 2;
+ 	}
+ 
+ 	if (damage) {
+ 	    mtmp->mhp -= damage;
+ 	    if (mtmp->mhp < 1) {
+ 		if(m_using) monkilled(mtmp, "", AD_RBRE);
+ 		else killed(mtmp);
+ 	    }
+ 	}
+ 	return(resisted);
+ }
+ 
+ void
+ makewish()
+ {
+ 	char buf[BUFSZ];
+ 	struct obj *otmp, nothing;
+ 	int tries = 0;
+ 
+ 	nothing = zeroobj;  /* lint suppression; only its address matters */
+ 	if (flags.verbose) You("may wish for an object.");
+ retry:
+ 	getlin("For what do you wish?", buf);
+ 	if(buf[0] == '\033') buf[0] = 0;
+ 	/*
+ 	 *  Note: if they wished for and got a non-object successfully,
+ 	 *  otmp == &zeroobj.  That includes gold, or an artifact that
+ 	 *  has been denied.  Wishing for "nothing" requires a separate
+ 	 *  value to remain distinct.
+ 	 */
+ 	otmp = readobjnam(buf, &nothing, TRUE);
+ 	if (!otmp) {
+ 	    pline("Nothing fitting that description exists in the game.");
+ 	    if (++tries < 5) goto retry;
+ 	    pline(thats_enough_tries);
+ 	    otmp = readobjnam((char *)0, (struct obj *)0, TRUE);
+ 	    if (!otmp) return;	/* for safety; should never happen */
+ 	} else if (otmp == &nothing) {
+ 	    /* explicitly wished for "nothing", presumeably attempting
+ 	       to retain wishless conduct */
+ 	    return;
+ 	}
+ 
+ 	/* KMH, conduct */
+ 	u.uconduct.wishes++;
+ 
+ 	if (otmp != &zeroobj) {
+ 	    /* The(aobjnam()) is safe since otmp is unidentified -dlc */
+ 	    (void) hold_another_object(otmp, u.uswallow ?
+ 				       "Oops!  %s out of your reach!" :
+ 				       (Is_airlevel(&u.uz) ||
+ 					Is_waterlevel(&u.uz) ||
+ 					levl[u.ux][u.uy].typ < IRONBARS ||
+ 					levl[u.ux][u.uy].typ >= ICE) ?
+ 				       "Oops!  %s away from you!" :
+ 				       "Oops!  %s to the floor!",
+ 				       The(aobjnam(otmp,
+ 					     Is_airlevel(&u.uz) || u.uinwater ?
+ 						   "slip" : "drop")),
+ 				       (const char *)0);
+ 	    u.ublesscnt += rn1(100,50);  /* the gods take notice */
+ 	}
+ }
+ 
+ 
+ /* LSZ/WWA Wizard Patch June '96 Choose location where spell takes effect.*/
+ /* WAC made into a void */
+ void
+ throwspell()
+ {
+ 	coord cc;
+ 
+ 
+ /*	if (u.uinwater) {
+ 		pline("You joking! In this weather?"); return 0; 
+ 	} else if (Is_waterlevel(&u.uz)) { 
+ 		You("better wait for the sun to come out."); return 0; 
+ 	} */
+ 	pline("Where do you want to cast the spell?");
+ 	cc.x = u.ux;
+ 	cc.y = u.uy;
+ 	while (1) {
+ 		getpos(&cc, TRUE, "the desired position");
+ 		if(cc.x == -10) {
+ 			u.dx = u.ux; u.dy = u.uy;
+ 			return; /* user pressed esc */
+ 		}
+ 		/* The number of moves from hero to where the spell drops.*/
+ 		if (distmin(u.ux, u.uy, cc.x, cc.y) > 10) {
+ 			You("can't reach that far with your mind!");
+ 		} else if (u.uswallow) {
+ 			pline("The spell is cut short!");
+ 			u.dx = u.ux;
+ 			u.dy = u.uy;
+ 			return;
+ 		} else if (!cansee(cc.x, cc.y) || IS_STWALL(levl[cc.x][cc.y].typ)) {
+ 			Your("mind fails to lock onto that location!");
+ 		} else {
+ 			/* Bingo! */
+ 			u.dx=cc.x;
+ 			u.dy=cc.y;
+ 			return;
+ 		}
+ 	}
+ }
+ 
+ 
+ #endif /*OVL2*/
+ 
+ /*zap.c*/
diff --recursive -P -C3 slashem-0.0.7E7F2/sys/unix/Makefile.dat slethe-0.0.7E7F2/sys/unix/Makefile.dat
*** slashem-0.0.7E7F2/sys/unix/Makefile.dat	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/sys/unix/Makefile.dat	2006-05-28 15:31:15.903965416 +0200
***************
*** 259,265 ****
  	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
  	../util/lev_comp beholder.des
  	../util/lev_comp bigroom.des
  	../util/lev_comp blkmar.des
--- 259,265 ----
  	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 lethe.des
  	../util/lev_comp beholder.des
  	../util/lev_comp bigroom.des
  	../util/lev_comp blkmar.des
***************
*** 274,279 ****
--- 274,280 ----
  	../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 --recursive -P -C3 slashem-0.0.7E7F2/sys/unix/Makefile.top slethe-0.0.7E7F2/sys/unix/Makefile.top
*** slashem-0.0.7E7F2/sys/unix/Makefile.top	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/sys/unix/Makefile.top	2006-05-28 15:31:15.906964960 +0200
***************
*** 126,132 ****
  
  DATHELP = help hh cmdhelp history opthelp wizhelp gypsy.txt
  
! SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev fakewiz?.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 \
--- 126,132 ----
  
  DATHELP = help hh cmdhelp history opthelp wizhelp gypsy.txt
  
! 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 \
***************
*** 135,141 ****
  	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
  QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev
  
  SHARE_DATNODLB = $(CNF_SHARE_DATND)
--- 135,142 ----
  	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 ucastle.lev \
! 	pvalley.lev nkai-?.lev nkai-a-?.lev lethe-?.lev leth-?-?.lev
  QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev
  
  SHARE_DATNODLB = $(CNF_SHARE_DATND)
diff --recursive -P -C3 slashem-0.0.7E7F2/win/share/objects.map slethe-0.0.7E7F2/win/share/objects.map
*** slashem-0.0.7E7F2/win/share/objects.map	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/win/share/objects.map	2006-05-28 15:33:02.111819368 +0200
***************
*** 43,537 ****
  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 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 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 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 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 254 "object, tools, whistle"
! tile 255 "object, tools, flute"
  tile 256 "object, tools, flute"
! tile 257 "object, tools, horn"
  tile 258 "object, tools, horn"
  tile 259 "object, tools, horn"
  tile 260 "object, tools, horn"
! tile 261 "object, tools, harp"
  tile 262 "object, tools, harp"
! tile 263 "object, tools, bell"
! tile 264 "object, tools, bugle"
! tile 265 "object, tools, drum"
  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 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 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 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 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"
--- 43,540 ----
  tile 42 "object, weapons, war hammer"
  tile 43 "object, weapons, heavy hammer"
  tile 44 "object, weapons, staff"
! 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, 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, 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, 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, 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, whistle"
  tile 256 "object, tools, flute"
! tile 257 "object, tools, flute"
  tile 258 "object, tools, horn"
  tile 259 "object, tools, horn"
  tile 260 "object, tools, horn"
! tile 261 "object, tools, horn"
  tile 262 "object, tools, harp"
! tile 263 "object, tools, harp"
! tile 264 "object, tools, bell"
! tile 265 "object, tools, bugle"
  tile 266 "object, tools, drum"
! 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, 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, blood-red"
! tile 368 "object, potions, sparkling"
! tile 369 "object, scrolls, LEP GEX VEN ZEA"
! tile 370 "object, scrolls, IA CTHULHU"
! tile 371 "object, scrolls, PRIRUTSENIE"
! tile 372 "object, scrolls, VERR YED HORRE"
! tile 373 "object, scrolls, YUM YUM"
! tile 374 "object, scrolls, THARR"
! tile 375 "object, scrolls, KERNOD WEL"
! tile 376 "object, scrolls, ELAM EBOW"
! tile 377 "object, scrolls, NR 9"
! tile 378 "object, scrolls, XIXAXA XOXAXA XUXAXA"
! tile 379 "object, scrolls, DAIYEN FOOELS"
! tile 380 "object, scrolls, ZELGO MER"
! tile 381 "object, scrolls, PRATYAVAYAH"
! tile 382 "object, scrolls, VENZAR BORGAVVE"
! tile 383 "object, scrolls, ANDOVA BEGARIN"
! tile 384 "object, scrolls, KIRJE"
! tile 395 "object, scrolls, 4OFAE OF9 SCC9"
! tile 386 "object, scrolls, JUYED AWK YACC"
! tile 387 "object, scrolls, DUAM XNAHT"
! tile 388 "object, scrolls, HACKEM MUCHE"
! tile 389 "object, scrolls, ELBIB YLOH"
! tile 390 "object, scrolls, VE FORBRYDERNE"
! tile 391 "object, scrolls, VELOX NEB"
! 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, 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, 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 --recursive -P -C3 slashem-0.0.7E7F2/win/share/objects.txt slethe-0.0.7E7F2/win/share/objects.txt
*** slashem-0.0.7E7F2/win/share/objects.txt	2005-12-04 15:58:27.000000000 +0100
--- slethe-0.0.7E7F2/win/share/objects.txt	2006-05-28 15:33:02.128816784 +0200
***************
*** 869,874 ****
--- 869,893 ----
    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
***************
*** 7025,7030 ****
--- 7044,7068 ----
    MMMMMMMMMMMMMMMM
    MMMMMMMMMMMMMMMM
  }
+ # tile 389 (IA CTHULHU / demonology)
+ {
+   MMMMMMMMMMMMMMMM
+   MMMMMMMMMMMMMMMM
+   MMMMPOOOOOPKAMMM
+   MMMDOOOOOOKDJMMM
+   MMMMPOOOOOPJAAMM
+   MMMMMAAAAAAPAMMM
+   MMMMMLLLLLLPAMMM
+   MMMMMNJNJAOMAMMM
+   MMMMMLLLLLLPAMMM
+   MMMMMLLJLJLPAMMM
+   MMMMPOOOOOPKAMMM
+   MMMDOOOOOOKDJMMM
+   MMMMPOOOOOPJAAMM
+   MMMMMAAAAAAAAMMM
+   MMMMMMMMMMMMMMMM
+   MMMMMMMMMMMMMMMM
+ }
  # tile 369 (PRIRUTSENIE / taming)
  {
    MMMMMMMMMMMMMMMM
***************
*** 7291,7296 ****
--- 7329,7353 ----
    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 383 (JUYED AWK YACC / destroy armor)
  {
    MMMMMMMMMMMMMMMM
