###############################################################################
# abyss.des: abyss random minivaults, exits and abyssal rune vaults.
# Exit and rune vaults are placed by tag.
#
# Abyssal vaults should usually be minivaults and floating vaults, no larger
# than 28x23. Encompass vaults will be rejected at compile time, and
# other orientations will produce weird results.

: crawl_require('dlua/vault.lua')

{{
 -- Since abyssal stairs don't spawn at the bottom of the Abyss,
 -- replace a vault's empty guarded floor with a floor item at the bottom.
function init_abyss_exit(e, glyph)
  if you.depth() == dgn.br_depth(you.branch()) then
    if crawl.random2(10) > 3 then
      e.kfeat(glyph .. " = exit_abyss")
    else
      e.kitem(glyph .. " = any no_pickup")
    end
  else
    e.kfeat(glyph .. " = exit_abyss w:6 / abyssal_stair w:4")
  end
end

function abyss_entry(e, glyph, category, transparent)
  e.tags("nolayout_encompass")
  e.tags("unrand")
  e.tags("extra")
  e.tags("patrolling")
  e.tags("abyss_entry_" .. category)
  if transparent then
    e.tags("transparent")
  end
  e.kfeat(glyph .. ' = enter_abyss')
  e.tile("c : dngn_stone_wall_blue / dngn_stone_wall_magenta")
  e.tile("t : dngn_demonic_tree_1 / dngn_demonic_tree_7 / \
              dngn_demonic_tree_9 / dngn_demonic_tree_11")
  e.tile("b : dngn_crystal_cyan / dngn_crystal_magenta")
end

-- A function for standardizing randomization with the newer entry vault set.
function index_abyss_entry_randomization(e, clear)
  e.kfeat("t = demonic_tree")
  e.kfeat("z = x")
  e.shuffle("zc' / zc' / yc- / yc- / yb'")
  e.subst("C : cxx")
  e.subst("y = x")
  e.subst("? : ccbTUVtG")
  e.subst("! : cbttGGU")
  e.subst("X : x``")
  e.subst("Y : x``")
  e.subst("Z : x``")
  if clear then
    e.clear("`")
  end
  e.tile("G = dngn_statue_maw / dngn_statue_tentacles / dngn_statue_demonic_bust")
  e.ftile("OA-t : floor_nerves_lightblue / floor_nerves_magenta")
  e.tile("z : wall_abyss_lightblue / wall_abyss_magenta")
end
}}

###############################################################################
# Abyss entries.
# To remix the old experience of seeing multiple Abyss entry vaults across
# D:21-26 or Depths, this now uses a serial vault to place multiple entrances
# across a single D floor, across three categories of monster presence.
###############################################################################

NAME:   serial_abyss_entrance
TAGS:   extra no_dump chance_enter_abyss uniq_abyss_entrance nolayout_encompass
DEPTH:  D:13-15
CHANCE: 33% (D:13), 50% (D:14), 100% (D:15)
# start TAG_MAJOR_VERSION == 34
CHANCE: 33% (D:21-24, D:26), 100% (D:25)
# end TAG_MAJOR_VERSION
{{
  local n, m, o = 1
  if crawl.coinflip() then
    n = 2
    m = 0
  end
  hook("post_place", function()
    dgn.place_maps{tag="abyss_entry_empty", count=n}
    dgn.place_maps{tag="abyss_entry_sparse", count=m}
    dgn.place_maps{tag="abyss_entry_threat", count=o}
  end)
}}

# start TAG_MAJOR_VERSION == 34
# This one is the backup that was used in encompass vaults. The D encompass
# vaults now manually place Abyss entrances if need-be, and this now just 100%
# covers save compat for games that cleared D without spawning the serial vault.
NAME:  abyss_entry
TAGS:  allow_dup overwrite_floor_cell no_exits replace_portal transparent
TAGS:  fallback_enter_abyss uniq_abyss_entrance
PLACE:  Depths:3
KFEAT:  O = enter_abyss
MAP
O
ENDMAP
# end TAG_MAJOR_VERSION

default-depth: D:13-

NAME:    minmay_room_of_horrors
KMONS:   1 = zombie
KMONS:   2 = small abomination
KMONS:   3 = brain worm
KMONS:   _ = chaos spawn / shapeshifter
SHUFFLE: 23
: dgn.delayed_decay(_G, '123', 'place:Abyss:1 corpse')
: abyss_entry(_G, '_', 'threat', true)
MAP
xxxxxc
x3113x
+1221x
x1221x
x311_x
cxxxxx
ENDMAP

NAME:    abyss_entry_small_statue_room
SUBST:   c : cx
: abyss_entry(_G, 'O', 'empty', false)
: tile("c = " .. crackle_def(_G))
MAP
cxxxc
xGOGx
cx+xc
ENDMAP

NAME:    abyss_entry_crystal
KFEAT:   t = demonic_tree
SHUFFLE: AB
SUBST:   A : .:50 G:50 T U V Y t
SUBST:   B : .:100 G
: abyss_entry(_G, 'O', 'empty', true)
MAP
  xxxxx
 xxbbbxx
xxbbObbxx
xbbA.Abbx
xbB...Bbx
xb.....bx
ENDMAP

NAME:    abyss_entry_glasseish
WEIGHT:  5
MONS:    tentacled starspawn / starcursed mass / wretched star, demonic plant
KFEAT:   ^ = trap_devourer
SUBST:   T : Tl12^A
KPROP:   Tl12^A = no_tele_into
KMASK:   !l12^A = opaque
: abyss_entry(_G, 'O', 'empty', true)
MAP
nnn nnn
nTn.nTn
nnn.nnn
 ..O..
nnn.nnn
nTn.nTn
nnn nnn
ENDMAP

NAME:    abyss_entry_flame_altar
KMONS:   O = efreet / fire elemental w:25
KFEAT:   _ = altar_lugonu
SUBST:   A : deG
: single_cloud(_G, "d", "flame", false)
: single_cloud(_G, "e", "seething chaos", true)
: abyss_entry(_G, 'O', 'sparse', false)
MAP
 bbb
bbObb
bA_Ab
  @
ENDMAP

NAME:    hangedman_abyss_entry_splay
KFEAT:   t = demonic_tree
SHUFFLE: ABCDE
SUBST:   A : tcxx.., B : tcxx.., CDE = x, F : ccxxb
: abyss_entry(_G, 'O', 'empty', false)
MAP
        xx..
        x.A.
        xx..
        x.C......
        xF.D.E.B.
      xxx.F.x.x.x
xxxxxxx.O.xxxxxxx
x.x.x.F.xxx
.B.E.D.Fx
......C.x
     ..xx
     .A.x
     ..xx
ENDMAP

NAME:   nicolae_abyss_entry_one_way_or_another
WEIGHT: 5
# One banisher and two mage types who can show up in the Abyss.
MONS:   vampire, vampire ; leather armour . long sword ego:distortion
MONS:   occultist, occultist ; robe . dagger ego:distortion
MONS:   efreet, efreet ; scimitar ego:distortion
NSUBST: 1 = 1:1 / 1:3 / 1 = 1:45 2:5 3:45 4:5 / 1 = 5:90 6 / *:'
: abyss_entry(_G, 'O', 'threat', true)
FTILE:  " = floor_pebble_blue
FTILE:  '123456O : floor_mystic_chasm / floor_pebble_blue
MAP
   ......
  ..bbbb..
 ..b''''b..
..b''''''b..
.b''bb3''b...
.""b'1O1'b"".
...b''3bb''b.
 ..b''''''b..
  ..b''''b..
   ..bbbb..
    ......
ENDMAP

####

NAME:    regret_index_abyss_entry_inbetween
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'empty', true)
MAP
        c
        x
        xx
        x.x@
       Zx..x
       .zA..x
      Y'xzxxxxc
    X.'O'.X
cxxxxzx'Y
  x..Az.
   x..xZ
   @x.x
     xx
      x
      c
ENDMAP

NAME:    regret_index_abyss_entry_starvergence
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'empty', true)
MAP
      c
      x
cx.   x   .xc
 .x.  z  .x.
   xz.'.zx
     'O'
     .'.
    z   z
    x   x
   x.   .x
  x.     .x
  c       c
ENDMAP

NAME:    regret_index_abyss_entry_transport_node
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'empty', true)
MAP
     C
   xx@xx
  xx.c.xx
 xx?x...xx
 x.x.....xx
C@c..!..z'x
 x.....z'xx
 xx...zOxx
  xx.z'xx
   xx'xx
    xxx
ENDMAP

# An iterative play on abyss_entry_small_statue_room.
NAME:    regret_index_abyss_entry_closets
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'empty', true)
MAP
     xcx
    xx?x
    xA'+
    xx?x.
 xxx czx..
xxAxc...xx+xx
C?'?z...z!'!C
xx+xx...cxOxx
   ..xzc xxx
    .x?xx
     +'Ax
     x?xx
     xcx
ENDMAP

NAME:    regret_index_abyss_entry_x_intersection
NSUBST:  O = 1:O / * = OA
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'empty', true)
MAP
     cx   xc
    ..xx xx..
  xc...xxx...cx
 xx.z...C...z.xx
xx...z.....z...xx
x'.!..c.?.c..!.'x
xxO..xx...xx..Oxx
 xx'xx..C..xx'xx
  xxx...x...xxx
     ..xxx..
ENDMAP

NAME:    regret_index_abyss_entry_x_curling
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'empty', true)
MAP
xxxxxxxx
x.?...'x
x.....cx.
x...x....cxxxxx
x.O.xz..X.x'Y'x
x'Y'x.X..zx.O.x
xxxxxc....x...x
      .xc.....x
       x'...?.x
       xxxxxxxx
ENDMAP

NAME:    regret_index_abyss_entry_sea_shelf
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'empty', true)
MAP
   xX
  x..x
C...x  Y
xx.   x
 xx. z. Z
  xx..'x  Y
   xc'O'.x
    xc'.z  x
     xc.  x.X
      xx. ..x
       xx..x
        xx.
         xC
ENDMAP

NAME:    regret_index_abyss_entry_ys
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'empty', true)
MAP
  X.
  .x.
  .x.
   .c.
  .x.x.
  .x.x.
..x. .x'
xx.   .zOz.   .xx
         'x. .x..
          .x.x.
          .x.x.
           .c.
            .x.
            .x.
             .X
ENDMAP

NAME:    regret_index_abyss_entry_already_here
TAGS:    no_monster_gen
WEIGHT:  5
MONS:    ugly thing, shapeshifter, basilisk
NSUBST:  1 = 1:1 / 1:2 / 1:3 / *:., b = 1:O / *:b
TILE:    b = bedevilled_crystal_abyss
: set_feature_name("crystal_wall", "bedevilled crystal wall")
: abyss_entry(_G, 'O', 'sparse', true)
MAP
 ..xxx..
x.x...x..
.x..b..x.
..x..1x...xxx...
 ..xxx...x...x.x
  ......x..b..x.
  .......x1..x..
 ..xxx....xxx..
..x..1x.......
.x..b..x......
x.x...x...xxx..
...xxx...x1..x..
       .x..b..x.
       ..x...x.x
        ..xxx...
ENDMAP

NAME:    regret_index_abyss_entry_degrid
MONS:    kobold brigand, ynoxinul
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'sparse', true)
MAP
   XxX  YxY
    x    x
   .x    x.
X ..x.  .x.. Z
xxxx-xxcx.xxxx
X  .x....z.  Z
    x.?'1x
    c.'2'c
Y  .x.1'Ox
xxxx.zxcxc
Y ..x.
   .x
    x
   ZxZ
ENDMAP

NAME:    regret_index_abyss_entry_contrepoint
MONS:    raiju, boulder beetle
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'sparse', true)
MAP
          axxxx
   xxx   .x..1xx
  xx.xA  z'.?.c@C
 xx...x'O'x..1xx
C@c2?.'z  Ax.xx
 xx...x.   xxx
  xxxxa
ENDMAP

NAME:    regret_index_abyss_entry_negative
MONS:    basilisk, ugly thing, efreet
MONS:    arcanist, shapeshifter, small abomination
NSUBST:  O = 1:O / * = OA
SHUFFLE: 12 / 34 / 24 / 56 / 56
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'sparse', true)
MAP
Cxxx
.Z.x
...x
xxxx..xxxx
x......Y.x
xA...?...x
xxxx..cxxx..xxxx
.Z.x..x'1......x
...x..xO'.?..X.x
xxxx..zxxz..xxxx
x.X..?.'Ox..x...
x......1'x..x.Z.
xxxx..xxxc..xxxx
      x...?...Ax
      x.Y......x
      xxxx..xxxx
            x...
            x.Z.
            xxxC
ENDMAP


NAME:    regret_index_abyss_entry_x_dapple
MONS:    shapeshifter
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'sparse', true)
MAP
C         c
.x  x x  x.
X.x ... x.Y
  .x.?.x.
   .'1'.
  x.zOz.x
   .'1'.
  .x.?.x.
Y.x ... x.X
.x  x x  x.
c         C
ENDMAP

NAME:    regret_index_abyss_entry_columnal
MONS:    kobold demonologist band
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'sparse', true)
MAP
  .X
 .x.X  .x.Z
.xxx. .xxx.Z
xCc.x.xxcxx.
.xxx. 'x1x.
Y.x.   'z.
 Y.     O     .Y
       .z'   .x.Y
      .x0x' .xxx.
     .xxcxx.x.cCx
     Z.xxx. .xxx.
      Z.x.  X.x.
             X.
ENDMAP

NAME:    regret_index_abyss_entry_earlier_magic
MONS:    occultist / ogre mage, rakshasa, boggart
SUBST:   - : xc++., 0 = 123, D : x.., E : x..
SHUFFLE: AO
: vault_metal_statue_setup(_G, "G", "dimensional conduit")
: abyss_entry(_G, 'O', 'threat', true)
FTILE:   .123AO+G : floor_mystic_chasm / floor_grey_dirt_b
MAP
    x'''@''xx''
   xxx....xx..''@
  xx.xx..cc....''
 xx...xx++......''
xx..D..+-+..E...xxx
'x.....++xx....xxAx
''x...cc..x...xx0.x
 ''x.xx...xx.xx1..x
 @''xx..G..xxx....x
   'x2.....+.....3x'
    x....xxx..G..xx''@
    x..1xx.xx...xx.x''
    x.0xx...x..cc...x''
    xOxx....xx++.....x'
    xxx...E..+-+..D..xx
     ''......++xx...xx
      ''....cc..xx.xx
      @''..xx....xxx
        ''xx''@'''x
ENDMAP

NAME:    regret_index_abyss_entry_lash
KMONS:   1 : orc warrior / two-headed ogre / deep elf pyromancer
KMONS:   2 = abyssal acolyte
KFEAT:   y = c
KFEAT:   z = x
SHUFFLE: AB / CD, IJKLM, 0G / 0G / G0
SUBST:   A : "zzz, B : cybb, CD = ', IJ : xcc, K : x`, LM = .
NSUBST:  0 = 1:2 / *:1
FTILE:   '12OG : floor_mystic_chasm / floor_grey_dirt_b
FTILE:   " : floor_nerves_blue / floor_nerves_magenta
TILE:    b : dngn_crystal_blue / dngn_crystal_magenta
: tile("y = " .. crackle_def(_G))
TILE:    z = wall_abyss_blue
: abyss_entry(_G, 'O', 'threat', true)
CLEAR:   `
MAP
     J.   I   .J
      J   I   J
      J   I   J
       J  .  J
 K      . x .      K
 .KK    xxxxx    KK.
    K  xxx0xxx  K
     .xxx'''xxx.
    xxxx'ACB'xxxx
LL.xxxx0'DOD'0xxxx.LL
    xxxx'BCA'xxxx
     .xxx'''xxx.
    M  xx'x'xx  M
 .MM    xx'xx    MM.
 M       .x.       M
ENDMAP

NAME:    regret_index_abyss_entry_entwine
MONS:    raiju, orc sorcerer
: index_abyss_entry_randomization(_G, true, "")
: abyss_entry(_G, 'O', 'threat', true)
MAP
x.X          Y.x
x..   Cxxx   ..x
 xx.xx1''.xx.xx
  .c...O?2..c.
 xx.xx1''.xx.xx
x..   xxxC   ..x
x.Y          X.x
ENDMAP

NAME:    regret_index_abyss_entry_flowthrough
KMONS:   1 : orc warrior / two-headed ogre / deep elf pyromancer
KMONS:   2 = abyssal acolyte
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'threat', true)
MAP
cxxxxxc
.......
...X...
 c...xxxxxxx
 x..xC'....xx
 xY.x'......xx
 x..x'?1zx.Z.x
 x..xx1O2xx..x
 x.Z.xz1?'x..x
 xx......'x.Yx
  xx....'Cx..x
   xxxxxxx...c
         ..X...
         ......
         cxxxxc
ENDMAP

NAME:    regret_index_abyss_entry_passing_by
MONS:    draugr, laughing skull
: index_abyss_entry_randomization(_G, false)
: abyss_entry(_G, 'O', 'threat', true)
MAP
   x..x
   xX.x
   x..x
xxxx..cxxxx
.Y......Z'xx
.....xx...!xx
Cxxc.xzxx+.'x
   x..x11x.Zx
   xZ.xO2x..x
   x'.xxxzx.cxxC
   xx?...xx.....
    xx'Z......Y.
     xxxxc..xxxx
         x..x
         x.Xx
         x..x
ENDMAP

NAME:    regret_index_abyss_entry_edifice
KMONS:   1 : shapeshifter / necromancer
KMONS:   2 : small abomination / zombie w:15
KMONS:   O = abyssal acolyte
SHUFFLE: 1234, lw / lw / wl
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'threat', true)
MAP
cxxxCxCxCxxxc
....2cOc2....
 .'xz1c1zx'.
.xx'.z.z.'xx.
c..?x. .x?..c
   'x. .x'
  .x'X X'x.
 .c.X   X.c.
ENDMAP

NAME:    regret_index_abyss_entry_elemental
TAGS:    no_pool_fixup
MONS:    fire elemental, water elemental, cyclops, harpy
KMONS:   O = abyssal acolyte
SHUFFLE: 1234, lw / lw / wl
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'threat', true)
MAP
   c     c
  x.x X x.x
 x...x.x...x
c..?..C..2..c
 x..1zxx...x
  x.zxl'x.x
 Y.xx'O'xx.Y
  x.x'lxz.x
 x...xxz4..x
c..3..C..?..c
 x...x.x...x
  x.x X x.x
   c     c
ENDMAP

NAME:    regret_index_abyss_entry_x_interlace
MONS:    ugly thing, rakshasa / ynoxinul
: index_abyss_entry_randomization(_G, true)
: abyss_entry(_G, 'O', 'threat', true)
MAP
       x   x
 X   Z .x x. Z   Y
x.   .x..x..x.   .x
 x. .x.'x.x'.x. .x
  x.x..z'1'c..x.x
   C....1O1....C
  x.x..c'2'z..x.x
 x. .x.'x.x'.x. .x
x.   .x..x..x.   .x
 Y   Z .x x. Z   X
       x   x
ENDMAP

###############################################################################
# abyss random vaults
###############################################################################

default-depth: Abyss

###############################################################################
# Dummy vaults
NAME: abyss_furniture_dummy
TAGS: dummy
CHANCE: 90% (Abyss:1)
CHANCE: 80% (Abyss:2)
CHANCE: 70% (Abyss:3)
CHANCE: 60% (Abyss:4)
CHANCE: 50% (Abyss:5)
CHANCE: 40% (Abyss:6)
CHANCE: 30% (Abyss:7)

NAME: abyss_rune_dummy
TAGS: abyss_rune unrand dummy
CHANCE: 10%

# FIXME: the tag name is inaccurate with abyssal stairs placed by these vaults.
NAME: abyss_exit_dummy
TAGS: abyss_exit unrand dummy
CHANCE: 95% (Abyss:1)
CHANCE: 90% (Abyss:2)
CHANCE: 85% (Abyss:3)
CHANCE: 80% (Abyss:4)
CHANCE: 75% (Abyss:5)
CHANCE: 70% (Abyss:6)
CHANCE: 65% (Abyss:7)

NAME:    abyss_fake_exit
TAGS:    allow_dup
WEIGHT:  1
KFEAT:   O = exit_abyss mimic w:6 / abyssal_stair mimic w:4
MAP
O
ENDMAP

###############################################################################
NAME: abyss_furniture_001
TAGS: extra allow_dup
MAP
G.G
.V.
G.G
ENDMAP

#################################################################
# Ecumenical Temple... (1KB)
# 'cuz the fun haters removed overflow temples from the Abyss...
NAME:    abyss_greek_temple
TAGS:    no_rotate
KMONS:   p = plant
KMONS:   b = bush
KFEAT:   g = granite_statue
KFEAT:   A = altar_ashenzari
KFEAT:   C = altar_cheibriados
KFEAT:   D = altar_dithmenos
KFEAT:   E = altar_elyvilon
KFEAT:   F = altar_fedhas
KFEAT:   G = altar_gozag
KFEAT:   H = altar_hepliaklqana
KFEAT:   K = altar_kikubaaqudgha
KFEAT:   M = altar_makhleb
KFEAT:   N = altar_nemelex_xobeh
KFEAT:   O = altar_okawaru
KFEAT:   Q = altar_qazlal
KFEAT:   R = altar_ru
KFEAT:   S = altar_sif_muna
KFEAT:   T = altar_trog
KFEAT:   U = altar_uskayaw
KFEAT:   V = altar_vehumet
KFEAT:   W = altar_wu_jian
KFEAT:   X = altar_xom
KFEAT:   Y = altar_yredelemnul
KFEAT:   Z = altar_zin
KFEAT:   1 = altar_the_shining_one
SHUFFLE: ACDEFGHKMNOQRSTUVWXYZ1
FTILE:   "ACDEFGHKMNOQRSTUVWXYZ1 : floor_limestone w:5 / floor_nerves
NSUBST:  . = 3:1 / 2:2 / *:.
SUBST:   ' = .
SUBST:   " = .
COLOUR:  " : white w:5 / none
MAP
''''''.................
''ccccccccccccccccccc..
''g'c"""E"""""""U"""c..
''''c"A"""K"""R"""Y"c..
''g'c"""F"""O"""V"""ct.
''''+"C"""M"""S"""Z"c..
''g'c"""G"""Q"""W"""c..
''''c"D"""N"""T"""1"c.t
''g'c"""H"""""""X"""c..
''ccccccccccccccccccc..
.......t........ttt....
ENDMAP

# <bh> I got the idea after I introduced a bug where the whole floor of
#        the abyss turned into altars
NAME:   bh_abyss_xom_lugonu_altar
TAGS:   extra allow_dup
COLOUR: " : magenta w:2 / white
KFEAT:   _ = altar_lugonu
KFEAT:   X = altar_xom
SUBST:   a = XXX"
SUBST:   b = X"
SUBST:   c = XX"
SUBST:   d = X""
SUBST:   e = X"""
MAP
   ebe
  dcacd
 ec"""ce
 ba"_"ab
 ec"""ce
  dcacd
   ebe
ENDMAP

# Inspired by a bug which turned Lemuel's castle moat into draconians...
NAME:   hangedman_abyss_monster_moat
TAGS:   no_monster_gen patrolling
MONS:   fire bat w:12 / bat simulacrum / spectral bat / bat
MONS:   vampire, vampire knight / vampire mage w:7
MONS:   crimson imp w:12 / white imp / shadow imp / iron imp
MONS:   kobold demonologist, deep elf demonologist
MONS:   scorpion w:40 / vampire mosquito w:20 / hornet
KMONS:  8 = demonic crawler
KMONS:  9 = emperor scorpion / death scarab
KMONS:  D = place:D:1 perm_ench:shapeshifter w:30 / \
            small abomination w:15 / chaos spawn
KMONS:  E = ugly thing / neqoxec w:3
KMONS:  F = very ugly thing / kobold fleshcrafter w:7
: local g = "good_item no_pickup"
: item("storm dragon scales " .. g .. " / shadow dragon scales " .. g .. " / " ..
:      "quicksilver dragon scales " .. g .. " / buckler " .. g .. " / " ..
:      "tower shield w:20 " .. g)
SHUFFLE: 123 / 456 / 789 / DEF
SUBST:  C = xccv, w : w:8 l:1 .:1, W : .:9 W:1
MAP
 CCCC  CCCCCCCCCC  CCCC
CC 1cccc+2WWWW5+cccc4 CC
C 11nd32ccc++ccc56dn44 C
C 11c3d3c1WwwW4c6d6c44 C
C 11ccncc11ww44ccncc44 C
C  11111111ww44444444  C
C   111111 ww 444444   C
.C                   .C.
 .CC .C. CCCCCC .C. CC.
ENDMAP

NAME:   hangedman_abyss_sting
TAGS:   no_item_gen no_monster_gen uniq_hornetnest
KMONS:  1 = orange demon
KMONS:  2 = hornet / brain worm w:2 / ribbon worm w:2
KMONS:  3 = death drake / green death / spark wasp w:2
ITEM:   potion of curing pre_id q:3 / scroll of poison pre_id q:2
KFEAT:  123 = W
NSUBST: 3 = 1:3 / 1:d / *:.
: dgn.delayed_decay(_G, '3', 'raiju corpse')
COLOUR: x = yellow
TILE:   x = wall_wax
MAP
 xxxxxxx
xx22222xx
x2...222x
x2.++xx3x
x2.+1 xxx
x2.x 1 xx
x22xx W x
xx23xx W
 xxxxxx W
ENDMAP

NAME:   hangedman_abyss_overflow_altar
TAGS:   no_item_gen no_monster_gen no_pool_fixup
MONS:   screaming refraction
KFEAT:  A = altar_lugonu
KFEAT:  B = dry_fountain
KFEAT:  C = abyssal_stair
SUBST:  x = xcv++, y = ..w, z = Wl
MAP
yyyyyyyy
yxxxxxxy
yxzzzzxy
yxzABzxy
yxz0Czxy
yxzzzzxy
yxxxxxxy
yyyyyyyy
ENDMAP

NAME:   hangedman_abyss_mock_shop
TAGS:   no_monster_gen patrolling
KMONS:  1 = water elemental w:5 / nothing w:5
KMONS:  2 = screaming refraction
KMONS:  0 = abyssal acolyte
KFEAT:  0 = abandoned_shop
KFEAT:  1 = dry_fountain
SUBST:  x = xcv, . = ...W
MAP
     . .
  ..xx.xx..
xxxxx1$1xxxxx
x.2..$0$..2.x
xxxxx1$1xxxxx
  ..xx.xx..
     . .
ENDMAP

NAME:    hangedman_abyss_shoalhut
TAGS:    no_pool_fixup patrolling
MONS:    red devil w:30 / smoke demon / eye of devastation w:5 / \
         unseen horror / ynoxinul / snapping turtle simulacrum w:15 / \
         apocalypse crab w:1 / tentacled starspawn w:1
KITEM:   d = $, $, demon trident / throwing net q:1 / longbow w:4 / \
             large rock q:8 w:4
NSUBST:  a = 1:+ / 1:xx+ / *:x, 1 = 1:1 / 2:. / * = 1.
SUBST:   x = xxxxcccvb, l = wWll
KMASK:   wWl = no_monster_gen
MAP
   l l
 lxxaxxl
 xx.1.xx
lx.1.1.xl
 a1.d.1a
lx.1.1.xl
 xx.1.xx
 lxx+xxl
   l l
ENDMAP

NAME:   bh_silent_lugonu_exit
TAGS:   allow_dup
MONS:   silent spectre
KFEAT:   _ = altar_lugonu
MAP
...       xxx
._.       x1x
...       xx+
ENDMAP

NAME:    hangedman_abyss_feature_spike
TAGS:    extra no_item_gen no_pool_fixup allow_dup
MONS:    fungus, plant, bush, pile of debris
ITEM:    stone q:1, large rock q:1, human skeleton
KFEAT:   - = altar_lugonu
KMASK:   wWl = no_monster_gen
SHUFFLE: fghij / opqrs, fghijopqrs / JKLMNOPQRS
SHUFFLE: fghij / fffff / fffff / fffff / fffff / fghgf / fgfgf / ffhii / ffhii
SHUFFLE: opqrs / ooooo / ooooo / ooooo / ooooo / opqpo / opopo / ooqrr / ooqrr
SHUFFLE: JKLMN / JJJJJ / JJJJJ / JJJJJ / JJJJJ / JKLKJ / JKJKJ / JJLMM / JJLMM
SHUFFLE: OPQRS / OOOOO / OOOOO / OOOOO / OOOOO / OPQPO / OPOPO / OOQRR / OOQRR
SUBST:   g = C, h = T, i = U, j = V
SUBST:   o = t, p = G, q = w, r = W, s = l
SUBST:   J = x, K = c, L = v, MN = m, O = 1, P = 2, Q = 3, R = 4, S = b
CLEAR:   -
SHUFFLE: AACCTTUUVYYdeefghi, tGGwWlI, xxccvvbbmm+123
MAP
        .....
        .LqL.
        .QhQ.
        .....
          .
     .          .
    ....      ....
    .pK.      .Mr.
    .Pg.      .iR.
    ....      ....
          -
 .                 .
....             ....
.oJ.             .Ns.
.Of.             .jS.
....             ....
ENDMAP

NAME:    hangedman_abyss_theft
TAGS:    no_monster_gen
KMONS:   1 = place:Lair:$
KMONS:   2 : place:Swamp:1 / place:Swamp:$
KMONS:   3 : place:Snake:1 / place:Snake:$
KMONS:   4 : place:Shoals:1 / place:Shoals:$
KMONS:   5 : place:Spider:1 / place:Spider:$
KMONS:   6 = place:Orc:$
KMONS:   7 : place:Elf:1 / place:Elf:$
KMONS:   8 : place:Crypt:1 / place:Crypt:$
KMONS:   9 : place:Hell / place:Slime
KMONS:   A = plant
KMONS:   B = bush
ITEM:    swamp dragon scales / barding / mundane javelin q:2 / \
         potion of ambrosia pre_id / book of weapons / \
         randbook disc:necromancy / demon blade / acid dragon scales
SHUFFLE: Gwm, xcvbwm, wwl, mmttB, 1234567, 1689
KMASK:   B = no_item_gen
MAP
     ..xbb..
 A x .xxbbb. b A
  x  xx1cvbb  b
 x  x...vc..b  b
   x.x.1cv...b
..x...x.vc2.b.b..
.xx..1..cv.b..bb.
xxbvbvbd$d..2.2bb
ccvbvbv$G$xcxcxbb
cc3.3..d$dcxcxcvv
.cc..c.xb..4..vv.
..c.c.3bx.v...v..
   c...xb4.v.v
 c  c..bx...v  v
  c  ccxb4vv  v
 A c .ccvvv. v A
     ..cvv..
ENDMAP

NAME:    hangedman_abyss_lost_library
TAGS:    patrolling no_monster_gen no_item_gen
MONS:    kobold fleshcrafter / cognitogaunt, great orb of eyes
MONS:    glowing orange brain, boggart, rakshasa / abyssal acolyte
MONS:    cacodemon / zykzyl, shadow demon
KMONS:   0 = occultist
KMONS:   8 = orc sorcerer
KMONS:   9 = guardian sphinx
KMONS:   & = lich
KMONS:   @ = deep elf sorcerer
KMONS:   Z = nonbase draconian
ITEM:    parchment w:19 / randbook numspells:2 w:1
ITEM:    scroll of amnesia pre_id / scroll of identify pre_id / \
         scroll of silence pre_id / scroll of noise pre_id
KFEAT:   _ = altar_sif_muna
SHUFFLE: ABCDEF
NSUBST:  A = 1:0 / 1:d / 1:dee / *:., B = 1:1 / 1:d / 1:dee / *:.
NSUBST:  C = 1:2 / 1:d / 1:dee / *:., D = 3:1 / 1:d / 1:dee / *:.
NSUBST:  E = 1:4 / 1:d / 1:dee / ., F = 1:& / 2:d / 1:e / *:.
NSUBST:  + = 2:+ / x, - = 2:+ / x
SHUFFLE: 0123456789', '''''''''@, &@Z
SUBST:   ' = ., a = +wl x:45, _ : _:30 TUVY .:35
SUBST:   x = x:20 c:4 v:1 b:1 +:2 .:2, X = x:20 c:5 v:2 b:2 .:1
FTILE:   + = floor_hall
MAP
 . .. .. .. .. .. .
..X++XXXXXXXXXXXXX..
 XX. xx xxx xxx xXX
.+._ xAAAxBBBxCCCxX.
.+  .xAAAaBBBaCCC X.
 XX..xAAAxBBBxCCCxX
.XX..xx xxx xxx xxX.
.X .............. X.
.X .............. X.
.Xxx xxx xxx xx..XX.
 XxDDDxEEExFFFx..XX
.X DDDaEEEaFFFx.  -.
.XxDDDxEEExFFFx _.-.
 XXx xxx xxx xx .XX
..XXXXXXXXXXXXX--X..
 . .. .. .. .. .. .
ENDMAP

NAME:    hangedman_abyss_batty_box
MONS:    fire bat / vampire bat, butterfly, hellwing
MONS:    spatial vortex, sky beast, obsidian bat, unseen horror
KMONS:   8 = wind drake perm_ench:glowing_shapeshifter
KITEM:   8 = rapier ego:electrocution randart / \
             staff of air / cloak good_item
NSUBST:  A = 2:2 / 1:2 / 2 = 1122., B = 1:3 / 1:4 / 1:1334. / 1:12334.
NSUBST:  C = 1:556 / 1:6 / 1:7 / 1:66777. / 1:1234567.
SUBST:   x = x:25 c:14 v:6 b:4 G:1 n:2, y = c:3 v:1 b:1, z = x:2 c:1 v:1 b:1 .:1
MAP
 xxxxxxxxxx.
xx x x x x.x
x x0x x.x.x
xx0x.x1x.x.x
x x.x1x.x.x.
xx x1++xyyyy
x x.x+xAzCzy
xx1x.xAAABCy
x x.xyzACBzy
xx.x.yCBB8zy
x.x.xyzCzzzy
.x x.yyyyyyy
ENDMAP

NAME:    hangedman_glass_garden
TAGS:    no_monster_gen no_pool_fixup decor extra
DEPTH:   D, Depths, Abyss
WEIGHT:  5 (Abyss), 2
MONS:    butterfly, plant, unseen horror, shadow wraith
ITEM:    potion of invisibility pre_id q:2, spriggan skeleton
SHUFFLE: 34GT, GTt
: if you.in_branch("Abyss") then
TAGS:    no_exits
SHUFFLE: 34f", ABCD / ACBD / ADCB
SUBST:   + = M, ' = x:5 c:2 v:1 b:1, " = ., % = %%***|
SUBST:   AB : wwl, CD : wll
NSUBST:  M : 1:+ / 2 = mmm+ / * = m:19 +:1
: else
SUBST:   M = m, 3'" = ., 4 = F, ABCD = W
:   decorative_floor(_G, 'F', "flower patch")
: end
MAP
   ''' '''
  'MmM+MmM'
 'MmAA.BBmM'
'MmA..2..BmM'
'mA.2.4.2.Bm'
'MA..1G1..BM'
 +.2T3d3T2.+
'MC..1G1..DM'
'mC.2.4.2.Dm'
'MmC..2..DmM'
 'MmCC.DDmM'
  'MmM+MmM'
   ''' '''
ENDMAP

NAME:    hangedman_shadowy_showcase
TAGS:    transparent no_monster_gen
MONS:    shadow wraith / unseen horror / thrashing horror
MONS:    lurking horror / screaming refraction w:4
MONS:    shapeshifter / ugly thing / large abomination w:2, wretched star
MONS:    large abomination / cognitogaunt, ancient zyme
MONS:    large slime creature w:12 / rakshasa w:2
KMONS:   8 = starcursed mass
KMONS:   9 = glass eye / chaos spawn / anaconda perm_ench:shapeshifter w:2
KMONS:   0 = tentacled starspawn
KMONS:   A = patrolling shadow demon
KMONS:   B = boggart
KFEAT:   T = fountain_eyes
ITEM:    parchment disc:summoning / \
         scarf ego:shadows / scarf ego:invisibility / \
         wand of polymorph charges:20 / protean talisman randart / \
         shadow dragon scales good_item / any ally scroll q:1 pre_id
SHUFFLE: 12 / 34 / 56 / 78 / 90, A' / A' / A' / A' / 'B
SUBST:   x = x:5 c:6 v:1, X = x:2 c:4 b:3 v:1, ' = ..lw
MAP
   ...xxxxxxx
  @.. xxxxxxx
 @. .xx ..2xx
.. ..xx.x1.xx
......x..x.xxx
. xx.d.... xxxx
xxxxx.X.XXXXXxxxxxx
xx ....T.X'AXxxxxxx
xx.x..X.A$d'X 3.3xx
xx..x.XX$>$XX.x..xx
xx1.1 X'd$A.X..x.xx
xxxxxxXA'X.T.... xx
xxxxxxXXXXX.X.xxxxx
    xxxx ....d.xx.
     xxx.x..x... ..
      xx.3x.xx.....
      xx4.. xx . @
      xxxxxxx...@
      xxxxxxx ..
ENDMAP

NAME:    hangedman_relentless_pull
TAGS:    no_monster_gen no_item_gen
MONS:    ugly thing / large abomination / ynoxinul / unseen horror / smoke demon
MONS:    tentacled starspawn / starcursed mass
MONS:    cognitogaunt / reaper, wretched star, lurking horror, ancient zyme
ITEM:    partisan good_item / demon trident ego:distortion / \
         bardiche ego:chaos good_item w:5 / demon trident ego:chaos w:5 / \
         protean talisman randart / gold q:100
SHUFFLE: 2d, 34eAB / 34eAB / '''CD, 34 / 56
SUBST:   e = d, AB = x, C = ., D = @, x = xxccb
MAP
 xxxxx         xxxxx
xx%1xx@       Bxx3exx
 x....xx.   .xxA43ex
xx.xxxxxxx xxxxxxx.xx
 x.xd. .2x x3. .dx.x
xx.xx.x.xxxxx.x.xx.xx
 x..xx.x.xxx.x.xx..x
xx..x.. xxxxx ..x..xx
 x..x .x. x .x. x..x
xx .xx..x.x.x..xx. xx
xxx..x....%....x..xxx
 xx .%.xx.1.xx.%. xx
  xx .xxxxxxxxx. xx
   xxxx x x x xxxx
ENDMAP

NAME:    hangedman_steaming_rock
TAGS:    transparent
KMONS:   1 = ynoxinul / smoke demon / thrashing horror / unseen horror / \
             ugly thing w:5 / rakshasa w:5 / chaos spawn w:5 / \
             screaming refraction
KMONS:   2 = smoke demon / green death / catoblepas w:8 / ophan w:7 / \
             fire crab w:5
KMONS:   3 = apocalypse crab / death drake w:5
KITEM:   3 = $, orb, $
KITEM:   23 = wand of digging charges:1, staff of earth / staff of air / \
              parchment disc:earth w:5 / parchment disc:air w:5 / \
              mundane granite talisman w:20
KFEAT:   ABCD = .
SUBST:   c = cccbbv
SHUFFLE: ABCD
MARKER:  A = lua:fog_machine {cloud_type = "flame", \
             pow_min = 2, pow_max = 3, delay = 40, size_min = 4, size_max = 6, \
             walk_dist = 2, start_clouds = 2, excl_rad = 0 }
MARKER:  B = lua:fog_machine {cloud_type = "freezing vapour", \
             pow_min = 2, pow_max = 3, delay = 55, size_min = 4, size_max = 6, \
             walk_dist = 2, start_clouds = 2, excl_rad = 0 }
MARKER:  C = lua:fog_machine {cloud_type = "poison gas", \
             pow_min = 3, pow_max = 4, delay = 30, size_min = 4, size_max = 6, \
             walk_dist = 2, start_clouds = 2, excl_rad = 0 }
MARKER:  D = lua:fog_machine {cloud_type = "calcifying dust", \
             pow_min = 2, pow_max = 3, delay = 75, size_min = 2, size_max = 3, \
             walk_dist = 2, start_clouds = 2, excl_rad = 0 }
MAP
   ....
  .cccc.
 .mmmccc..
.cmmAcmccc.
.cmAcmmmmcc.
.cccmm   mcc.
 ..cm 322 mc.
 ..cm 422 mc.
.cccmm   mcc.
.cmDcmmmmcc.
.cmmDcmccc.
 .mmmccc..
  .cccc..
   ....
ENDMAP

NAME:    hangedman_classic_abyss_death
TAGS:    transparent no_monster_gen
MONS:    large abomination / ynoxinul / unseen horror / \
         sixfirhy / smoke demon / neqoxec / \
         efreet / rakshasa / glowing orange brain / ugly thing / \
         golden eye / hell hog
MONS:    lich / hellephant / tentacled monstrosity / profane servitor / \
         death drake / daeva / angel / bone dragon / balrug w:4 / \
         shadow demon w:4 / executioner w:4 / hellion w:4
ITEM:    any book / mundane staff of necromancy / robe randart / \
         orb ego:energy / gold q:100 w:2
ITEM:    demon whip / demon blade / demon trident
KFEAT:   > = abyssal_stair
SHUFFLE: lw / ll / ww / ''
NSUBST:  2 : 2:2 / *:1
SUBST:   c = ccvbb, x = xxxc, ' = .
MAP
         c
        cc
       cc.
      ccx.@
     cc1x..x
    cc$xx wxx
   cce1.x$ w.@
  cc2x1xdx$ ...cc
 ccxxxxe>exxxxcc
cc... $xdx1x2cc
   @.l $x.1ecc
    xxl xx$cc
     x..x1cc
      @.xcc
       .cc
       cc
       c
ENDMAP

NAME:    hangedman_illusive_loot
TAGS:    patrolling
WEIGHT:  5
MONS:    rakshasa ; whip good_item | trident good_item | long sword good_item . \
                    ring mail good_item | kite shield good_item . \
                    mundane javelin | boomerang | throwing net
MONS:    guardian serpent / great orb of eyes / abyssal acolyte band
ITEM:    potion of curing pre_id / potion of moonshine pre_id
SUBST:   x = ccccvbb
MAP
     .x.x
   x.xxx.x
  x.xx1xx.x
 x. x.. x .x
 .xxx.$$xxx.
.xx..d$$d xx.
xx1.$$$...1xx
.xx $d..x.xx.
x.xxxd.x+xx..
 x. x ..x2. x
  x.xx1xx.x.
   x.xxx. ..
     .x..x
ENDMAP

NAME:   hangedman_abyss_or_decor_stabs
TAGS:   transparent no_pool_fixup decor
DEPTH:  D, Depths, Abyss
ITEM:   potion of attraction pre_id / rapier good_item / \
        short sword good_item / pair of boots ego:stealth good_item pre_id
: if you.in_branch("Abyss") then
SUBST:  xc = xxxxcccb, ' = d0, " = wl...
: else
TAGS:   extra
SUBST:  '" = ., c : xxc
: end
MAP
...."
.cxx.
.x'..."
.x.cxx.
"..x'..."
  .x.cxx.
  "..x'..."
    .x.cxx.
    "..x'..
      .x.
      "..
ENDMAP

NAME:   hangedman_abyss_or_decor_jellyfish_corner
TAGS:   transparent decor extra
DEPTH:  D:4-, Depths, Abyss
WEIGHT: 5 (D), 10
ITEM:   ring of poison resistance / medusa talisman / \
        demon whip ego:venom pre_id / throwing net q:1
KFEAT:  ^ = trap_harlequin / trap_devourer w:13
: if you.in_branch("Abyss") then
SUBST:  x : XXCB, c : CB, X = xxxxcb, C = xccccb, B = xcbbbb
SUBST:  HIJ = cbw,  ' = 000., " = dd.
: else
SUBST:  '"^ = ., c : xxc, H : xc.., I : xc.., J : xc..
: end
MAP
       .c
      .xc
     .xcc
    @x^.c......
   @x..'ccxx...
  .x..H"c".xxx.
 .x^.H'"c'.....
.xc.'"""c.I...
ccccccccc...J.
   .c"'..x.^..
   .x..I..x...
   .xx...^.xx.
   ..x..J..xx.
   ..x........
   ....
ENDMAP

NAME:    hangedman_abyss_or_decor_lesser_grid
TAGS:    transparent no_pool_fixup decor
DEPTH:   D, Depths, Abyss
ITEM:    ring mail randart / scale mail randart / \
         kite shield good_item / any blast wand charges:1 / \
         parchment of hailstorm
: if you.in_branch("Abyss") then
SHUFFLE: ABCDEF, "'
SUBST:   A : cbx.., B : cbx., C : cbx.., D : cbx., E : cbx.., F : cbx.
SUBST:   " = 0., ' = dd..., X = wl.
: else
TAGS:    extra
SUBST:   '" = ., X : x.
SUBST:   A : xxc., B : xxc., C : xxc., D : xxc., E : xxc., F : xxc.
: end
MAP
.......
.AB....
.BA.X..
.'".......
.CD"EF"xx.
.DC'FE'xx.
.......'"....
   ..X.FE....
   ....EF.X..
   ....'"....
      .DC"BA.
      .CD'AB.
      .......
ENDMAP

NAME:    hangedman_abyss_or_decor_clamps
TAGS:    transparent no_pool_fixup decor
DEPTH:   D:8-, Depths, Abyss
KFEAT:   @ = +
KFEAT:   > = abyssal_stair
KFEAT:   ^ = trap_harlequin / trap_devourer w:13
SHUFFLE: ABCDEFGH
: if you.in_branch("Abyss") then
SUBST:   b = wlb., AB = wl., CD = xcb., EFGH = .
SUBST:   x = xxxxcccb, ' = 00., " = >>., + = ^
: else
TAGS:    extra
SUBST:   b : bbwww., A : @, B : @xx, C : @xxxx, DEFGH = x, '"^ = .
: end
MAP
    xxAxx
    x...x
    B.'.C
    x...x
xxDxx...xxExx
x....b".....x
F.'.."b"..'.G
x......b....x
xxHxxx+xbx+xxxHxx
    x....b......x
    G.'.."b"..'.F
    x....."b....x
    xxExx...xxDxx
        x...x
        C.'.B
        x...x
        xxAxx
ENDMAP

NAME:    hangedman_abyss_or_decor_passed
TAGS:    transparent no_pool_fixup decor
DEPTH:   D:4-, Depths, Abyss
ITEM:    any weapon ego:pain / any weapon ego:electrocution
KFEAT:   ^ = trap_harlequin w:7 / trap_devourer w:13
: if you.in_branch("Abyss") then
SUBST:   ' = 00., " = dd.
SUBST:   x = xxxxcb, XY = ww...
: else
TAGS:    extra
SUBST:   x : xxxc, Y = x, X : x.., ^ = .
NSUBST:  ; = 1:@ / *:., : = 1:@ / *:., ` = 1:@ / *:.
: end
MAP
     x
 ;;;;x::::
 ;YX.x.XY:
 ;X..x..X:
 ;....^..:
xxxx.x.xxxx
 `..^....'x
 `X..x.X'"x
 `YX.x.'Y"x
 ````x'""xx
     xxxxx
ENDMAP

NAME:    hangedman_abyss_or_decor_stagger
TAGS:    transparent no_pool_fixup decor
DEPTH:   D:4-, Depths, Abyss
ITEM:    great mace ego:distortion randart / wand of mindburst pre_id / \
         dart ego:atropa q:4 w:4 / potion of moonshine pre_id w:4 / \
         parchment of alistair's intoxication
KFEAT:   ^ = trap_harlequin w:7 / trap_devourer w:13
: if you.in_branch("Abyss") then
SUBST:   ' = 00., " = ddd.., X = xxcccb, x = xxxxxcccb
SUBST:   yY = ...xxxcbw, zZ = ...xxxcbl
: else
TAGS:    extra
SHUFFLE: yY, zZ
SUBST:   x : xxxxc, X : xxc, y : x.., z : x.., YZ'"^ = .
: end
MAP
..........
.xxxXxxx..
.^.'X"..z...
..."X'..Z...
.xxxXXXxxx..
..Y.."X'..z...
..y..'X"..Z...
 ..xxxXXXxxx..
 ...Y..'X"..z..
 ...y.."X'..Z..
   ..xxxXXXxxx.
   ...Y.."X'...
   ...y..'X".^.
     ..xxxXxxx.
     ..........
ENDMAP

NAME:    hangedman_abyss_or_decor_slice
TAGS:    transparent no_pool_fixup decor
DEPTH:   D:4-, Depths, Abyss
WEIGHT:  5 (D), 10
ITEM:    scimitar good_item / great sword ego:distortion / demon blade / \
         blade talisman w:20 / battleaxe good_item w:5 / glaive good_item w:5
: if you.in_branch("Abyss") then
SUBST:   ' = 00., " = dd., x = xxxxxcccb, cX = xxccb
: else
TAGS:    extra
SUBST:   x : xxxxc, c : xxc., X : xxc, '" = .
: end
MAP
        ..c
       ..X.
      ..c..
.......c'.
x"x'x"c.xxxx
xxxx.c"x'x"x
  .'c.......
 ..c..
 .X..
 c..
ENDMAP

NAME:    hangedman_abyss_town
TAGS:    no_monster_gen patrolling allow_dup
WEIGHT:  5
MONS:    rakshasa / efreet / smoke demon / occultist / base draconian w:5 / \
         vampire w:3 / necromancer w:3 / death knight w:3 / abyssal acolyte
MONS:    thrashing horror / blink frog / weeping skull band / \
         large abomination / unseen horror / screaming refraction / \
         wretched star w:5 / air elemental / raiju / worldbinder
MONS:    draconian shifter w:5 / shadow demon w:5 / lich / cognitogaunt / \
         profane servitor w:5 / deep elf demonologist / deep elf sorcerer / \
         herald of the abyss
MONS:    bone dragon / tentacled starspawn / starcursed mass / \
         apocalypse crab / dancing weapon / tentacled monstrosity / \
         glowing shapeshifter
ITEM:    orb
ITEM:    boomerang good_item q:10 / javelin good_item q:5, any magical staff
ITEM:    scroll of revelation q:4 / scroll of noise q:4
ITEM:    ring mail randart / scale mail randart / chain mail randart w:20
ITEM:    demon blade ego:chaos good_item pre_id / \
         demon trident ego:chaos good_item pre_id / \
         demon whip ego:chaos good_item pre_id
ITEM:    any wand charges:2
SHUFFLE: defghijk
NSUBST:  0 : 2:0 / 1 = VY / *:.
SUBST:   c = c:7 b:2 v:1, x = x:8 c:1 b:1
MAP
  ccccccc..
 ccccccc ...ccccccc
 ccd...cc... ccccccc
 cc.2c+cc...cc...ecc
 cc.cc1 cc..cc+c2.cc
 cc.+12.+..cc 1cc.cc
 cccc .cc...+.21+.cc
 c ccc+c....cc. cccc
 ....c.. xx .c+ccc c
........x00x...c....
....c...x00x........
c ccc+c. xx ..c....
cccc..cc....c+ccc c
cc.+12.+...cc.$cccc
cc.cc1.cc..+.34+$cc
cc.2c+cc..cc$4cc1cc
ccf...cc...cc+c1$cc
ccccccc ...cc$1$gcc
 ccccccc... ccccccc
         ..ccccccc
ENDMAP

NAME:    hangedman_abyss_stitches_cave
TAGS:    transparent no_monster_gen
MONS:    thrashing horror / unseen horror / raiju / \
         shapeshifter w:5 / large abomination / common demon
MONS:    starcursed mass / apocalypse crab / hellephant / \
         tentacled monstrosity / tentacled starspawn w:5
ITEM:    great sword randart ego:distortion / protean talisman / \
         quill talisman / maw talisman / medusa talisman / \
         mundane amulet of regeneration / orb ego:guile
SHUFFLE: yY / yY / Yy
SUBST:   x : X:9 C:1, y : W:25 L:25 X:35 C:10 M:5, Y = ., z : X:20 CMB
SUBST:   X = x:50 cb, C = c:50 bv, B = b:50 cv, M = m:50 cb, W = w:50 l
SUBST:   L = l:50 w, $ = $%., % = %:7 .:3, * = *:7 %:3
MAP
            xxxxxxxxxxx
            x$1.zxz...x
           xx.y.zzz.y.xxx
         xxx..Y..Y..Y....
         x$..zzz.y.zzz.Z.
         x2Yyzxz$1.zxz...
         xd1.zzxxxxxxx
   xxxxxxxzz.1dx
...zxz.1$zxzYZ2x
.Z.zzz.Y.zzz..$x
....Y..y..y..xxx
xxx.y.zzz.Y.xx
  x.1.zxz.1$x
  xxxxxxxxxxx
ENDMAP

NAME:    hangedman_abyss_river_spirits
TAGS:    no_monster_gen
MONS:    smoke demon, efreet, fire elemental, water elemental
ITEM:    parchment disc:fire / wand of flame charges:32 / \
         parchment disc:ice / scimitar ego:freezing randart
SHUFFLE: ABCDEF / ABCDEF / ABCDEF / ACEBDF / ACEBDF / GGGGGG
SHUFFLE: 1234 / 1234 / 1234 / 1212 / 1212 / 1212 / 3434 / 3434 / 3434
SUBST:   ACE = w, BDF = l, G : wl, x = x:50 cb
TILE:    c = wall_stone_scorched
MAP
%2xxAAxxxx
1.xx..xx2x
xx..xx.dxxBBxxxx
xxDDxxd.xx..xx3x
    x1xx..xx.dxxCCxx
    xxxxEExxd.xx..xx
          x4xx..xx.3
          xxxxFFxx4%
ENDMAP

NAME:   bh_abyss_negative
TAGS:   allow_dup decor
MAP
....      ....
.....     .....
.....     .....
.....     .....
 .....   .....
    .......
     .....
     .....
     .....
    .......
 .....   .....
.....     .....
.....     .....
.....     .....
 ....      ....
ENDMAP

# 3/28

NAME:    tekkud_abyss_stardom
TAGS:    patrolling no_monster_gen
WEIGHT:  5
MONS:    starflower, starcursed mass / tentacled starspawn w:5 / sun demon
KMONS:   O = wretched star
KITEM:   O = $ no_pickup good_item, orb ego:stardust pre_id
NSUBST:  . = 1:12 / 4:2 / 4 = 2.. / *:.
NSUBST:  @ = 1:@ / * = x@
SHUFFLE: xm
MAP
       x
      mxm
      m.m
     xm.mx
    @x...x@
   xx.....xx
 mmm.......mmm
xx.....O.....xx
 mmm.......mmm
   xx.....xx
    @x...x@
     xm.mx
      m.m
      mxm
       x
ENDMAP

###############################################################################
# Abyss rune vaults
#
# Follow the lead of the other vaults here, and use runelights under different
# floor colours to distinguish these vaults from other abyss vaults.
###############################################################################
# Non-combined rune vaults (see the combined rune vault header).

NAME:   evilmike_abyss_rune_ettins
TAGS:   abyss_rune unrand
MONS:   ettin ; giant spiked club ego:distortion | giant club ego:distortion . \
                giant spiked club ego:chaos | giant club ego:chaos
MONS:   ettin zombie w:6 / flayed ghost / shadow wraith w:4
MONS:   place:Abyss:$, silent spectre
KMONS:  O = glass eye
KITEM:  O = abyssal rune of Zot
KFEAT:  A = stone_arch
KFEAT:  " = runelight
SUBST:  x = xxccn, . = ...W
NSUBST: 0 = 4:1 / 2:2 / *:3
FTILE:  AO = floor_crystal_squares
FTILE:  .1234O = floor_necro_squares
COLOUR: O = lightmagenta
MAP
    """"""""
 ""..xxxAxx..
 "xxxx.xx1xx."
 .x0x.x0xx.xx"
".xx.xxx.xx.x"
"xx.xx3x.x0xx"
"x.xx1O2xx.xx"
"xx.xx4xx.xxx"
".xx.xxxxx0xx"
 .x0x.x0x.xx."
 "xxxx.x.xx..
 ""..xxxxx..
    """""""
ENDMAP

NAME:   evilmike_abyss_rune_tso_outpost
TAGS:   abyss_rune unrand no_monster_gen
MONS:   angel, ophan, cherub, patrolling juggernaut
MONS:   dancing weapon ; long sword ego:holy_wrath
KITEM:  O = abyssal rune of Zot
KFEAT:  A = stone_arch
KFEAT:  _ = altar_the_shining_one
KFEAT:  " = runelight
FTILE:  A45OG = floor_crystal_squares
COLOUR: 45OG = lightmagenta
MAP
.......................
....."""ccc"5"cccccc...
.c++ccGcc2ccGcc...3cc..
.c...ccc...ccc....cccc.
Ac.T15+"._."+"....+4Oc.
.c...ccc...ccc....cccc.
.c++ccGcc2ccGcc...3cc..
....."""ccc"5"cccccc...
.......................
ENDMAP

NAME:    hangedman_abyss_rune_flesh_and_stone
TAGS:    abyss_rune unrand no_monster_gen no_item_gen no_pool_fixup
WEIGHT:  5
MONS:    catoblepas, earth elemental, basilisk, screaming refraction
MONS:    catoblepas zombie, air elemental, death drake
ITEM:    potion of enlightenment q:1 pre_id
KMONS:   O = patrolling war gargoyle
KITEM:   O = abyssal rune of Zot
KFEAT:   A = stone_arch
KFEAT:   ^ = trap_devourer
KFEAT:   "@6 = runelight
SHUFFLE: 23 / 57
SUBST:   ! = 2, 0 = 222234555
KPROP:   l = no_cloud_gen
FTILE:   AO = floor_crystal_squares
COLOUR:  O = lightmagenta
MAP
    @d0A0d@
6ccccGclcGcccc6
 .cOccclccccc.
  c+c0"l"0ccc
"cc1ccclcccccc"
 .c4c0"l"0ccc.
  c5c clc ccc
"cc.c0"l"0cccc"
 .c.ccclccccc.
  c.c0"l"0ccc
"cc^ccclcccdcc"
 .c+c2c!c5c+c.
  c 3 c1c 7 c
6cc2 2+ +5 5cc6
 .ccccccccccc.
  .c c. .c c.
ENDMAP

# This vault would really appreciate "warning door" and "locked door"
# being separated from their forced union as runed doors...
NAME:   hangedman_abyss_rune_macabre_mess
TAGS:   abyss_rune unrand no_monster_gen
KMONS:  1 = glowing orange brain
KMONS:  2 = golden eye / glass eye w:4
KMONS:  3O = laughing skull
KMONS:  4 = small abomination / weeping skull w:3
KMONS:  5 = zykzyl
KMONS:  6 = executioner
KMONS:  7 = shining eye
KMONS:  8 = very large slime creature
KITEM:  O = abyssal rune of Zot
KFEAT:  A = stone_arch
KFEAT:  n = iron_grate
KFEAT:  " = runelight
KFEAT:  T = fountain_eyes
KFEAT:  1237 = shallow_water w:1 / . w:14
SUBST:  c = ccccvb
FTILE:  A+@W48O = floor_crystal_squares
COLOUR: 48 = lightmagenta
MAP
 "cccccc4@4cccccc"
 cc .. ccAcc .. cc
"c .."" x"x "".. c"
cc4.nnn.c+c.nnn.4cc
c 4nn2n.....n2nn4 c
c44+13n5.c.5n31+44c
c 4nn2n.....n2nn4 c
cc".nnn..T..nnn."cc
"c ............. c"
 ccc ".nnnnn." ccc
  "cc8.n7O7n.8cc"
   "c 4nn1nn4 c"
    cc44n+n44cc
    "c 44444 c"
     ccc 6 ccc
      "ccccc"
ENDMAP

# This theme is even more disparate than the literal vault combinations...
NAME:   grunt_abyss_rune_wretched_hive
TAGS:   abyss_rune unrand patrolling
MONS:   killer bee, meliai, spark wasp
MONS:   wretched star, green very ugly thing
KMONS:  O = queen bee
# flavor: abyss creature wandered into the hive.
: dgn.delayed_decay(_G, '1', 'any corpse')
KITEM:  O = abyssal rune of Zot
KITEM:  d = potion of ambrosia pre_id
KFEAT:  a = x
KFEAT:  A = stone_arch
KFEAT:  t = demonic_tree
KFEAT:  " = runelight
NSUBST: 1 = 1:1 / / 3:2 / 2:3 / 3:5 / 1:15 / 10 = 11. / * = .
NSUBST: ' = 1:d / 4:d / * = d:1 .:199
SUBST:  t = tbb
TILE:   a = wall_wax
FTILE:  A4O = floor_crystal_squares
COLOUR: a = yellow
COLOUR: 4O = lightmagenta
: decorative_floor(_G, 'OF', "flower patch")
MAP
          xxxxxxx
        xxxxtttxxxxx
      xxxxattOttaaxxx
    xxxaaaad1t1daaaxxx
   xxaa1aa21'1'12aa1axxx
  xxaa'a'1"a"."a"1'a'aaxx
 xxaa4aaa1aaa4aaa1aaa4aaxx
xxaa..'a'."a"."a".'a'.'aaxx
xaa.'a'.'a'.'a'.'a'.'a'.aax
xaa1aaa1aaa1aaa1aaa1aaa1aax
xa..'a'.'a'.'a'.'a'.'a'..ax
aa.a'."a".'a'.'a'."a".'a.aa
F.aaa1aaa1aaa1aaa1aaa1aaa.F
 ..a.."a".'a'.'a'."a"..a..
   ..........F..........
        .....A......
           ..@..
ENDMAP

NAME:    nicolae_abyss_rune_star_stuff
TAGS:    abyss_rune unrand no_monster_gen
WEIGHT:  20
KMONS:   1 = starcursed mass
KMONS:   2 = wretched star
KMONS:   3 = tentacled starspawn
KMONS:   4 = place:Abyss:$
KITEM:   O = abyssal rune of zot
KFEAT:   A = stone_arch
KFEAT:   4 = runelight
# Place an arch before the door, and place the rune on one of
# the three most distant points from the entrance.
SHUFFLE: Aa'Bb"Dd-Ee_Ff~ / Bb"Dd-Ee_Ff~Aa' / Dd-Ee_Ff~Aa'Bb" / \
         Ee_Ff~Aa'Bb"Dd- / Ff~Aa'Bb"Dd-Ee_
NSUBST:  FAB : 1:O / *:"
NSUBST:  s = 2:1 / 2:2 / 2:3
SUBST:   a = +, ' = A, DE = ., bdef = c
SUBST:   c = cccxbv, z = cccbv
CLEAR:   "-_~
FTILE:   123O = floor_crystal_squares
COLOUR:  123O = lightmagenta
MAP
     4zzz4
    czzBzzc
  _ec..s..cf~
4zcc...c...ccz4
zz....c.c....zz
zA...........Dz
z..sc.....cs..z
zz..c..s..c..zz
-d...........a'
 c...c...c...c
 cz..cc.cc..zc
 4z.s.....s.z4
  zF.......Ez
  zzzzcbczzzz
       "
ENDMAP

NAME:    nicolae_abyss_rune_left_handed
TAGS:    abyss_rune unrand no_monster_gen
WEIGHT:  20
MONS:    ancient zyme, wretched star, starcursed mass, lurking horror
MONS:    thrashing horror, tentacled starspawn, apocalypse crab
# Worldbinders summon from other branches....
KMONS:   8 = nagaraja / ghost moth / thorn hunter / merfolk javelineer
KMONS:   9 = guardian serpent / entropy weaver / swamp dragon / satyr
KMONS:   0 = place:Abyss:$
KMONS:   O = worldbinder
KITEM:   O = abyssal rune of zot
KFEAT:   A = stone_arch
KFEAT:   " = runelight
NSUBST:  0 = 1:0 / 1:9 / * = 09
NSUBST:  X = 1:1 / 1:2 / 1:3 / * = 123"", Q = 1:6 / 1:7 / * = 67...
SHUFFLE: 12, 45
FTILE:   A123O = floor_crystal_squares
FTILE:   .4567890O+ = floor_mystic_chasm
COLOUR:  123O = lightmagenta
MAP
    ..'
   '.c..'.
  ..cc0.c.
 '.ccc"..'..'
..cccccccccc..
'.0ccc.4cc.cc..
..cc9+cc+...nc'
'"c.5.cc..X..c.
.ccc+ccc.XcX.c.
.....Q.c..X8.c'
'.Q.A..cn...nc.
.....Q..ccOcc..
.ccccc..8ccc".0
'ccc"ccccc"cc.'
.ccc...0....cc.
.'..'...'...c0.
           'cc.
           ...'
ENDMAP

NAME:   doesnt_abyss_rune_brain_food
TAGS:   abyss_rune unrand patrolling no_pool_fixup
MONS:   neqoxec / brain worm w:1, very ugly thing, glowing orange brain
MONS:   cognitogaunt, starcursed mass, orange crystal statue
KITEM:  O = abyssal rune of Zot
KFEAT:  " = runelight
COLOUR: n = lightmagenta
NSUBST: - = 4:d / 2 = d. / *:.
NSUBST: . = 2:1 / 1:3 / 1:4 / 1:15 / 1:114 / 2 = 224... / *:.
SUBST:  l : lw
: dgn.delayed_decay(_G, 'd', 'minotaur corpse / troll corpse / ogre corpse')
MAP
  cccnccc
 cc-nOn-cc
 c.--n--.c
cc"-n-n-.cc
c---...---c
nll-...-lln
n6l-.."-l6n
nll-"..-lln
n---...---n
nn"......nn
 nn...."nn
  nn"."nn
ENDMAP

NAME:    gammafunk_abyss_rune_reverse_zot
TAGS:    abyss_rune unrand
MONS:    draconian, nonbase draconian
MONS:    wretched star / starcursed mass / apocalypse crab / lurking horror / \
         very ugly thing / storm dragon / shadow dragon
MONS:    balrug w:12 / hellion / tormentor / zykzyl / cacodemon w:12 / \
         reaper w:12 / blizzard demon w:12 / cognitogaunt / angel / daeva
KMONS:   R = hellephant / ancient lich / dread lich / \
             hell sentinel / profane servitor / executioner / \
             herald of the abyss w:2 / wyrmhole w:2
KITEM:   O = abyssal rune of Zot
KFEAT:   ! = runelight
MARKER:  P = lua:transp_loc("reverse_zot_entry")
MARKER:  Q = lua:transp_dest_loc("reverse_zot_entry")
MARKER:  R = lua:transp_loc("reverse_zot_exit")
MARKER:  S = lua:transp_dest_loc("reverse_zot_exit")
SHUFFLE: AB, CD
# Make a classed draconian and band in the top lung parts.
NSUBST:  A = 1:2 / 1 = 112 / 3 = 11''' / *:'
NSUBST:  C = 1:2 / 1 = 112 / 3 = 11""" / *:"
NSUBST:  B = 1:3 / 1:0 / *:', D = 1:3 / 1:0 / *:"
NSUBST:  ' = 1:003 / 1:003... / *:., " = 1:003 / 1:003... / *:.
NSUBST:  - = 1:4 / 2 = 34.. / .
COLOUR:  c = lightmagenta
COLOUR:  n@O012345. = magenta
FTILE:   nc+@OPQRS012345. = floor_rough_magenta
MAP
!!       !@!       !!
cccccccccP.Sccccccccc
ccAAAAcccnnncccCCCCcc
cAAAAAAccnnnccCCCCCCc
cAAAAAAc.....cCCCCCCc
ccAAAAA+..Q..+CCCCCcc
cAAAAAAc.....cCCCCCCc
ccAAAAccccnccccCCCCCc
cccBccccc+O+cccccDccc
ccBBBcc--ccc--ccDDDcc
cBBBBBcc-----ccDDDDDc
cBBBBBcc-----ccDDDDDc
cBBBBBc-------cDDDDDc
cBBBBB+--c+c--+DDDDDc
ccBBBccc-cRc-cccDDDcc
ccccccccccccccccccccc
ENDMAP

NAME:   spicy_pingpong_abyss_rune
TAGS:   abyss_rune unrand
# Four starflowers, 2 inside, 2 outside (1). Four wretched stars maximum, with
# chances for monsters similiar to starflowers or generic abyss monsters
# who don't mind their target being moved around.
MONS:   starflower, wretched star
MONS:   tentacled starspawn / starcursed mass / demonic plant / oklob plant w:30
MONS:   cognitogaunt w:5 / occultist / thrashing horror / screaming refraction w:2
MONS:   demonic plant
KITEM:  O = abyssal rune of Zot
KFEAT:  - = runelight
KFEAT:  A = stone_arch
KFEAT:  n = iron_grate
KFEAT:  P = demonic_tree w:30 / petrified_tree / tree
KFEAT:  t : demonic_tree / altar_lugonu / granite_statue
NSUBST: F = 2:1 / *:3
SUBST:  2 = 223, 3 = 3334
COLOUR: cbO = magenta
COLOUR: n- = lightmagenta
FTILE:  AO = floor_crystal_squares
MAP
3
 A F P PP    3
  @--.-..-....-
 F-++cccccccbb.3
  -+-n5nPn3ntb.
 P.cnA.....3nc.
  -c3.-.P.n.3c.
 P.cn..n2nP.nc-
 P.cP.12O21.Pc.P
  -cn.Pn2n..nc.P
  .c3.n.P.-.3c-
  .cn......Anc.P
  .btn3nPn5n-+-
 3.bbccccccc++-F
  -....-..-.--@
   3    PP P F A
                3
ENDMAP

# Xom angels & daevas can spawn in the Abyss,
# this seemed like the next logical step.
NAME:   skrybe_abyss_rune_heretic_angels
TAGS:   abyss_rune unrand
MONS:   daeva god:Xom ; scimitar ego:chaos w:5 | demon blade ego:chaos w:1 | \
                        eudemon blade | scimitar ego:holy_wrath | \
                        long sword ego:holy_wrath w:20 . tower shield
MONS:   angel god:Xom ; whip ego:chaos w:5 | demon whip ego:chaos w:1 | \
                        sacred scourge | whip ego:holy_wrath w:30 . robe
MONS:   holy swine
MONS:   dancing weapon ; eudemon blade ego:holy_wrath w:2 | \
                         scimitar ego:holy_wrath
MONS:   large abomination, zykzyl / cacodemon band, apocalypse crab
KITEM:  O = abyssal rune of Zot
KFEAT:  _ = altar_xom
KFEAT:  " = runelight
NSUBST: A = 1:2 / 1:123 / 2 = 122 / *:.
NSUBST: X = 1:3 / 1:5 / 1:6 / 4 = 33455 / *:.
COLOUR: c = white
TILE:   c = wall_church
MAP
"."..........""....""
.ccccccccccccccccccc"
"cO...ttX...tt..t..c.
.c._...7t..t....t..c.
.c..1...t..t.....ttc.
.c...ccccccccc++cccc.
.ct..ctt....t..Acc.c.
.ct7.ctX...t...cc..c.
.cXt.c...tX...cc...c.
.c..tc..ttt..c+..t.c.
"c..tc..Xt..cc..t..+"
"c.t.c.t...cc..tA..+"
.ct..ct...+c..t..t.c.
.ct..c...cc..tA.t..c.
.c.t.+..cc..t..t.Xtc.
"c..t+Acc........tXc"
.cccccccccccc++ccccc.
"."..........""..."."
ENDMAP

########################################
# Combined abyssal rune vaults, because we were collecting a lot
# and standardizing difficulty was easier with consolidation.
NAME:   dshaligram_kb_abyss_rune_zappy_water_cross
TAGS:   abyss_rune unrand patrolling no_pool_fixup
KMONS:  1 = generate_awake lightning spire
KMONS:  2 = raiju
KMONS:  3 = smoke demon
KMONS:  4 = blizzard demon
KMONS:  O = abyssal acolyte
KITEM:  O = abyssal rune of Zot
KFEAT:  O = shallow_water
KFEAT:  A = stone_arch
KFEAT:  1 = runelight
FTILE:  A234OwW = floor_crystal_squares
MAP
www1w1www
www2w4www
123WOW321 A
www4w2www
www1w1www
ENDMAP

NAME:   due_evilmike_abyss_rune_seething_liches
TAGS:   abyss_rune unrand no_monster_gen
MONS:   fire bat, chaos spawn, cognitogaunt, ogre mage / abyssal acolyte w:4
KMONS:  KL = lich
KMONS:  OP = ancient lich / dread lich
KITEM:  KO = abyssal rune of Zot
KFEAT:  A = stone_arch
KFEAT:  ^ = trap_harlequin / trap_devourer w:4
KFEAT:  ' = runelight
NSUBST: L = 1:KKO / 1:LLP / *:L
MARKER: ! = lua:fog_machine { cloud_type = "seething chaos", \
            pow_min = 8, pow_max = 12, delay_min = 20, delay_max = 30, \
            size = 1, walk_dist = 1, spread_rate = 16 }
SUBST:  ! = V, X = x', x = xc, C : c.
FTILE:  @A+V1234LOx = floor_crystal_squares
COLOUR: @12LO = lightmagenta
MAP
  cccccc X
 ccLccLcc
cccc+c+cccX
cLccc1.ccc X
cc+c^21+LcX X
ccc12.^ccc X X
cL+.1^++Cxx X X
cccc+c++.4xx X X
 cccLcC.c.3xx X X
X ccccx4.1.2xx X
  X X xx3.1.2xx X
   X X xx2.!..xxx
    X X xx2....xx
     X X xx....+'
      X X xx...+'
       X X xx++x@
        X X x''@A
ENDMAP

# Even with mad acolytes of Lugonu gone, there's still one acolyte left.
NAME:   evilmike_abyss_rune_siren_acolytes
TAGS:   abyss_rune unrand patrolling no_pool_fixup
MONS:   herald of the abyss, abyssal acolyte
MONS:   generate_awake merfolk avatar, blink frog / raiju w:4
MONS:   tentacled starspawn
KMONS:  O = starcursed mass
KITEM:  O = abyssal rune of Zot
KFEAT:  _ = altar_lugonu
KFEAT:  ^ = trap_harlequin / trap_devourer w:13
KFEAT:  A = stone_arch
KFEAT:  "@ = runelight
SUBST:  X = c', c = ccv, N : nb.
KPROP:  l = no_cloud_gen
FTILE:  A1234O+ = floor_crystal_squares
COLOUR: 1234O = lightmagenta
MAP
 XbbbXXXXXXXXXX@
XXb1bbbbbcccccc+
XXbblblblccwc..c"
XXbb+^^....4.^.c
Xbb5n.N...llb4cc"
XbOnn1._.4l3l2wcA
Xbb5n.N...llb4cc"
XXbb+^^....4.^.c
XXbblblblccwc..c"
XXb1bbbbbcccccc+
 XbbbXXXXXXXXXX@
ENDMAP

NAME:    evilmike_abyss_rune_elephants_shrine
TAGS:    abyss_rune unrand
KMONS:   1 = elephant
KMONS:   23 = dire elephant
KMONS:   45 = hellephant
KMONS:   67 = generate_awake spatial vortex
KMONS:   89 = draconian shifter / herald of the abyss w:4
KMONS:   _ = patrolling spatial maelstrom
ITEM:    potion of enlightenment q:1 pre_id
KITEM:   _ = abyssal rune of Zot
KFEAT:   _ = altar_lugonu
KFEAT:   A = stone_arch
KFEAT:   " = runelight
# Two rings of opposite sides on the inside / outside of the octagon lava moat,
# with one to three (mostly two) pairs of opposite sides made floor or wall.
SHUFFLE: HIJKL, MNOPQ
SUBST:   HIMN = l, J : ll., KL = ., O : llP, PQ : xxxxb, c : ccv
NSUBST:  ' = 1:4 / 1:8 / 1 = 22248 / 10 = 2216 / *:., d = 1:dddd. / *:.
: single_cloud(_G, "F", "translocational energy", true)
FTILE:   AF3579_OG+ = floor_crystal_squares
COLOUR:  F3579 = lightmagenta
MAP
  l".HIIIIIIIIJ."l
 l".HllllllllllJ."l
l"dHlMNNNNNNNNOlJd"l
".HlMMllllKlllOOlJ."
.HlMMlJ''''''HlOOlJ.
HlMMlJ''''G'''HlOOlJ
KlPlJ'FccccccF'HlPlK
KlPl''ccG"79cc''lPlK
KlPII''+"5_7cc'IIPlKA
KlPl''ccG37"cc''lPlK
KlPlH'FccccccF'JlPlK
JlOOlH''''G'''JlMMlH
.JlOOlH''''''JlMMlH.
".JlOOllllKlllMMlH."
l"dJlONNNNNNNNMlHd"l
 l".JllllllllllH."l
  l".JIIIIIIIIH."l
ENDMAP

NAME:   evilmike_nicolae_abyss_rune_containment_curve
TAGS:   abyss_rune unrand patrolling no_monster_gen no_item_gen
MONS:   brain worm w:4 / weeping skull w:2 / raiju / worldbinder / \
        thrashing horror / shapeshifter w:6 / screaming refraction w:2
MONS:   cognitogaunt w:4 / tormentor / hellion / shadow demon / \
        bone dragon / iron dragon zombie w:4
KMONS:  3O = spatial maelstrom
KITEM:  O = abyssal rune of Zot
KFEAT:  A = stone_arch
KFEAT:  ^ = trap_harlequin / trap_devourer w:13
KFEAT:  " = runelight
SUBST:  X : b", x = xv, n = nnnnnc, m = n
FTILE:  A123$Onc = floor_crystal_squares
COLOUR: 123$O = lightmagenta
MAP
""xxxxxxxxxxxxxxxx
.....1xxnnnnnnnnnxxx
..^.....1nnnnnnnnxxxxx
....X.....^xxnnnnnxxxx
.........2..nnnn33xxxx
A.....X1..x.2$mm3Oxxxx
.........2..nnnn33xxxx
....X.....^xxnnnnnxxxx
..^.....1nnnnnnnnxxxxx
.....1xxnnnnnnnnnxxx
""xxxxxxxxxxxxxxxx
ENDMAP

NAME:    hangedman_grunt_abyss_rune_horror_hoard
TAGS:    abyss_rune unrand no_monster_gen no_item_gen patrolling transparent
WEIGHT:  5
KMONS:   1 = great orb of eyes perm_ench:shapeshifter
KMONS:   2 = guardian serpent perm_ench:shapeshifter
KMONS:   3 = crystal guardian
KMONS:   4 = unseen horror
KMONS:   5 = thrashing horror
KMONS:   6 = lurking horror
# Note: if anything in these two item sets becomes useful for more then a tiny
# fraction of characters finding the abyssal rune, remove or replace them.
KITEM:   4d = scroll of noise w:15 q:1 / \
         club w:6 / stone q:1 / dart q:1 ego:atropa / \
         mundane animal skin / mundane ring mail / gold q:1
KITEM:   5 = wand of flame / whip w:2 / hat mundane w:5
KITEM:   6e = abyssal rune of zot mimic
KITEM:   O = abyssal rune of zot
KFEAT:   A = stone_arch
KFEAT:   " = runelight
SHUFFLE: 12
SUBST:   X = xxxxc, c = cccvb
FTILE:   Ade456O = floor_crystal
FTILE:   .@12 = floor_crystal_squares
COLOUR:  de456O = lightmagenta
MAP
    .....  . X ".@
  ........cXXXXX. X
 ...xmxmxcx c2c.c" .
 ..mxd4dxm1......c..
..xxd5d4dxx.......X"
."md6ddd5d+3.....cX
@.x4d4O4d4+...e..1XXA
."md5ddd6d+3.....cX
..xxd4d5dxx.......X"
 ..mxd4dxm1......c..
 ...xmxmxxx c2c.c" .
  ........XXXXXX. X
    .....  . X ".@
ENDMAP

# Perhaps parts of Elf and Forest were devoured in a twisted experiment?
NAME:    grunt_abyss_rune_forest_and_sorcery
TAGS:    abyss_rune unrand patrolling no_pool_fixup no_monster_gen transparent
MONS:    worldbinder, rakshasa
KMONS:   34 = deep elf sorcerer
KMONS:   56 = deep elf demonologist
KMONS:   78 = tengu reaver
KMONS:   90 = shambling mangrove
KMONS:   AB = thorn hunter
KMONS:   CD = dire elephant
KMONS:   EF = satyr
KMONS:   G = water elemental
KMONS:   H = water nymph
KITEM:   O = abyssal rune of Zot
KFEAT:   G = w
KFEAT:   H = W
KFEAT:   a = stone_arch
KFEAT:   ' = runelight
# Exclude one of the deep elves / tengu and one of the Forest denizens.
SHUFFLE: 34 / 56 / 78, 90 / AB / CD / EF
SUBST:   T = t., X = t:20 d:2 W w
NSUBST:  . = 1:2 / *:., w = 2:G / *:w, W = 2:H / *:W
COLOUR:  1 = lightmagenta
COLOUR:  x = elven_brick
FTILE:   -+U4680BDFO = floor_hall
FTILE:   .t23579ACE = floor_grass_dark
FTILE:   a1 = floor_crystal_squares
TILE:    x = wall_hall
: tile("c = " .. crackle_def(_G))
TILE:    t = dngn_demonic_tree_1 / dngn_demonic_tree_8 / \
             dngn_demonic_tree_9 / dngn_demonic_tree_16
MAP
    ..'.'.
  ....XXX....
 .2XWwtttwWX..
 .X.Tt.w.tT1X..'..
'.WT.WXAXW.xxxxxxx.
1.wt.tt'xxxxcccccx'
.Xt.Xt3'x0--c6--cx.
aXtw....+-U-+-O4cx1
.Xt.Xt2'x6--c0--cx.
1.wt.tt'xxxxcccccx'
'.WT..XCXW.xxxxxxx.
 .X.Tt.w.tT1X..'..
 .2XWwtttwWX..
  ....XXX....
    ..'.'.
ENDMAP

NAME:    evilmike_nicolae_abyss_rune_betentacled_crabyss
TAGS:    abyss_rune unrand transparent no_pool_fixup patrolling
KMONS:   1P = apocalypse crab
KMONS:   2 = fire crab
KMONS:   3 = ghost crab
KMONS:   K = kraken
KMONS:   T = tentacled monstrosity
KMONS:   S = shambling mangrove
KITEM:   OP = abyssal rune of Zot
KFEAT:   TS1P = W
KFEAT:   K = w
KFEAT:   A = stone_arch
KFEAT:   " = runelight
SHUFFLE: O1 / O1 / P'
SUBST:   D : cw, ' = w
FTILE:   A23O = floor_crystal_squares
COLOUR:  23O = lightmagenta
MAP
  .............
  .cc.......cc.
....c"ccccc"c....
.cccccccOccccccc.
.."cc1WWWWW1cc"..
.cccWWDWSWDWWccc.
.."cTWWWWWWWTc"..
.ccccccWWWcccccc.
..."cc"WWW"cc"...
 ..cc""WWW""cc..
 ..c"""WWW"""c..
 ..c"""WwW"""c..
 .cccWWwwwWWccc.
 .c22WwKwKwW33c.
 .cccWWwwwWWccc.
 ...""""A""""...
ENDMAP

###############################################################################
# Abyss Exit Vaults
# Note: Don't tag your abyss exit with allow_dup unless it's small and
# restrained in its gimmickry: there are more than enough abyss_exit vaults
# for the longest of given trips without having to repeat vault gimmicks
# and block seeing other vault gimmicks.
###############################################################################

NAME: abyss_exit_lava
TAGS: abyss_exit unrand allow_dup
: init_abyss_exit(_G, "O")
MAP
l.l
.O.
l.l
ENDMAP

NAME:  evilmike_abyss_exit_glass
TAGS:  abyss_exit
MONS:  screaming refraction
: init_abyss_exit(_G, "O")
MAP
 mmm@
mm1mm
m.O.m
mm.mm
 mmm
ENDMAP

NAME:  evilmike_abyss_exit_plants
TAGS:  abyss_exit
SUBST: 1 = 112.
SUBST: . = .:100 1
MONS:  demonic plant
MONS:  bush
: init_abyss_exit(_G, "O")
MAP
 .......
.........
..11111..
..12221..
..12O21..
..12221..
..11111..
.........
 .......
ENDMAP

NAME:  evilmike_abyss_exit_1
TAGS:  abyss_exit unrand allow_dup
: init_abyss_exit(_G, "O")
MAP
x+x
+O+
x+x
ENDMAP

NAME:  evilmike_abyss_exit_2
TAGS:  abyss_exit unrand allow_dup
SUBST: x = x:30 c:20 v:20 m:3 b:3
: init_abyss_exit(_G, "O")
MAP
  @ xxxx
 x.xxxxxxx
xx.x.....xx
xx.x.xxx.xx
xx.x.xOx.xx
xx.x.x.x.xx
xx.x...x.xx
xx.xxxxx.xx
xx.......xx
 xxxxxxxxx
  xxxxxxx
ENDMAP

NAME:  evilmike_abyss_exit_3
TAGS:  abyss_exit unrand allow_dup
SUBST: . = ..Wwl
: init_abyss_exit(_G, "O")
MAP
     .
    ...
   .....
  .......
 .........@
.....O.....
 .........
  .......
   .....
    ...
     .
ENDMAP

NAME:  evilmike_abyss_exit_4
TAGS:  abyss_exit unrand allow_dup
ITEM:  stone q:1 no_pickup
: init_abyss_exit(_G, "O")
MAP
    x
    x
  ..x..
  .dxd.
xxxxxxxxx
  .Oxd.
  ..x..
 .  x
@   x
ENDMAP

NAME:   evilmike_abyss_exit_5
TAGS:   abyss_exit unrand allow_dup
ITEM:   stone q:1 no_pickup
NSUBST: d = 1:O / *:d
: init_abyss_exit(_G, "O")
MAP
    x   x
  x x x x x
 xxxxxxxxxxx
  xdxdxdxdx
xxx+x+x+x+xxx
  x.........@
xxx+x+x+x+xxx
  xdxdxdxdx
 xxxxxxxxxxx
  x x x x x
    x   x
ENDMAP

NAME:  evilmike_abyss_exit_6
TAGS:  abyss_exit unrand allow_dup
SUBST: X: .x, x: xxxccvlw, .: ...W
: init_abyss_exit(_G, "O")
MAP
  x x x
 x x x x x
xxxxxxxxx x
xX.XxX.Xxx x
x.x.x.x.x x
@XxX.XxOxx x
xxxxxxxxx x
 x x x x x
  x x x
ENDMAP

NAME:  evilmike_abyss_exit_7
TAGS:  abyss_exit unrand allow_dup
SUBST: x:xxcv
: init_abyss_exit(_G, "O")
MAP
xx.xx
x.x.x
.xOx.
x.x.x
xx.xx
ENDMAP

NAME:  evilmike_abyss_exit_8
TAGS:  abyss_exit unrand allow_dup
SUBST: G : GGT, T : TV
: init_abyss_exit(_G, "O")
MAP
...G...
.G...G.
.......
G..O..G
.......
.G...G.
...G...
ENDMAP

NAME:  evilmike_abyss_exit_9
TAGS:  abyss_exit unrand allow_dup
KMONS: O = tentacled monstrosity / large abomination / cognitogaunt w:5
SUBST: x = xxc
: init_abyss_exit(_G, "O")
MAP
.xxx.
x...x
x.O.x
x...x
.xxx.
ENDMAP

NAME:    evilmike_abyss_exit_10
TAGS:    abyss_exit
SUBST:   X = x.., z = x'', x = xxxcv
MONS:    neqoxec, brain worm band, cognitogaunt
SHUFFLE: 12 / '3
CLEAR:   '
: init_abyss_exit(_G, "O")
MAP
XXXXXXXXXXX
XzzzzzzzzzX
XzxxxxxxxzX
Xzx..2..xzX
Xzx.xxx.xzX
Xzx1.Ox....
Xzx.xxx.xzX
Xzx..2..xzX
XzxxxxxxxzX
XzzzzzzzzzX
XXXXXXXXXXX
ENDMAP

NAME:  evilmike_abyss_exit_11
TAGS:  abyss_exit unrand allow_dup
SUBST: b = bbx
: init_abyss_exit(_G, "O")
MAP
   b.b
  bb.bb
 bb...bb
bb.....bb
b.......b
....O....
b.......b
bb.....bb
 bb...bb
  bb.bb
   b.b
ENDMAP

# Technically possible for this one to require dig, but pretty unlikely.
NAME:  evilmike_abyss_exit_12
TAGS:  abyss_exit
SUBST: X = x., x = xxx++.
: init_abyss_exit(_G, "O")
MAP
XXXxxxXXX
XxxxxxxxX
XxxxxxxxX
xxxxxxxxx
xxxxOxxx+
xxxxxxxxx
XxxxxxxxX
XxxxxxxxX
XXXxxxXXX
ENDMAP

# Orange crystal and obsidian statue are very rare here...
# I want most characters to be able to actually use this exit
NAME:  evilmike_abyss_exit_13
TAGS:  abyss_exit unrand allow_dup
KMONS: O = orange crystal statue w:1 / obsidian statue w:2 / \
           ice statue w:20 / oklob plant w:15
: init_abyss_exit(_G, "O")
MAP
O
ENDMAP

NAME:  evilmike_abyss_exit_14
TAGS:  abyss_exit unrand allow_dup
SUBST: x = xcv, 0 = 0.
: init_abyss_exit(_G, "O")
MAP
x..x..x
.0.x.0.
...x...
xxxOxxx
...x...
.0.x.0.
x..x..x
ENDMAP

NAME:  evilmike_abyss_exit_15
TAGS:  abyss_exit
MONS:  small abomination
KMONS: O = unseen horror
SUBST: 1 = 1., X = x., x=xxc
: init_abyss_exit(_G, "O")
MAP
 X X X
X XXX X
 XXXXX X
XXXXXXX X
xxxxxxxX X
+1+1+OxXX X
xxxxxxxX X
XXXXXXX X
 XXXXX X
X XXX X
 X X X
ENDMAP

NAME:   evilmike_abyss_exit_16
TAGS:   abyss_exit
NSUBST: . = 1:O / *:.
SUBST:  c = cbx, . = .....12
MONS:   slime creature, endoplasm / jelly
: init_abyss_exit(_G, "O")
MAP
c+c+c+c+c+c
+.+.+.+.+.+
c+c+c+c+c+c
+.+.+.+.+.+
c+c+c+c+c+c
+.+.+.+.+.+
c+c+c+c+c+c
+.+.+.+.+.+
c+c+c+c+c+c
+.+.+.+.+.+
c+c+c+c+c+c
ENDMAP

NAME:  evilmike_abyss_exit_17
TAGS:  abyss_exit unrand allow_dup
SUBST: x = xxc, . = ...W, 0 = 0.
: init_abyss_exit(_G, "O")
MAP
..xx0xx..
...xxx...
x...x...x
xx.V.V.xx
0xx.O.xx0
xx.V.V.xx
x...x...x
...xxx...
..xx0xx..
ENDMAP

NAME:   evilmike_abyss_exit_kraken
TAGS:   abyss_exit no_pool_fixup
NSUBST: w = 1:m / *:w
KFEAT:  m = w
KMONS:  m = kraken
SUBST:  Z = wY, Y = wW, W = w., w=WWw
: init_abyss_exit(_G, "O")
MAP
..WWWWWWW..
.WYYYYYYYW.
WYZZZZZZZYW
WYZwwwwwZYW
WYZwwwwwZYW
WYZwwOwwZYW
WYZwwwwwZYW
WYZwwwwwZYW
WYZZZZZZZYW
.WYYYYYYYW.
..WWWWWWW..
ENDMAP

# Fog machine parameters are the same as that swamp entry vault; you pretty
# much can't avoid the fog here, so I hope you have rMut.
NAME:   evilmike_abyss_exit_mutagenic
TAGS:   abyss_exit
MARKER: O = lua:fog_machine {                               \
                pow_min = 8, pow_max = 12, delay = 25,      \
                size = 2, walk_dist = 1, spread_rate = 33,  \
                cloud_type = "mutagenic fog"                \
            }
: init_abyss_exit(_G, "O")
MAP
...
.O.
...
ENDMAP

# Make sure to close the doors if you don't like what you see behind them...
NAME:   evilmike_abyss_exit_vortex
TAGS:   abyss_exit
ITEM:   stone q:1 no_pickup
SUBST:  x:xxxcv, 1=1., g:G.
SUBST:  G:Gb.
MONS:   generate_awake spatial vortex
: init_abyss_exit(_G, "O")
MAP
     xxxxx
     x111x
     x1d1x
     x111x
    @x+++x@
xxxxx.....xxxxx
x111+..g..+111x
x1d1+.gGg.+1d1x
x111+..g..+111x
xxxxx.....xxxxx
    @x+++x@
     x111x
     x1O1x
     x111x
     xxxxx
ENDMAP

NAME:  evilmike_abyss_exit_chaos
TAGS:  abyss_exit
MONS:  chaos spawn
SUBST: 1 = 11., n : nc, c = cvb
: init_abyss_exit(_G, "O")
MAP
 ccncc
cc.1.cccccc
c.1.1.c.1.cccc
n1.O..+......+@
c.1.1.c.1.cccc
cc.1.cccccc
 ccncc
ENDMAP

NAME:    hangedman_abyss_exit_choices
TAGS:    abyss_exit unrand no_monster_gen
MONS:    hell hound, raiju, great orb of eyes
MONS:    glowing orange brain, swamp drake, wind drake, torpor snail
KMONS:   8 = tyrant leech
KMONS:   9 = mana viper
KMONS:   0 = anaconda
KMONS:   A = ball lightning
KMONS:   B = air elemental
KMONS:   C = unseen horror
KMONS:   D = shadow wraith
KMONS:   E = elephant
KMONS:   F = catoblepas
SHUFFLE: 12, 56, 90, CD, 12 / 34, 56 / 78, 90 / AB, CD / EF
SUBST:   c = ccv, x = xxc
: init_abyss_exit(_G, "N")
MAP
. . . . . . . . . .
 .xx x x x x x x .
.ccccccccccccccccc.
.c +C+ +9+ +5+ +1+.
.cNcnc.cnc.cnc.cncn
.c +D+ +0+ +6+ +2+.
.ccccccccccccccccc.
 .xx x x x x x x .
. . . . . . . . . .
ENDMAP

###################################################################
# Distorted/chaotic kobolds (abyss exit version!) (Jude)
NAME:   due_exit_kobolds
TAGS:   no_rotate abyss_exit
SUBST:  y  = c.
COLOUR: 1. = random
MARKER: P  = lua:fog_machine { cloud_type="blue smoke", walk_dist=1, \
             size=9, pow_max=20, delay=10, buildup_amnt=14, buildup_time=7, \
             spread_rate=3, start_clouds=1, colour="blue" }
KFEAT:  _ = altar_lugonu
KMONS:  1 = kobold brigand w:80 ; dart ego:poisoned | dart ego:curare w:5 . \
                  short sword | rapier w:9 | athame w:1 | quick blade w:3 / \
            kobold brigand w:10 ; dart ego:poisoned | dart ego:curare w:5 . \
                  quick blade ego:distortion w:6 | rapier ego:distortion | \
                  athame ego:distortion
: init_abyss_exit(_G, "P")
MAP
  ccccc
 cc...cc
cc..P..cc
 cc...cc
 ccc.cccc
ccyy.yyyccc
cy..111.yyc
cc..1_1..cc
cyy.111..yc
cccyy..yycc
  ccc..ccc
    c++c
     @@
ENDMAP

NAME:  guppyfry_abyss_exit_glass_guarded
TAGS:  abyss_exit
: init_abyss_exit(_G, "O")
MAP
.............
.xmxmxmxmxmx.
m.m.......m.m
xm.mmm.mmm.mx
xxxx.....xxxx
x00...O...00x
xxxxxxlxxxxxx
lllllllllllll
mxmxmxmxmxmxx
.............
ENDMAP

NAME:  guppyfry_abyss_exit_spiral_guarded
TAGS:  abyss_exit unrand allow_dup
SUBST: - = llx
: init_abyss_exit(_G, "O")
MAP
.0---------0
.-........--
..--------.-
.--.....--.-
.-.-----.-.-
.-.--O--.-.-
.-.-.---.-.-
.-.--...--.-
.-.-------.-
.--.......--
.0---------0
ENDMAP

NAME: guppyfry_abyss_exit_imp_island
TAGS: abyss_exit
SUBST: - = Wwwww
MONS: crimson imp / white imp
: init_abyss_exit(_G, "O")
MAP
.---------.
---..1..---
--..1.1..--
---..1..---
.---------.
.....O.....
.---------.
---..1..---
--..1.1..--
---..1..---
.---------.
ENDMAP

NAME:  bh_abyss_exit_spiral
TAGS:  abyss_exit unrand allow_dup
: init_abyss_exit(_G, "O")
MAP
 .xxxx.
  .xxxx.
    .xxx.
    .xx.
   ..x..
  ...O...
   ..x..
   .xx.
  .xxx.
   .xxxx.
    .xxxx.
ENDMAP

NAME:  bh_abyss_exit_grid
TAGS:  abyss_exit unrand allow_dup
SUBST: a = x.
SUBST: b = x..
SUBST: c = x...
: init_abyss_exit(_G, "O")
MAP
   b b b b b
  a.a.a.a.a.a
 a.x.x.x.x.x.a
b.x.x.x.x.x.x.b
 a.x.x.x.x.x.a
b.x.x.c.c.x.x.b
 a.x.c.0.c.x.a
b.x.x.c.c.x.x.b
 a.x.x.x.x.x.a
b.x.x.x.x.x.x.b
 a.x.x.x.x.x.a
  a.a.a.a.a.a
   b b b b b
ENDMAP

####
# Take a deep breath...
NAME:  grunt_abyss_exit_deep_breaths
TAGS:  abyss_exit unrand transparent
MONS:  ice statue, fire crab, swamp dragon, catoblepas
: init_abyss_exit(_G, "O")
MAP
   xxxxx
  xxlllxx
 xxll3llxx
xxll.O.llxx
xll..1..llx
xl.2...2.lx
xl...4...lx
xl.......lx
ll.......ll
 ..........
  ...@....
ENDMAP

NAME:  bh_abyss_exit_choice
TAGS:  abyss_exit unrand transparent
DEPTH: Abyss, !Abyss:$
KFEAT: < = exit_abyss
KFEAT: > = abyssal_stair
MAP
xxxxxxxxxxx
x00........
x<0......>.
x00........
xxxxxxxxxxx
ENDMAP

NAME:   gammafunk_abyss_exit_x_factor
TAGS:   abyss_exit unrand transparent
MONS:   large abomination / thrashing horror / tentacled starspawn \
        / starcursed mass / tentacled monstrosity
MONS:   orange crystal statue
NSUBST: E = E / -
NSUBST: - = 2=0 / 1 / 2=01.. / .
SUBST:  c : cvb
MARKER: D = lua:transp_loc("x_factor")
MARKER: E = lua:transp_dest_loc("x_factor")
: init_abyss_exit(_G, "O")
MAP
ccccc     ccccc
nn--cc   cc-Ecc
.nn--ccccc--cc
..nn--c-c--cc
@.DnO--2---c
..nn--c-c--cc
.nn--ccccc--cc
nn--cc   cc-Ecc
ccccc     ccccc
ENDMAP

NAME:   spicy_abyss_helpful_harpoons
TAGS:   abyss_exit
MONS:   starflower, demonic plant
NSUBST: 1 = 4:1. / 22t...
KMONS:  O = place:Abyss
: init_abyss_exit(_G, "O")
MAP
   @
  ...
 .111.
@.1O1.@
 .111.
  ...
   @
ENDMAP

NAME:   spicy_abyss_unhelpful_harpoons
TAGS:   abyss_exit
SUBST:  M = xxxxcccvbnt2
MONS:   starflower
MONS:   demonic plant
: init_abyss_exit(_G, "O")
MAP
ccccccccccc
 1...M...1
  .......
@....O....@
  .......
 1...M...1
ccccccccccc
ENDMAP

NAME:   spicy_abyss_rude_harpoons
TAGS:   abyss_exit no_pool_fixup
SUBST:  l : llw-
SUBST:  - = -'
KFEAT:  - = trap_dispersal
KFEAT:  ' = trap_teleport / trap_zot / trap_net
KMONS:  M = starflower
: init_abyss_exit(_G, "O")
MAP
lllll
lMOMl
lllll
ENDMAP

# can imply a certain cooperation or truce between Swamp/Abyss
# also looks a bit like a dna helix
# worship Fed to bypass the starflower!
NAME:   spicy_abyss_planar_alliance
TAGS:   abyss_exit
KMONS:  O = starflower
SUBST:  c : bclmvx+G
SUBST:  . = Ww.+vbV0xt
SUBST:  0 = 000_
KMONS:  _ = place:Swamp / demonic plant w:1
SUBST:  _ = __A
KFEAT:  _ = altar_lugonu
KFEAT:  A = altar_fedhas
SUBST:  M = .
: init_abyss_exit(_G, "O")
MAP
 c.c
  c
 c.c
c...c
@0M0.
.MOM.
.0M0@
c...c
 c.c
  c
 c.c
ENDMAP

NAME:   spicy_abyss_pitcher_plant
TAGS:   abyss_exit
SUBST:  c : xxxxcccvbnt2
MONS:   starflower
MONS:   demonic plant
: init_abyss_exit(_G, "O")
MAP
 ccc.....ccc
cccO......1ccc
 ccc.....ccc
ENDMAP

# based on entry_crystal
NAME:    tekkud_abyss_exit_so_close
TAGS:    abyss_exit
: kitem("d = " .. vault_species_skeletons(_G, "late"))
KFEAT:   t = demonic_tree
NSUBST:  y = 1:TTt / * = t.., z = 1:TTt / * = t.., ' = 3:d / *:.
: init_abyss_exit(_G, "O")
MAP
   xxxxx
  xxbbbxx
 xxbbObbxx
xxbbt'tbbxx
xbbt'''tbbx
xbt'.'.'tbx
xt.......tx
ENDMAP
