summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dat/volcano.des
diff options
context:
space:
mode:
authorEino Keskitalo <evktalo@users.sourceforge.net>2009-10-29 16:58:39 +0200
committerEino Keskitalo <evktalo@users.sourceforge.net>2009-10-29 17:00:28 +0200
commit0494f2c39e25a9b63251f78df63dfed036d0752e (patch)
tree9ea7541e965e54fbdec404e661bbb8ae753ad1d7 /crawl-ref/source/dat/volcano.des
parent3e9a111e4cc50a3957d2b738f345db17d3434db8 (diff)
downloadcrawl-ref-0494f2c39e25a9b63251f78df63dfed036d0752e.tar.gz
crawl-ref-0494f2c39e25a9b63251f78df63dfed036d0752e.zip
Add Volcanoes, early-midgame portal vaults by Jude, with dpeg and Zaba.
Signed-off-by: Eino Keskitalo <evktalo@users.sourceforge.net>
Diffstat (limited to 'crawl-ref/source/dat/volcano.des')
-rw-r--r--crawl-ref/source/dat/volcano.des981
1 files changed, 981 insertions, 0 deletions
diff --git a/crawl-ref/source/dat/volcano.des b/crawl-ref/source/dat/volcano.des
new file mode 100644
index 0000000000..0a9bdab155
--- /dev/null
+++ b/crawl-ref/source/dat/volcano.des
@@ -0,0 +1,981 @@
+###
+# V for Volcano!
+#
+# A combined effort of ideas, execution and tweaking by Jude, dpeg, and Zaba!
+###
+#
+# i. Threats
+#
+# Initial threat is the volcano itself; while there is quite a
+# delay between explosions, the flame clouds are quite powerful
+# and cover quite a large area; this could kill an early level
+# character easily, so beware!
+#
+# Loot-guard threats are defined in the fiery_guardians function.
+# Please see the comments there for explanations, and lists of
+# possible threats.
+#
+# Extra threats will be listed as MONS: lines.
+#
+# ii. Loot
+#
+# All volcanoes have a combination of the following items, though
+# the amounts of each usually vary. In addition, they also have
+# whatever armour or weapons have been created for the monsters that
+# populate the level.
+#
+# Fire resistance ego armour (any type of armour; this also
+# includes dragon armour, which is not
+# given extra rF+)
+# Flaming ego weapons (a selection of high-damage weapons)
+# Gold
+# "Good" potions with fire themes (see setup_loot() for the list)
+#
+# In addition, some volcanos have extra items taken from:
+# "Random item"
+# "Bad items" (see setup_loot() for the list)
+# "Fruit" (only in volano_6)
+#
+# See setup_loot() for more information.
+#
+###
+# Index:
+# volcano_grotto - forgotten grotto "temple" volcano; a temple to
+# the side of a volcano, line 472-523
+# volcano_lake - lava lake "temple" volcano; a temple suspended
+# in the middle of a volcano, line 531-591
+# volcano_pools - many pools "pyramid"; some caves off a central
+# chamber, but no pyramid?, line 599-658
+# volcano_tomb - volcano "tomb"; based of Tutankhamun's burial
+# chamber, has mummies and fire. Line 666-709.
+# volcano_aerie - "aerie"; two paths to the loot, including lindwurm
+# island! Line 717-775.
+# volcano_bunker - "hidden bunker"; "science"-ish portal vault with
+# golems and a "conservatory". Line 783-823.
+# volcano_caves - "collapsing caverns", you can choose which one you
+# want! maybe more than one? Line 830-902.
+# volcano_village - by zaba! villagerrs are kinda scary, actually!
+# Line 912-967.
+###
+
+{{
+-- ####
+-- # General setup and design functions: (head to line 382 for the maps)
+
+function volcano_portal (e)
+ local desc_long = [[Leading directly into the rock is a dark and forbidding tunnel. Every so often air, hot enough to singe your face, blasts from within, and, as though trigger by the air, rocks fall from the roof and sides of the tunnel, slowly filling the entry.]]
+
+ local timeout_turns = crawl.random_range(1200, 1700)
+ local messager =
+ timed_msg {
+ visible = true,
+ -- $F{xxx} will be substituted with the 'entity' property of the timed
+ -- marker, or with the desc property (if entity is not set).
+ messages = time_messages(timeout_turns,
+ "Rocks fall inside $F{the}.",
+ "Debris falls inside $F{the}, filling the entry.",
+ "More rocks fall inside $F{the}, blocking the entry.",
+ "Rocks have almost completely blocked $F{the}.")
+ }
+
+ e.lua_marker('O',
+ timed_marker {
+ disappear = "There is a deep roar from within the tunnel. Moments later, a river of lava pours forth, sealing the it permanantly.",
+ desc = "A dark tunnel",
+ desc_long = desc_long,
+ entity = 'tunnel',
+ dst = "volcano",
+ dstname_abbrev = "Volcano",
+ dstorigin = "in a volcano",
+ overmap = "dark tunnel",
+ turns = timeout_turns,
+ floor = "lava",
+ msg = messager })
+ e.kfeat("O = enter_portal_vault")
+ e.kfeat("S = .")
+ e.colour("O = red")
+ e.tags("layout_caves")
+end
+
+function volcano_feat_descs()
+ dgn.set_feature_desc_short("gate leading back to the Dungeon",
+ "rocky tunnel")
+ dgn.set_feature_desc_short("empty arch of ancient stone",
+ "rock-blocked tunnel")
+end
+
+dgn.set_lt_callback("volcano", "volcano_feat_descs")
+
+-- Destinations:
+function volcano_setup (e, metal)
+ setup_loot(e)
+ e.kfeat("< = exit_portal_vault")
+ e.kfeat("I = exit_portal_vault")
+ e.kfeat("^ = known alarm trap")
+ e.subst("L = lll.")
+ e.subst("y = xxx.")
+ e.colour("< = red")
+ e.lrockcol("red")
+ e.lrocktile("wall_pebble_red")
+ if metal == nil then
+ e.colour("c = lightred")
+ e.colour("G = lightred")
+ e.colour("= = lightred")
+ e.lfloorcol("red")
+ e.lfloortile("floor_rough_red")
+ end
+ crawl.mark_milestone("br.enter", "entered a Volcano.")
+end
+
+-- "Volcano" functions. While the sizes may appear extreme, they are carefully
+-- weighted and balanced and have been tested extensively.
+
+-- Currently unused
+--function place_giant_volcano(e)
+-- e.kfeat("V = l")
+-- e.lua_marker('V', fog_machine { cloud_type = "flame", walk_dist=0, pow_min=10,
+-- pow_max=10, delay=1100, size=90000,
+-- spread_rate=100 })
+--end
+
+local large_warning = tw_machine(3, "The air gets thick with the scent of sulphur.",
+ "In the distance, the volcano erupts with a roar.",
+ "The volcano comes to life with a roar!")
+
+local small_warning = tw_machine(3, nil, nil, nil, "The volcano roars to life, " ..
+ "belching forth lava!", "The air gets thick with " ..
+ "the scent of sulphur.")
+
+function place_large_volcano(e)
+ e.kfeat("V = l")
+ e.lua_marker('V', fog_machine { cloud_type = "flame", walk_dist=15, pow_max=6,
+ delay = 300, size = 10000, spread_rate = 30,
+ helper = large_warning})
+end
+
+function place_medium_volcano(e)
+ e.kfeat("V = l")
+ e.lua_marker('V', fog_machine { cloud_type = "flame", walk_dist=15, pow_max=6,
+ delay = 300, size = 3000, spread_rate = 30,
+ helper = small_warning})
+end
+
+function place_small_volcano(e)
+ e.kfeat("V = l")
+ e.lua_marker('V', fog_machine { cloud_type = "flame", walk_dist=15, pow_max=6,
+ delay = 300, size = 800, spread_rate = 30,
+ helper = small_warning})
+end
+
+function place_tiny_volcano(e)
+ e.kfeat("V = l")
+ e.lua_marker('V', fog_machine { cloud_type = "flame", walk_dist=10, pow_max=6,
+ delay = 800, size = 80, spread_rate = 10,
+ helper = large_warning})
+end
+
+function place_medium_flame_cloud (e, glyph, nolava)
+ if not nolava then
+ e.kfeat(glyph .. " = l")
+ end
+ e.lua_marker(glyph, fog_machine { size = 3, pow_min = 7, pow_max = 7, delay = 80,
+ start_clouds = 1, cloud_type = "flame"})
+end
+-- #
+-- ###
+
+-- ###
+-- # Loot functions:
+
+function make_fiery_armour (e, armour)
+ local armour_string = ""
+ for _, at in ipairs(armour) do
+ armour_string = armour_string .. " / " .. at .. " ego:fire_resistance good_item"
+ end
+ return string.gsub(armour_string, "\s*\/$", "")
+end
+
+function make_fiery_weapon (e, weapon)
+ local weapon_string = ""
+ for _, wt in ipairs(weapon) do
+ weapon_string = weapon_string .. " / " .. wt .. " ego:flaming good_item"
+ end
+ local n_weapon = string.gsub(weapon_string, "\s*\/$", "")
+ e.item(n_weapon)
+end
+
+function setup_loot (e)
+ e.item(make_fiery_armour(e, {"robe w:30", "animal skin w:30", "leather armour w:30",
+ "ring mail w:30", "scale mail w:20", "chain mail w:20",
+ "banded mail w:20", "plate mail w:10", "pair of gloves w:5",
+ "helmet w:6", "pair of boots w:3", "cap w:2", "wizard hat w:2",
+ "shield w:1", "buckler w:3"}) ..
+ " / dragon armour w:5")
+ e.item([[potion of berserk rage w:20 / potion of poison w:2 / potion of might w:5 / potion of brilliance w:5 /
+ potion of agility w:5 / potion of experience w:1 / potion of resistance]])
+ e.item(make_fiery_weapon(e, {"demon whip w:2", "dire flail w:4", "ankus w:20", "dagger w:20",
+ "sabre w:20", "scimitar w:20", "katana w:1", "demon blade w:1",
+ "triple sword w:1", "broad axe w:20", "battleaxe w:10",
+ "executioner's axe w:1", "spear w:20", "trident w:20", "demon " ..
+ "trident w:1", "glaive w:1", "halberd w:10", "lajatang w:10",
+ "longbow w:5", "crossbow w:5"}))
+ e.item("any")
+ e.item([[potion of decay / potion of degeneration / potion of mutation /
+ scroll of immolation / scroll of curse weapon / scroll of curse armour /
+ potion of confusion / potion of paralysis / scroll of paper /
+ scroll of random uselessness]])
+end
+
+-- #
+-- ###
+
+-- ###
+-- # Monster functions:
+
+function make_fiery_mons (e, monster, weapons, armours)
+ -- Converts a "normal" monster to a fire-themed one through ego weapons and armour.
+ -- syntax: make_fiery_mons(_G, "monster", {"weapon chance 1", "weapon chance 2"}, {"armour chance 1", "armour chance 2"}) etc.
+ local monstring = "" .. monster
+ if weapons ~= False then
+ monstring = monstring .. " ; "
+ for _, weapon in ipairs(weapons) do
+ monstring = monstring .. weapon .. " ego:flaming |"
+ end
+ end
+ if armours ~= False then
+ monstring = monstring .. " . "
+ for _, armour in ipairs(armours) do
+ monstring = monstring .. armour .. " ego:fire_resistance |"
+ end
+ end
+
+ return string.gsub(monstring, "\s*\|$", "")
+end
+
+-- This function sets up two slots of monsters: in general, the first
+-- slot (say, 1) is the "surrounding" guardians, while the third slot
+-- is a "levelled" up version of the 1s. It's currently balanced for
+-- two or three 1s, and one 2.
+--
+-- Packs are basically as follows:
+-- ("intelligent" packs; packs involving uniques)
+-- orc, orc, orc, Urug; orc, orc, orc, Blork the orc; orc, orc, orc,
+-- orc warrior.
+-- human, human, human, Edmund; human, human, human, Michael; human,
+-- human, human, human.
+-- kobold, kobold, kobold, Sonja; kobold, kobold, kobold, big kobold.
+-- goblin, goblin, goblin, Ijyb; goblin, goblin, goblin, hobgoblin.
+-- gnoll, gnoll, gnoll, Grum + war dogs; gnoll, gnoll, gnoll, gnoll.
+-- (in "Tomb") mummy, mummy, mummy, Menkaure; mummy, mummy, mummy,
+-- guardian mummy.
+-- (no-unique packs, but still "intelligent")
+-- deep elf soldier, deep elf soldier, deep elf soldier, deep elf
+-- fighter;
+-- nothing, minotuar (all on its lonesome)
+--
+-- Natural "packs" usually consist of a few fire/red-themed monsters
+-- surrounding either a lindwurm, firedrake, or manticore.
+--
+-- Demonic "packs" usually consist high chance of imps, toenail golems
+-- and pulsating lumps, lower chance of red devils, hell hounds and ghouls
+-- which are then surrounding either a hell hog, a hell knight (with
+-- watered-down equipment), flayed ghost or flaming corpse.
+--
+-- Mixed demonic/natural packs consist of mixes of the above.
+--
+-- Non-living packs consist of fire vortices and elementals, and are usually
+-- mixed in with the above demonic packs.
+
+local urug = "Urug ; spear ego:flaming race:orcish . leather armour ego:fire_resistance race:orcish"
+local blork = "Blork the orc ; short sword race:orcish ego:flaming . leather armour ego:fire_resistance race:orcish"
+local edmund = "Edmund ; flail ego:flaming . leather armour ego:fire_resistance"
+local michael = "Michael ; dagger ego:flaming . robe ego:fire_resistance"
+local sonja = "Sonja" -- We don't touch her equips.
+local ijyb = "Ijyb ; club ego:flaming | dagger ego:flaming . ring mail ego:fire_resistance race:orcish"
+local grum = "Grum ; animal skin ego:fire_resistance"
+local menkaure = "Menkaure" -- Or his
+local hellknight = "hell knight w:1 ; hand axe ego:flaming . ring mail ego:fire_resistance"
+
+function fiery_humans (e)
+ local human = "human ; short sword ego:flaming | long sword ego:flaming . ring mail ego:fire_resistance"
+ e.mons("hog / " .. human)
+ e.mons(human)
+end
+
+function fiery_guardians (e, tomb)
+ local found_guard = false
+ local guard_type = ""
+ local main_guard = ""
+ if crawl.one_chance_in(9) then
+ -- We decided to use a unique.
+ local unq_weight = crawl.random2(50)
+ found_guard = true;
+ if unq_weight < 10 then
+ guard_type = "orc warrior"
+ main_guard = urug .. " / " .. blork .. " / orc warrior ; trident race:orcish ego:flaming . ring mail ego:fire_resistance"
+ elseif unq_weight < 20 then
+ guard_type = "human"
+ main_guard = edmund .. " / " .. michael .. " / human ; falchion ego:flaming . leather armour ego:fire_resistance"
+ elseif unq_weight < 30 then
+ guard_type = "big kobold"
+ main_guard = sonja .. " / big kobold ; long sword ego:flaming . ring mail ego:fire_resistance"
+ elseif unq_weight <= 50 then
+ guard_type = "gnoll"
+ main_guard = grum .. " / gnoll ; halberd ego:flaming"
+ end
+ end
+
+ if tomb then
+ guard_type = "mummy"
+ main_guard = menkaure .. " / guardian mummy"
+ found_guard = true
+ end
+
+ -- If we've reached this stage, we've maybe already found a guardian.
+ if found_guard then
+ e.mons(guard_type)
+ e.mons(main_guard)
+ return
+ end
+
+ -- If not, we still have to decide what we're going to use.
+ if crawl.one_chance_in(10) then
+ -- It's a lone minotaur! labyrinth-esque.
+ e.mons("nothing")
+ e.mons("minotaur ; trident ego:flaming . ring mail ego:fire_resistance")
+ return
+ end
+
+ if crawl.one_chance_in(4) then
+ -- We're still going to use a pack of "intelligents".
+ local pack_weight = crawl.random2(30)
+ -- "Plain" flavour packs are orcs+orc warrior (maybe an orc knight)
+ -- kobolds + big kobold (maybe a kobold demonologist), or deep elf
+ -- soldiers + deep elf fighter.
+ if pack_weight < 10 then
+ e.mons("orc warrior")
+ e.mons("orc warrior / orc knight w:1")
+ elseif pack_weight < 20 then
+ e.mons("big kobold")
+ e.mons("big kobold / kobold demonologist w:2")
+ elseif pack_weight <= 30 then
+ e.mons("deep elf fighter" )
+ e.mons("deep elf fighter / deep elf knight w:3")
+ end
+ return
+ end
+
+ -- We are now going to use a mixed pack.
+ if crawl.one_chance_in(3) then
+ -- "Lair"-esque fire-themed monster pack.
+ e.mons("hog / giant ant / redback w:1 / bumblebee w:1 / manticore")
+ e.mons("firedrake / lindwurm w:1")
+ return
+ end
+
+ if crawl.one_chance_in(3) then
+ -- "Demonic" fire-themed monster pack.
+ e.mons("imp w:20 / pulsating lump / toenail golem / hell hound w:9 / \
+ ghoul w:9 / red devil ; trident ego:flaming")
+ e.mons("efreet / flaming corpse / flayed ghost / hell-hog / vampire / " .. hellknight)
+ return
+ end
+
+ if crawl.coinflip() then
+ -- Demonic/unliving themed pack.
+ e.mons("imp / fire elemental / toenail golem / pulsating lump / hell hound / fire vortex")
+ e.mons("efreet / vampire / " .. hellknight)
+ return
+ end
+
+ -- Finally, if we reach this stage, let's go all out.
+ e.mons("hell hound / hog / toenail golem / fire elemental / imp")
+ e.mons(hellknight)
+ return
+
+end
+}}
+
+default-depth: Lair:5-8, Orc:2-4, Hive:1
+
+###############################################################################
+# Entries:
+NAME: enter_volcano_1
+TAGS: uniq_volcano
+ORIENT: float
+COLOUR: X = red
+COLOUR: S = red
+: volcano_portal(_G)
+MAP
+ xx
+xXX..
+XXS..@
+XOSS...
+XXSS...
+xXXx.xx
+ xxxxxx
+ENDMAP
+
+NAME: enter_volcano_2
+TAGS: uniq_volcano
+ORIENT: float
+COLOUR: X = red
+COLOUR: S = red
+: volcano_portal(_G)
+MAP
+xxxxx
+xXXXx
+xXOXx
+xSSSx
+xx.Sxx
+ x.S.xx
+ xx.@.x
+ENDMAP
+
+NAME: enter_volcano_3
+TAGS: uniq_volcano
+ORIENT: float
+MONS: patrolling firedrake
+# His name is Robby.
+COLOUR: X = red
+COLOUR: S = red
+: volcano_portal(_G)
+MAP
+ xxxxx
+ xxXXXxx
+ xXXOXXx
+ xxSSSxx
+ xx.1xx
+xx...x
+x..xxx.
+xx....@
+ xxxxx.
+ENDMAP
+
+# This is the "large" one. You might get a clear path, but then again...
+NAME: enter_volcano_4
+TAGS: uniq_volcano
+ORIENT: float
+COLOUR: X = red
+COLOUR: S = red
+NSUBST: L = 4:. / *:l
+: volcano_portal(_G)
+MAP
+ xxxxx
+ xXXXx
+ xXOXx
+xxSSSxx
+xxxSxxx
+ xxx.xx
+ xxx.x
+ xxLxx
+ xxLlLxx
+ xxLlllLxx
+ xLlllllLx
+ xxLlllLxx
+ xxLlLxx
+ x.@.x
+ENDMAP
+###############################################################################
+
+default-depth:
+
+###############################################################################
+# "Forgotten grotto Temple"
+#
+# In the bowels of a volcano, some renegade priests of
+# makhleb/trog/vehumet have built a temple, which has
+# since been forgotten... the temple guardians still remain
+# and are ready to fight to the death.
+NAME: volcano_grotto
+WEIGHT: 60
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen
+KFEAT: _ = altar_makhleb / altar_trog / altar_vehumet
+KMONS: l = lava snake w:2 / lava fish w:5 / nothing w:120
+KFEAT: l = l
+# Sets up the temple guardians.
+: fiery_guardians(_G)
+MONS: clay golem w:50 / molten gargoyle w:2
+# Loot: 9 items, 8 gold.
+: volcano_setup(_G)
+: place_large_volcano(_G)
+MAP
+ xxxx
+ xxxxxxyyxxxx
+ xxxxy......yyyxx
+ xxxxyyy.LLLLL....yxxx
+ xxxyyy...LlllllL.....Gxxxxxxxx
+ xxxyy....LLlllllllL...........yxxx
+ xxxyy....LLlllllllllL....Gxxxyy..yyxx
+ xxyy.....LllllllllllllL..yxx xxy.y..yxx
+ xxy......LlllllllllllllL..yxxx xxyxx.yyx
+ xxy......LlllllllllllllllL..yyxx xxy..yxx
+ xxy.....LllllllllllllllllllL..yyxxxxxy.xx
+ xxy.....LllllllllllllllllllllL....yx xxy.xx
+ xxy....LllllllllllVlllllllllllL...yxx xxy.x
+ xy....LlllllllllllllllllllllLL...yxx xx.x
+ xxy....LlllllllllllllllllllL....yxx xx.xx
+ xy.....LlllllllllllllllllLL...yxx xx.x
+ xy.y...LllllllllllllllllLL...yxx x.yx
+ xxyxy...LllllllllllllllL...yyxx xx+xx
+ xxxxy...LllllllllllllL...yxxx xx...xx
+ xxy...LL....LlllllL..yxx cccccx.....xccccc
+ xxy....xxx..LlllL...yx ccd$ecc..<..ccd$fcc
+ xy.yxxx<xxy.LLL...yxx c.$f$.c.....c.$e$.c
+ xx.xx....xxx.....yxx c.g$g.ccc+ccc.g$g.c
+ x.xxx.....xxy....yx c..3..c.....c..3..c
+ xx..xxxAxx.xxy..yxx cc...c=.111.=c...cc
+ xxx..xxx.xxxx..xx cccccc.G_G.cccccc
+ xxx.x.xx xxxx cc.2.cc
+ x...x ccccc
+ xxxxx
+ENDMAP
+###############################################################################
+
+###############################################################################
+# "Lava lake Temple"
+#
+# Somehow, some priests have constructed a temple right over the lava! Who kows
+# what magic spells keep this structure afloat, and its occupants from roasting
+# to death!
+NAME: volcano_lake
+WEIGHT: 60
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen no_rotate
+KFEAT: _ = altar_makhleb / altar_trog / altar_vehumet
+KMONS: l = lava snake w:2 / lava fish w:5 / nothing w:900
+KFEAT: l = l
+# Let's choose a path from m, u, z, i, r, y
+SHUFFLE: m/u/z/i/r/n
+SUBST: m = .
+SUBST: u = l, z = l, i = l, r = l, n = l
+# Sets up the temple guardians.
+: fiery_guardians(_G)
+MONS: clay golem w:50 / molten gargoyle w:2
+# Loot: 10 items, 6 gold.
+: volcano_setup(_G)
+: place_medium_volcano(_G)
+MAP
+ xxxx xxxxx xxxxx xxxxxx
+ xxxyyxxx xxyyxxxxyyyxxxyyyyxx
+ xxxx xxx....xxxxx....xx.....xxx...xxxxxx
+ xyyxxxxyyy.yyyyyyyy.y....yyy...yyyy...yyxx
+ xxxx..yyy.................................yxx
+ xxxyyy.......................................yxxx
+ xxxyyy...........................................yxxx
+ xxxxy...............LLLllLLllLLLllllLLllLLlllL........yxxxx
+ xy..............LllllllllllllllllllllllllllllllLL........yxxx
+ xxxy............LlllllllllllllllllllllllliiilllllliL........yxxx
+ xxy............LLllllllllVlllllllllllllliillliilliilllLLL......<x
+ xy............LmmllllllllllllllllllllliillllllViilllllll.......yxx
+ xxxy........LllllmmllllllllllllllllliillllllllllllllllllL.......yx
+ xxy...........Llllllmmllllllllllllllilllllllllllllllllllll.....yxxx
+ xxy.........LllllllllmmllLlLLllLLlillLLLllLllllllllllllLL......yx
+ xxy.....LlllllllllllllmL..................LlllllllllllllL.....yxxxx
+ xy......Lllllllllllllll.ccccccccccccccccc.lllllllllllllllL.......yx
+ xy.......LlllllVllllllL.c....+.111.+....c.LllllllllllllllL......yxx
+ xxy.....Lrrllllllllllll.c.<1.c.G_G.c.1<.c.llllllllllllllLL.......yx
+ xy......LllrrlllllllllL.c....c..2..c....c.Lllllllllllluuu.......yxx
+ xxy.....Lllllrrllllllll.ccc==ccc+ccc==ccc.LllllllllluullL......yxx
+ xy.....LlllllllrllllllL.c......c.c......c.lllllllluullllL.....yxx
+ xxy.....Llllllllrllllll.cccccc.c.c.cccccc.LllllluulllllllL.....yxx
+ xy......LllllllllrrlllL.c.$f$c.c.c.cgd$.c.lllluullVllllllL......yxx
+ xxy......LlllllVllrllll.c.$gec.c.c.c$e$.c.LluulllllllllllL......yxx
+ xxy.......LllllllllrllL.c.3dgc.c.c.cfg3.c.uullllllllllllL.....yxxx
+ xy........LlllllllllrlL.c......c.c......c.LllllllllllllL......yxx
+ xxy.....Lllllllllllllrr.cccccccc+cccccccc.llllllllllllllL......yxx
+ xy.....LlllllllnnnllnnL.................LLllllllllllllL.....yxxx
+ xxxy....LllllnnlllnnlllLllLlLllllLllLlLlzlllllllllllllL.......yxx
+ xA.......nnnllllllllllLlllllllllllllllllzzllllllllllllL.......yxx
+ xxxxy.....LllllllVllllllllllllllllllllllllzzlllVlllllllL.....yxx
+ xy........LLllllllllllllllllllllllllllllllzzllllllllL.....yxx
+ xxxy..........LllllllllllllllllllLllllllllllzlllllLL......yxx
+ xxxy.........LLlllllllllllllLL...LLllllllllzzzL......yxxxx
+ xxxy.........LLlLLlLllllLL.......LLllLlLlLL.......yxxx
+ xxxxxxxy...................yy.................yxxx
+ xxxxy..............yxxxxxy.............yxxx
+ xxxyyy.yy.yy.yyyxx xxy..........yxxx
+ xxxxxxxxxxxxxxx xxyyyy.yyy.yxxx
+ xxxxxxxxxxxx
+ENDMAP
+###############################################################################
+
+###############################################################################
+# "Many pools Pyramid"
+#
+# There's no pyramid as such, but it was originally supposed to be a pyramid!
+# Instead, we have randomly placed loot in little rooms off the central chamber.
+# Nice place to take a holiday, wouldn't want to leave here...
+NAME: volcano_pools
+WEIGHT: 60
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen
+# Sets up the temple guardians.
+: fiery_guardians(_G)
+MONS: clay golem w:50 / molten gargoyle w:2
+# Loot: 10 items, 6 gold; done in volano_setup.
+SHUFFLE: T/Q/B/Y/R
+# Do the loot first, 10 objects: two monsters (1, 2)
+NSUBST: T = 1:1 / 1:2 / 1:d / 1:e / 2:$ / 2:f / 2:g
+NSUBST: Q = 1:1 / 1:1 / 2:d / 2:e / 2:$ / 1:f / 1:g
+# Now the entrance:
+NSUBST: B = 1:A / *:.
+# Loot + 10 trashy items.
+SUBST: R = h
+NSUBST: Y = 2:1 / *:.
+# And the exit
+SHUFFLE: <<<
+NSUBST: < = 4:.
+: volcano_setup(_G)
+: place_tiny_volcano(_G)
+: place_medium_flame_cloud(_G, 'J')
+MAP
+ xxx
+ xxyxx
+ xxyTyxx xxx
+ xxTTTTyxxxxxxxx
+ xxlLTTTy.xx...yxx xxx
+ xxlllTT<.y..yxx.xxx xxyxx
+ xxllllL.Lxxxxxy.x.xx xxxxxxxxxxyQyxx
+ xxJlllllxx xxy..yxx xxy...xyQyQQ.LLxx
+ xxxxllxx xxxy..xx xxxy..yxx.QQQQ.LllLxx
+ xxxx xxyy.x xxxy..yxxxxlL.Q<Llllllxx
+ xyy.x xxxy..yxxxxxlllLlLllllllJxx
+ xx..xxxxx xxy..yxxxx xxlllllllllllxxx
+ x.yxxxxyxxxxxxxxy.yxxxxx xxlllllllxxxx
+ x...xy..xxy..yxx.yx xxxJllxxx
+ xx.............y.xxx xxxxx
+ xxy...LlLlLlL....xyxx xxx
+ xxy...LllllllllL....yx xJx
+ xy...LllllllllllL....x xxllx
+ xy...LlllllVllllL....xx xxlllxx
+ xy...LlllllllllllL....x xxlLLllx
+ xxx....LlllllllllL....yxxxx xxlLRRLlx
+ xxxxy.xy....LllLlLlL.......xyxx xxy<RRRRyx
+ xxy...yxxyy..............yxx..yxxxxy.RRRRyxx
+ xxxy.xxxxxxxxyyxxxyyxy.yyyxxxxxx..xy..yy..yxx
+ xxxxx..yx xxxx xxxxxx.xxxxxx xxy..yxxxxxxx
+ xxyxy.Lyxxxxx xx.y<y.yx xxyxxx
+ xy.yy.LllllJx xxyyYYYyyx xxx
+ xy<BBB.Lllllx xxyYYYYYyxx
+ xLBBBBLlllllx xxllLYYlLLx
+ xxLBBBLllllxx xxllLlllxx
+ xlllLLlllxx xxllllxx
+ xlllllllxx xxxllx
+ xxllllxxx xJxx
+ xxxJlxx xxx
+ xxxx
+ENDMAP
+###############################################################################
+
+###############################################################################
+# "Volcano tomb"
+#
+# Some forgotten emperor was burried here! His tomb is guarded by mummies, flying
+# skulls and clouds of flame. Perhaps there is loot!
+NAME: volcano_tomb
+WEIGHT: 30
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen no_rotate
+# Sets up the temple guardians, 1s and 2s.
+# The flying skulls on lava.
+KFEAT: u = lava
+KMONS: u = flying skull
+# We have a specific monster set for this vault.
+: fiery_guardians(_G, true)
+MONS: firedrake skeleton w:5 / lindwurm skeleton w:1 / hog skeleton / hound skeleton
+MONS: mummy
+# Loot: 4 gold, 8 items.
+SHUFFLE: 12K
+: volcano_setup(_G)
+: place_large_volcano(_G)
+: place_medium_flame_cloud(_G, "J")
+: place_medium_flame_cloud(_G, "K")
+MAP
+ xxxx
+ xxxxxxyyxxxxx
+ xxxy..yy.....yxxxx
+ xxy........yyx...yxxx xxxx
+ xxxy.................yxxx xxxxyyxx
+ xxxy.........LLLL........yxxx xxy.y..Lxx
+ xxy.........LLllllLL........yxxx cccccccxy.y.3Lllx
+ xxy..<..A...LllllllllLLL.......yxxx c..Y..cy.xxxLlllx
+ xxy.........LlllllllllllllLLL.....yxc ccc.....=.xx xxllJx
+ xxy........LLlllllllllllllllllLLL...lcccccccccGc..3..ccc xxxxx
+xxy....LLlLlllllllllllllllllllllllL........+....+.3<3.+Kc
+xy....LlllllllllllllllllllllllllL....lcccccccccGc..3..ccc
+xLl.LllllllllllllllllllllllllllllL..yxc ccc.....c
+xlllllllllllllllllGlllllllllllllllLLxx c1c..Y..c
+xxlllllllllllllGlllllGlllllllllllllxx cc+ccccc=cc cccccc
+ xxlllllllllllllllllllllllllllllllxx ccc.........ccc$defc
+ xxullllllllGllllVllllGlllllllluxx c2+.lllllll.+4=ge$fc
+ xxxlllllllllllllllllllllllllxxx ccc.........ccc$defc
+ xxllllllllGlllllGlllllllxxx cc+ccccc+cc cccccc
+ xxllllllllllGlllllllllxxx c1c cKc
+ xxllllllllllllllllllxxx ccc ccc
+ xxxllllllllllllllxxx
+ xxxlxxlxxxxlxxxx
+ xxxxxx xxx
+ENDMAP
+###############################################################################
+
+###############################################################################
+# Lava "aerie".
+#
+# It doesn't look much like an aerie these days, but it still has some of
+# the "aerie"-ish effects: flame clouds, flame elementals, lava and vortices!
+NAME: volcano_aerie
+WEIGHT: 30
+ORIENT: encompass
+MONS: lindwurm
+MONS: toenail golem / molten gargoyle
+MONS: fire elemental / fire vortex
+NSUBST: R = 1:1 / 1:L / 1:l / 1:.
+NSUBST: Y = 8:3 / 6:J / *:.
+SUBST: X = lx
+KPROP: l = no_cloud_gen
+COLOUR: m = red
+TAGS: volcano no_item_gen no_monster_gen
+: volcano_setup(_G)
+: place_small_volcano(_G)
+: place_medium_flame_cloud(_G, "J", true)
+: place_medium_flame_cloud(_G, "K")
+# Sides: Lindwurm # Vortex/elemental
+MAP
+ xxxxxxxxx
+ xxKlllllKxx
+ xxllLLLLLllxx
+ xxXl.d$$ef.lXxx
+ xxy...$f<g$...yxx
+ xxy..g$de$..yxx
+ xxy..yyy..yxx
+ xxx+mxm+xxxx
+ xxy.xxllLYyxx
+ xxy.yxXlllLYyxx
+ xxy.2yxXllllLYyx
+ xxy2yxXlllLYyxx
+ xxy.xxllLYyxx
+ xxy.xxLYyxx
+ xxy.xYyxx
+ xxxx+x+xxxx
+ xxxy..xxxYYyxxx
+ xxxy..LlXxXlLYYyxxx
+ xxy..LlllXxXlllLYYyxx
+ xy.LlllRRXxXlVlllLYyx
+ xy.LlllRRXxXlllllLYyx
+ xxy..LlllXxXlllLYYyxx
+ xxxy..LLXxXlLYYyxxx
+ xxxy..xxxYYyxxx
+ xxxxx+x+xxxx
+ xxy.xYyxx
+ xxy.xxlYyxx
+ xxy.xxllLYyxx
+ xxy.yxXlllLYyxx
+ xxy.2yxXKlllLYyx
+ xxy2yxXlllLYyxx
+ xxy.xxllLYyxx
+ xxx+mxm+xxx
+ xxy..yyy..yxx
+ xxy.........yxx
+ xxy...<...A...yxx
+ xxy...LLL...yxx
+ xxllLlllLllxx
+ xxKlllllKxx
+ xxxxxxxxx
+ENDMAP
+###############################################################################
+
+###############################################################################
+# Hidden bunker!
+#
+# There are scientists about, beware, as they may wish to experiment on you! The
+# idea was by Zaba, and the execution by due!
+NAME: volcano_bunker
+WEIGHT: 30
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen no_rotate
+# Loot: 11 items, 8 gold.
+: volcano_setup(_G, true)
+ITEM: apple / choko
+COLOUR: m = blue
+COLOUR: = = cyan
+COLOUR: + = cyan
+MONS: dragon
+MONS: human ; robe ego:fire_resistance
+MONS: toenail golem
+: place_medium_volcano(_G)
+: dgn.set_feature_desc_short("translucent rock wall",
+: "glass window")
+: dgn.set_feature_desc_long("translucent rock wall",
+: "A pockmarked, ultra-hard glass window.")
+KFEAT: K = .
+MARKER: K = lua:fog_machine ( { cloud_type = "rain", walk_dist=3, pow_max=2, \
+ delay=300, size=3 } )
+MAP
+ xxxx vvvvvvvvvvvvv
+ xxxxllxxx xxx v...........v
+ xxxlllllllxxxlxxx v.vvvvvvvvv.v
+xxlllVlllllllllllxxxx v.v33$e$$fv.v
+ xxlllllllllllllllllxxx v.v$$$gddgv.v
+xxllllllllllllllllllllxx v.+ggdf$$ev.v
+ xxllllllllvmvmvmvmvmvvvvvvvvvvvvvvvvvv.v
+ xxllllllllm.....vKiii...2...v...=......v
+ xxlllllllv.232.viWtWW......+.<.vvvvvvvv
+ xxllllllm.....vllttW..2...v...vxxx
+ xxxllllvvv+vvvvvvvvvvvvvvvv+vv.yxx
+ xxlllm.....v.v..2v2.....v..m..yxx
+ xxllllv.<.A.+.v+vvvvv+v+vvv.=..Lyxxx
+ xxlllllm.....v...............mLLllllxx
+ xxlllllvmvmvmvmvmvmvmvmvmvmvmvlllllxxx
+ xxllVlllllllllllllllllllllllllllllllllxx
+ xxxlllllllllllllllllllllllllllllVlllxx
+ xxllllllllllllllllxxllxxxllllllllxx
+ xxxxlllllVllllllxxxxxx xxxlllllxx
+ xxxllllllllxxx xxxllxx
+ xxxlllllxx xxxx
+ xxxxxxxx
+ENDMAP
+###############################################################################
+
+###############################################################################
+# Collapsing caverns! These don't actually have flame clouds. Wow!
+# idea by dpeg, execution by due. One entrance will close when you enter the
+# portal, leaving you with 7 to discover. Quickly, now!
+NAME: volcano_caves
+WEIGHT: 30
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen no_rotate
+LFLAGS: no_tele_control
+: volcano_setup(_G, true)
+{{
+local mytable = { total_doorways=8, total_collapsed=0, ac = {} }
+
+local function collapse_doorways (marker, mytable)
+ local x, y = marker:pos()
+ local you_x, you_y = you.pos()
+ if mytable.total_collapsed == mytable.total_doorways then
+ return
+ end
+
+ if you_x == x and you_y == y then
+ crawl.mpr("There is a rumble as the volcano erupts. The roof shakes.",
+ "warning")
+ return
+ end
+ local ack = x .. "/" .. y
+ if mytable.ac[ack] ~= true then
+ mytable.ac[ack] = true
+ if you.see_cell(marker:pos()) then
+ crawl.mpr("The volcano erupts! Nearby, a roof collapses.", "warning")
+ else
+ crawl.mpr("There is a rumble as the volcano erupts. The roof shakes.",
+ "warning")
+ end
+ mytable.total_collapsed = mytable.total_collapsed + 1
+ dgn.terrain_changed(x, y, "stone_wall", false, false, false)
+ dgn.colour_at(x, y, "lightred")
+ end
+end
+
+local collapse_marker = function_machine ( {marker_type = "random", turns_min=30,
+ turns_max=40, func=collapse_doorways, marker_params=mytable } )
+}}
+# FIX: Smushing these together does nothing. Enne is working on it!
+KPROP: R = no_rtele_into
+KPROP: X = no_rtele_into
+KPROP: Z = no_rtele_into
+KPROP: 1 = no_rtele_into
+KPROP: 2 = no_rtele_into
+KPROP: < = no_rtele_into
+SUBST: X = .
+SUBST: Z = c.
+SUBST: Y = c.
+SUBST: R = defg$
+: fiery_guardians(_G)
+: lua_marker("M", collapse_marker)
+: volcano_setup(_G)
+# There are eight oportunities for loot! Seven single threat (1) plus two items,
+# and one triple threat (121), plus six items. items can be any of: 1 armour,
+# 1 weapon, 1 potion, 1 any, 1 gold)
+MAP
+ ccc ccccc
+ ccXcc cccZZZcc
+ cccc cccc ccXZ<cc cccc ccXXRXX<cc
+ ccZXccc ccXZccc cXXRR1c cccZZccc ccXR1Zcc
+ cc<XRRYcccXR<ZXc ccXXccc cccX1RRX<cc cccXcc cccc
+ cccX1XXZccXR1ccc ccMcc ccXXXXXXXcc ccMc cccZccc
+ cccccccMccXcccccXXXccc.YYcccXXccccXZZcccccc ccc.cccc cccZXXXZccc
+ cccY..Yc.cYccc.cccMcccY.Y...YccMcYYccccc.cc.cccYY.YYYccccZXXXXXXXZccc
+ ccY...c.....Y.....cYY....cc.Y.......Y.YYY..Y..Y......Y..cXXXX1RRXXXZZc
+ ccAcccccYY..Y...Y.....YcccMcccY...Y...Y....Yc.cYY....ccMXXXX2RRXXXXZc
+ ccc cccYccc.ccccY.cccZXXXZccc.cccY....YcccMcccY..YcccZXXX1RRXXXZcc
+ ccc ccc cccccZXXRRXXX<ccc ccc..cccZXXRXccc<cc ccZXXXXXXZccc
+ cccZXX1XZccc cccc ccZXR1XXccc cccZXXZccc
+ cccZZccc cccZcc<c cc<ccc
+ cccc cccccc ccc
+ENDMAP
+###############################################################################
+
+###############################################################################
+# Zaba's village!
+#
+# These stupid humans have built their village right next to a dormant volcano.
+# It has erupted! Most have fleed, but some have stayed behind to guard their
+# hard-earned loot. Idea kinda by dpeg, execution by Zaba.
+NAME: volcano_village
+WEIGHT: 30
+ORIENT: encompass
+TAGS: volcano no_item_gen no_monster_gen no_rotate
+SUBST: S = lw
+SUBST: W = wW.
+SUBST: L = ll.
+SUBST: R = lx
+KFEAT: # = open_sea
+SHUFFLE: MIN
+SUBST: I = $def
+NSUBST: M = 4:1 / 1:2 / *:.
+NSUBST: N = 6:1 / *:.
+SUBST: " = ..'
+KFEAT: ' = alarm trap
+: fiery_humans(_G)
+: volcano_setup(_G)
+: place_medium_volcano(_G)
+MAP
+#########################################################
+#########################################################
+#########################################################
+#########################################################
+#########################################################
+#########################################################
+#########################################################
+#########################################################
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww########
+########wwwwwwwwWwWwWwWwWwWwWwWwWwWwWwWwWwwwwwwww########
+########wwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwww########
+########wwwwwwx...."""....."""....."""....xxwwwww########
+########wwwxxxx...xx+xx...xxxxx...xx+xx...'xxwwww########
+########wwxx.xx..xxMMMxx.xxIIIxx.xxNNNxx..x.xxxww########
+########SSx.x.x..xMMMMMx.xIIIIIx.xNNNNNx..x.xAxSS########
+#######xSSx<x.x..xMMMMMx.xIIIIIx.xNNNNNx..x.x<xSSx#######
+#######xlRxxx.x..xxMMMxx.xxIIIxx.xxNNNxx..xx.xxRlx#######
+#######xRlllxx....xxxxx...xx+xx...xxxxx...xxxxllRx#######
+#######xlRlllxx...."""....."""....."""....xllllRlx#######
+#######xRllllllLLLLLLLLLLLLLLLLLLLLLLLLLLLllllllRx#######
+ xlRllllllLlLlLlLlLlLlLlLlLlLlLlLlLllllllRlx
+ xRlllVllllllllllllllllllllllllllllllVllllRx
+ xlRlllllllllllVllllllVllllllllVlllllllllRlx
+ xRlRlllllllllllllllllllllllllllllllllllRlRx
+ xRlllRlllRlllRlllRlllRlllRlllRlllRlllRlllRx
+ xlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlx
+ xRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRlRx
+ xRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRx
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ENDMAP
+###############################################################################