2 ## Maps from named Wizards, unrand and fixedarts
4 #Wizard |Threat |Loot |XP
5 #--------------------------------------------------------------------
6 #Tukima |6 dancing weapons, |weapons, book, |14400
7 # |weapon generator |acquirement |
8 #--------------------------------------------------------------------
9 #Eringya |centaurs, fauns, |books, staves, potions |19000
11 #--------------------------------------------------------------------
12 #Doroklohe |constructs or demons |scrolls or armour |12000
13 # |or top-tier undead |or random |
14 #--------------------------------------------------------------------
15 #Wucad Mu |hell effect "monks", |potions of experience, |9000
16 # |summoning OCS |staff of Wucad Mu |
17 #--------------------------------------------------------------------
18 #Cigotuvi |uglies, abominations, |tmut potions / books, |16000
19 # |lump shapeshifters |scrolls of summoning |
20 #--------------------------------------------------------------------
21 #Iskenderun|DE mages, iood statues, |books, books, books, |22000
22 # |purple draconians |robe of the archmagi |
23 #--------------------------------------------------------------------
24 #Zonguldrok|skeletal warriors, |consumables, gold, |20000+
25 # |zombies, ancient lich |Zonguldrok's sword |
26 #--------------------------------------------------------------------
27 #Golubria |tloc-themed monsters, |tloc items, cloaks, |20000
28 # |Abyss monsters |abyss-escape aides |
29 #--------------------------------------------------------------------
30 #Cloud Mage|air elementals, |potions, robe of clouds,|16000
31 # |vapours, Cloud Mage |speed/air-related misc |
32 #--------------------------------------------------------------------
33 #Hellbinder|demons, summoners, |fire/summoning/ |17000
34 # |Hellbinder |demonic items |
35 #---------------------------------------------------------------------
36 #Full Name |Layout |Colours
37 #---------------------------------------------------------------
38 #Tukima's Dance Hall |mirrored hall |lightgray/white
39 #---------------------------------------------------------------
40 #Eringya's Formal Garden |overgrown formal |green and brown
42 #---------------------------------------------------------------
43 #Doroklohe's Tomb |densely packed |yellow walls,
44 # |collapsing tombs |dark floor
45 #---------------------------------------------------------------
46 #Wucad Mu's Monastery |empty temple |dark walls,
48 #---------------------------------------------------------------
49 #Cigotuvi's Fleshworks |organic, irregular, |magenta/red/yellow
50 # |twisted innards |flesh/blood tiles
51 #---------------------------------------------------------------
52 #Iskenderun's Mystic Tower|fortress tower with |tons of magenta
53 # |statues, cave corners|
54 #---------------------------------------------------------------
55 #Zonguldrok's Mausoleum |tower, graveyard |piles of darkgray
56 #---------------------------------------------------------------
57 #Roulette of Golubria |old-abyss mess, |mostly green,
58 # |teleport chambers maw|rare white or cyan
59 #---------------------------------------------------------------
60 #Cloud Mage's Chambers |"cloud-esque" |lightgray, white,
62 #---------------------------------------------------------------
63 #Hellbinder's Lair |triangles and circles|red, darkgray,
64 # |sigils |yellow sigils
69 # Actual portals need quite a bit of editing, and some unique tiles.
70 # Tiles to fix: Tukima's fountains, Eringya's rock-like stone walls,
71 # Doroklohe's plain floor, Cigotuvi's doorways, less generic
72 # Iskenderun tiles, Cloud Mage's "white fluffiness" and "sea of clouds".
77 function wizlab_portal (e)
78 local timeout_turns = crawl.random_range(600, 800)
82 initmsg = { "You hear the crackle of arcane power.",
83 "There is an entrance to a wizard's laboratory on "
84 .. "this level! Hurry and find it before the "
85 .. "portal closes forever!" },
86 finalmsg = "The crackle of the magical portal is almost imperceptible now.",
89 noisemaker = 'magical portal',
91 { 5000, 'rapid ' }, { 4000, '' },
92 { 2500, 'slow ' }, { 1500, 'irregular ' },
99 disappear = "The flow of magic halts.",
101 turns = timeout_turns,
103 floor = "stone_arch",
104 feat_tile = "dngn_portal_bazaar_gone",
106 e.kfeat("O = enter_wizlab")
107 e.tags("uniq_wizlab no_item_gen no_monster_gen chance_wizlab")
112 function wizlab_setup (e, wizlab_desc)
113 e.orient("encompass")
114 e.tags("no_item_gen no_monster_gen")
115 e.kfeat("< = exit_wizlab")
118 function wizlab_milestone (e, wizlab_desc)
119 crawl.mark_milestone("br.enter", "entered " .. wizlab_desc .. ".", "parent")
122 function tukima_machine (data, triggerable, triggerer, marker, ev)
123 if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
127 local x, y = marker:pos()
128 local you_x, you_y = you.pos()
130 if data.weapon_count >= 5 then
131 if you.see_cell(x, y) then
132 crawl.mpr("The machine makes a dull noise.")
134 crawl.mpr("You hear a distant, dull noise.")
139 if (you_x == x and you_y == y) then return end
140 if dgn.mons_at(x, y) then return end
142 dgn.apply_area_cloud(x, y, 1, 6, 1, 10, "black smoke", "other", -1)
144 if (not dgn.create_monster(x, y, "generate_awake dancing weapon")) then
148 data.weapon_count = data.weapon_count + 1
150 if you.see_cell(x, y) then
151 crawl.mpr("The generator hisses, and spits out a dancing weapon!")
153 crawl.mpr("You hear a distant hissing noise.")
157 function wizlab_eringya_grow(data, triggerable, triggerer, marker, ev)
158 if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
164 if data.nofruitsyet and crawl.one_chance_in(5) then
165 -- Fruit! Only once, though: infinite fruit is abusable.
166 for spot in iter.adjacent_iterator() do
167 if not feat.is_solid(spot:xy()) and feat.has_solid_floor(spot:xy())
168 and crawl.one_chance_in(3) then
169 dgn.create_item(spot.x, spot.y, "pear / apple / choko / apricot / orange"
170 .. "/ banana / strawberry q:4 / lemon / rambutan "
171 .. "/ grape q:7 / sultana q:9 / lychee")
173 data.nofruitsyet = false
177 crawl.mpr("Fruit sprouts up around you!")
180 for spot in iter.adjacent_iterator() do
181 if not feat.is_solid(spot:xy()) and feat.has_solid_floor(spot:xy())
182 and not crawl.one_chance_in(3) then
183 if crawl.one_chance_in(9) then
184 dgn.create_monster(spot.x, spot.y, "wandering mushroom")
187 dgn.create_monster(spot.x, spot.y, "toadstool")
193 crawl.mpr("Mushrooms sprout up around you!")
198 function wizlab_doroklohe_convert_boxes(data, triggerable, triggerer,
200 if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
204 if data.phase == 1 then
205 data.phase = data.phase + 1
206 if you.silenced() then
207 crawl.mpr("The ground shakes.", "warning")
209 crawl.mpr("There is a faint hissing noise.", "warning")
212 elseif data.phase == 2 then
213 data.phase = data.phase + 1
214 if you.silenced() then
215 crawl.mpr("The ground shakes.", "warning")
217 crawl.mpr("There is a loud grinding noise.", "warning")
220 elseif data.phase == 3 then
221 data.phase = data.phase + 1
222 crawl.mpr("The walls fall away. The entombed are set free!", "warning")
223 for _, i in ipairs(dgn.find_marker_positions_by_prop("wall_drop", 1)) do
224 dgn.terrain_changed(i.x, i.y, "floor", false, false, false)
225 dgn.place_cloud(i.x, i.y, "black smoke", 2)
233 local function spawn_zombie (x, y, spec)
234 dgn.terrain_changed(x, y, "floor", false, false, false)
235 local mons = dgn.create_monster(x, y, spec)
236 mons.set_prop("zonguldrok", 1)
240 function wizlab_zonguldrok_spawn_zombies(data, triggerable, triggerer,
243 if data.count == nil then
244 data.count = 0; data.swcount = 0; data.vpcount = 0; data.account = 0
246 if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
249 local graves = dgn.find_markers_by_prop("grave", 1)
251 for _, gmarker in ipairs(graves) do
253 if (you.see_cell(x, y) and crawl.one_chance_in(3)) or
254 crawl.one_chance_in(8) then
255 if data.count < 9 or data.count < 18 and crawl.one_chance_in(5) then
256 if crawl.coinflip() then
257 spawn_zombie(x, y, "generate_awake ogre zombie")
259 spawn_zombie(x, y, "generate_awake wight")
261 elseif data.count < 21 or data.count < 26 and crawl.one_chance_in(4) then
262 if data.vpcount > 3 or crawl.coinflip() then
263 spawn_zombie(x, y, "generate_awake troll zombie")
265 spawn_zombie(x, y, "generate_awake vampire")
266 data.vpcount = data.vpcount + 1
268 elseif data.count < 28 or data.account > 1 or crawl.x_chance_in_y(6, 7) then
269 if data.swcount > 5 or crawl.coinflip() then
270 spawn_zombie(x, y, "generate_awake hill giant zombie")
272 spawn_zombie(x, y, "generate_awake skeletal warrior")
273 data.swcount = data.swcount + 1
276 spawn_zombie(x, y, "generate_awake ancient champion")
277 data.account = data.account + 1
279 data.count = data.count + 1
285 function wizlab_zonguldrok_killed_zombie(data, triggerable, triggerer,
287 if data.door_appeared then
291 local mons = dgn.mons_from_mid(ev:arg1())
292 if not mons.has_prop("zonguldrok") then
296 data.number_killed = data.number_killed + 1
297 if (#dgn.find_markers_by_prop("grave", 1)) * 2 < data.number_killed * 3
298 and #dgn.find_markers_by_prop("grave", 1) < 10 then
299 local x, y = marker:pos()
300 dgn.tile_feat_changed(x, y, nil)
301 dgn.terrain_changed(x, y, "closed_door", false, false, false)
302 data.door_appeared = true
303 if you.see_cell(x, y) then
304 crawl.mpr("A door appears!")
306 crawl.mpr("The walls vibrate.")
308 local gxm, gym = dgn.max_bounds()
309 for p in iter.rect_iterator(dgn.point(1, 1), dgn.point(gxm-1, gym-1)) do
310 if dgn.fprop_at(p.x, p.y, "no_rtele_into") then
311 dgn.fprop_changed(p.x, p.y, "no_rtele_into")
318 function wizlab_zonguldrok_awaken_wizard(data, triggerable,
319 triggerer, marker, ev)
320 if data.awoke == true then
324 local pos = dgn.find_marker_positions_by_prop("wizard_grave", 1)[1]
325 local lich = dgn.create_monster(pos.x, pos.y, "generate_awake ancient lich "
326 .."col:brown name:antique_lich name_replace name_descriptor "
327 .."tile:mons_zonguldrok_lich")
333 function wizlab_wucad_msgfn(data, triggerable, triggerer, marker, ev)
334 if data.trig == true then
338 if crawl.one_chance_in(3) then
342 if dgn.persist.wucad_mu_died == true then
346 if data.spot == 1 then
347 crawl.mpr("Strange, shadowy figures dance through the air in front of you.", "talk_visual")
349 elseif data.spot == 2 then
350 crawl.mpr("This room is filled with shadowy figures, quietly meditating.", "talk_visual")
352 elseif data.spot == 3 then
353 crawl.mpr("Here, spectral monks perform complicated, martial routines; they fade quickly.", "talk_visual")
355 elseif data.spot == 4 then
356 if you.silenced() then
359 crawl.mpr("Faint laughter comes from somewhere. Too faint to be real.", "talk_visual")
361 elseif data.spot == 5 then
362 if you.silenced() then
365 crawl.mpr("There is a faint scream of pain from a crouched figure. This too fades quickly.", "talk_visual")
367 elseif data.spot == 6 then
368 crawl.mpr("Grey monks gather around the fountain. They do not speak, nor look at each other.", "talk_visual")
370 elseif data.spot == 7 then
371 crawl.mpr("A figure sits in silent meditation. It spots you, gestures wildly, and disappears.", "talk_visual")
376 function wizlab_wucad_summon_monks(data, triggerable, triggerer, marker, ev)
377 if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
381 if dgn.persist.wucad_mu_died == true then
385 -- For now, no spawning during Step From Time; perhaps monks should
386 -- continue to appear, just more slowly. If so, the circle_iterator below
387 -- needs a different centre from (0,0).
388 if you.pos() == 0 then
392 local msp = "monstrous demonspawn seen sum:shadow_creatures dur:2 " ..
393 "nas:old_memories generate_awake " ..
394 "tile:mons_faint_demonspawn_monk / deep troll seen " ..
395 "sum:shadow_creatures dur:2 nas:old_memories generate_awake " ..
396 "tile:mons_faint_deep_troll_monk / grey draconian monk w:5" ..
397 "seen sum:shadow_creatures dur:2 nas:old_memories " ..
398 "generate_awake tile:mons_faint_grey_draconian_monk"
401 for point in iter.circle_iterator(3) do
402 if crawl.one_chance_in(8) and count < 3 then
403 if feat.is_solid(point.x, point.y) or not feat.has_solid_floor(point.x, point.y) then
405 local mon = dgn.create_monster(point.x, point.y, msp)
414 crawl.mpr("One of the shadowy figures appears more solid!", "warning")
415 elseif count > 1 then
416 crawl.mpr("Shadows coalesce into solid form.", "warning")
420 function callback.wizlab_wucad_wucad_died(data, triggerable,
421 triggerer, marker, ev)
422 dgn.persist.wucad_mu_died = true
423 crawl.mpr("The shadows inhabiting this place fade forever.", "talk_visual")
426 function teleporter_golubria_switch_fn(data, triggerable, triggerer, marker, ev)
427 local position = dgn.point(marker:pos())
428 my_slaves = dgn.find_marker_positions_by_prop("teleport_spot",
431 if you.teleport_to(my_slaves[1].x, my_slaves[1].y, true) then
432 crawl.mpr("Your surroundings suddenly seem different!")
434 crawl.mpr("There is a strange hissing noise.")
440 default-depth: Depths, Elf, Crypt, Vaults:1-4
442 ###############################################################################
445 # Todo: more, and better.
446 NAME: mu_enter_wizlab_1
447 TILE: m = dngn_transparent_wall_green
448 COLOUR: m = lightgreen
462 NAME: mu_enter_wizlab_2
464 TILE: m = dngn_transparent_wall_green
465 COLOUR: m = lightgreen
466 TILE: c = wall_stone_gray
485 NAME: mu_enter_wizlab_3
486 DEPTH: D:$, Depths, Elf, Crypt, Vaults:1-4
487 MARKER: ! = lua:fog_machine { \
488 pow_max = 10, delay_min = 10, delay_max = 40, \
489 size = 2, size_buildup_amnt = 5, \
490 size_buildup_time = 25, cloud_type = "flame" \
492 MARKER: ? = lua:fog_machine { \
493 pow_max = 10, delay_min = 10, delay_max = 40, \
494 size = 2, size_buildup_amnt = 5, \
495 size_buildup_time = 25, cloud_type = "freezing vapour" \
497 COLOUR: .' = red / blue
498 KPROP: '?! = no_rtele_into
500 TILE: n = dngn_transparent_stone_magenta
501 COLOUR: n = lightmagenta
502 TILE: c = wall_stone_gray
521 NAME: mu_enter_wizlab_4
524 FTILE: !O = floor_rough_magenta
539 NAME: mu_enter_wizlab_5
540 DEPTH: D:$, Depths, Elf, Crypt, Vaults:1-4
542 COLOUR: W = mutagenic
543 KFEAT: o = granite_statue
544 FTILE: WU.Oo = floor_rough_magenta
545 TILE: b = dngn_crystal_magenta
547 : set_feature_name("green_crystal_wall", "wall of crystal")
563 NAME: mu_enter_wizlab_6
565 TILE: c = wall_stone_white
566 TILE: m = dngn_transparent_stone_magenta
567 FTILE: mcx.O = floor_rough_magenta
583 NAME: mu_enter_wizlab_7
584 DEPTH: D:$, Depths, Elf, Crypt, Vaults:1-4
586 KFEAT: ABCD : rock_wall
587 TILE: ABCD = floor_rough_white
588 TILE: ABCD = wall_zot_white
612 NAME: infiniplex_enter_wizlab_glasses
613 DEPTH: D:22-, Elf, Crypt, Vaults:1-4
614 FTILE: GO_ = floor_rough_magenta
615 TILE: m = dngn_transparent_wall_green
616 COLOUR: m = lightgreen
618 TILE: G = dngn_statue_dragon
630 NAME: infiniplex_enter_wizlab_water
631 FTILE: cnO_ = floor_rough_magenta
632 TILE: n = dngn_transparent_stone_magenta
633 COLOUR: n = lightmagenta
635 TILE: c = wall_stone_white
650 NAME: infiniplex_enter_wizlab_spiral
651 DEPTH: D:$, Depths, Elf, Crypt, Vaults:1-4
654 MARKER: ! = lua:fog_machine { \
655 pow_max = 8, delay_min = 20, delay_max = 60, \
656 walk_dist = 3, size = 1, start_clouds = 1, \
657 start_clouds = 1, cloud_type = "freezing vapour" \
659 MARKER: ? = lua:fog_machine { \
660 pow_max = 8, delay_min = 20, delay_max = 60, \
661 walk_dist = 3, size = 1, start_clouds = 1, \
662 start_clouds = 1, cloud_type = "mutagenic fog" \
664 FTILE: _! = floor_frozen
665 COLOUR: _! = lightcyan
666 FTILE: -? = floor_rough_magenta
687 NAME: lightli_enter_wizlab_magi_temple
689 FTILE: . = floor_rough_magenta
706 ###############################################################################
708 default-depth: WizLab
710 ###############################################################################
712 ###############################################################################
713 # Firstly, we have Tukima's Dance Studio.
718 KFEAT: M = granite_statue
719 TILE: M = dngn_machine_tukima
720 MARKER: M = lua:props_marker {veto_fragmentation="veto", veto_disintegrate="veto", \
721 veto_shatter="veto", slaved_to="tukima"}
724 local tukima_marker = TriggerableFunction:new {
725 func = "tukima_machine",
727 data = {weapon_count=0},
730 tukima_marker:add_triggerer(DgnTriggerer:new {
731 type="turn", delay_min=600, delay_max=900
734 lua_marker('?', tukima_marker)
738 COLOUR: +cA< = darkgrey
739 KMONS: 789 = statue spells:blink_other;.;.;.;.;blink_other \
740 col:silver name:strange_machine n_rpl n_des \
741 hd:13 hp:70 tile:mons_statue_guardian
742 # please make sure this is the book with Tukima's Dance
743 KITEM: 8 = book of enchantments
744 KITEM: 9 = acquire any, scroll of blinking q:4 ident:type
745 SHUFFLE: XxLl / HhIi, YyRr / JjKK
746 SUBST: XYik = +, xyIK = ., HJRrLl = c, hj = m
747 TILE: c = wall_stone_dark
748 TILE: V = dngn_dry_fountain_white
749 LFLOORTILE: floor_pebble_white
751 TILE: m = dngn_mirror_wall
752 : set_feature_name("clear_rock_wall", "crystal clear mirror")
753 : set_feature_name("granite_statue", "strange generator")
754 : set_feature_name("dry_fountain", "glistening fountain")
755 : set_feature_name("stone_wall", "black marble wall")
756 : set_feature_name("floor", "marble floor")
757 : set_random_mon_list("dancing weapon")
758 : wizlab_setup(_G, "Tukima's Studio")
760 wizlab_milestone(_G, "Tukima's Studio")
770 cc...cccc...cccc...cc
771 cm...mcm..0..mcm...mc
772 cm...mcm.....mcm...mc
773 cm...mcm..V..mcm...mc
774 cm...mcm.....mcm...mc
775 cm...mcm..0..mcm...mc
776 cc...cccc...cccc...cc
777 ccc.cccccc.cccccc.ccc
779 ccm7mccm.....mccm7mcc
780 cm.0......M......0.mc
781 ccXm.mccm..?..mccm.mYcc
782 cccxccmlcccm...mcccrmccycc
783 ccm.mcccLcccm.mcccRcccm.mcc
784 ccm...mLLcccm...mcccRRm...mcc
785 ccm..$..mcccm.....mcccm..$..mcc
786 cm..$8$..m+m...7...m+m..$9$..mc
787 ccm..$..mcccm.....mcccm..$..mcc
788 ccm.0.mcc ccm...mcc ccm.0.mcc
789 ccmmmcc ccmmmcc ccmmmcc
793 ###############################################################################
794 # Eringya's Formal Garden
796 # Map was based on this image:
797 # https://upload.wikimedia.org/wikipedia/commons/5/58/Plan_du_château_et_des_jardins_de_Clagny_dessiné_par_Maraine_XVIIe_siècle.jpg
799 # TODO: Needs vine-covered statues, rose-covered archway.
800 # Map was previously said to be too static: while this is still the case,
801 # I think the improvements to terrain and monsters should be more than
802 # enough, though more dynamic lua with e.g. oklobs, spores,
803 # fruit-renamed dancing weapons could still contribute to the theme.
807 MONS: generate_awake patrolling centaur
808 MONS: generate_awake patrolling faun
809 MONS: centaur warrior, satyr, thorn hunter
810 MONS: earth elemental name:vine_covered name_adjective col:lightgreen \
813 ITEM: any fixed theme book, any fixed level book
814 ITEM: any magical staff / any rod w:2, any potion no_pickup
815 KFEAT: - = stone_arch
816 KFEAT: _ = altar_fedhas
817 NSUBST: 1 = 3:2 / 6:1 / * = 1:14 2:1
818 NSUBST: 3 = 2:4 / 2:3 / * = 3:14 4:1
819 NSUBST: P = 1:7 / *:t, A = 1:A / *:-
821 SHUFFLE: ef / ef / fe
822 COLOUR: G = lightgrey
823 TILE: G = dngn_statue_centaur
824 MARKER: A = feat:stone_arch
825 TILE: c = wall_brick_vines
826 LROCKTILE: wall_brick_vines
827 LFLOORTILE: floor_grass
829 local grow_marker = TriggerableFunction:new { func = "wizlab_eringya_grow",
831 data = { nofruitsyet = true } }
833 grow_marker:add_triggerer(DgnTriggerer:new { type="turn",
834 delay_min=500, delay_max=800, })
837 lua_marker("_", grow_marker)
839 : set_border_fill_type("stone_wall")
840 : wizlab_setup(_G, "Eringya's Formal Garden")
841 : set_feature_name("stone_arch", "rose-covered archway")
842 : set_feature_name("granite_statue", "vine-covered statue")
843 : set_feature_name("stone_wall", "crumbling stone wall")
844 : set_feature_name("floor", "the grass-covered ground")
845 : set_random_mon_list ("centaur / centaur warrior / faun / satyr w:6 / thorn hunter w:4")
847 wizlab_milestone(_G, "Eringya's Formal Garden")
850 ccccccccccccccccccccccccccccccccccccccccccccc
851 ctttttttttttttttttttttttttttttttttttttttttttc
852 ctttttttt...........................ttttttttc
853 ctttt.....tttttttttttt.tttttttttttt.....ttttc
854 cttt..tt.tttttttttt.......tttttttttt.tt..tttc
855 ct.1.tAt............G.<.G............tAt.1.tc
856 cttt..tt.tttttttttt.......tttttttttt.tt..tttc
857 ctttt.....tttttttttttt.tttttttttttt.....ttttc
858 ctttttttt...........................ttttttttc
859 cttttttttttttttttttttt.tttttttttttttttttttttc
860 ctttttttttyyyttttttty...ytttttttyyytttttttttc
861 ctttttttty...yt...ty..T..yt...ty...yttttttttc
862 cttttttt..1t1..ttt....P....ttt..1t1..tttttttc
863 ctttttt....t1.t...tc.....ct...t.1t....ttttttc
864 cttttt.tty...yttttttcc-cctttttty...ytt.tttttc
865 ctttt.t.ttytyttttttt.....tttttttytytt.t.ttttc
866 cttt.t.tttt.ttttttty.353.yttttttt.tttt.t.tttc
867 cttt.t.tttt..tttttttyf.fyttttttt..tttt.t.tttc
868 ctttt.t.tttt..tttttttytyttttttt..tttt.t.ttttc
869 cttttt.t.tttt..ttttttttttttttt..tttt.t.tttttc
870 ctttttt.t.tttt..tttttcccttttt..tttt.t.ttttttc
871 cttttyyy-yyytt...tttygggyttt...ttyyy-yyyttttc
872 cttty.1...1.y.tt..ty..1..yt..tt.y.1...1.ytttc
873 ctty...tTt...y.tt....1T1....tt.y...tTt...yttc
874 cttty.1.3.1.y.tt..ty..3..yt..tt.y.1.3.1.ytttc
875 cttttyyy-yyytt...tttygggyttt...ttyyy-yyyttttc
876 ctttttt.tttttt..tttttcccttttt..tttttt.ttttttc
877 cttttt.t.tttt..ttttttttttttttt..tttt.t.tttttc
878 ctttt.t.tttt..ttttt5G._.G5ttttt..tttt.t.ttttc
879 cttt.t.tttt..ttttt...6.6...ttttt..tttt.t.tttc
880 cttt.t.ttt..ttttt...........ttttt..ttt.t.tttc
881 ctttt.t.tytyttttde..cc+cc..edttttytyt.t.ttttc
882 cttttt.ty...yttttttcc...cctttttty...yt.tttttc
883 ctttttt.-.1.-.ttttcc..P..cctttt.-.1.-.ttttttc
884 cttttttty...yt.t..t-.3T3.-t..t.ty...ytttttttc
885 cttttttttyyyttt.tt.y.....y.tt.tttyyyttttttttc
886 cttttttttttttttt..ttyytyytt..tttttttttttttttc
887 ctttttttttttttttttttttttttttttttttttttttttttc
888 ccccccccccccccccccccccccccccccccccccccccccccc
891 ###############################################################################
892 # Doroklohe's Forbidden Tomb
894 # It seems as if he practised box casting. I wonder what that's good for.
895 # Vault by dpeg. Thanks to Enne for box_glyph and to Jude for triggers.
897 # A bleach sun settles in the smog-stained sky
898 # Dismembered bodies stray in disarray
899 # Breakfast is served in the Manchester Morgue
900 # The beginning of a horrifying day
903 # TODO: Floor tiles, use box_glyph for warning box instead of manual placement.
904 NAME: wizlab_doroklohe
909 function make_box(cenx, ceny, gly)
914 if (x >= 1 and y >= 1 and x <= width() and y <= height()) then
915 if (ox ~= 0 or oy ~= 0) then
923 function box_glyph(findgly, boxgly)
924 local glyphs = {gly_points(findgly)}
925 for i = 1, #glyphs, 2 do
926 make_box(glyphs[i], glyphs[i+1], boxgly)
930 # There are two layouts: round and grid.
931 # Round has 19 boxes: 12 % and 6 * and 1 |
932 # Grid has 21 boxes: b-u and |
933 # Layout for grid can be regular or random.
935 : local layout = crawl.random2(13)
937 # Preparation for the rare regular grid layout.
938 SUBST: bcdefghijk = ., lmnopqrstu = .
939 SUBST: B=b, C=c, D=d, E=e, F=f, G=g, H=h, I=i, J=j, K=k
940 SUBST: L=l, M=m, N=n, O=o, P=p, Q=q, R=r, S=s, T=t, U=u
943 # First the round layout...
945 KFEAT: _ = stone_wall
946 TILE: _ = wall_stone_black_marked / wall_stone_dark w:4 / wall_stone_black_marked
947 SUBST: bcdefghijk = ., lmnopqrstu = .
948 SUBST: BCDEFGHIJK = ., LMNOPQRSTU = .
950 # ...and now the grid layout.
953 SUBST: B=b, C=c, D=d, E=e, F=f, G=g, H=h, I=i, J=j, K=k
954 SUBST: L=l, M=m, N=n, O=o, P=p, Q=q, R=r, S=s, T=t, U=u
955 NSUBST: b = 1:b / *:., c = 1:c / *:.
956 NSUBST: d = 1:d / *:., e = 1:e / *:.
957 NSUBST: f = 1:f / *:., g = 1:g / *:.
958 NSUBST: h = 1:h / *:., i = 1:i / *:.
959 NSUBST: j = 1:j / *:., k = 1:k / *:.
960 NSUBST: l = 1:l / *:., m = 1:m / *:.
961 NSUBST: n = 1:n / *:., o = 1:o / *:.
962 NSUBST: p = 1:p / *:., q = 1:q / *:.
963 NSUBST: r = 1:r / *:., s = 1:s / *:.
964 NSUBST: t = 1:t / *:., u = 1:u / *:.
965 # Of the outer boxes, three are damaged.
966 # TODO: adapt this code for the first box,
967 # instead of manually ruining it.
968 SHUFFLE: bcdefghijklm
969 : box_glyph('b', 'X')
970 : box_glyph('c', 'Y')
971 : box_glyph('d', 'Z')
973 NSUBST: X = 1=. / *=!:20 .:1
974 NSUBST: Y = 1=. / *=!:30 .:1
975 NSUBST: Z = 1=. / *=!:50 .:1
976 # For the other boxes, prepare same setup as for the
977 # round layout (i.e. six *'s)
979 SUBST: efghijklmn = %
983 # 0 Tomb set: zombies, mummies (weight *2)
984 # 1 Demons (if demons are added or reclassified, please change!)
986 # TODO: 3 Holy set (for later)
987 : local mrnd = crawl.random2(4)
989 KMONS: 0% = gargoyle / earth elemental / toenail golem w:1
990 KMONS: * = war gargoyle / crystal guardian / iron golem
991 KMONS: | = electric golem
992 : set_random_mon_list("earth elemental / toenail golem w:1 / " ..
993 : "gargoyle / crystal guardian / iron golem")
994 : elseif mrnd == 1 then
995 KMONS: 0% = smoke demon / ynoxinul / neqoxec w:6 / ice devil /\
996 chaos spawn / soul eater / sun demon
997 KMONS: * = lorocyproca / reaper / shadow demon / tormentor / hellion /\
998 blizzard demon / green death / balrug / cacodemon
999 KMONS: | = hell sentinel / brimstone fiend / shadow fiend /\
1000 ice fiend / executioner
1001 : set_random_mon_list(
1002 : "smoke demon / ynoxinul / neqoxec / ice devil /" ..
1003 : "chaos spawn / soul eater / sun demon / " ..
1004 : "lorocyproca / reaper / shadow demon / tormentor / hellion")
1006 KMONS: 0% = place:Depths:1 zombie / guardian mummy w:4
1007 KMONS: * = zombie / mummy priest w:6
1008 KMONS: | = ancient lich / greater mummy
1009 : set_random_mon_list("place:Depths:1 zombie / zombie / guardian mummy")
1012 # 0 = scrolls. 1 = armours. 2 = mixed.
1013 : local lrnd = crawl.random2(3)
1015 KITEM: % = any scroll / any scroll q:2 w:3 / any scroll q:3 w:1
1016 : kitem("* = " .. dgn.good_scrolls)
1017 KITEM: | = scroll of acquirement ident:type / scroll of enchant weapon III q:2 ident:type /\
1018 scroll of blinking q:2 ident:type, scroll of fog q:2 ident:type, \
1019 scroll of holy word q:2 ident:type
1020 : elseif lrnd == 1 then
1021 KITEM: % = any armour
1022 KITEM: * = any good_item armour
1023 KITEM: | = cursed robe ego:resistance ident:type / cursed gold dragon armour
1025 KITEM: % = any / star_item w:2
1026 KITEM: * = star_item / superb_item w:2
1027 KITEM: | = superb_item
1030 : box_glyph('%', '!')
1031 : box_glyph('*', '!')
1032 : box_glyph('|', '!')
1033 # Intentionally colouring the floor glyphs of the central room only.
1034 # The squares beneath the boxes are to remain uncoloured.
1035 NSUBST: x = 1:. / 1 = x. / *:x
1036 COLOUR: ^ = darkgrey
1037 TILE: ^ = wall_stone_black_marked / wall_stone_dark w:4 / wall_stone_black_marked
1039 KFEAT: ^ = stone_wall
1040 COLOUR: . = darkgrey / blue w:3 / cyan w:1
1041 MARKER: ! = lua:portal_desc {wall_drop=1}
1042 MARKER: = = lua:portal_desc {wall_drop=1}
1043 TILE: !x = wall_sandstone
1045 local box_marker = TriggerableFunction:new {
1046 func="wizlab_doroklohe_convert_boxes",
1047 repeated=true, data={phase=1} }
1049 box_marker:add_triggerer(DgnTriggerer:new { type="turn",
1050 delay_min=500, delay_max=1000})
1052 lua_marker("A", box_marker)
1054 : set_feature_name("rock_wall", "strange rock wall")
1055 : set_feature_name("stone_wall", "highly decorated stone wall")
1056 : set_feature_name("floor", "rough-hewn floor")
1057 : wizlab_setup(_G, "Doroklohe's Tomb")
1059 wizlab_milestone(_G, "Doroklohe's Tomb")
1062 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1063 ^________________...........________________^
1064 ^____________...................____________^
1065 ^_________........................._________^
1066 ^_______b....cc......d%d......ee....f_______^
1067 ^_____bB.....cC%.....dDd.....%Ee.....Ff_____^
1068 ^____bb...............................ff____^
1069 ^___.....................................___^
1070 ^__........%......o*.....*p......%........__^
1071 ^__.......nnN....oO.......Pp....Qqq.......__^
1072 ^_........................................._^
1073 ^_...mm...............................gg..._^
1074 ^_...mM..%......*.....|.....*......%..Gg..._^
1075 ^_...mm...............................gg..._^
1076 ^_........................................._^
1077 ^__.......uuU....tT.......Ss....Rrr.......__^
1078 ^__........%......t*.....*s......%........__^
1079 ^___.....................................___^
1080 ^____ll...............................hh____^
1081 ^_____lL.....kK%.....xxx.....%Ii.....Hh_____^
1082 ^_______l....kk......x0x......ii....h_______^
1083 ^_________...........xxx..........._________^
1084 ^____________...................____________^
1085 ^________________...........________________^
1086 ^^^^^^^^^^^^^^^^^^^^^^#^^^^^^^^^^^^^^^^^^^^^^
1097 ##############################################################################
1098 # Cigotuvi's Fleshworks (by Mu.)
1100 # Cigotuvi has mastered the art of manipulating flesh, and his lab is a
1101 # living testament to this fact, seeming like the interior of some
1102 # ghastly beast. The walls and floor are slick and membranous, pulsing to an
1103 # unheard heartbeat and oozing thick, green ichor from every inch.
1105 # The bulk of Cigotuvi's Fleshworks is devoted to cells that house test
1106 # subjects in various stages of degeneration. Most are sickly humanoids; the
1107 # others are ugly things, pulsating lumps and abominations.
1109 # The central, circular chamber houses Cigotuvi's flesh golem.
1110 # The Eastern half of his lab is dominated by a snaking passageway filled with
1111 # pulsating lumps and the occasional ugly thing.
1113 # The western half of his lab is full of abominations, including the terrible
1114 # "Cigotuvi's Monster".
1116 # TODO: * door tile is *really* ugly, fix this?
1118 NAME: wizlab_cigotuvi
1120 KPROP: . = w:1 bloody / w:15 nothing
1121 KPROP: ' = bloody / w:5 nothing
1122 MONS: human name:sickly dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_human /\
1123 human name:monstrous dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_human /\
1124 human name:deformed dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_human /\
1125 human name:twisted dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_human /\
1126 human name:grotesque dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_human /\
1127 human name:hideous dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_human /\
1128 human name:febrile dbname:deformed_humanoid n_adj n_noc tile:mons_deformed_human
1129 MONS: elf name:sickly dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_elf /\
1130 elf name:monstrous dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_elf /\
1131 elf name:deformed dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_elf /\
1132 elf name:twisted dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_elf /\
1133 elf name:grotesque dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_elf /\
1134 elf name:hideous dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_elf /\
1135 elf name:febrile dbname:deformed_humanoid n_adj n_spe n_noc tile:mons_deformed_elf
1136 MONS: orc name:sickly dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_orc /\
1137 orc name:monstrous dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_orc /\
1138 orc name:deformed dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_orc /\
1139 orc name:twisted dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_orc /\
1140 orc name:grotesque dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_orc /\
1141 orc name:hideous dbname:deformed_humanoid n_adj n_spe tile:mons_deformed_orc /\
1142 orc name:febrile dbname:deformed_humanoid n_adj n_noc tile:mons_deformed_orc
1143 MONS: ugly thing, very ugly thing
1144 MONS: pulsating lump perm_ench:shapeshifter / pulsating lump w:1
1145 MONS: small abomination
1146 KMONS: 8 = large abomination
1147 KMONS: 9 = generate_awake giant eyeball
1148 KMONS: 0 = col:red iron golem name:flesh_golem name_replace \
1149 tile:mons_flesh_golem name_descriptor
1150 KMONS: & = col:mutagenic tentacled monstrosity name:Cigotuvi's_Monster \
1151 name_replace hp:200 tile:mons_cigotuvis_monster
1152 ITEM: potion of mutation w:60 / potion of beneficial mutation / \
1153 potion of cure mutation
1154 ITEM: potion of beneficial mutation, potion of cure mutation
1155 ITEM: amulet of resist mutation good_item
1156 ITEM: randbook disc:transmutation owner:Cigotuvi
1157 ITEM: book of transfigurations / randbook disc:transmutation
1158 ITEM: staff of death, scroll of summoning
1159 SHUFFLE: de / h~ / j|
1160 NSUBST: de = 1:e / 1:f / *:d, g = 1:g / *:$, h = 1:h / 2:i / *:., j = 1:j / *:k
1161 SUBST: 4 = 4 5:2, " = 6:1 .:16, |~ = .
1162 MARKER: ! = lua:fog_machine { \
1163 pow_max = 10, delay_min = 10, delay_max = 40, \
1164 size = 1, size_buildup_amnt = 10, \
1165 size_buildup_time = 500, cloud_type = "mutagenic fog", \
1167 MARKER: ? = lua:fog_machine { \
1168 pow_max = 20, delay_min = 10, delay_max = 40, \
1169 size = 5, size_buildup_amnt = 10, \
1170 size_buildup_time = 25, cloud_type = "mutagenic fog", \
1173 LFLOORTILE: floor_nerves
1174 LROCKTILE: wall_flesh
1175 TILE: c = wall_flesh
1176 TILE: m = wall_transparent_flesh
1177 TILE: + = no_random dngn_fleshy_orifice
1179 COLOUR: c+ = lightred
1181 : set_feature_name("shallow_water", "Viscous fluid")
1182 : set_feature_name("stone_wall", "sinewy wall")
1183 : set_feature_name("clear_rock_wall", "thin membrane")
1184 : set_feature_name("floor", "pulsating floor")
1185 : lua_marker('+', props_marker {
1186 : door_description_noun="fleshy orifice",
1187 : door_berserk_verb_open="You part the %s%s",
1188 : door_berserk_adjective="with a squelch!",
1189 : door_berserk_verb_close="You squeeze the %s%s closed",
1190 : door_noisy_verb_open="You part the %s%s with a squelch!",
1191 : door_noisy_verb_close="You squeeze the %s%s closed with a squelch!",
1192 : door_airborne_verb_open="You reach down and part the %s%s.",
1193 : door_airborne_verb_close="You reach down and squeeze the %s%s closed.",
1194 : door_verb_open="You part the %s%s.",
1195 : door_verb_close="You squeeze the %s%s shut."
1197 : wizlab_setup(_G, "Cigotuvi's Fleshworks")
1198 : set_random_mon_list("pulsating lump / large abomination / ugly thing / very ugly thing")
1200 wizlab_milestone(_G, "Cigotuvi's Fleshworks")
1203 ccccccccccccccccccccccccccccccccccccccccccccc
1204 ccjjjcccc|cccccccccccAccccccccccccWWWW~5hcccc
1205 c|...|c....|ccc...ccc+cccccccccccWh~~~.45hccc
1206 c|8........|cc.4...m...m..ccccccW~......45hcc
1207 c.&........cc...2..m.7.m.1.cccccW~........hcc
1208 c.8........cc...3..m...m.4..ccccW~.......~Wcc
1209 c|.........cc.cccccm...mc...ccccc.......~Wccc
1210 c|...|ccc+ccccc..cccc+cccccccccccc.....hWcccc
1211 ccjjjccc..cccc444.cm...m..3..ccccc+cccccccccc
1212 cccccccc..ccc..!...m.7.m.1..cccccc""ccccccccc
1213 cceecccc..ccc.444..m...m...ccccccc""cc$$g$$cc
1214 ceddecc...cccc....cm...m.cccWccccc""c...c...c
1215 cedde+...cccccc..cccc+cccc...Wcccc""c...c...c
1216 ceddec...ccccccccc.m...m.77...Wccc""ccc+c+ccc
1217 cceccccc+cccccccc..m.7.m...4..Wccc""c...9...c
1218 ccccccc...cccc...1.m...m....7.ccgc""c...6...c
1219 cccc.........c..2..m...mc....cc$$c""c..6669.c
1220 c.67...ccc...cc..cccc+cccc..ccc+cc""c..66..cc
1221 c...ccccccc+cccccc.m.....cccc.666c""+.....ccc
1222 cc...ccccc'''cccc..m.....4cc9.666c""ccccccccc
1223 cc...ccc''''''cc.!.m.....<4c9....+"""""""""cc
1224 c..cccc''''''''cc.......c4ccc....cc"""""""""c
1225 c..ccc'''''''''cccccc+cccccccccccccccccccc""c
1226 c..cc''''''''''ccccc...ccccccc""""""""""""""c
1227 c..cc''''''''''ccc.......cccc""""""""""""""cc
1228 c..c'''''''''''cc.........ccc""cccccccccccccc
1229 c..c+c+c+c+c+ccc...........cc""""""""""""""cc
1230 c..c8c8c8c8c8ccc...........ccc""""""""""""""c
1231 c..cccccccccccc.....c.c.....cccccccccccccc""c
1232 c...76........+......?......+"""""ccc"""""""c
1233 c...76........c.....c.c.....c""""""c"""""""cc
1234 ccmmmccccmmmcccc...........cccccc""c""ccccccc
1235 c.....cc.....cccWW.......WWcc""""""c""""""ccc
1236 cc.66cccc444cccccWW..0..WWcc""""""ccc""""""cc
1237 cc66.cccc.1.ccccccWWWWWWWccc""ccccccccccc""cc
1238 cc.3cccccc44ccccccccWWWccccc"""""""""""""""cc
1239 ccccccccccccccccccccccccccccc"""""""""""""ccc
1240 ccccccccccccccccccccccccccccccccccccccccccccc
1243 ###############################################################################
1244 # Iskenderun's Mystic Tower
1246 # TODO: Could use more unique tiles.
1247 # A previous commit labeled this one as boring, though acceptable;
1248 # hopefully emphasizing the orbs and terrain more than previously
1249 # should help, though more unique contents could certainly be tried.
1251 NAME: wizlab_iskenderun
1252 TAGS: no_rotate patrolling
1253 MONS: deep elf mage spells:magic_dart;force_lance;iskenderun's_battlesphere;\
1254 iskenderun's_mystic_blast;iskenderun's_battlesphere;.
1255 MONS: statue hd:12 spells:orb_of_destruction tile:mons_statue_mage col:vehumet \
1257 KMONS: 3DEF = purple draconian
1258 KITEM: D = robe ego:archmagi ident:type, star_item / superb_item, star_item
1259 KITEM: E = any book, randbook disc:conjuration owner:Iskenderun \
1260 spells:iskenderun's_mystic_blast|iskenderun's_battlesphere, \
1261 randbook disc:conjuration owner:Iskenderun
1262 KITEM: F = any book good_item, any book good_item, any book
1263 KMONS: DEF = purple draconian
1265 TILE: v = dngn_metal_wall_magenta
1266 MARKER: " = lua:fog_machine { \
1267 pow_max = 10, delay_min = 10, delay_max = 40, \
1268 size = 15, cloud_type = "purple smoke" }
1269 NSUBST: 1 = 4 = 1:1 3:19 / 6 = 1:2 3:3 / * = 1:15 .
1270 SHUFFLE: '=F- / '=F- / '=F- / F-'= / F-'=, DEF
1271 SUBST: - = v, ' = ., = = +
1272 LROCKTILE: wall_zot_magenta
1273 LROCKCOL: lightmagenta
1274 LFLOORTILE: floor_rough_magenta
1276 : set_random_mon_list("purple draconian / deep elf mage")
1277 : wizlab_setup(_G, "Iskenderun's Mystic Tower")
1279 wizlab_milestone(_G, "Iskenderun's Mystic Tower")
1282 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
1283 vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv
1284 vxxx..x.x.x.x.x.x.xx"xx.x.x.x.x.x.xx.xxxv
1285 vxx<xxAx.x.x.x.x.x.x.x.x.x.x.x.x.x.xx.xxv
1286 vx.x"xxx.x..........x.............xx"x.xv
1287 vx.xx...............................xxxxv
1288 vxxAx...............2...............x.xxv
1289 vx.xx................................x.xv
1290 vxx.......2.......v...v.......2.......xxv
1291 vx.xx...........v.vv.vv.v............x.xv
1292 vxx............vvv11.11vvv............xxv
1293 vx.x..........v.v1vvvvv1v.v..........x.xv
1294 vxx..........v.v1vvvEvvv1v.v..........xxv
1295 vx.x........vvv1vvvv+vvvv1vvv........x.xv
1296 vxx..........v1vvv.....vvv1v..........xxv
1297 vx.x.......vv1vvv.......vvv1vv.......x.xv
1298 vxxx........v1vvv.......vvv1v........xxxv
1299 vx".x...2.....vD+...2...+'=.....2...x."xv
1300 vxxx........v1vvv.......vvv1v........xxxv
1301 vx.x.......vv1vvv.......vvv1vv.......x.xv
1302 vxx..........v1vvv.....vvv1v..........xxv
1303 vx.x........vvv1vvvv+vvvv1vvv........x.xv
1304 vxx..........v.v1vvvFvvv1v.v..........xxv
1305 vx.x..........v.v1vv-vv1v.v..........x.xv
1306 vxx............vvv11.11vvv............xxv
1307 vx.x............v.vv.vv.v............x.xv
1308 vxx.......2.......v...v.......2.......xxv
1309 vx.x.................................x.xv
1310 vxx.x...............2...............x.xxv
1311 vxxxx...............................xxxxv
1312 vx.x"xx.............x.............xx"x.xv
1313 vxx.xx.x.x.x.x.x.x.x.x.x.x.x.x.x.x.xx.xxv
1314 vxxx.xx.x.x.x.x.x.xx"xx.x.x.x.x.x.xx.xxxv
1315 vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv
1316 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
1319 ###############################################################################
1320 # Zonguldrok's Shrine
1321 NAME: wizlab_zonguldrok
1323 : wizlab_setup(_G, "Zonguldrok's Shrine")
1327 MONS: patrolling skeletal warrior, patrolling ancient champion
1328 COLOUR: t = darkgrey / lightgrey
1329 TILE: t = dngn_tree_dead
1332 NSUBST: d = 2:e / 1:f / * = d:20 e:2
1333 ITEM: any scroll / any potion, any book w:2
1334 ITEM: bastard sword unrand:sword_of_zonguldrok
1335 KFEAT: GW = G no_mimic
1336 KPROP: 12'def$ZL+ = no_rtele_into
1338 graves = 28 + crawl.random2(4) + crawl.random2(4)
1339 nsubst("G = " .. graves .. ":G / *:.")
1340 lua_marker("G", portal_desc { grave = 1 })
1341 lua_marker("Z", portal_desc { wizard_grave = 1})
1342 lua_marker("W", portal_desc { desc="Zonguldrok's gravestone",
1343 veto_fragmentation="veto", veto_disintegrate="veto", veto_shatter="veto" })
1345 local zombies_appear_marker = TriggerableFunction:new {
1346 func = "wizlab_zonguldrok_spawn_zombies",
1348 data = {count = 0, vpcount = 0, swcount = 0, account = 0}
1351 local zombies_killed_marker = TriggerableFunction:new {
1352 data = { number_killed = 0, door_appeared = false },
1353 func = "wizlab_zonguldrok_killed_zombie",
1357 local wizard_appear_marker = TriggerableFunction:new {
1358 data = { awoke = false },
1359 func = "wizlab_zonguldrok_awaken_wizard",
1361 props = {listen_to_slaves = true, only_at_slave = true }
1364 wizard_appear_marker:add_triggerer(DgnTriggerer:new {
1365 type = "player_move" })
1367 zombies_appear_marker:add_triggerer(DgnTriggerer:new {
1373 zombies_killed_marker:add_triggerer(DgnTriggerer:new {
1374 type = "monster_dies",
1378 lua_marker("M", zombies_appear_marker)
1379 lua_marker("D", zombies_killed_marker)
1380 lua_marker("L", Triggerable.synchronized_markers(wizard_appear_marker))
1383 : set_feature_name("granite_statue", "gravestone")
1384 : set_feature_name("floor", "the ground")
1388 TILE: W = dngn_gravestone_ornate
1389 TILE: G = dngn_gravestone
1391 LFLOORTILE: floor_tomb
1392 LROCKTILE: wall_hall_darkgray
1393 TILE: c = wall_stone_gray
1394 : set_random_mon_list([[ ogre zombie / troll zombie / hill giant zombie / ]]
1395 : .. [[ wight w:20 / vampire w:5 / skeletal warrior w:15 / ]])
1397 wizlab_milestone(_G, "Zonguldrok's Shrine")
1399 # An "unused" definition for gather_mons and @?? monster
1400 MONS: generate_awake ancient lich col:brown name:antique_lich name_replace \
1401 name_descriptor tile:mons_zonguldrok_lich
1403 M xxxxxxxxxxxxxxxxxxx
1404 xx?????????????????xx
1405 xx?!!!!!!!!!!!!!!!!!?xx
1406 xx?!!.G.G.G.G.G.G.G.!!?xx
1407 xx?!!.G.G.G.G.G.G.G.G.!!?xx
1408 x?!!.G.G.G.G.G.G.G.G.G.!!?x
1409 x?!.G.G.GcccccccccG.G.G.!?x
1410 x?!G.G.G.c'ddcdd'c.G.G.G!?x
1411 x?!.G.G.ccdd'c'ddcc.G.G.!?x
1412 x?!G.Gcccddcc+ccddcccG.G!?x
1413 x?!.G.c'dd'cLLLc'dd'c.G.!?x
1414 x?!G.Gc$'ccc'''ccc'$cG.G!?x
1415 x?!.G.c$$c''ZZZ''c$$c.G.!?x
1416 x?!G.Gcccc''ZWZ''ccccG.G!?x
1417 x?!.G.c''+''ZZZ''+''c.G.!?x
1418 x?!G.Gc'2ccc'''ccc1'cG.G!?x
1419 x?!.G.c''1'c'''c'1''c.G.!?x
1420 x?!G.Gccc''ccccc1'cccG.G!?x
1421 x?!.G.G.cc'''c'''cc.G.G.!?x
1422 x?!G.G.G.c'''c'''c.G.G.G!?x
1423 x?!.G.G.GccccDccccG.G.G.!?x
1424 x?!!.G.G.G.GV.VG.G.G.G.!!?x
1425 xx?!!.G.G.G..<..G.G.G.!!?xx
1426 xx?!!.G.G.G.A.G.G.G.!!?xx
1427 xx?!!!!!!!!!!!!!!!!!?xx
1428 xx?????????????????xx
1432 ###############################################################################
1433 # Wucad Mu's Monastery
1435 # TODO: Could use more "alien" statue tiles.
1436 # Any spawn list (explicitly used here) blocks any redefinition
1437 # for monsters, which altogether means the flavour redefinitions
1438 # of the monks were cut they don't work consistently; currently,
1439 # retiles apply to the level spawns but not the OCS spawns.
1440 # dbname use may or may not be warranted to preserve old flavour.
1441 # (also, OCS boss sucks while disint is still binary.)
1443 # A prefix as well as suffix but no regular modifier
1444 # (so, "faint draconian monk") would be the best, if it's done.
1448 KMONS: 8 = orange crystal statue name:Statue_of_Wucad_Mu n_rpl n_the \
1449 hd:20 hp:80 tile:mons_wucad_mu_statue \
1450 spells:shadow_creatures;shadow_creatures;shadow_creatures;\
1451 shadow_creatures;shadow_creatures;.
1452 KITEM: 8 = staff of energy unrand:staff_of_wucad_mu, \
1453 potion of restore abilities ident:type
1454 COLOUR: c = darkgrey
1455 COLOUR: t = lightred / red w:3
1456 TILE: t = dngn_tree_lightred / dngn_tree_red w:4 / dngn_tree_yellow w:4
1457 # This used to specify dngn_statue_troll as the only middle case, but that tile
1459 TILE: G = dngn_granite_statue / \
1460 dngn_statue_angel / dngn_statue_imp / \
1461 dngn_statue_ancient_evil / dngn_statue_ancient_hero
1463 COLOUR: < = lightred
1464 TILE: c = dngn_stone_dark
1465 LFLOORTILE: floor_pebble_white
1466 KFEAT: ' = open_door
1468 KMONS: 1234567 = nothing
1470 ITEM: potion of experience, potion of beneficial mutation
1471 ITEM: manual of fighting / manual of armour / manual of spellcasting / \
1472 manual of staves / manual of fighting / manual of dodging
1473 ITEM: book of enchantments
1478 dgn.persist.wucad_mu_died = false
1480 local function trigfn (spot)
1481 return Triggerable.synchronized_markers(function_at_spot(
1482 "wizlab_wucad_msgfn",
1483 { spot=spot, trig = false}, true, { only_at_slave = true,
1484 listen_to_slaves = true }))
1487 lua_marker('1', trigfn(1))
1488 lua_marker('2', trigfn(2))
1489 lua_marker('3', trigfn(3))
1490 lua_marker('4', trigfn(4))
1491 lua_marker('5', trigfn(5))
1492 lua_marker('6', trigfn(6))
1493 lua_marker('7', trigfn(7))
1496 local summon_marker = TriggerableFunction:new ({
1497 func="wizlab_wucad_summon_monks",
1500 summon_marker:add_triggerer(DgnTriggerer:new {type="turn", delay_min=150,
1503 local wucad_marker = TriggerableFunction:new ({
1504 func="callback.wizlab_wucad_wucad_died",
1507 wucad_marker:add_triggerer(DgnTriggerer:new {type="monster_dies",
1508 target="Statue of Wucad Mu"})
1510 lua_marker('A', summon_marker)
1511 lua_marker('A', wucad_marker)
1514 MARKER: G = lua:props_marker {veto_fragmentation="veto", veto_disintegrate="veto", \
1515 veto_shatter="veto" }
1516 MARKER: + = lua:props_marker {veto_fragmentation="veto", veto_disintegrate="veto", \
1517 veto_shatter="veto" }
1518 MARKER: ' = lua:props_marker {veto_fragmentation="veto", veto_disintegrate="veto", \
1519 veto_shatter="veto" }
1520 MARKER: c = lua:props_marker {veto_fragmentation="veto", veto_disintegrate="veto", \
1521 veto_shatter="veto" }
1522 MARKER: t = lua:props_marker {veto_fragmentation="veto", veto_disintegrate="veto", \
1523 veto_shatter="veto", veto_fire="veto" }
1524 : wizlab_setup(_G, "Wucad Mu's Monastery")
1525 : set_border_fill_type("tree")
1526 : set_random_mon_list([[shadow w:6 / flayed ghost w:2 / hungry ghost w:2 / ]]
1527 : .. [[monstrous demonspawn / deep troll / ]]
1528 : .. [[grey draconian monk w:6 / ]])
1529 : set_feature_name("tree", "autumnal tree")
1530 : set_feature_name("stone_wall", "crumbled stone wall")
1531 : set_feature_name("granite_statue", "strange statue")
1532 : set_feature_name("floor", "timeless floor")
1534 wizlab_milestone(_G, "Wucad Mu's Monastery")
1537 tttttttttttttttttttttttttttttttttttttttt
1538 tttttttttttttttttttttttttttttttttttttttt
1539 ttttttttttttttTTTTTTTttttttttttttttttttt
1540 ttttttTTTTTTTT.......TTTTTTTTTTTTttttttt
1541 tttttT.........ccccc.............Ttttttt
1542 ttttT.........cc777cc.............Tttttt
1543 tttT.......cccc77777cccc...........Ttttt
1544 ttT.......cc..cc777cc..cc......ccc..Tttt
1545 ttT......cc....cc+cc....cc....cc6cc..Ttt
1546 ttT.....Tc....G.....G....cT..cc6U6cc.Ttt
1547 ttT.....cc...............cc...cc6cc..Ttt
1548 ttT......+.G.....8.....G.c.....c+c...Ttt
1549 ttT.....cc...............cc..........Ttt
1550 ttT.....Tc....G.....G....cT..........Ttt
1551 ttT.c..cTcc.............cccT.........Ttt
1552 ttTcc++ccccccc.......ccccccc+cc......Ttt
1553 ttcc5555cccdeccc+++cccfgccc444cc.....Ttt
1554 ttc555555c....c.....c....c44444c....Tttt
1555 ttc555555cc.............cc44444cc..ctttt
1556 ttc555555ccccccccccccccccccc+cccc++ccttt
1557 ttcc5555ccc.............ccc222cc3333cctt
1558 tttccccccc...............+22222+33333ctt
1559 ttttttttccc..ccc+++ccc..ccc222cc3333cctt
1560 tttttttttcccccTT111Ttccccccccccccccccttt
1561 ttttttttttttttT11111Tttttttttttttttttttt
1562 tttttttttttT.........TTTTTTttttttttttttt
1563 tttccccctttT.....G........Ttcccccttttttt
1564 ttcc...cctT..............Ttcc...cctttttt
1565 ttc..A..'..................'..<..ctttttt
1566 ttcc...cctT.....TTTT.....Ttcc...cctttttt
1567 tttccccctttT...TTttTT....Tttcccccttttttt
1568 ttttttttttttTTTTttttTTTTTttttttttttttttt
1569 tttttttttttttttttttttttttttttttttttttttt
1570 tttttttttttttttttttttttttttttttttttttttt
1573 ################################################################################
1574 # The Roulette of Golubria (by HangedMan.)
1575 # Golubria's fascination with translocations led him to warp out a sub-realm
1576 # of the Abyss into his own translocations playground, with some nasty and wild
1577 # security systems built in to defend his many assorted possessions.
1579 # Teleporter explanations: three sets of three chained rooms each,
1580 # rotating the same amount of rooms per direction in the same direction,
1581 # though distorted by the use of the ninth room and each set rotated.
1582 NAME: wizlab_golubria
1584 LFLAGS: no_tele_control
1585 KMONS: 1 = spatial vortex w:7 / blink frog / insubstantial wisp w:3 / nothing w:5
1586 KMONS: 2 = deep elf summoner w:5 ; dart ego:dispersal w:20 | dart w:5 | nothing . robe / \
1587 rakshasa w:5 ; dart ego:dispersal w:20 | dart w:5 | nothing / \
1588 boggart ; dart ego:dispersal w:20 | dart w:5 | nothing / \
1589 wizard ; dart ego:dispersal w:20 | dart w:5 | nothing . robe
1590 KMONS: 3 = rakshasa w:5 ; whip ego:distortion | whip ego:vorpal w:6 | dagger \
1591 ego:distortion | dagger ego:vorpal w:6 | spear ego:distortion | \
1592 spear ego:vorpal w:6 . dart ego:dispersal / \
1593 boggart w:5 ; whip ego:distortion | whip ego:vorpal w:6 | dagger \
1594 ego:distortion | dagger ego:vorpal w:6 | spear ego:distortion | \
1595 spear ego:vorpal w:6 . dart ego:dispersal / \
1596 wizard ; whip ego:distortion | whip ego:vorpal w:6 | dagger \
1597 ego:distortion | dagger ego:vorpal w:6 | spear ego:distortion | \
1598 spear ego:vorpal w:6 . dart ego:dispersal . robe
1599 KMONS: 04 = large abomination w:15 / small abomination w:15 / unseen horror w:5 / \
1600 thrashing horror w:30 / skeleton w:30 / freezing wraith w:5 / \
1601 hellwing / chaos spawn w:5 / orange demon / blue devil / \
1602 hell hound / red devil w:5 / lesser demon w:25 / mana viper w:5 / \
1603 ugly thing w:30 / fire elemental w:5 / air elemental w:5
1604 KMONS: 95 = ynoxinul / smoke demon / sixfirhy / sun demon w:5 / efreet w:5 / \
1605 soul eater w:5 / hell knight w:5 / demonic crawler / raiju / \
1606 ancient zyme w:20 / lurking horror / tentacled starspawn w:30 / \
1607 vapour w:5 / earth elemental w:5 / water elemental / \
1608 very ugly thing / base draconian / guardian serpent / brain worm / \
1609 eidolon w:5 / shadow wraith / anaconda skeleton w:5 / \
1610 flaming corpse / great orb of eyes w:5 / giant orange brain
1611 KMONS: 6 = executioner w:5 / balrug w:5 / cacodemon / shadow demon / hellion w:5 / \
1612 tormentor w:5 / lorocyproca w:5 / blizzard demon / \
1613 reaper / lich w:5 / angel / profane servitor w:5 / \
1614 death drake w:5 / tentacled monstrosity w:20 / draconian shifter w:20 / \
1615 starcursed mass w:30 / apocalypse crab w:20
1616 KMONS: 7 = eldritch tentacle
1617 KMONS: 8 = silver statue
1618 # Translocations items, abyss escape aides, shrouds, and an immeadiate aide.
1619 KITEM: d = scroll of blinking / scroll of teleportation q:2 / \
1620 wand of teleportation w:5 / any scroll w:1
1621 KITEM: e = ring of teleport control w:9 / ring of teleportation w:20 / any ring w:1
1622 KITEM: f = book of spatial translocations w:5 / book of the warp w:5 / \
1623 manual of translocations w:5 / randbook disc:translocation numspells:5 / \
1624 randbook disc:translocation owner:Golubria numspells:7 \
1625 spells:shroud_of_golubria|passage_of_golubria
1626 KITEM: g = ring of flight / potion of flight q:2 / \
1627 wand of digging w:5 / lantern of shadows / \
1628 potion of haste w:5 / scroll of fog / potion of porridge / \
1629 any wand w:1 / any potion w:1 / any scroll w:1
1630 KITEM: h = pair of boots ego:flying w:8 / pair of boots ego:running w:1 / \
1631 pair of boots ego:stealth w:8 / pair of boots w:3
1632 KITEM: i = wand of disintegration
1633 KITEM: j = any level:3, any level:3 / nothing
1634 KITEM: k = star_item / any w:5, any w:5 / nothing
1635 KITEM: | = cloak good_item w:75 / randart cloak w:95 / cloak unrand:cloak_of_flash / \
1636 cloak unrand:cloak_of_starlight / cloak unrand:cloak_of_the_thief
1637 KFEAT: m = iron_grate
1638 KFEAT: ~ = deep_water
1639 KFEAT: ^ = known teleport trap
1640 KFEAT: 8_ = altar_lugonu
1641 KFEAT: OPQRSTUVW&{( = teleporter
1642 KFEAT: opqsrtuvw@}) = floor
1643 KPROP: a"_~ = no_rtele_into
1644 MARKER: ^ = lua:fog_machine { cloud_type = "translocational energy", pow_max = 25, \
1645 delay_min = 30, delay_max = 60, walk_dist = 1, size_min = 2, size_max = 3 }
1646 SHUFFLE: ozRrIUuLO / uLOozRrIU / rIUuLOozR, pZSsJVvMP / vMPpZSsJV / sJVvMPpZS
1647 SHUFFLE: zRIULO / RzUIOL, ZSJVMP / SZVJPM, HTKW / THWK
1648 NSUBST: @ = 1:w / 1:Y / 1:Q / *:<, 4 = 4:5 / *:4, ` = 4:d / 3:| / 1:|j / 1:i / 4:j / *:`
1649 NSUBST: a = 1:_ / 1:_" / *:a, + = 1:+ / *:c, ( = 1:} / 1:( / *:<
1650 NSUBST: 2 = 1:6 / 2 = 66993 / 2:9 / * = 2:9 3:1 9:2, 1 = 2:0 / *:1, 0 = 2:9 / *:0
1651 NSUBST: [ = 1:< / *:d, d = 2:k / 2:e / 2:f / 3:g / 2:eegghhj
1652 NSUBST: 7 = 1:7 / 1 = 7:4 `:6 / *:`, A = 1:) / 1:< / 1:{ / 1:A
1653 SUBST: H = O, I = P, J = Q, K = R, L = S, M = T, Y = U, z = V, Z = W, ? = &
1654 SUBST: a = ":70 x:40 ccCC~, - = ':50 x:40 ccCC~, E = nccCC, c = cccb, C = cb
1655 SUBST: B = ccbn..., e = de, j = jjjjg., k = kkj
1656 COLOUR: n = lightgreen
1658 COLOUR: OPQRSTUVW&{( = warp
1659 COLOUR: opqrstuvw@}) = gold
1660 COLOUR: X = darkgrey
1662 FTILE: '"Gbca-n45_+ = floor_demonic_green
1663 FTILE: .012369AB< = floor_rough_green / floor_pebble_green w:15
1664 FTILE: `~78m = floor_demonic_green / floor_pebble_green / floor_rough_green w:5
1665 FTILE: defghijk| = floor_rough_green
1666 LROCKTILE: wall_zot_green
1667 TILE: b = dngn_crystal_green / dngn_crystal_cyan w:5
1668 TILE: c = dngn_stone_wall_green / dngn_stone_wall_cyan w:5
1669 TILE: n = dngn_transparent_stone_green / dngn_transparent_stone_cyan w:5
1670 TILE: X = dngn_dimension_edge
1671 FTILE: OPQRSTUVW&{( = floor_rough_green
1672 TILE: opqrstuvw@}) = floor_black_cobalt
1675 -- This isn't the prettiest way of handling the teleporters, but it guarantees
1676 -- they behave exactly the same way as in HangedMan's original version. All I've
1677 -- done is remove some massive code duplication. [evilmike]
1679 local teleporter_glyph = "OPQRSTUVW&?{("
1680 local teleport_spot_glyph = "opqrstuvw@!})"
1681 local tele_marker = {}
1683 for i = 1, #teleporter_glyph do
1684 tele_marker[i] = TriggerableFunction:new {
1685 func="teleporter_golubria_switch_fn",
1686 data = {teleport_spot=i},
1688 tele_marker[i]:add_triggerer(DgnTriggerer:new { type="player_move" })
1689 lua_marker(teleporter_glyph:sub(i,i), tele_marker[i])
1690 lua_marker(teleport_spot_glyph:sub(i,i), portal_desc { teleport_spot=i})
1693 set_random_mon_list([[rakshasa w:15 / deep elf summoner w:15 / wizard w:15 / spatial vortex w:15 /
1694 boggart / blink frog w:5 / shadow wraith w:5 / unseen horror /
1695 raiju / ynoxinul / neqoxec / chaos spawn / giant orange brain /
1696 large abomination w:15 / small abomination w:15 / skeleton w:20 /
1697 hellwing w:5 / smoke demon w:5 / hell hound w:5 / very ugly thing w:5 /
1698 golden eye w:5 / executioner w:3 / shadow demon w:4 / hellion w:3 /
1699 thrashing horror w:25 / tentacled starspawn w:25 / ]])
1701 set_border_fill_type('permarock_wall')
1702 set_feature_name("permarock_wall", "The dimension's edge")
1703 set_feature_name("green_crystal_wall", "wall of crystal")
1704 wizlab_setup(_G, "The Roulette of Golubria")
1708 wizlab_milestone(_G, "The Roulette of Golubria")
1711 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1712 XXXXXXXXXXXXXXXXcccccccEEccccccccccXXXXXXXXXXXXXXXXX
1713 XXXXXccccccXXXXccaaacc.o..ccaaaaaaccXXXXccccccXXXXXX
1714 XXXEEc...Pccccccaaacc......ccaaaaaaccccccZ...cEEXXXX
1715 XXXEv.....ccaaaaaaacz......Rcaaaaaaaaaacc.....pEXXXX
1716 XXcc.......naaaaaaan..BBBB..naaaaaaaaaan.......ccXXX
1717 XXc....B...n"aaaaa"n..0B2...n"aaaaaaaa"n...B....cXXX
1718 XXc...BBB.1c"aaaaa"c...B....c"aaaaaaaa"c0.BBB...cXXX
1719 XXc....BB..cccaaaaacc......ccaaaaaaaaccc..BB....cXXX
1720 XXcM.....2...caaaaaac1.[..1caaaaaaaaac...2.....ScXXX
1721 XXccc..0..[..caaaaaacc....cc---aaaaaac..[..1..cccXXX
1722 XXXccnncc..1.ccaaaa--cc..cc-----aaaacc.1..ccnnccXXXX
1723 XXXcaa""c.....c--a--'-c+cc-''-'--a--c.....c""aacXXXX
1724 XXXcaaaacccc..c'---'-''-'-'--'-'---'c..ccccaaaacXXXX
1725 XXccaaaaaaaccc+-'-'------4------'-'-+cccaaaaaaaccXXX
1726 Xccaaaaaaaaa-'---'------'G'------'---'-aaaaaaaaacXXX
1727 Xcaaaaaaaaaa--'-4-'--'-'---'-'--'-4-'--aaaaaaaaaacXX
1728 Xcaaaaaaaaaaa--'-G-''C'C'-'C'C''-G-'--aaaaaaaaaaacXX
1729 Xcaaaaaaaaaa--'-'--CCCCCC(CCCCCC--'-'--aaaa""aaaacXX
1730 Xcaaaaaaaaa--'---'Cn'C''CnC'^C'nC'---'--aaccnnccacXX
1731 Xcaaaaaaaaa-'----'C'@C'`'n'`'C@'C'----'-ccc...HcccXX
1732 Xcaaaa""aaa--'--'CCCC`````````CCCC'--'-cc1......ccXX
1733 Xcaccnnccaa-'----'C^'`````````''C'---'cc....0B...cXXXXXXXX
1734 XcccO...ccc-'---'CC'````mmm````'CC'---+..[.BBB..qEXXnnnnnX
1735 Xcc......1cc-'-'-'CC'``mm7mm```CC'-'-'c.....2B...EXXnA.AnX
1736 Xc.........cc-4G--(nn``m787m``nn(--G4-cc.........cXXn...nX
1737 XE...B2.....c'-'-'CC'``mm7mm```CC'-'-'-cc1......ccXXnA.AnX
1738 XEu..BBB.[..+---'CC'````mmm````'CC'---'-ccc...TcccXXnnnnnX
1739 Xc...B0....cc'---'C''`````````'^C'----'-aaccnnccacXXXXXXXX
1740 Xcc......1cc-'--'CCCC`````````CCCC'--'--aaa""aaaacXX
1741 XcccL...ccc-'----'C'@C'`'n'`'C@'C'----'-aaaaaaaaacXX
1742 Xcaccnnccaa--'---'Cn'C^'CnC''C'nC'---'--aaaaaaaaacXX
1743 Xcaaaa""aaaa--'-'--CCCCCC(CCCCCC--'-'--aaaaaaaaaacXX
1744 Xcaaaaaaaaaaa--'-G-''C'C'-'C'C''-G-'--aaaaaaaaaaacXX
1745 Xcaaaaaaaaaa--'-4-'--'-'---'-'--'-4-'--aaaaaaaaaacXX
1746 Xccaaaaaaaaa-'---'------'G'------'---'-aaaaaaaaaccXX
1747 XXccaaaaaaaccc+-'-'------4------'-'-+cccaaaaaaaccXXX
1748 XXXcaaaaaccc..c'---'-'--'-'-''-'---'c..ccccaaaacXXXX
1749 XXXcaa""cc....c--a--'-''-cc+c-'--a--c.....c""aacXXXX
1750 XXXccnncc..1.ccaaaa-----cc..cc--aaaacc.1..ccnnccXXXX
1751 XXccc..1..[..caaaaaaaaacc....ccaaaaaac..[..0..cccXXX
1752 XXcW.....2...caaaaaaaaac1..[.1caaaaaac...2.....IcXXX
1753 XXc....BB..cccaaaaaaaacc......ccaaaaaccc..BB....cXXX
1754 XXc...BBB.0c"aaaaaaaa"c....B...c"aaaaa"c1.BBB...cXXX
1755 XXc....B...n"aaaaaaaa"n...2B0..n"aaaaa"n...B....cXXX
1756 XXcc.......naaaaaaaaaan...BBB..naaaaaaan.......EcXXX
1757 XXXEt.....ccaaaaaaaaaacV......Jcaaaaaaacc.....rcXXXX
1758 XXXEEc...Kccccccaaaaaacc......ccaaaccccccU...EcEXXXX
1759 XXXXXccccccXXXXccaaaaaacc..s.ccaaaccXXXXccccccXXXXXX
1760 XXXXXXXXXXXXXXXXccccccccccEEcccccccXXXXXXXXXXXXXXXXX
1761 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1764 ###############################################################################
1765 # Random and semi-random Wizard vaults
1766 ###############################################################################
1768 ###############################################################################
1769 # Chambers of the Cloud Mage (by Mu.)
1771 # TODO: Needs an "ocean of clouds" tiles, and fluffy "cotton wool" cloud tiles.
1774 MONS: vapour, air elemental, insubstantial wisp
1777 wizname = crawl.make_name()
1779 kmons (" 5 = patrolling Cloud Mage dbname:Cloud_Mage name:" .. string.gsub(wizname, " ", "_")
1780 .. " ; robe unrand:robe_of_clouds . quick blade ego:electrocution |"
1781 .. " quick blade ego:freezing | dagger ego:speed | dagger ego:electrocution"
1782 .. " | dagger ego:freezing")
1784 NSUBST: . = 3:1 / * = .:120 1:2 2:6 3:1
1785 MARKER: ! = lua:fog_machine { \
1786 pow_max = 10, delay_min = 10, delay_max = 40, \
1787 size = 2, size_buildup_amnt = 4, \
1788 size_buildup_time = 25, cloud_type = "grey smoke", \
1789 colour = "white", name = "white fluffiness" \
1791 ITEM: w:20 potion of flight / potion of magic / potion of haste / \
1792 potion of resistance / gold / potion of agility / potion of brilliance
1793 ITEM: wand of lightning / staff of air / ring of flight /\
1794 gold / scroll of silence / ring of teleport control / \
1795 quick blade / ring of evasion / ring of see invisible / \
1796 book of clouds / any book w:15 / any good_item / any w:20
1797 ITEM: randbook disc:air
1798 KFEAT: #4 = deep_water
1799 KPROP: #4 = no_rtele_into
1800 NSUBST: e = 2:f / * = de, # = 5:4 / 4 = 4## / *:#
1802 LFLOORCOL: lightblue
1803 LFLOORTILE: floor_rough_lightblue
1804 TILE: o = dngn_transparent_stone_white
1805 TILE: b = dngn_crystal_white
1806 COLOUR: wWv#4 = silver
1807 : set_border_fill_type('open_sea')
1808 : set_random_mon_list("vapour / air elemental")
1809 : wizlab_setup(_G, "The Chambers of " .. wizname .. " the Cloud Mage")
1810 : set_feature_name("floor", "damp floor")
1811 : set_feature_name("green_crystal_wall", "wall of white crystal")
1814 wizlab_milestone(_G, "The Chambers of " .. wizname .. " the Cloud Mage")
1816 # Map is ugly because border_fill_type doesn't allow for (yet)
1819 #####################################################################
1820 #####################################################################
1821 #####################################################################
1822 #####################################################################
1823 #####################################################################
1824 #####################################################################
1825 #####################################################################
1826 #####################################################################
1827 #####################################################################
1828 #####################################################################
1829 #####################oooooooooooooooooooooooooooooo##################
1830 ###################ooo............................ooo################
1831 #################ooo...wwwwwwwwwwwwwwwwwwwwwwwwww...ooo##############
1832 ################oo...wwwwwwwbbbbbbbbbbbbbbbbbbbbwww...oo#############
1833 ################o..wwwwwwwbbbbbbbbbbbbbbbbbbbbbbwwwww..o#############
1834 ###############oo.wwwwwwbbbbbbbb..b..b..b..b..bbwwwwww.oo############
1835 ###############o..wwwwwbb.....b.!............!.bwwwwww..o############
1836 ##############oo.wwwwwwbb.eee.b................bwwwwwww.oo###########
1837 ##############o..wwwwwbbb.eee.b................bWWWWWWW..o###########
1838 ##############o..wwwwwbbb.eee.+...5............+.........o###########
1839 ##############o..wwwwwbbb.eee.b................bWWWWWWW..o###########
1840 ##############oo.wwwwwwbb.eee.b................bwwwwwww.oo###########
1841 ###############o..wwwwwbb.....b.!............!.bwwwwww..o############
1842 ###############oo.wwwwwwbbbbbbbb..b..b..b..b..bbwwwwww.oo############
1843 ################o..wwwwwwwbbbbbbbbbbbbbbbbbbbbbbwwwww..o#############
1844 ################oo...wwwwwwwbbbbbbbbbbbbbbbbbbbbwww...oo#############
1845 #################oo....wwwwwwwwwwwwwwwwwwwwwwwwww...ooo##############
1846 ##################oooo............................ooo################
1847 #####################bbb.......bbbbbbbbbbbbbbbbbbbb##################
1848 #####################oo.......oo#####ooo#############################
1849 ####################oo.......oo#####oo.oo############################
1850 ###################oo.......oo#####oo.!.oo###########################
1851 ###################o!......ooo####oo.....ooo#########################
1852 ###################ooo.......ooo#oo........oo########################
1853 ####################oooo.......ooo..........oo#######################
1854 #######################ooo!.....ooo..........o#######################
1855 ########################o.....!ooobb+bb......oo######################
1856 #######################ooo......obb...bb!.....o######################
1857 ########################o......obb.....bb.....oo#####################
1858 #######################ooo......b.......b......o#####################
1859 #######################o.!.....ob.<.A.<.b......o#####################
1860 #######################o.b......b.......bo...!oo#####################
1861 #######################o.bo.....bb.....bb......o#####################
1862 #######################b+bbbb....bb...bb!.....oo#####################
1863 #######################o....bo...!bbbbb......oo######################
1864 #######################o.dd.bo.............oob#######################
1865 #######################o.dd.boo...........bbbbbbbbb##################
1866 #######################o....b#o..........!...+....o##################
1867 #######################ooooob#oo........ooooob.dd.o##################
1868 ###############################oo......oo####b.dd.o##################
1869 ################################oo.!..oo#####b....o##################
1870 #################################oooooo######booooo##################
1871 #####################################################################
1872 #####################################################################
1873 #####################################################################
1874 #####################################################################
1875 #####################################################################
1876 #####################################################################
1877 #####################################################################
1878 #####################################################################
1879 #####################################################################
1882 ###############################################################################
1883 # Halls of the Hellbinder (by Mu.)
1885 TAGS: no_rotate no_hmirror no_vmirror
1888 LFLOORTILE: floor_pebble_lightred
1889 COLOUR: c = darkgrey
1890 COLOUR: -|/\o[]CDEFGHIJKLMNOPQRSTUVWXYZu = yellow
1891 KFEAT: -|/\o[]CDEFGHIJKLMNOPQRSTUVWXYZu = floor
1892 KFEAT: _ = altar_makhleb
1893 KPROP: ' = bloody / nothing
1895 TILE: c = wall_stone_dark
1896 # symbols roughly corresponding to sigil shape
1897 FTILE: - = sigil_straight_E_W
1898 FTILE: | = sigil_straight_N_S
1899 FTILE: / = sigil_straight_NE_SW
1900 FTILE: \ = sigil_straight_NW_SE
1901 FTILE: o = sigil_circle
1902 FTILE: T = sigil_cross
1904 FTILE: ] = sigil_Y_left
1905 FTILE: [ = sigil_Y_right
1906 FTILE: O = sigil_rhombus
1907 FTILE: Q = sigil_algiz_left
1908 FTILE: R = sigil_algiz_right
1909 FTILE: S = sigil_sharp_E_NE
1910 FTILE: Z = sigil_sharp_W_SW
1911 FTILE: K = sigil_straight_E_NE_SW
1912 FTILE: X = sigil_fourway
1913 FTILE: Uu = sigil_Y_inverted
1914 FTILE: V = sigil_Y_leftleaning
1915 FTILE: W = sigil_Y_rightleaning
1916 # remaining sigil patterns
1917 FTILE: C = sigil_curve_S_E
1918 FTILE: D = sigil_curve_S_W
1919 FTILE: E = sigil_curve_N_E
1920 FTILE: F = sigil_curve_N_W
1921 FTILE: G = sigil_straight_E_SW
1922 FTILE: H = sigil_straight_W_SE
1923 FTILE: I = sigil_straight_S_NE
1924 FTILE: J = sigil_straight_S_NW
1925 FTILE: L = sigil_straight_N_SE
1926 FTILE: M = sigil_straight_N_SW
1927 FTILE: N = sigil_straight_E_NW
1928 FTILE: P = sigil_straight_W_NE
1929 RTILE: x = wall_undead
1930 MARKER: h = lua:fog_machine { \
1931 pow_max = 10, delay_min = 10, delay_max = 40, \
1932 size = 2, size_buildup_amnt = 5, \
1933 size_buildup_time = 25, cloud_type = "flame", \
1935 KMONS: 2 = lorocyproca w:1 / hell beast w:15 / reaper /\
1936 green death / soul eater w:20 / tormentor w:5
1937 KMONS: 3u = ice devil / red devil / orange demon / blue devil / \
1938 iron devil w:5 / ynoxinul / sun demon
1939 KMONS: 4 = kobold demonologist
1940 KMONS: 5 = deep elf demonologist
1941 KMONS: 6 = balrug / cacodemon / blizzard demon / hellion
1943 wizname = crawl.make_name()
1945 kmons ("1 = patrolling Hellbinder dbname:Hellbinder name:" .. string.gsub(wizname, " ", "_"))
1947 KITEM: $ = gold / w:1 scroll of torment / w:1 scroll of summoning
1948 KITEM: i = rod of shadows / ring of fire / ring of protection from fire /\
1949 amulet of conservation / scroll of torment / scroll of summoning /\
1950 demon blade w:1 / demon whip w:1 / demon trident w:1 / gold / wand of fire /\
1951 wand of draining / staff of summoning / any book w:30 / any good_item w:15
1952 KITEM: B = randbook disc:summoning
1953 NSUBST: i = 2:B / *:i
1954 SHUFFLE: A<, 4d, 7f, 4d / 5e, 7f / 8g
1955 SUBST: 7 = 4, 8 = 5, df = 6, eg = 3
1956 : set_random_mon_list([[lesser demon w:50 / red devil / blue devil / ]]
1957 : .. [[orange demon / ynoxinul / kobold demonologist / ]])
1958 : wizlab_setup(_G, "The Hall of " .. wizname .. " the Hellbinder")
1959 : set_feature_name("floor", "hot floor")
1960 : set_feature_name("stone_wall", "black wall")
1961 : set_feature_name("rock_wall", "carved rock wall")
1963 wizlab_milestone(_G, "The Hall of " .. wizname .. " the Hellbinder")
1966 cccccccccccccccccccccccccccccccccccccccccccccc
1967 ccccccc.cccccc...................cccccc.cccccc
1968 ccccc.....cccc.cc+ccccc+ccccc+cc.cccc.....cccc
1969 cccc..G-H..ccc.c...cccc.cccc...c.ccc...o...ccc
1970 ccc../...\..cc.+.A.ccc...ccc.<.+.cc..|...../cc
1971 ccc.I...3.J.cc.c...cc.....cc...c.cc.-O-.3./.cc
1972 cc..|..u..|....ccccc..c.c..ccccc.....|.3./...c
1973 cc..|.3Y..|....cccc..cc.cc..cccc......3./....c
1974 ccc.L.....M.cc.ccc.....4.....ccc.cc....K----cc
1975 ccc..\.../..cc.cc..cccc.cccc..cc.cc.../.....cc
1976 cccc..N-P..ccc.+.......d.......+.ccc./.....ccc
1977 ccccc.....cccc.ccccccccccccccccc.cccc.....cccc
1978 ccccccc.cccccc...................cccccc.cccccc
1979 ccccccc.cccccc.cccccccx.xccccccc.cccccc.cccccc
1980 ccccccc.ccccccx.cccccc.c.cccccc.xcccccc.cccccc
1981 ccccccc.cccccccx.cccc.ccc.cccc.xccccccc.cccccc
1982 ccccccc.ccccccccx.cc.ccccc.cc.xcccccccc.cccccc
1983 ccccccc.cccccccccc..ccccccc..cccccccccc.cccccc
1984 ccccccc.cccc.6...................6.cccc.cccccc
1985 ccccccc.cccc..ccccccccc.ccccccccc..cccc.cccccc
1986 ccccccc.ccccc..cccc$$$c.c$$$cccc..ccccc.cccccc
1987 ccccccc.cccccc..ccc$$$+.+$$$ccc..cccccc.cccccc
1988 ccccccc.cc.cccc..cc$$$c.c$$$cc..cccc.cc.cccccc
1989 ccccccc......c.x..ccccc.ccccc..x.c..Z...cccccc
1990 ccccccc...o...x.c..cccc.cccc..c.x../..O.cccccc
1991 cccccc..\.../..ccc..ccc.ccc..ccc../..OTO.ccccc
1992 cccccc...\3/...cccc..cc.cc..cccc./2.2.U..ccccc
1993 ccccc..\2CXD2/..cccc.......cccc./..2.3....cccc
1994 cccccc..\|2|/...ccccc.\7/.cccccS--------Zccccc
1995 cccccc...Q.R....ccccc..Y..ccccc......../.ccccc
1996 ccccccc..ETF....ccccc..|..ccccc......./.cccccc
1997 cccccccc........ccccc..f..ccccc......S.ccccccc
1998 cccccccccc......cccc..ccc..cccc......ccccccccc
1999 ccccccccccc.....ccc..ccccc..ccc.....cccccccccc
2000 cccccccccccc.....c...ccccc...c.....ccccccccccc
2001 cccccccccccc..\./..cc.ccc.cc..\./..ccccccccccc
2002 ccccccccccccc..V..cccc.c.cccc..W..cccccccccccc
2003 ccccccccccccc./...ccccchccccc...\.cccccccccccc
2004 cccccccccccccc.....ccc.c.ccc.....ccccccccccccc
2005 ccccccccccccccc.....c.ccc.c.....cccccccccccccc
2006 ccccccccccccccccc.....ccc.....cccccccccccccccc
2007 ccccccccccccccccccc....0....cccccccccccccccccc
2008 ccccccccccccccccccccc.....cccccccccccccccccccc
2009 cccccccccccccccccccccxc+cxcccccccccccccccccccc
2010 ccccccccccccccccccccc.....cccccccccccccccccccc
2011 ccccccccccccccccccc...G"H...cccccccccccccccccc
2012 ccccccccccccccccc...GP...NH...cccccccccccccccc
2013 cccccccccccccccc..G[.......]H..ccccccccccccccc
2014 ccccccccccccccc../..N.....P..\..cccccccccccccc
2015 ccccccccccccccc.I.............J.cccccccccccccc
2016 cccccccccccccc..U.....G.H.....U..ccccccccccccc
2017 cccccccccccccc.I.J.../...\...I.J.ccccccccccccc
2018 ccccccccccccc..|..../..1..\....|..cccccccccccc
2019 ccccccccccccc..|.../\.'''./\...|..cccccccccccc
2020 ccccccccccccc..|../xx\'_'/xx\..|..cccccccccccc
2021 cccccccccccc...L./..xxN'Pxx..\.M...ccccccccccc
2022 cccccccccccci...W..G.xxxxx.H..V...iccccccccccc
2023 ccccccccccccii...NP.........NP...iiccccccccccc
2024 cccccccccccciii.................iiiccccccccccc
2025 cccccccccccccccccccccccccccccccccccccccccccccc
2028 ###############################################################################
2029 # Incomplete and TODO work area.
2031 # See git history for previous versions of Ozocubu, Alistair, Borgnjor.
2033 # March 2013 note: there isn't the greatest of interest in making
2034 # the majority of these potential portals, as nice as that would be,
2035 # and the portal is effectively "finished".
2041 # Alistair's Brewery: mutated wizards, mephitic cloud generators,
2042 # cupboards full of potions, confused monsters.
2043 # Lee's Rapid Deconstructor: golems and "monk" or otherwise unarmed creatures,
2044 # exploding features and exploding corpses. It's a timed vault, so you have
2045 # to get to the loot quickly and avoid the hordes of monsters.
2046 # Lehudib's Crystal Spire: crystal walls and crystal golems, crystal monsters,
2047 # spear throwers (statues with crystal spear), possibly the unrand as the
2049 # Maxwell's Forge: Maxwell employs a bunch of angels to churn out weapons;
2050 # stashes of hammers, flame clouds, other "smithy" styled themes, with black
2052 # Olgreb's Toxic Laboratory: poisonous clouds, a toxic radiance effect,
2053 # poisonous monsters, possibly even a "poison" effect that bypasses rPois,
2054 # potions of poison and potions dropped converting into potions of poison.
2055 # Ozocubu's Refrigerator: simulacra, refrigeration effect, a solid stone room
2056 # inside of an "ice cave", freezing clouds.
2060 # Cekugob's Oubliette: a randomised maze (though not a labyrinth) with skeletal
2061 # guards, and with occasionally hidden. Cekugob's amulet as the loot,
2063 # Botono's Bayou: A bay-like area with small huts, wizards that cast negative
2064 # related spells, shadow dragons, rebranded swamp worms, wraiths, spectrals.
2065 # Ukta's Hut: phantoms, other "ghosts", ogre mages and ogres, druidic style,
2066 # wooden walls set in a forest (more "earthy" than Eringya's Garden)
2067 # The Alchemist's Tower: gold turned into things, things turned into gold.
2069 # Other mages that could use representation, not yet expounded upon:
2070 # Borgnjor, Leda, Doom Knight, Octopus King, The Captain, Zhor.
2071 # There might be enough material to split the set into two portals
2072 # based on an artefact smith or owner and named mage, eventually...