##############################################################################
#
# The Ossuary, a Tomb en miniature (Zaba)
#
#
# The Ossuary tries to pose an unusual early challenge: many alarm traps and
# slow monsters, making the player choose between pressing on towards the loot
# or leaving the vault.
#
# Flavour: Mini versions of Tomb and otherwise crypt like.
#
##############################################################################

: crawl_require('dlua/vault.lua')

{{
function ossuary_portal(e)
  local timeout_turns = crawl.random_range(600, 800)

  local messager =
    timed_msg {
      initmsg = { "You hear the hiss of flowing sand.",
                  "There is an entrance to an ossuary on this level. "
                  .. "Hurry and find it before the portal is buried!" },
      finalmsg = "The hiss of flowing sand is almost imperceptible now.",

      verb = 'hiss',
      -- This is always preceded by an article, so...
      noisemaker = 'avalanche of sand',
      ranges = {
        { 5000, 'slow ' },  { 4000, '' },
        { 2500, 'brisk ' }, { 1500, 'quick ' },
        { 0, 'rapid ' }
      }
    }

  e.lua_marker('O',
      timed_marker {
        disappear = "The hiss of flowing sand is gone.",
        entity = 'staircase',
        turns = timeout_turns,
        single_timed = true,
        floor = "expired_portal",
        feat_tile = "dngn_portal_ossuary_gone",
        msg = messager })
  e.tags("uniq_ossuary no_monster_gen chance_ossuary")
  e.depth_chance("D:4-5", 500)
  e.depth_chance("D:6-7", 550)
  e.kfeat("O = enter_ossuary")
  e.colour("123' = yellow")
  e.colour("c = white")
  e.ftile("123'O = floor_sandstone")
  e.tile("c = stone_wall_ossuary")
end

-- Use the following line in destination maps after all SUBSTs
-- : ossuary_setup_features(_G)
-- Note that the function also defines < to be the exit portal.
function ossuary_setup_features(e)
  e.tags("no_monster_gen")
  e.tags("no_item_gen")
  e.tile("c = stone_wall_ossuary")
  e.kfeat("< = exit_ossuary")
end

-- With its limited usefulness for the length of a game, and to help
-- differentiate early portal rewards, provide inkwell talismans in 15%
-- of all Ossuary visits.
function inkwell_talisman_chance(e, iglyph, nsubst, nglyph)
  if nsubst == nil then
      nsubst = false
  end
  e.kitem(iglyph .. " = inkwell talisman")
  if nsubst then
    e.nsubst(nglyph .. " = 1:" .. iglyph .. ":3 " .. nglyph .. ":17 / *:" .. nglyph)
  else
    e.subst(iglyph .. " = " .. iglyph .. ":3 .:17")
  end
end

function callback.badplayer_boxes_open_up(data, triggerable, triggerer, marker,
                                          ev)
  if not data.triggered then
    data.triggered = true
    for replica in iter.replica_iterator("disappearing_wall", 1) do
      dgn.terrain_changed(replica.x, replica.y, "floor", false)
    end
    crawl.mpr("There is a click, and some walls slide away!", 'warning')
  end
end
}}

#### Portal entry vaults.
default-depth: D:4-7

NAME:   enter_ossuary_1
TAGS:   transparent
SUBST:  . = . ':7
: ossuary_portal(_G)
MAP
.....
.'''.
.'O'.
.'''.
.....
ENDMAP

NAME:    enter_ossuary_2
TAGS:    transparent
SHUFFLE: C+
SUBST:   C = c
: ossuary_portal(_G)
MAP
.......
.cc+cc.
.c'''c.
.C'O'C.
.c'''c.
.ccCcc.
.......
ENDMAP

NAME:   enter_ossuary_3
TAGS:   transparent
MONS:   rat zombie / jackal zombie / ribbon worm zombie
MONS:   kobold zombie / goblin zombie / hobgoblin zombie
MONS:   orc zombie / gnoll zombie / human zombie
NSUBST: . = 1:. / 1:' / 1:112 / * = .:100 1123
: ossuary_portal(_G)
MAP
...
.O.
...
ENDMAP

NAME:   enter_ossuary_4
TAGS:   transparent
MONS:   rat zombie / quokka zombie / goblin zombie
MONS:   adder zombie / scorpion zombie / centaur zombie w:5
: if you.depth() > 5 then
SUBST:  1 = 2
: end
: ossuary_portal(_G)
MAP
.........
.ccccccc.
.c''O''c.
.c'''''c.
.c'c'c'c.
.c1c'c1c.
.ccc'ccc.
....'....
ENDMAP

NAME:   enter_ossuary_5
TAGS:   transparent
: ossuary_portal(_G)
MAP
   ...
  ..c..
 ..cc+..
..cc'cc..
.cc'O'cc.
..cc'cc..
 ..ccc..
  ..c..
   ...
ENDMAP

NAME:   gup_ossuary_entry_pyramid
TAGS:   transparent
KMONS:  O = mummy
: ossuary_portal(_G)
MAP
     ...
    ..c..
   ..ccc..
  ..ccOcc..
 ..cc...cc..
..cc.....cc..
.ccccc+ccccc.
.............
ENDMAP

NAME:   nicolae_ossuary_entry_catacombs
TAGS:   transparent
FTILE:  O1s+ABC = floor_sandstone
COLOUR: 1s = yellow
NSUBST: A = + / c, B = + / c, C = + / c, s = 1:O / 4:1 / *:1.....
KMONS:  O1 = orc draugr / orc zombie w:15 / elf zombie w:15 / \
             human zombie w:15
: ossuary_portal(_G)
MAP
ccccccccc
+'1'csAsc
ccc+c+cAc
cs+'''+sc
ccc'''ccc
cs+'''+sc
cCc+c+cBc
csCscsBsc
ccccccccc
ENDMAP

NAME: nicolae_ossuary_entry_false_entrances
TAGS: transparent
NSUBST: O = O / >
SHUFFLE: AB/AB/AB/BA
SUBST: A = m, B = c
FTILE: Om> = floor_sandstone
: ossuary_portal(_G)
MAP
   xxxxx
 +ccccccc+
 c'''c'''c
xc'O'A'O'cx
xc'''B'''cx
xccABBBAccx
xc'''B'''cx
xc'O'A'O'cx
 c'''c'''c
 +ccccccc+
   xxxxx
ENDMAP

NAME: nicolae_ossuary_entry_giza
TAGS: transparent
NSUBST: M = 1:O / *:z
KMONS: O = mummy
KMONS: z = goblin zombie / hobgoblin zombie / kobold zombie / orc zombie
FTILE: Oz = floor_sandstone
COLOUR: z = yellow
: ossuary_portal(_G)
MAP
          .
         ...
        ..c..
       ..ccc..
      ..ccMcc..
     ..ccc+ccc..
    ..c.......c..
   ..ccc.....ccc..
  ..ccMcc...ccMcc..
 ..ccc+ccc.ccc+ccc..
.....................
ENDMAP

NAME: nicolae_ossuary_entry_monument
TAGS: transparent
FTILE: G = floor_sandstone
: ossuary_portal(_G)
MAP
..G..
.'''.
G'O'G
.'''.
..G..
ENDMAP

NAME: nicolae_ossuary_entry_plus
TAGS: transparent
: if crawl.coinflip() then
SUBST: Dd = +, o = O, p = '
: else
SUBST: d = +, D = c, o = '
NSUBST: p = O / '
: end
FTILE: + = floor_sandstone
: ossuary_portal(_G)
MAP
.........
...cDc...
..'cpc'..
.ccc'ccc.
.Dp'o''d.
.ccc'ccc.
..'cpc'..
...cDc...
.........
ENDMAP

NAME: nicolae_ossuary_entry_ruins
TAGS: transparent
FTILE: GO = floor_sandstone
SUBST: c = -c, - = ''., ^ = '..
: ossuary_portal(_G)
MAP
.......
.cc-cc.
.c---c.
.--O--.
.c---c.
.cc-cc.
.......
ENDMAP

NAME: lightli_ossuary_entry_decrepit_ruins
TAGS: transparent ruin
NSUBST: a = 1:' / *:c
: ossuary_portal(_G)
MAP
GcccccG
cc'O'cc
caaaaac
c'''''c
c'''''c
cc'''cc
Gcc'ccG
   @
ENDMAP

NAME: chequers_ossuary_entry_cave
TAGS: transparent
: ossuary_portal(_G)
MAP
xxxxxcccccccxxxxx
xxxxcc'''''ccxxxx
xxxxcG''O''Gcxxxx
xxxxcc'''''ccxxxx
xxxxxccc'cccxxxxx
xxxxxxxc'cxxxxxxx
xxxxxxxcAcxxxxxxx
.................
@@@@@@@@@@@@@@@@@
ENDMAP

NAME:   mainiacjoe_ossuary_entry_dusty_tomb
TAGS:   no_monster_gen no_item_gen
KFEAT:  ` = web
NSUBST: ` = 8:` / *:.
: vault_granite_statue_setup(_G, "GH", "sarcophagus")
TILE:   H = dngn_sarcophagus_pedestal_left
: ossuary_portal(_G)
MAP
  .......
 .xxxxxxx.
..x`G`G`x..
.xx`````cc.
.c``G`G``c.
.+``````Oc.
.c``H`H``c.
.xx`````cc.
..x`H`H`x..
 .xxxxxxx.
  .......
ENDMAP

NAME:  mainiacjoe_ossuary_entry_find_the_door
TAGS:  no_monster_gen
: local d = math.max(0, 12 - (you.depth() * 2))
: local e = math.max(0, you.depth() - 4)
: local f = math.max(0, you.depth() - 6)
: local z = "zombie w:"
: mons("adder " .. z .. d .. " / hound " .. z .. d ..
:      " / scorpion " .. z .. e .. " / howler monkey " .. z .. e ..
:      " / bullfrog " .. z .. f .. " / killer bee " .. z .. f)
SUBST: 1 = 11', 3 = 1'
: ossuary_portal(_G)
MAP
   .....
  .x+x+x.
 ..x'x1x..
.xxc'cccxx.
.+1c3'3c1+.
.xxc'O'cxx.
.+1c3'3c1+.
.xxcccccxx.
 ..x1x1x..
  .x+x+x.
   .....
ENDMAP

#### The portal vaults ####################################

# Reset default depth to prevent random generation of portal vaults.
# Sort destination maps by WEIGHT.
default-depth: Ossuary

###########################################################
# Common: Based off the original Tomb. Weight 40, one 20.
###########################################################

NAME:    ossuary_tomb_1
TAGS:    no_rotate
WEIGHT:  40
ORIENT:  encompass
MONS:    mummy
MONS:    human zombie / elf zombie / centaur zombie
MONS:    jackal zombie / adder zombie / kobold zombie / \
         hound zombie / gnoll zombie / orc zombie
# loot: 12.5 items
ITEM:    any scroll w:2 / any scroll q:2 w:3 / \
         any potion w:4 / any potion q:2 w:6
: inkwell_talisman_chance(_G, "e")
KFEAT:   T = alarm trap
SHUFFLE: dwyz
SUBST:   wy = 2, T = T.
NSUBST:  z = 1:1 / *:3, 2 = 1:2 / * = 233, ? = 1:2 / *:3
: ossuary_setup_features(_G)
MAP
xxxxxxxxxxxxxxxxxxxxxx
x.........<A.........x
x....................x
x...cccccccccccccc...x
x...c.22*c.e.cdddc...x
x?..c1cccc...cdddc..?x
x..?c........+cccc?..x
x?..cccccc.<.....c..?x
x..?c.zzzc.......c?..x
x?..c.czzc.......c..?x
x...c.cccc.......c...x
x...c............c...x
x...c.ccccTTcccc.c...x
x...c.cyycTTcwwc.c...x
x...c.yyycTTcwww.c...x
x...ccccccTTcccccc...x
x....................x
x.?.?.?..G..G..?.?.?.x
x..?.?..........?.?..x
x....................x
xxxxxxxxxxxxxxxxxxxxxx
ENDMAP

NAME:    ossuary_tomb_2
TAGS:    no_rotate
ORIENT:  encompass
WEIGHT:  40
MONS:    adder zombie / jackal zombie / orc zombie / gnoll zombie
MONS:    water moccasin zombie / gnoll zombie
MONS:    bullfrog simulacrum / spectral scorpion / crocodile zombie w:30
MONS:    mummy, weeping skull / burial acolyte
# Number of 1's is 53.
: if crawl.one_chance_in(10) then
SUBST:   ' = 1, 1 = 1:20 2:10 .:90
: else
SHUFFLE: 1'
SUBST:   1 = 1:15 2:10 .:30
: end
SUBST:   z = 1
NSUBST:  B = 1:+ / *:c, C = 1:+ / *:c, D = 1:+ / *:c, E = 1:+ / *:c
NSUBST:  F = 1:+ / *:c, G = 1:+ / *:c, H = 1:+ / *:c, I = 1:+ / *:c
NSUBST:  J = 1:+ / *:c, K = 1:+ / *:c, 1 = 1:3 / 1:5 / 1:31 / *:1
SUBST:   ? = 35
# loot: 12 items
ITEM:    any scroll w:6 / any potion / any potion q:2 w:2
: inkwell_talisman_chance(_G, "e")
: ossuary_setup_features(_G)
MAP
cccccccccccccccccccccc
c<11H'''G1111F'''E111c
c111H'''G1111F'''E111c
c111H'''G1111F'''E111c
cIIIccccccccccccccDDDc
c'''c            c'''c
c'''c            c'''c
c'''c            c'''c
c'''c            c'''c
cJJJc            cCCCc
c111c            c111c
c111c            c111c
c111c            c111c
c111c            c111c
cKKKc            cBBBc
c'''c            c...c
c'''cccccccccccccc...c
c'''c.4.cddddc...c.z.c
c'''+.<3+d**dn.A.+...c
c'''c.4ecddddc...c.z<c
cccccccccccccccccccccc
ENDMAP

# Another ossuary (loosely) based on Tomb:2
NAME:    ossuary_minmay_tomb_2a
TAGS:    no_rotate
WEIGHT:  20
ORIENT:  encompass
MONS:    rat zombie / jackal zombie / goblin zombie / hobgoblin zombie / \
         adder zombie / gnoll zombie / orc zombie / kobold zombie / \
         hound zombie / human zombie / elf zombie
MONS:    mummy
ITEM:    any scroll / any scroll q:2, any potion / any potion q:2
SHUFFLE: $de*
: inkwell_talisman_chance(_G, "f", true, "$")
NSUBST:  B = 1:+ / *:n, C = 1:+ / *:n, D = 1:+ / *:n, E = 1:+ / *:n
NSUBST:  X = 1:< / *:.
: ossuary_setup_features(_G)
MAP
ccccccccccccccccccccccccccccccc
c$$B...........<...........Cddc
c$$B.......................Cddc
cBBB.........ccccc.........CCCc
c.............................c
c....2.........1.........2....c
c.....cc....1.....1....cc.....c
c.....cc...............cc.....c
c.........1.........1.........c
c..c.......................c..c
c..cc..........X..........cc..c
c<.cc....1....XAX....1....cc.<c
c..cc..........X..........cc..c
c..c.......................c..c
c.........1.........1.........c
c.............................c
c.....cc....1.....1....cc.....c
c.....cc.......1.......cc.....c
c....2...................2....c
c.............................c
cEEE.........ccccc.........DDDc
c**E.......................Deec
c**E...........<...........Deec
ccccccccccccccccccccccccccccccc
ENDMAP

NAME:    ossuary_tomb_3
TAGS:    no_rotate no_vmirror
WEIGHT:  40
ORIENT:  encompass
# zombies should be awake, so they march downwards in a line
MONS:    generate_awake orc zombie / generate_awake kobold zombie / \
         generate_awake hobgoblin zombie / generate_awake gnoll zombie
MONS:    mummy
MONS:    orc zombie / kobold zombie / hobgoblin zombie
ITEM:    nothing / any scroll w:5 / any potion
: inkwell_talisman_chance(_G, "e", true, "$")
: ossuary_setup_features(_G)
MAP
cccccccccccccccccccccc
cccc.....2..2.....cccc
ccc..2...cccc...2..ccc
cc......cc..cc......cc
cc.....cc....cc.....cc
cc........22........cc
ccc..3....22....3..ccc
cccc..............cccc
cccc+cc........cc+cccc
cccc..cc111111cc..cccc
ccc....cc....cc....ccc
ccd.....c....c.....dcc
c$dd....c....c....dd$c
c$dd....c....c....dd$c
c$$d....c....c....d$$c
cc$dd...c....c...dd$cc
cc$$d..cc....cc..d$$cc
ccc$d..cc....cc..d$ccc
ccc$d.ccc.<A.ccc.d$ccc
cccccccccccccccccccccc
ENDMAP

###########################################################
# Rare: WEIGHT 20
###########################################################

NAME:    minmay_ossuary_two_tombs
WEIGHT:  20
ORIENT:  encompass
MONS:    mummy
MONS:    generate_awake ball python zombie / generate_awake jackal zombie / \
         generate_awake adder zombie / generate_awake kobold zombie
MONS:    gnoll zombie / orc zombie / hound zombie / \
         human zombie / elf zombie / centaur zombie
MONS:    bullfrog simulacrum / spectral scorpion / \
         killer bee zombie w:5 / crocodile zombie w:35
MONS:    weeping skull / burial acolyte w:12
# Loot: between 5 scrolls / potions and 9 scrolls / potions, with some gold.
# The tomb close to the player is a bit easier than the other one, and is
# more likely to be the one with less loot, giving weak players a chance.
ITEM:    any scroll, any potion
: inkwell_talisman_chance(_G, "h", true, "$")
SHUFFLE: def$
NSUBST:  d = 1:1 / *:d, e = 1:1 / *:e, $ = 1:1 / *:$
SUBST:   ? = 2:11 3:2 .:1
NSUBST:  ! = 1:4 / 1:5 / 1:45 / * = 3 2:1 .:1
: ossuary_setup_features(_G)
MAP
xxxxxxxxxxxxxxxxxxxxxx
x........<..A........x
x....................x
x......cccccccc......x
x...cccc!??!+eccc+...x
x..cc.......ceec.+c..x
x..c<!ccccc.cccc..c..x
x..cc?+dddc..!.?.+c..x
x..?ccccddc...ccc+?..x
x......cccccccc......x
x..?....?.!.?........x
x........?.!.?....?..x
x......cccccccc......x
x..?+ccc!+ffc!cccc?..x
x..c+...?cccc.c$$cc..x
x..c..?....!?.+$$<c..x
x..c+...?cccc.c$$cc..x
x...+ccc!+ffc!cccc...x
x......cccccccc......x
x.......?.!.?........x
x........?.!.?.......x
xxxxxxxxxxxxxxxxxxxxxx
ENDMAP

NAME:    ossuary_crypta
TAGS:    no_rotate no_vmirror
WEIGHT:  20
ORIENT:  encompass
MONS:    mummy, weeping skull / burial acolyte
MONS:    kobold zombie / gnoll zombie / orc zombie
MONS:    human zombie / elf zombie / centaur zombie
# mix of good items with useless ones. sometimes mostly useless ones,
# and occasional raw random ones.
: item( dgn.loot_scrolls .. " / " .. dgn.loot_potions .. " / " ..
:       "scroll of noise pre_id w:33 / " ..
:       "potion of moonshine pre_id w:33" )
# and sometimes mostly useless ones
ITEM:    scroll of noise pre_id w:30 / scroll of poison pre_id / \
         potion of mutation pre_id w:5 / \
         potion of moonshine pre_id w:40
# occasionally just use this
ITEM:    any potion / any scroll w:5
: inkwell_talisman_chance(_G, "g", true, "$")
KFEAT:   ^ = alarm trap
SHUFFLE: hjkl
SUBST:   h : d, j : e, k : de, l : de.
NSUBST:  f = 6:f / *:e, . = 6:^ / *:.
NSUBST:  d = 2 = 1f / 1:2 / *:d, e = 2 = 1f / 1:2 / *:e, 3 = 2 = 34 / *:3
SUBST:   d = dddf, e = eeef, f = fff.., ^ = ^..
: ossuary_setup_features(_G)
MAP
          vvv
        vvv1vvv
 ccccc vvfffffvv ccccc
 clllc v$ff1ff$v chhhc
 clllc vvvv^vvvv chhhc
 cc^cc    v^v    cc^cc
ccc.c   ccv+vcc   c.ccc
c3++cc cc.....cc cc++3c
c.c..ccc.......ccc..c.c
c3c...+.........+...c3c
ccc.c.+....U....+.c.ccc
c3c...+.........+...c3c
c.c..ccc.......ccc..c.c
c3++cc cc.....cc cc++3c
ccc.c   cc+c+cc   c.ccc
 cc^cc   c...c   cc^cc
 ckkkc   cc.cc   cjjjc
 ckkkc   c.A.c   cjjjc
 ccccc   c.<.c   ccccc
         ccccc
ENDMAP

# Scorpions, and lots of them. Hope you weren't expecting to breeze through
# the ossuary just because you found a mace of holy wrath!
NAME:   ossuary_minmay_scorpions
WEIGHT: 20
ORIENT: encompass
MONS:   scorpion, mummy
MONS:   gnoll zombie / jackal zombie / orc zombie / \
        human zombie / ball python zombie / adder zombie / \
        centaur zombie / scorpion zombie w:45
ITEM:   any scroll / any potion / any jewellery w:1
: inkwell_talisman_chance(_G, "e")
SUBST:  1 = 111.., 3 = 33., d = d:21 .
: ossuary_setup_features(_G)
MAP
ccccccccccccccccccccccccc
c...c..3c..1c...ndddc131c
c.A.c...G...+...nd2d+313c
c...c3......c...ndddc131c
cc+cccG...Gccc+ccccccc+cc
c...c......3c...c3.1c...c
c.<.+...G...c...G...c...c
c...c...c3..c......3c...c
ccccccccccccccG.3.Gcc...c
c1.1cdddn...c3.....3c...c
c.3.+d2dn...+...G...c...c
c3.3cdddn...c..3c3.1c...c
cc+ccccccc+ccccccccccc+cc
c1...3c.....c...c...c3.1c
c.....c.....c...+...G...c
c..3..G.....c...c......3c
c...........cc+cccG.3.Gcc
c3..........c3.3c3.....3c
cccG..3..Gccc...c...G...c
c3.........3c3.3c1.3c3.1c
c.3.........cc+ccccccc+cc
c..3..G..3..c...ndddc3.3c
c.e.3.c.....+...nd2d+.3.c
c3...3c3...1c...ndddc1.1c
ccccccccccccccccccccccccc
ENDMAP

NAME:    ossuary_zaba_flooded
WEIGHT:  20
ORIENT:  encompass
{{
local flood_x, flood_y, n = -1, -1, 0

-- Find where to start the flood.
for x = 0, width() - 1 do
    for y = 0, height() - 1 do
        if mapgrd[x][y] == '.' then
            n = n + 1
            if crawl.one_chance_in(n) then
                flood_x, flood_y = x, y
            end
        end
    end
end

-- Flood it!
flood(flood_x, flood_y, crawl.random_range(6, 16), function(x, y, distance)
    local c = mapgrd[x][y]

    local replacements = {
        ['.'] = { {'.', 1}, {'W', 2} },
        ['x'] = { {'x', 5}, {'w', 5} },
        ['c'] = { {'c', 5}, {'w', 3}, {'W', 2}, {'x', 1} },
        ['+'] = { {'+', 10}, {'W', 5} },
        ['1'] = { {'2', 1} }
    }

    if replacements[c] then
        mapgrd[x][y] = util.random_choose_weighted(replacements[c])
    end

    if c == '+' or c == 'v' then
        return 0
    end

    return distance - 1
end)

}}
MONS:    generate_awake ball python zombie / generate_awake hound zombie /\
         generate_awake howler monkey zombie / generate_awake bullfrog zombie /\
         w:5 generate_awake mummy
MONS:    w:15 withered plant /\
         mummy name:bog n_adj col:green tile:mons_bog_mummy \
         spells:throw_frost.18.wizard;slow.27.wizard / \
         w:5 nothing
MONS:    crocodile zombie / killer bee zombie w:3
ITEM:    any potion / any scroll / any jewellery w:1
: inkwell_talisman_chance(_G, "e")
SHUFFLE: ABI/CDJ/EFK/GHL
SUBST:   A : ., B : A, I : <
SUBST:   EFKGHL : d
SUBST:   CDJ = 1112
NSUBST:  1 = 5:. / *:1
KPROP:   w = no_tele_into
: ossuary_setup_features(_G)
: lrockcol('brown')
MAP
      xxxxxxxxxxxxxxx
   xxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxx
 xxxxxxxxxxxxxxxxxxxxxxxxx
 xxxxxcccccccccccccccxxxxx
 xxxxxc1c1c1c1c1c1c1cxxxxx
xxxxccc+c+c+c+c+c+c+cccxxxx
xxxxc1+.............+1cxxxx
xxxxccc.vv+vv+vv+vv.cccxxxx
xxxxc1+.vAAAv3vCCCv.+1cxxxx
xxxxccc.vABAvvvCDCv.cccxxxx
xxxxc1+.vAAIv3vJCCv.+1cxxxx
xxxxccc.vvvvv+vvvvv.cccxxxx
xxxxc1+......e......+1cxxxx
xxxxccc.vvvvv+vvvvv.cccxxxx
xxxxc1+.vEEKv3vLGGv.+1cxxxx
xxxxccc.vEFEvvvGHGv.cccxxxx
xxxxc1+.vEEEv3vGGGv.+1cxxxx
xxxxccc.vv+vv+vv+vv.cccxxxx
xxxxc1+.............+1cxxxx
xxxxccc+c+c+c+c+c+c+cccxxxx
 xxxxxc1c1c1c1c1c1c1cxxxxx
 xxxxxcccccccccccccccxxxxx
 xxxxxxxxxxxxxxxxxxxxxxxxx
  xxxxxxxxxxxxxxxxxxxxxxx
   xxxxxxxxxxxxxxxxxxxxx
      xxxxxxxxxxxxxxx
ENDMAP

###########################################################
# Very rare: WEIGHT 10
###########################################################

# Heavily reworked, because zombies and mummies not shouting made it a tedious
# stutterstep lure-fest and the end corridor wasn't obvious without mapping.
NAME:   minmay_ossuary_gauntlet
WEIGHT: 10
ORIENT: encompass
NSUBST: 1 = 1:1 / 1:3 / 2:. / *:4
NSUBST: 0 = 1:1 / 1:2 / 1:334 / 3:. / *:4
MONS:   mummy, weeping skull / burial acolyte
MONS:   human zombie / elf zombie w:8 / centaur zombie w:2
MONS:   kobold zombie / orc zombie / gnoll zombie / \
        adder zombie / hound zombie / howler monkey zombie
ITEM:   any potion / any scroll
: inkwell_talisman_chance(_G, "e", true, "$")
SUBST:  z = c.
: ossuary_setup_features(_G)
MAP
         ccccccccccccccccc
         c.c1c1c1c1c1c1c.c
  ccccc  c.....c...c.....c
 cc...cc c.....c...c.....c   ccccc
cc.....ccc=====c===c=====cc cc$$$cc
c.........=....$.=.$....=.ccc$d$$$c
c..<.A..z.=....z.=.zd..<=.32.$$d$$c
c.........=....$.=.$....=.ccc$$$d$c
cc.....ccc=====c===c=====cc cc$$$cc
 cc...cc c.....c...c.....c   ccccc
  ccccc  c.....c...c.....c
         c.c0c0c0c0c0c0c.c
         ccccccccccccccccc
ENDMAP

NAME:    ossuary_the_hunt_dpeg
WEIGHT:  10
ORIENT:  encompass
MONS:    mummy, crocodile zombie
MONS:    kobold zombie / centaur zombie w:5 / gnoll zombie
# Especially good loot for an ambush.
# Most of the loot helps right here, if need be.
: item( dgn.loot_scrolls .. " / " .. dgn.loot_potions )
: inkwell_talisman_chance(_G, "e")
KFEAT:   ~ = net trap / alarm trap w:30 / dispersal trap
KFEAT:   ^ = net trap w:20 / dispersal trap w:5
SUBST:   M = 11., z = c...
NSUBST:  3 = 1:2 / 4:. / * = 3.
NSUBST:  ~ = 4:~ / 40:. / * = ~:25 .:200
NSUBST:  ^ = 1:^ / 1:. / * = ^.
: ossuary_setup_features(_G)
MAP
             cccccccccccccccccccccc
 ccccccccccccc3c3c3c3c3c3c3cccddddcc
cc3.........~c~~~~~~~~~~~~~c+^.....cc
c......c....~~~~~~~~~~~~~~~~+^.....Mcc
c1.....A..<.....z...z...z...+^....e2<c
c......c....~~~~~~~~~~~~~~~~+^.....Mcc
cc2.........~c~~~~~~~~~~~~~c+^.....cc
 ccccccccccccc3c3c3c3c3c3c3cccddddcc
             cccccccccccccccccccccc
ENDMAP

NAME:    ossuary_due_mausoleum
TAGS:    no_rotate no_vmirror
WEIGHT:  10
ORIENT:  encompass
MONS:    kobold zombie w:4 / orc zombie / gnoll zombie / \
         rat draugr w:6 ; dagger / kobold draugr w:6 ; dagger plus:-4
MONS:    mummy
KMONS:   3X = wight ; mace | flail | falchion | short sword . robe
KMONS:   4C = burial acolyte
KITEM:   34d = any scroll / any potion
: inkwell_talisman_chance(_G, "e")
KFEAT:   C = altar_kikubaaqudgha
NSUBST:  - = 1:+ / *:c, = = 1:+ / *:c
SUBST:   d = dd., 4 = 444C
KPROP:   X = no_tele_into
: ossuary_setup_features(_G)
MAP
ccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccc
cc1.1.1...............1.1.1cc
cc.<.....................<.cc
cc.......ccccc=ccccc.......cc
cc......cc.........cc......cc
cc.....cc...cc-cc...cc.....cc
cc....cc...cm.e.mc...cc....cc
cc....c...cm.3dd.mc...c....cc
cc....=...-.dd4dd.-...=....cc
cc....c...cm.dd3.mc...c....cc
cc....cc...cm...mc...cc....cc
cc1....cc...cc-cc...cc....1cc
cc......cc.........cc......cc
cc1......ccccccccccc......1cc
cc.<.....................<.cc
cc1.......................1cc
ccccccccccccc+++ccccccccccccc
ccccccccccccc...ccccccccccccc
cccccccccc$d+.2.+d$cccccccccc
ccccccccccddc1.1cddcccccccccc
ccccccccccccc.1.ccccccccccccc
ccccccccccccc1.1ccccccccccccc
ccccccccccccc...ccccccccccccc
ccccccccccccc...ccccccccccccc
ccccccccccccc...ccccccccccccc
ccccccccccccc...ccccccccccccc
ccccccccccccc+++ccccccccccccc
cccccccccccc.....cccccccccccc
ccccccccccc.......ccccccccccc
ccccccccXn...<.A...nXcccccccc
ccccccccccc.......ccccccccccc
cccccccccccc.....cccccccccccc
ccccccccccccc...ccccccccccccc
ccccccccccccccncccccccccccccc
ccccccccccccccXcccccccccccccc
ccccccccccccccccccccccccccccc
ENDMAP

# INDY: Oh, rats! ... He hates rats. He's scared to death of 'em.
NAME:    ossuary_due_small_catacomb
WEIGHT:  10
ORIENT:  encompass
MONS:    kobold draugr ; dagger plus:-4 / gnoll zombie / \
         orc zombie w:12 / centaur zombie w:2
MONS:    crocodile zombie / weeping skull w:2
KMONS:   4x = mummy w:12 / wight w:2 / spectral scorpion w:2
KMONS:   y = spectral rat
ITEM:    any scroll / any potion
KITEM:   x = any scroll / any potion
KITEM:   y = any scroll w:5 / any potion w:5 / nothing w:10
: inkwell_talisman_chance(_G, "%")
KFEAT:   ! = alarm trap
KFEAT:   ? = altar_yredelemnul
SHUFFLE: Bb / Zz, Dd / Ww, Ee / Vv
SUBST:   ZzWwVv = c, BDE = X
NSUBST:  X = 1:4 / 1:x / 1: xxxx? / 2:$ / * = x4
NSUBST:  b = 1:+ / c, d = 1:+ / c, e = 1:+ / c
NSUBST:  ^ = 1:!!!. / *:., ~ = 1:!!!. / *:.
: ossuary_setup_features(_G)
MAP
           ccc
         cccxccccc
       ccc....+..c      cccccc
      cc...ccccc^c     cc.+.1cc
     cc1.ccc  cc+cc   cc..cc..cc
    cc..cc   cc...ccccc..cccc..ccc
ccc cc+cc    c+.x.+.1...cc  cc...cc
cAccc...cc  ccb...cccxccc   cecc~cc
c..+..1.+c  cBcc+cc ccc   cceEec+cc
c<ccc...cc  ccb..cc   cccccxccc...ccc
ccc cc+cc   cc..+cccccc..+....+.x.+Xc
     c.cccccc1.cc~cdDd%1ccccccc...ccc
     c^cc.....cccc.cdd.cc     cc+cc
     c....cc+cc  cc.cc+cc      cXc
     cc..cc...cccccc+yyyccccc  ccc
      cc1+^.x..+..~+yy2yy+.1cc
       cccc...cccxcccyyyccc..cc
          cc+cc ccc cc+cc cc..ccccc
           cxc       ccc   cc...+Xc
           ccc              ccccccc
ENDMAP

# Menkaure's pyramid
NAME:    ossuary_due_pyramid
TAGS:    no_rotate no_vmirror
WEIGHT:  10
ORIENT:  encompass
MONS:    kobold zombie / gnoll zombie / orc zombie / rat zombie / \
         goblin zombie / hobgoblin zombie
MONS:    bat draugr ; dagger / rat draugr ; short sword / \
         goblin draugr ; club / gnoll draugr w:3 ; spear
MONS:    mummy
KMONS:   4 = Menkaure, weeping skull / burial acolyte
# Loot:  2-15 items
ITEM:    any scroll / any potion
NSUBST:  d = 1:d / 1:e / * = dddd$
: inkwell_talisman_chance(_G, "e")
: ossuary_setup_features(_G)
KFEAT:   ! = alarm trap
KFEAT:   ? = altar_kikubaaqudgha
KFEAT:   ^ = floor w:20 / alarm trap
NSUBST:  ' = 40:1 / 5:2 / 5 = 112 / 30:^ / .
: ossuary_setup_features(_G)
MAP
                            cc
                           cccc
                          cccccc
                         cc''''cc
                        cc''cc''cc
                       cc''cccc''cc
                      cc''cccccc''cc
                     cc''cc''''cc''cc
                    cc''cc''cc''cc''cc
                   cc''cc''cccc''cc''cc
                  cc''cc''cccccc''cc''cc
                 cc''cc''cc''''cc''cc''cc
                cc''cc''cc''cc''cc''cc''cc
               cc''cc''cc''cccc''cc''cc''cc
              cc''cc''cc''ccddcc''cc''cc''cc
             cc''cc''cc''ccddddcc''cc''cc''cc
            cc''cc''cc''ccd3dd3dcc''cc''cc''cc
           cc''cc''cc''cc..d<<d..cc''cc''cc''cc
          cc''cc''cc''cc...4dd3...cc''cc''cc''cc
         cc''cc''cc''cc.....dd.....cc''cc''cc''cc
        cc''cc''cc''cccccccccccccc++cc''cc''cc''cc
       cc''cc''cc''''''''''''''''''''cc''cc''cc''cc
      cc''cc''cccccccccccccccccccccccccc''cc''cc''cc
     cc''cc''''''''''''''''''''''''''''''''cc''cc''cc
    cc''cccccccccccccccccccccccccccccccccccccc''cc''cc
   cc''''''''''''''''''''''''''''''''''''''''''''cc<Acc
  cccccccccccccccccccccccccccccccccccccccccccccccccccccc
ENDMAP

NAME:   ossuary_zaba_two_paths
TAGS:   no_rotate
# There is no way up in the end. This is to give the zombies in the beginning
# more time to go for a walk and another chance to meet the player.
ORIENT: encompass
WEIGHT: 10
MONS:   kobold zombie / orc zombie / gnoll zombie
MONS:   human zombie / elf zombie w:8 / centaur zombie w:2, crocodile zombie
KMONS:  4ip = mummy
KMONS:  I = adder simulacrum / jackal simulacrum / \
            gnoll simulacrum / hound simulacrum
KMONS:  5 = bullfrog simulacrum / scorpion simulacrum
KMONS:  P = spectral adder / spectral jackal / \
            spectral gnoll / spectral hound
KMONS:  6 = spectral bullfrog / spectral scorpion
ITEM:   any potion / any scroll / nothing w:1
: inkwell_talisman_chance(_G, "e")
KFEAT:  IP`" = floor
KFEAT:  ^ = alarm trap
NSUBST: I = 1:5i / 4:I / 5 = I` / *:`, P = 1:6p / 4:P / 5 = P" / *:"
COLOUR: I` = cyan
COLOUR: P" = green
SUBST:  ' = ^ .:70
KFEAT:  IiPp`" = floor
: ossuary_setup_features(_G)
TILE:   v = dngn_metal_wall_brown
TILE:   b = DNGN_CRYSTAL_BROWN
MAP
ccccccccccccccccccccccccccc
c2.2.2+c...........c+2.2.2c
cccccc+.............+cccccc
c.....+....G...G....+.....c
c.....+.............+.....c
c++++cccccccc+cccccccc++++c
bPcc''ccG+.......+Gcc''ccIv
bPPcc''ccc.......ccc''ccIIv
bPPPcc''cc.13231.cc''ccIIIv
bPPPPc+'cc.......cc'+cIIIIv
bPPPPP+''c..4.4..c''+IIIIIv
bPPPPPcc'c...G...c'ccIIIIIv
bPPPPP+''c.......c''+IIIIIv
bPPPPc+'cc...e...cc'+cIIIIv
bPPPcc''cc..ddd..cc''ccIIIv
bPPcc''ccc..ddd..ccc''ccIIv
bPcc''ccG+..ddd..+Gcc''ccIv
ccc++ccccccccccccccccc++ccc
c11111cc1c1ccccc1c1cc11111c
c......c+c+ccccc+c+c......c
c.........................c
c..........<.A.<..........c
ccccccccccccccccccccccccccc
ENDMAP

# A larger, less orderly ossuary than usual.
# Petrified trees in this strange cavern are the only appropriate walls thin
# enough to help the skulls serve as intelligent alarm traps.
NAME:    ossuary_due_cavern
WEIGHT:  10
ORIENT:  encompass
MONS:    centaur zombie w:1 / orc zombie w:15 / hobgoblin zombie /\
         kobold zombie / kobold draugr w:5 ; dagger / adder zombie / \
         ball python draugr w:15 ; dagger / nothing w:5
KMONS:   2V = wight
KMONS:   3X = laughing skull
KMONS:   4 = burial acolyte
ITEM:    any scroll / any potion
ITEM:    any scroll / any potion / any wand w:4
: inkwell_talisman_chance(_G, "f")
KFEAT:   ^ = teleport trap
KFEAT:   t = petrified_tree
NSUBST:  B : 1:+ / 1:+ccc / *:c, C : 1:+ / 1:+ccc / *:c
SHUFFLE: VX, yzYZ
NSUBST:  y = 1:n / * = c:20 n:8, z = 2:n / * = c:20 n:4
NSUBST:  Y = 1:n / * = c:20 n:4, Z = 1:n / * = c:20 n:1
NSUBST:  3 = 1:1 / *:3, 4 = 1:4 / 1:1 / 1:42 / *:2
SUBST:   0 = 1:10 2:1
KPROP:   VX = no_tele_into
: ossuary_setup_features(_G)
MAP
 cccccccccc
ccc.......cc
ct.........c
c...<..A..cc
cc.......tc
 cct.....cc
  ccc...cc
    cc.xcc
     cx.cc
     cx.cc
     cx.cc
    cc.cc                           ccccccc     ccccccc
   cc.xc                            ct....ccccccc....tc
   cc..ccc                          c.................c
    cx...cc cccccccccccccc          c..ct+..cyc..+tc..c
  ccc...xcc c............c          c..t4t..t3t..t4t..c
 cc......ccccBcBcBcBcBcc+cccccccccccc^.ctc..yyy..ctc..c
cc........ccc0c0c0c0c0cc.....cccccVccc...............cc
c..........ccc+cc+c+c+cc.tdG.cccccnctc.ctz..eee..YtY.c
c..x.......+...........t..d....+.....+.c3z..eeef.Y3Y.c
cc.tt......cc+c+c+cc+ccc.Gdt.cccccnctc.ctz..eee..YtY.c
cc.x..<...ccc0c0c0c0c0cc.....cccccXccc...............cc
cc.tt....ccccCcCcCcCcCcc+cccccccccccc^.ctc..ZZZ..ctc..c
 cc.....cc  c............c          c..t4t..t3t..t4t..c
  cc...cc   cccccccccccccc          c..ct+..cZc..+tc..c
   ccccc                            c.................c
                                    ct....ccccccc....tc
                                    ccccccc     ccccccc
ENDMAP

# Four chambers, one with loot, three with zombies and a mummy.
# (The player won't know which is which because Crawl rotates the vault.)
#
# Stealthy players can close the doors without the mummy noticing. This is
# probably okay, but may turn out to be too easy.... -- dpeg
NAME:   ossuary_minmay_four_chambers
WEIGHT: 10
ORIENT: encompass
MONS:   gnoll zombie w:5 / human zombie / elf zombie / centaur zombie w:5
MONS:   bullfrog simulacrum / spectral scorpion / \
        killer bee zombie w:5 / crocodile zombie w:45
MONS:   mummy
ITEM:   any scroll / any potion / any scroll q:2 w:2 / any potion q:2 w:2
: inkwell_talisman_chance(_G, "e")
KFEAT:  ^ = alarm trap
NSUBST: 2 = 1:2 / 1 = 12 / *:1, 1 = 1:. / 1:1. / *:1, ^ = 1:^ / 1:. / *:^.
: ossuary_setup_features(_G)
MAP
            ccc
          cccdccc
         ccdddddcc
         c..ddd..c
         c...d...c
         c...e...c
         cc..^..cc
          ccc.ccc
            c+c
  ccccc   ccc.ccc   ccccc
 cc1.2cc cc.....cc cc2.1cc
 c.....c c.......c c.....c
cc.....ccc...<...ccc.....cc
c3....^.+...<A<...+.^....3c
cc.....ccc...<...ccc.....cc
 c.....c c.......c c.....c
 cc1.2cc cc.....cc cc2.1cc
  ccccc   ccc.ccc   ccccc
            c+c
          ccc.ccc
         cc..^..cc
         c2.....2c
         c.......c
         c1.....1c
         cc.....cc
          ccc3ccc
            ccc
ENDMAP

# The intent was that the mummies chase the player through the whole ossuary.
# Now it's just some netted-corner corridors with additional scorpion friends.
NAME:   ossuary_minmay_chase
WEIGHT: 10
ORIENT: encompass
MONS:   jackal zombie / adder zombie / kobold zombie / gnoll zombie
MONS:   scorpion zombie, human zombie / elf zombie
MONS:   generate_awake mummy, scorpion
ITEM:   any scroll / any potion / gold w:4
: inkwell_talisman_chance(_G, "e")
KFEAT:  ~ = net trap
SUBST:  ~ = ~.
NSUBST: B = 1:2 / *:1, C = 1:2 / 1:111223 / *:1, D = 1:2 / 1:123 / *:1
: ossuary_setup_features(_G)
MAP
ccccc     ccc ccc ccc
cdddcccccccDcccDcccDccccccc
cddd~~~~c5............c~~~c
cd<de~<~+.4...........+~<~c
cddd~~~~c5............c~~~c
cdddcccccccDcccDcccDcccc+cc
ccccc     ccc ccc ccc c...c
                     cc...cc
                     cC...Cc
                     cc...cc
                      c...c
                     cc...cc
                     cC...Cc
                     cc...cc
                      c...c
                     cc...cc
                     cC...Cc
                     cc...cc
cccc      ccc ccc ccc c...c
c4.cccccccc.cccBcccBcccc+cc
cc......c.............c~~~c
c2..A.<.+.............+~<~c
cc......c.............c~~~c
c4.cccccccc.cccBcccBccccccc
cccc      ccc ccc ccc
ENDMAP

NAME:   ossuary_boxes_badplayer
WEIGHT: 10
ORIENT: encompass
MONS:   rat zombie / quokka zombie / adder zombie /\
        goblin zombie / hobgoblin zombie / kobold zombie / gnoll zombie w:2 /\
        human zombie w:1 / elf zombie w:1 / orc zombie w:1
MONS:   mummy
MONS:   ogre zombie w:45 / centaur zombie w:50 / troll zombie w:5
KMONS:  N = mummy
KMONS:  O = Menkaure w:5 / mummy, mummy
KITEM:  N = $
KITEM:  $ = any scroll w:49 / any potion w:49 / any wand w:1 / any ring w:1
: inkwell_talisman_chance(_G, "?", true, "$")
KFEAT:  O = exit_ossuary
KFEAT:  ab = stone_wall
NSUBST: ` = 2:2 / *:.
NSUBST: 1 = 25:1 / *:. , 3 = 5:3 / *:.
NSUBST: a = 1:+ / *:a , B = 1:+ / *:c , C = 1:+ / *:c , D = 1:+ / *:c
NSUBST: E = 1:+ / *:c , F = 1:+ / *:c , G = 1:+ / *:c , H = 1:+ / *:c
NSUBST: I = 1:+ / *:c , J = 1:+ / *:c , K = 1:+ / *:c , L = 1:+ / *:c
NSUBST: M = 1:+ / *:c
{{
lua_marker(":", Triggerable.synchronized_markers(
  function_at_spot( "callback.badplayer_boxes_open_up",
                    { triggered = false }, true,
                    { only_at_replica = true, listen_to_replicas = true })))

lua_marker('ab', props_marker {disappearing_wall = 1})
}}
: ossuary_setup_features(_G)
MAP
ccccccccccccccccccccccccccccccc
cA```````````````````````````<c
c`````````````````````````````c
c``ccccc+ccc+ccc+ccc+ccc+ccc``c
c``c111c111c111c111c111c111c``c
c``c1cGcGGccHHHcIIIccJJcJc1c``c
c``+1G....c....c....c....J1c``c
c``ccc....c....c....c....ccc``c
c``c1G....c....c....c....J1+``c
c``c1G...3b3...c3...b3...J1c``c
c``+1ccccbbaaaacaaaabbcccc1c``c
c``ccc....a:::::::::a....ccc``c
c``c1F....a:.......:a....K1+``c
c``c1F....a:..$$$..:a....K1c``c
c``+1F3...a:.$$N$$.:a3...K1c``c
c``cccccccc:.$NON$.:cccccccc``c
c``c1E....a:.$$N$$.:a....L1+``c
c``c1E....a:..$$$..:a....L1c``c
c``+1E....a:.......:a....L1c``c
c``ccc3...a:::::::::a3...ccc``c
c``c1ccccbbaaaacaaaabbcccc1+``c
c``c1D....b....c....b....M1c``c
c``+1D....c....c....c....M1c``c
c``ccc....c....c....c....ccc``c
c``c1D3...c3...c3...c3...M1+``c
c``c1cDcDDccCCCcBBBccMMcMc1c``c
c``c111c111c111c111c111c111c``c
c``ccc+ccc+ccc+ccc+ccc+ccccc``c
c`````````````````````````````c
c<```````````````````````````Ac
ccccccccccccccccccccccccccccccc
ENDMAP

NAME:    ossuary_kennysheep_city_of_the_dead
WEIGHT:  10
ORIENT:  encompass
KMONS:   1s = weeping skull
KMONS:   2 = burial acolyte
KMONS:   3 = mummy
KMONS:   4 = hound zombie / gnoll zombie / orc zombie
KMONS:   5 = human zombie / elf zombie / centaur zombie
KMONS:   F = marrowcuda
KITEM:   123d = any potion / any scroll / any jewellery w:1
: inkwell_talisman_chance(_G, "e", true, "$")
KFEAT:   ^ = alarm trap
KFEAT:   C = altar_kikubaaqudgha / altar_hepliaklqana w:2
KFEAT:   DF = dry_fountain
SHUFFLE: HIJKLMNOPQRSTUVW
NSUBST:  4 = 3:4 / 2:. / * = 4:3 5:1 .:6, F = 1:F / *:D
NSUBST:  H = 1:1 / 1:2 / *:d, I = 1:3 / *:4
NSUBST:  J = 1:3 / *:4, K = 1:2 / *:d
SUBST:   L = 4, M = 5, NOPQ = ., RS = $, TUVW = d, C = CGG
KPROP:   w = no_tele_into
: ossuary_setup_features(_G)
MAP
ccccccccccccccccccccccccccccc
c.............^.............c
c...........................c
c..xxxx..xxxx...xxxx..xxxx..c
c..xHHx..xIIx...xJJx..xKKx..c
c..x++x..x++x...x++x..x++x..c
c..x..x..x..x...x..x..x..x..c
c...........................c
c.............F.............c
c..xxxx..4..xxxxx..4..xxxx..c
c..xL+..4G4.xMMMx.4G4..+Nx..c
c..xL+...4..x+++x.44...+Nx..c
c..xxxx.....x...x.....xxxx..c
c...........................c
c......xxxxx.$4..xxxxx......c
c^....FxOO+..4C4..+PPxF....^c
c......xxxxx..4$.xxxxx......c
c...........................c
c..xxxx.....x...x.....xxxx..c
c..xQ+...44.x+++x..4...+Sx..c
c..xQ+..4G4.xRRRx.4G4..+Sx..c
c..xxxx..4..xxxxx..4..xxxx..c
c.............D.............c
c...........................c
c..x..x..x..x...x..x..x..x..c
c..x++x..x++x...x++x..x++x..c
c..xTTx..xUUx...xVVx..xWWx..c
c..xxxx..xxxx...xxxx..xxxx..c
c...........................c
c...........................c
ccccccccccccc+++ccccccccccccc
           cc...cc
          cc.....cc
       cccc.......cccc
       csn...<.A...nsc
       cccc.......cccc
          cc.....cc
           cc...cc
            ccncc
             csc
             ccc
ENDMAP

NAME:   ossuary_hellmonk_silent_tomb
WEIGHT: 10
ORIENT: encompass
MONS:   silent spectre, wight / marrowcuda / weeping skull w:5
MONS:   centaur zombie w:20 / water moccasin zombie / scorpion zombie /\
        bullfrog zombie / scorpion w:2
MONS:   goblin zombie / hobgoblin zombie / adder zombie / orc zombie /\
        gnoll zombie / ogre zombie w:3 / human zombie w:1 / bes kemwar w:1
ITEM:   any potion w:15 / any scroll w:15 / gold w:6 / any armour w:1
: inkwell_talisman_chance(_G, "e")
NSUBST: ~ = 2:4 / 12 = 4... / *:.
NSUBST: - = 2:4 / 12 = 4... / 4 = 3... / *:.
NSUBST: ' = 1:3 / 1:4 / 4 = 3... / 12 = 4... / *:.
NSUBST: ! = 2:3 / 1:4 / 8 = 3... / 8 = 4... / *:.
SUBST:  G : G:100 V T D:4 Y:1
KFEAT:  D = petrified_tree
: ossuary_setup_features(_G)
MAP
   ccccccccccccccccccccc
  cc--------ccc''''''''cc
 cc---------ccc'''''''''cc
cc-----------+'''''''''''cc
c------------+''''''''''''c
c----G-------+'''''''G''''c
c---GcG----ccccc''''GcG'''c
c----G---ccccccccc'''G''''c
c-------ccccccccccc'''''''c
c------ccccccccccccc''''''c
c------ccccccccccccc''''''c
c-----ccccccccccccccc'''''c
ccc---ccccccccccccccc'''ccc
ccc+++ccccccn1ncccccc+++ccc
ccc~~~cccccdnnndccccc!!!ccc
c~~~~~ccccddd<dddcccc!!!!!c
c~~~~~~ccccdddddcccc!!!!!!c
c~~~~~~cccccdddccccc!!!!!!c
c~~~~~~~ccccc2ccccc!!!!!!!c
c~~~~G~~~ccccecccc!!!G!!!!c
c~~~GcG~~~~cc.cc!!!!GcG!!!c
c~~~~G~~~~~~c+c!!!!!!G!!!!c
c~~~~~~~~~~~c.!!!!!!!!!!!!c
cc~~~~~~~~~~c.!!!!!!!!!!!cc
 cc~~~~~~~~~c.!!!!!!!!!!cc
  cc~~~~~~~~c.!!!!!!!!!cc
   cccccc+++cccccccccccc
       c....<c
       c....Ac
       ccccccc
ENDMAP

# an ossuary with no clear pathway and monsters and loot scattered about
NAME:    ossuary_hellmonk_twisting_tombs
WEIGHT:  10
ORIENT:  encompass
MONS:    weeping skull / burial acolyte
MONS:    mummy / wight w:2
MONS:    kobold zombie w:8 / gnoll zombie / orc zombie / hound zombie / \
         human zombie w:4 / centaur zombie w:6
MONS:    bes kemwar
ITEM:    any potion w:15 / any scroll w:15 / gold w:6
: inkwell_talisman_chance(_G, "e")
SHUFFLE: -+
SHUFFLE: <A
SUBST:   -:c, V:VVVVG
NSUBST:  + = 10:++~ / *:+
NSUBST:  1 = 1:1 / 1:12 / 1:3 / * = 3., ? = 1:2 / 1:23 / 1:334 / * = 3.
NSUBST:  " = 4:^ / 3=^" / *:"
NSUBST:  . = 6:3 / 2:4 / 12 = 3. / *:.
NSUBST:  d = 1:* / 1:*d / *:d
KFEAT:   ^ = net trap / alarm trap w:30 / dispersal trap
KFEAT:   ~ = broken_door
: ossuary_setup_features(_G)
MAP
ccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccc
cccd13...+.?c.....dc.....-3dccc
ccc333...c..+......+.....c31ccc
ccc-cccccc..c......c....dc33ccc
ccc......+..cc-ccccccc-cccc+ccc
ccc......c..c...ec.....+....ccc
ccccc+c+-cc-c....+..?3.c...dccc
cccd..c"""""c....c.....ccc-cccc
ccc...c"""""+....cc-cccc...dccc
ccc?..-"<VA"cccc-c.....-....ccc
ccc...c"""""+....c.....cc-c+ccc
ccc...c"""""c....+..3?.c....ccc
cccc-+ccc+ccc....-.....+..'.ccc
ccc....c....-....c.....cd...ccc
ccc....c....ccccccccc+ccccc-ccc
ccc33..-....c......c....+.33ccc
ccc13..c..?.+......-....c.31ccc
cccd3..+....c.....dcd...-.3dccc
ccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccc
ENDMAP

NAME:   ossuary_hellmonk_split_paths
WEIGHT: 10
ORIENT: encompass
MONS:   burial acolyte / weeping skull
MONS:   mummy / scorpion w:4
MONS:   centaur zombie / water moccasin zombie / scorpion zombie /\
        bullfrog zombie
MONS:   goblin zombie / hobgoblin zombie / adder zombie / orc zombie /\
        gnoll zombie
ITEM:   any potion w:15 / any scroll w:15 / gold w:6
: inkwell_talisman_chance(_G, "e")
KFEAT:  ^ = net trap / alarm trap w:30 / dispersal trap
NSUBST: 3 = 2:3 / *=3...
NSUBST: - = 4:4 / 1:3 / 8 = 4. / *:., ~ = 4:4 / 1:3 / 8 = 4. / *:.
NSUBST: ! = 3:4 / 1:3 / 1:3.. / 6 = 4. / *:., ' = 3:4 / 1:3 / 1:3.. / 6 = 4. / *:.
NSUBST: " = 2:^ / 1:2 / *:.
NSUBST: 2 = 2:2 / 3 = 2... / *:.
NSUBST: d = 1:* / 1:*d / *:d
: ossuary_setup_features(_G)
MAP
cccccccccccccccccccccccc
cccc-----------------ccc
ccc-------------------cc
cc------ccccccccccc----c
c----cccc!!!!!!!!!ccc..c
c---cc!!!!!!!!!!!!.....c
c..cc!!!!!cc!!!cc....cccc
c..!!!!!ccccccccccc.....cc
c..!!!cccc2.....2cccc....c
c..!!cc"3cc..3..ccddccc..cc
c..ccc""""cc...ccd43dc....c
c..""""""".c...c.3.4dcc...c
c3.""""2"3^+.G^+..e1ddcA.<c
c..""""""".c...c.3.4dcc...c
c..ccc""""cc...ccd43dc....c
c..''cc"3cc..3..ccddccc..cc
c..'''cccc2.....2cccc....c
c..'''''ccccccccccc.....cc
c..cc'''''cc'''cc....cccc
c~~~cc''''''''''''.....c
c~~~~cccc'''''''''ccc..c
cc~~~~~~ccccccccccc~~~~c
ccc~~~~~~~~~~~~~~~~~~~cc
cccc~~~~~~~~~~~~~~~~~ccc
cccccccccccccccccccccccc
ENDMAP

NAME:   ossuary_hellmonk_orc_graveyard
WEIGHT: 10
ORIENT: encompass
MONS:   orc warrior zombie w:20 / weeping skull / troll zombie w:1
MONS:   ogre zombie / mummy w:1
MONS:   orc zombie w:30 / gnoll zombie / ogre zombie w:2 /\
        hobgoblin zombie w:7 / elf zombie w:1
KMONS:  B = burial acolyte
ITEM:   any potion w:15 / any scroll w:15 / gold w:6
: inkwell_talisman_chance(_G, "e")
KFEAT:  ^ = alarm trap
KFEAT:  B = altar_kikubaaqudgha / altar_beogh w:2
KFEAT:  t = petrified_tree
SUBST:  3 = 3..
NSUBST: - = 10:t / 3:G / 5:3 / 20 = t.. / 5 = G. / 6 = 3. / *:.
NSUBST: 1 = 1:1 / *:2, d = 6:d / 1:* / *=ddd*
: vault_granite_statue_setup(_G, "G", "gravestone")
: ossuary_setup_features(_G)
MAP
         ccccc
        cc.B.cc
        c..e..c
ccccccccccc+ccccccccccc
c.....^..3.2.3..^.....c
c.....^.........^.....c
c3...cc.........cc...3c
cd13dcccc.^^^.ccccd31dc
cddddc3.cc+++cc.3cddddc
cccccc...........cccccc
  cc.....-----.....ccc
  c3...--.---.--...3c
  c...-.--.-.--.-...c
  cc..-----------..cc
   c3.----.-.----.3c
   c...--.---.--...c
   cc..-.-----.-..cc
    c...-.-.-.-...c
    cc...-.-.-...cc
     cc.........cc
      ccc.....ccc
        c..G..c
       cc.....cc
       c..A.<..c
       c.......c
       cc..t..cc
        ccccccc
ENDMAP
