Changelong for 0.14.1.
[crawl.git] / crawl-ref / source / dat / des / portals / wizlab.des
1 ###
2 ## Maps from named Wizards, unrand and fixedarts
3 #
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
10 #          |plants, golems          |                        |
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
41 #                         |French garden        |
42 #---------------------------------------------------------------
43 #Doroklohe's Tomb         |densely packed       |yellow walls,
44 #                         |collapsing tombs     |dark floor
45 #---------------------------------------------------------------
46 #Wucad Mu's Monastery     |empty temple         |dark walls,
47 #                         |                     |autumn trees
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,
61 #                         |                     |lightblue
62 #---------------------------------------------------------------
63 #Hellbinder's Lair        |triangles and circles|red, darkgray,
64 #                         |sigils               |yellow sigils
65 ##
66 #
67 # TO-DO:
68 #
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".
73 #
74 ##
75
76 {{
77 function wizlab_portal (e)
78     local timeout_turns = crawl.random_range(600, 800)
79
80     local messager =
81       timed_msg {
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.",
87
88         verb = 'crackle',
89         noisemaker = 'magical portal',
90         ranges = {
91           { 5000, 'rapid ' },  { 4000, '' },
92           { 2500, 'slow ' }, { 1500, 'irregular ' },
93           { 0, 'erratic ' }
94         }
95     }
96
97     e.lua_marker('O',
98       timed_marker {
99         disappear = "The flow of magic halts.",
100         entity = 'portal',
101         turns = timeout_turns,
102         single_timed = true,
103         floor = "stone_arch",
104         feat_tile = "dngn_portal_bazaar_gone",
105         msg = messager })
106     e.kfeat("O = enter_wizlab")
107     e.tags("uniq_wizlab no_item_gen no_monster_gen chance_wizlab")
108     e.chance("500")
109 end
110
111 -- Destinations:
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")
116 end
117
118 function wizlab_milestone (e, wizlab_desc)
119     crawl.mark_milestone("br.enter", "entered " .. wizlab_desc .. ".", "parent")
120 end
121
122 function tukima_machine (data, triggerable, triggerer, marker, ev)
123   if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
124     return
125   end
126
127   local x, y = marker:pos()
128   local you_x, you_y = you.pos()
129
130   if data.weapon_count >= 5 then
131     if you.see_cell(x, y) then
132       crawl.mpr("The machine makes a dull noise.")
133     else
134       crawl.mpr("You hear a distant, dull noise.")
135     end
136     return
137   end
138
139   if (you_x == x and you_y == y) then return end
140   if dgn.mons_at(x, y) then return end
141
142   dgn.apply_area_cloud(x, y, 1, 6, 1, 10, "black smoke", "other", -1)
143
144   if (not dgn.create_monster(x, y, "generate_awake dancing weapon")) then
145     return
146   end
147
148   data.weapon_count = data.weapon_count + 1
149
150   if you.see_cell(x, y) then
151     crawl.mpr("The generator hisses, and spits out a dancing weapon!")
152   else
153     crawl.mpr("You hear a distant hissing noise.")
154   end
155 end
156
157 function wizlab_eringya_grow(data, triggerable, triggerer, marker, ev)
158   if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
159     return
160   end
161
162   local count = 0
163
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")
172         count = count + 1
173         data.nofruitsyet = false
174       end
175     end
176     if count > 0 then
177       crawl.mpr("Fruit sprouts up around you!")
178     end
179   else
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")
185           count = count + 1
186         else
187           dgn.create_monster(spot.x, spot.y, "toadstool")
188           count = count + 1
189         end
190       end
191     end
192     if count > 0 then
193       crawl.mpr("Mushrooms sprout up around you!")
194     end
195   end
196 end
197
198 function wizlab_doroklohe_convert_boxes(data, triggerable, triggerer,
199                                         marker, ev)
200   if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
201     return
202   end
203
204   if data.phase == 1 then
205     data.phase = data.phase + 1
206     if you.silenced() then
207       crawl.mpr("The ground shakes.", "warning")
208     else
209       crawl.mpr("There is a faint hissing noise.", "warning")
210     end
211     return
212   elseif data.phase == 2 then
213     data.phase = data.phase + 1
214     if you.silenced() then
215       crawl.mpr("The ground shakes.", "warning")
216     else
217       crawl.mpr("There is a loud grinding noise.", "warning")
218     end
219     return
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)
226     end
227     return
228   else
229     return
230   end
231 end
232
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)
237     return mons
238 end
239
240 function wizlab_zonguldrok_spawn_zombies(data, triggerable, triggerer,
241                                          marker, ev)
242     -- Save compat bit.
243     if data.count == nil then
244         data.count = 0; data.swcount = 0; data.vpcount = 0; data.account = 0
245     end
246     if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
247         return
248     end
249     local graves = dgn.find_markers_by_prop("grave", 1)
250     local x, y
251     for _, gmarker in ipairs(graves) do
252         x, y = gmarker:pos()
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")
258                 else
259                     spawn_zombie(x, y, "generate_awake wight")
260                 end
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")
264                 else
265                     spawn_zombie(x, y, "generate_awake vampire")
266                     data.vpcount = data.vpcount + 1
267                 end
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")
271                 else
272                     spawn_zombie(x, y, "generate_awake skeletal warrior")
273                 data.swcount = data.swcount + 1
274                 end
275             else
276                 spawn_zombie(x, y, "generate_awake ancient champion")
277                 data.account = data.account + 1
278             end
279             data.count = data.count + 1
280             gmarker:remove()
281         end
282     end
283 end
284
285 function wizlab_zonguldrok_killed_zombie(data, triggerable, triggerer,
286                                          marker, ev)
287     if data.door_appeared then
288         return
289     end
290
291     local mons = dgn.mons_from_mid(ev:arg1())
292     if not mons.has_prop("zonguldrok") then
293         return
294     end
295
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!")
305         else
306             crawl.mpr("The walls vibrate.")
307         end
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")
312             end
313         end
314     end
315 end
316
317
318 function wizlab_zonguldrok_awaken_wizard(data, triggerable,
319                                          triggerer, marker, ev)
320     if data.awoke == true then
321         return
322     end
323
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")
328     if lich then
329         data.awoke = true
330     end
331 end
332
333 function wizlab_wucad_msgfn(data, triggerable, triggerer, marker, ev)
334   if data.trig == true then
335     return
336   end
337
338   if crawl.one_chance_in(3) then
339     return
340   end
341
342   if dgn.persist.wucad_mu_died == true then
343     return
344   end
345
346   if data.spot == 1 then
347     crawl.mpr("Strange, shadowy figures dance through the air in front of you.", "talk_visual")
348     data.trig = true
349   elseif data.spot == 2 then
350     crawl.mpr("This room is filled with shadowy figures, quietly meditating.", "talk_visual")
351     data.trig = true
352   elseif data.spot == 3 then
353     crawl.mpr("Here, spectral monks perform complicated, martial routines; they fade quickly.", "talk_visual")
354     data.trig = true
355   elseif data.spot == 4 then
356     if you.silenced() then
357       return
358     end
359     crawl.mpr("Faint laughter comes from somewhere. Too faint to be real.", "talk_visual")
360     data.trig = true
361   elseif data.spot == 5 then
362     if you.silenced() then
363       return
364     end
365     crawl.mpr("There is a faint scream of pain from a crouched figure. This too fades quickly.", "talk_visual")
366     data.trig = true
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")
369     data.trig = true
370   elseif data.spot == 7 then
371     crawl.mpr("A figure sits in silent meditation. It spots you, gestures wildly, and disappears.", "talk_visual")
372     data.trig = true
373   end
374 end
375
376 function wizlab_wucad_summon_monks(data, triggerable, triggerer, marker, ev)
377   if triggerer.type ~= "turn" or triggerer.sub_type ~= "countdown" then
378     return
379   end
380
381   if dgn.persist.wucad_mu_died == true then
382     return
383   end
384
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
389     return
390   end
391
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"
399
400   local count = 0
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
404       else
405        local mon = dgn.create_monster(point.x, point.y, msp)
406        count = count + 1
407       end
408     end
409   end
410
411   crawl.redraw_view()
412
413   if count == 1 then
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")
417   end
418 end
419
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")
424 end
425
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",
429                                                 data.teleport_spot)
430
431   if you.teleport_to(my_slaves[1].x, my_slaves[1].y, true) then
432     crawl.mpr("Your surroundings suddenly seem different!")
433   else
434     crawl.mpr("There is a strange hissing noise.")
435   end
436 end
437
438 }}
439
440 default-depth: Depths, Elf, Crypt, Vaults:1-4
441
442 ###############################################################################
443 # Portal entrances.
444 #
445 # Todo: more, and better.
446 NAME:       mu_enter_wizlab_1
447 TILE:       m = dngn_transparent_wall_green
448 COLOUR:     m = lightgreen
449 :           wizlab_portal(_G)
450 MAP
451     wwwww
452    wwwwwww
453   wwbmbmbww
454  wwbb...bbww
455 wwbm..O..mbww
456  wwbb...bbww
457   wwbb+bbww
458    www.www
459     w.@.w
460 ENDMAP
461
462 NAME:       mu_enter_wizlab_2
463 SHUFFLE:    tU
464 TILE:       m = dngn_transparent_wall_green
465 COLOUR:     m = lightgreen
466 TILE:       c = wall_stone_gray
467 :           wizlab_portal(_G)
468 MAP
469 .................
470 .bbbbbbbmbbbbbbb.
471 .bb...b...b...bb.
472 .m..U...O...U..m.
473 .bb...b...b...bb.
474 .bbbbbbb+bbbbbbb.
475 ..bb...b.b...bb..
476 ..m..t.....t..m..
477 ..bb...b.b...bb..
478 ..bbbbbb+bbbbbb..
479 .................
480 ......c...c......
481 .....ccc.ccc.....
482 .................
483 ENDMAP
484
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" \
491              }
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" \
496              }
497 COLOUR:     .' = red / blue
498 KPROP:      '?! = no_rtele_into
499 SUBST:      ' = .
500 TILE:       n = dngn_transparent_stone_magenta
501 COLOUR:     n = lightmagenta
502 TILE:       c = wall_stone_gray
503 :           wizlab_portal(_G)
504 MAP
505  ccccccccc
506 cc''!'?''cc
507 c?'''''''!c
508 c''nnnnn''c
509 c''n...n''c
510 c''n.O.n''c
511 c'?n...n!'c
512 c''nn.nn''c
513 c''nn.nn''c
514 cc!n.n.n?cc
515  ccnn.nncc
516   cc.n.cc
517    cc.cc
518     c@c
519 ENDMAP
520
521 NAME:       mu_enter_wizlab_4
522 KFEAT:      ! = floor
523 COLOUR:     ! = magenta
524 FTILE:      !O = floor_rough_magenta
525 :           wizlab_portal(_G)
526 MAP
527     xxxxx
528     w!!!x
529    ww!O!x
530   www!!!x
531  www..www
532 www..www
533 ww..www
534 w..www
535 @.www
536 @www
537 ENDMAP
538
539 NAME:       mu_enter_wizlab_5
540 DEPTH:      D:$, Depths, Elf, Crypt, Vaults:1-4
541 COLOUR:     U = random
542 COLOUR:     W = mutagenic
543 KFEAT:      o = granite_statue
544 FTILE:      WU.Oo = floor_rough_magenta
545 TILE:       b = dngn_crystal_magenta
546 :           wizlab_portal(_G)
547 : set_feature_name("green_crystal_wall", "wall of crystal")
548 MAP
549 bbbbbbbbbbb
550 bbbb...bbbb
551 bWWU.O.UWWb
552 bWbb...bbWb
553 bWWWW.WWWWb
554 bbbbW.Wbbbb
555 bbbbW.Wbbbb
556 bbbbW.Wbbbb
557 bbbbW.Wbbbb
558 bbbbo.obbbb
559 bbbb...bbbb
560      @
561 ENDMAP
562
563 NAME:       mu_enter_wizlab_6
564 SUBST:      x = mc.
565 TILE:       c = wall_stone_white
566 TILE:       m = dngn_transparent_stone_magenta
567 FTILE:      mcx.O = floor_rough_magenta
568 :           wizlab_portal(_G)
569 MAP
570 c.c.ccccccc
571 x.x.x.x..Oc
572 .x.x.x.x..c
573 x.x.x.x.x.c
574 .x.x.x.x.xc
575 x.x.x.x.x.c
576 .x.x.x.x.xc
577 x.x.x.x.x..
578 .x.x.x.x.xc
579 x.x.x.x.x..
580 .x.x.x.x.xc
581 ENDMAP
582
583 NAME:   mu_enter_wizlab_7
584 DEPTH:  D:$, Depths, Elf, Crypt, Vaults:1-4
585 KFEAT:  abcd : floor
586 KFEAT:  ABCD : rock_wall
587 TILE:   ABCD = floor_rough_white
588 TILE:   ABCD = wall_zot_white
589 COLOUR: Aa : yellow
590 COLOUR: Bb : green
591 COLOUR: Cc : blue
592 COLOUR: Dd : magenta
593 : wizlab_portal(_G)
594 MAP
595 xxxxxxxxxxxxx
596 x...........@
597 x.xxxxxxxxxxx
598 xaAbbbbbbbbax
599 xaAcBBBBBBAax
600 xaAcCddddcAax
601 xaAcCdDDCcAax
602 xaAcCdOdCcAax
603 xaAcCDDdCcAax
604 xaAcddddCcAax
605 xaABBBBBBcAax
606 xabbbbbbbbAax
607 xxxxxxxxxxx.x
608 @...........x
609 xxxxxxxxxxxxx
610 ENDMAP
611
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
617 COLOUR:   _ = magenta
618 TILE:     G = dngn_statue_dragon
619 : wizlab_portal(_G)
620 MAP
621 .......
622 .bmmmb.
623 .m_O_m.
624 .mG_Gm.
625 .m___m.
626 .bb_bb.
627 .......
628 ENDMAP
629
630 NAME:     infiniplex_enter_wizlab_water
631 FTILE:    cnO_ = floor_rough_magenta
632 TILE:     n = dngn_transparent_stone_magenta
633 COLOUR:   n = lightmagenta
634 COLOUR:   _ = magenta
635 TILE:     c = wall_stone_white
636 : wizlab_portal(_G)
637 MAP
638 ww......ww
639 ww.wwww.ww
640 ...wwww...
641 .wwcnncww.
642 .wwnO_nww.
643 .wwn__nww.
644 .wwcnn_ww.
645 ...wwww...
646 ww.wwww.ww
647 ww......ww
648 ENDMAP
649
650 NAME:     infiniplex_enter_wizlab_spiral
651 DEPTH:    D:$, Depths, Elf, Crypt, Vaults:1-4
652 SUBST:    G : xG.
653 SUBST:    x : xx.
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" \
658            }
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" \
663            }
664 FTILE:    _! = floor_frozen
665 COLOUR:   _! = lightcyan
666 FTILE:    -? = floor_rough_magenta
667 COLOUR:   -? = magenta
668 : wizlab_portal(_G)
669 MAP
670 xx...........xx
671 xG.bbbbbbbbb.Gx
672 ...bw..........
673 .b.bw.bbbbbbbb.
674 .b.bw.bllllllb.
675 .b.bw.bl.....b.
676 .b.bw..l.bbb.b.
677 .b.bwwwO--?b.b.
678 .b.bbb._..-b.b.
679 .b....._b.?b.b.
680 .b!__!_!b.-b.b.
681 .bbbbbbbb.-b.b.
682 ..........?b...
683 xG.bbbbbbbbb.Gx
684 xx...........xx
685 ENDMAP
686
687 NAME: lightli_enter_wizlab_magi_temple
688 COLOUR: . = magenta
689 FTILE: . = floor_rough_magenta
690 : wizlab_portal(_G)
691 MAP
692 bmm.@.mmb
693 m.......m
694 m.bmmmb.m
695 m.bGOGb.m
696 m.m...m.m
697 b.mb.bm.b
698 b.mb.bm.b
699 m.m...m.m
700 m.b...b.m
701 m.b...b.m
702 m.......m
703 bmmbbbmmb
704 ENDMAP
705
706 ###############################################################################
707
708 default-depth: WizLab
709
710 ###############################################################################
711 # And arrivals!
712 ###############################################################################
713 # Firstly, we have Tukima's Dance Studio.
714 #
715 NAME:       wizlab_tukima
716 TAGS:       no_rotate
717 MONS:       dancing weapon
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"}
722 {{
723
724 local tukima_marker = TriggerableFunction:new {
725     func = "tukima_machine",
726     repeated = true,
727     data = {weapon_count=0},
728 }
729
730 tukima_marker:add_triggerer(DgnTriggerer:new {
731     type="turn", delay_min=600, delay_max=900
732 })
733
734 lua_marker('?', tukima_marker)
735
736 }}
737 SUBST:      ? = .
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
750 COLOUR:     mMV = silver
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")
759 epilogue{{
760             wizlab_milestone(_G, "Tukima's Studio")
761 }}
762 MAP
763             ccccccc
764             ccmmmcc
765         cccccm...mccccc
766        cc.....A.<.....cc
767       cc..ccm.....mcc..cc
768       cc.ccccm...mcccc.cc
769       cc.cccccc7cccccc.cc
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
778       cc.ccccm...mcccc.cc
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
790    ccccc     ccccc     ccccc
791 ENDMAP
792
793 ###############################################################################
794 # Eringya's Formal Garden
795 #
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
798 #
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.
804 #
805 NAME:       wizlab_eringya
806 TAGS:       no_rotate
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 \
811             tile:mons_vine_golem
812 MONS:       bush
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 / *:-
820 SUBST:      y = ct
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
828 {{
829 local grow_marker = TriggerableFunction:new { func = "wizlab_eringya_grow",
830                                               repeated = true,
831                                               data = { nofruitsyet = true } }
832
833 grow_marker:add_triggerer(DgnTriggerer:new { type="turn",
834         delay_min=500, delay_max=800, })
835
836
837 lua_marker("_", grow_marker)
838 }}
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")
846 epilogue{{
847             wizlab_milestone(_G, "Eringya's Formal Garden")
848 }}
849 MAP
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
889 ENDMAP
890
891 ###############################################################################
892 # Doroklohe's Forbidden Tomb
893 #
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.
896 #
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
901 #                                    Impetigo 1992
902 #
903 # TODO: Floor tiles, use box_glyph for warning box instead of manual placement.
904 NAME:       wizlab_doroklohe
905 TAGS:       no_rotate
906 LROCKCOL:   yellow
907 KFEAT:      ! = x
908 {{
909 function make_box(cenx, ceny, gly)
910   for ox = -1, 1 do
911     for oy = -1, 1 do
912       local x = cenx + ox
913       local y = ceny + oy
914       if (x >= 1 and y >= 1 and x <= width() and y <= height()) then
915         if (ox ~= 0 or oy ~= 0) then
916           mapgrd[x][y] = gly;
917         end
918       end
919     end
920   end
921 end
922
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)
927   end
928 end
929 }}
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.
934 #
935 :           local layout = crawl.random2(13)
936 :           if layout < 3 then
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
941 :           end
942 :           if layout > 9 then
943 #           First the round layout...
944 COLOUR:     _ = darkgrey
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 = .
949 :           else
950 #           ...and now the grid layout.
951 SUBST:      _ = .
952 SUBST:      *=., %=.
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')
972 SUBST:      bcd = .
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)
978 SHUFFLE:    nqru
979 SUBST:      efghijklmn = %
980 SUBST:      opqrstu = *
981 :           end
982 #           Monsters
983 #            0 Tomb set: zombies, mummies (weight *2)
984 #            1 Demons (if demons are added or reclassified, please change!)
985 #            2 Golems
986 #            TODO: 3 Holy set (for later)
987 :           local mrnd = crawl.random2(4)
988 :           if mrnd == 0 then
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")
1005 :           else
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")
1010 :           end
1011 #           Loot.
1012 #           0 = scrolls. 1 = armours. 2 = mixed.
1013 :           local lrnd = crawl.random2(3)
1014 :           if lrnd == 0 then
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
1024 :           else
1025 KITEM:      % = any / star_item w:2
1026 KITEM:      * = star_item / superb_item w:2
1027 KITEM:      | = superb_item
1028 :           end
1029 #           Boxification:
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
1038 COLOUR:     = = yellow
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
1044 {{
1045 local box_marker = TriggerableFunction:new {
1046     func="wizlab_doroklohe_convert_boxes",
1047     repeated=true, data={phase=1} }
1048
1049 box_marker:add_triggerer(DgnTriggerer:new { type="turn",
1050     delay_min=500, delay_max=1000})
1051
1052 lua_marker("A", box_marker)
1053 }}
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")
1058 epilogue{{
1059             wizlab_milestone(_G, "Doroklohe's Tomb")
1060 }}
1061 MAP
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 ^^^^^^^^^^^^^^^^^^^^^^#^^^^^^^^^^^^^^^^^^^^^^
1087                 ^____...____^
1088                 ^__.......__^
1089                 ^_...!+!..._^
1090                 ^_.<.+A+.<._^
1091                 ^_...!+!..._^
1092                 ^__.......__^
1093                 ^____...____^
1094                 ^^^^^^^^^^^^^
1095 ENDMAP
1096
1097 ##############################################################################
1098 # Cigotuvi's Fleshworks (by Mu.)
1099 #
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.
1104 #
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.
1108 #
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.
1112 #
1113 # The western half of his lab is full of abominations, including the terrible
1114 # "Cigotuvi's Monster".
1115 #
1116 # TODO:     * door tile is *really* ugly, fix this?
1117 #
1118 NAME:       wizlab_cigotuvi
1119 TAGS:       no_rotate
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", \
1166                  excl_rad = 0 }
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", \
1171                  excl_rad = 0 }
1172 LFLOORCOL:  magenta
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
1178 COLOUR:     m = yellow
1179 COLOUR:     c+ = lightred
1180 COLOUR:     W = green
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."
1196 :           })
1197 :           wizlab_setup(_G, "Cigotuvi's Fleshworks")
1198 :           set_random_mon_list("pulsating lump / large abomination / ugly thing / very ugly thing")
1199 epilogue{{
1200             wizlab_milestone(_G, "Cigotuvi's Fleshworks")
1201 }}
1202 MAP
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
1241 ENDMAP
1242
1243 ###############################################################################
1244 # Iskenderun's Mystic Tower
1245 #
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.
1250 #
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 \
1256             name:conjurer n_adj
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
1264 COLOUR:     v = magenta
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
1275 LFLOORCOL:  magenta
1276 :           set_random_mon_list("purple draconian / deep elf mage")
1277 :           wizlab_setup(_G, "Iskenderun's Mystic Tower")
1278 epilogue{{
1279             wizlab_milestone(_G, "Iskenderun's Mystic Tower")
1280 }}
1281 MAP
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
1317 ENDMAP
1318
1319 ###############################################################################
1320 # Zonguldrok's Shrine
1321 NAME:       wizlab_zonguldrok
1322 TAGS:       no_rotate
1323 :           wizlab_setup(_G, "Zonguldrok's Shrine")
1324 SUBST:      ? = txxx
1325 SUBST:      ! = t..
1326 NSUBST:     Z = Z / '
1327 MONS:       patrolling skeletal warrior, patrolling ancient champion
1328 COLOUR:     t = darkgrey / lightgrey
1329 TILE:       t = dngn_tree_dead
1330 LFLOORCOL:  darkgrey
1331 LROCKCOL:   darkgrey
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
1337 {{
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" })
1344
1345 local zombies_appear_marker = TriggerableFunction:new {
1346     func = "wizlab_zonguldrok_spawn_zombies",
1347     repeated = true,
1348     data = {count = 0, vpcount = 0, swcount = 0, account = 0}
1349 }
1350
1351 local zombies_killed_marker = TriggerableFunction:new {
1352     data = { number_killed = 0, door_appeared = false },
1353     func = "wizlab_zonguldrok_killed_zombie",
1354     repeated = true
1355 }
1356
1357 local wizard_appear_marker = TriggerableFunction:new {
1358     data = { awoke = false },
1359     func = "wizlab_zonguldrok_awaken_wizard",
1360     repeated = true,
1361     props = {listen_to_slaves = true, only_at_slave = true }
1362     }
1363
1364 wizard_appear_marker:add_triggerer(DgnTriggerer:new {
1365     type = "player_move" })
1366
1367 zombies_appear_marker:add_triggerer(DgnTriggerer:new {
1368     type = "turn",
1369     delay_min = 150,
1370     delay_max = 250
1371 })
1372
1373 zombies_killed_marker:add_triggerer(DgnTriggerer:new {
1374     type = "monster_dies",
1375     target = "any"
1376 })
1377
1378 lua_marker("M", zombies_appear_marker)
1379 lua_marker("D", zombies_killed_marker)
1380 lua_marker("L", Triggerable.synchronized_markers(wizard_appear_marker))
1381
1382 }}
1383 :           set_feature_name("granite_statue", "gravestone")
1384 :           set_feature_name("floor", "the ground")
1385 SUBST:      M = x
1386 SUBST:      D = c
1387 COLOUR:     W = yellow
1388 TILE:       W = dngn_gravestone_ornate
1389 TILE:       G = dngn_gravestone
1390 SUBST:      LZ = '
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 / ]])
1396 epilogue{{
1397             wizlab_milestone(_G, "Zonguldrok's Shrine")
1398 }}
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
1402 MAP
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
1429     xxxxxxxxxxxxxxxxxxx
1430 ENDMAP
1431
1432 ###############################################################################
1433 # Wucad Mu's Monastery
1434 #
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.)
1442 #
1443 #       A prefix as well as suffix but no regular modifier
1444 #       (so, "faint draconian monk") would be the best, if it's done.
1445 NAME:       wizlab_wucad
1446 TAGS:       no_rotate
1447 SUBST:      T = t.
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
1458 # no longer exists.
1459 TILE:       G = dngn_granite_statue / \
1460                 dngn_statue_angel / dngn_statue_imp / \
1461                 dngn_statue_ancient_evil / dngn_statue_ancient_hero
1462 COLOUR:     AG = red
1463 COLOUR:     < = lightred
1464 TILE:       c = dngn_stone_dark
1465 LFLOORTILE: floor_pebble_white
1466 KFEAT:      ' = open_door
1467 KFEAT:      1234567 = .
1468 KMONS:      1234567 = nothing
1469 LROCKCOL:   darkgrey
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
1474 SHUFFLE:    defg
1475 LFLOORCOL:  white
1476
1477 {{
1478 dgn.persist.wucad_mu_died = false
1479
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 }))
1485 end
1486
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))
1494
1495
1496 local summon_marker = TriggerableFunction:new ({
1497     func="wizlab_wucad_summon_monks",
1498     repeated=true })
1499
1500 summon_marker:add_triggerer(DgnTriggerer:new {type="turn", delay_min=150,
1501     delay_max=300 })
1502
1503 local wucad_marker = TriggerableFunction:new ({
1504     func="callback.wizlab_wucad_wucad_died",
1505     repeated=false })
1506
1507 wucad_marker:add_triggerer(DgnTriggerer:new {type="monster_dies",
1508     target="Statue of Wucad Mu"})
1509
1510 lua_marker('A', summon_marker)
1511 lua_marker('A', wucad_marker)
1512
1513 }}
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")
1533 epilogue{{
1534             wizlab_milestone(_G, "Wucad Mu's Monastery")
1535 }}
1536 MAP
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
1571 ENDMAP
1572
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.
1578 #
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
1583 TAGS:    no_pool_fixup
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
1657 COLOUR:  c = white
1658 COLOUR:  OPQRSTUVW&{( = warp
1659 COLOUR:  opqrstuvw@}) = gold
1660 COLOUR:  X = darkgrey
1661 LFLOORCOL: green
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
1673
1674 {{
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]
1678
1679 local teleporter_glyph = "OPQRSTUVW&?{("
1680 local teleport_spot_glyph = "opqrstuvw@!})"
1681 local tele_marker = {}
1682
1683 for i = 1, #teleporter_glyph do
1684     tele_marker[i] = TriggerableFunction:new {
1685                      func="teleporter_golubria_switch_fn",
1686                      data = {teleport_spot=i},
1687                      repeated=true }
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})
1691 end
1692
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 / ]])
1700
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")
1705 }}
1706
1707 epilogue{{
1708             wizlab_milestone(_G, "The Roulette of Golubria")
1709 }}
1710 MAP
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
1762 ENDMAP
1763
1764 ###############################################################################
1765 # Random and semi-random Wizard vaults
1766 ###############################################################################
1767
1768 ###############################################################################
1769 # Chambers of the Cloud Mage (by Mu.)
1770 #
1771 # TODO: Needs an "ocean of clouds" tiles, and fluffy "cotton wool" cloud tiles.
1772 NAME:       wizlab_cloud
1773 TAGS:       no_rotate
1774 MONS:       vapour, air elemental, insubstantial wisp
1775 KMONS:      4 = twister
1776 {{
1777 wizname = crawl.make_name()
1778
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")
1783 }}
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" \
1790             }
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## / *:#
1801 COLOUR:     +<b = white
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")
1812
1813 epilogue{{
1814             wizlab_milestone(_G, "The Chambers of " .. wizname .. " the Cloud Mage")
1815 }}
1816 #           Map is ugly because border_fill_type doesn't allow for (yet)
1817 #           recolouring.
1818 MAP
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 #####################################################################
1880 ENDMAP
1881
1882 ###############################################################################
1883 # Halls of the Hellbinder (by Mu.)
1884 NAME:       wizlab_demon
1885 TAGS:       no_rotate no_hmirror no_vmirror
1886 LFLOORCOL:  red
1887 LROCKCOL:   red
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
1894 KPROP:      _ = bloody
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
1903 FTILE:      Y = sigil_Y
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", \
1934                 excl_rad = 0 }
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
1942 {{
1943 wizname = crawl.make_name()
1944
1945 kmons     ("1 = patrolling Hellbinder dbname:Hellbinder name:" .. string.gsub(wizname, " ", "_"))
1946 }}
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")
1962 epilogue{{
1963             wizlab_milestone(_G, "The Hall of " .. wizname .. " the Hellbinder")
1964 }}
1965 MAP
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
2026 ENDMAP
2027
2028 ###############################################################################
2029 # Incomplete and TODO work area.
2030 #
2031 # See git history for previous versions of Ozocubu, Alistair, Borgnjor.
2032 #
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".
2036 #
2037 # PLANNING AREA:
2038 #
2039 # From spells:
2040 #
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
2048 #    loot.
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
2051 #    smoke.
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.
2057 #
2058 # From unrands:
2059 #
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,
2062 #    possibly.
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.
2068 #
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...
2073 #