1###############################################################################
2# icecave.des: All maps related to the Ice Cave Portal.
3#
4# <<1>> Entry vaults.
5# <<2>> Ice Cave maps.
6#
7###############################################################################
8
9{{
10
11crawl_require("dlua/dungeon.lua")
12
13--[[
14Setup function for ice cave entry vaults. Create portal timer marker, determine
15ice cave difficulty, and set ice cave chance, and define the ice cave entry
16feature.
17
18@tab e The map environment.
19]]
20function ice_cave_portal(e)
21    local timeout_turns = crawl.random_range(600, 800)
22
23    local messager = timed_msg {
24        initmsg = { "You feel a wave of frost pass over you.",
25                    "There is an entrance to an ice cave on this level. "
26                    .. "Hurry and find it before the portal melts!" },
27        finalmsg = "The crackling of melting ice is subsiding rapidly.",
28        verb = 'crackling',
29        noisemaker = 'melting archway',
30        ranges = {
31            { 5000, 'faint ' },  { 4000, '' },
32            { 2500, 'steady ' }, { 1500, 'quick ' },
33            { 0, 'loud ' }
34        }
35    }
36
37    dgn.persist.ice_cave_hard = hard_ice_cave_difficulty()
38
39    e.lua_marker('O',
40        timed_marker {
41          disappear = "The archway melts and disappears.",
42          entity = 'archway',
43          turns = timeout_turns,
44          single_timed = true,
45          floor = "expired_portal",
46          feat_tile = "dngn_portal_ice_cave_gone",
47          msg = messager })
48    e.tags("uniq_icecv chance_icecave")
49    e.chance(500)
50    e.kfeat("O = enter_ice_cave")
51    e.colour("a = white")
52    e.kfeat("a = x")
53    e.rtile("a = wall_ice_block")
54    e.colour(".1234 = blue")
55    e.ftile(".12345O+^ = floor_ice")
56end
57
58--[[
59Determine if we're placing a hard difficulty ice cave map. Possible depths for
60easy ice caves are D:11-13, Lair, Orc. Hard ice caves are placed in D:14-15,
61Elf and the Lair roulette branches. This function must be updated if the depth
62range of ice cave changes, which is set by the default-depth statement of the
63entry vault section or by the entry maps themselves.
64
65treturn bool True for hard difficulty, false for easy.
66]]
67function hard_ice_cave_difficulty()
68
69    if you.in_branch("D") and you.depth() < 14 or you.in_branch("Lair") or
70       you.in_branch("Orc") then
71        return false
72    end
73
74    return true
75end
76
77--[[
78Define an Ice Cave exit feature on '<' and set ice cave thematic terrain
79descriptions. Should be called after all terrain substitutions are performed.
80
81@tab e The map environment.
82]]
83function ice_cave_appearance(e)
84    e.kfeat("< = exit_ice_cave")
85
86    -- Alter short feature descriptions for all ice cave destination vaults.
87    e.set_feature_name("rock_wall", "ice covered rock wall")
88    e.set_feature_name("stone_arch", "ice choked empty arch of ancient stone")
89    e.set_feature_name("shallow_water", "Some ice crusted shallow water")
90    e.set_feature_name("deep_water", "Some ice crusted deep water")
91end
92
93--[[
94Place a freezing vapour generator on the '!' glyph via a lua marker.
95
96@tab e The map environment.
97@number[opt=12] size The number of squares upon which the cloud generator
98    will place clouds.
99@string[opt="!"] glyphs The glyphs on which to place the marker.
100]]
101function place_freezing_vapour_machine(e, size, glyphs)
102    if size == nil then
103        size = 12
104    end
105
106    if glyphs == nil then
107        glyphs = "!"
108    end
109
110    e.lua_marker(glyphs,
111        fog_machine { pow_max = 20, cloud_type = "freezing vapour",
112                      delay_min = 50, delay_max = 250, size = size,
113                      start_clouds = 1, excl_rad = -1 })
114end
115
116--[[
117Returns monster simulacrum definition strings according to three types,
118"mocking", "savage", and "cruel", that are modified by ice cave difficulty.
119The "mocking" set tends to resemble player species, the "savage" set contains
120beastly simulacrum, and the "cruel" set contains particularly dangerous
121simulacrum in terms of speed, attack strength, or number of attacks.
122
123@treturn table A table of strings with keys "mocking", "savage", and "cruel".
124]]
125function simulacrum_monsters()
126    local mons = {}
127    if dgn.persist.ice_cave_hard then
128        mons["mocking"] = "deep troll simulacrum / minotaur simulacrum \
129             / entropy weaver simulacrum / spriggan defender simulacrum"
130    else
131        mons["mocking"] = "two-headed ogre simulacrum / troll simulacrum \
132            / naga simulacrum / spriggan simulacrum"
133    end
134
135    if dgn.persist.ice_cave_hard then
136        mons["savage"] = "lindwurm simulacrum / dire elephant simulacrum  \
137            / alligator simulacrum / harpy simulacrum / anaconda simulacrum"
138    else
139        mons["savage"] = "wolf simulacrum / elephant simulacrum  \
140            / polar bear simulacrum / cane toad simulacrum \
141            / death yak simulacrum"
142    end
143
144    if dgn.persist.ice_cave_hard then
145        mons["cruel"] = "ettin simulacrum / hydra simulacrum \
146            / golden dragon simulacrum / caustic shrike simulacrum"
147    else
148        mons["cruel"] = "dire elephant simulacrum / harpy simulacrum \
149            / anaconda simulacrum / entropy weaver simulacrum"
150    end
151
152    return mons
153end
154
155--[[
156Define undead and demonic monsters on glyphs 1 through 8 using KMONS, with the
157monster types modified by ice cave difficulty. The glyph definitions are
158roughly in order of difficulty. Glyph 3 defines a statue monster, which is ice
159statue for easy ice caves and obsidian statue for hard ice caves. The glyph 6
160monster is a "miniboss" that should be used sparingly in easy ice caves. The
161"boss" monsters are on glyphs 7 and 8, with 7 being appropriate for a 2+ size
162boss group and 8 being appropriate for a solo boss on easy ice caves or a small
163group for hard ice caves.
164
165Also set a random monster list for shadow creatures purposes containing
166monsters on glyphs 1,2,4, and 5, with total weights for each glyph having
167ratios 18:6:2:1.
168
169@tab e The map environment.
170@string[opt] reaper_glyphs If non-nil, a KMONS will be defined on the given
171    glyphs for a reaper with a freezing scythe and rC gear, the latter getting
172    it to rC+++ and hence freezing vapour immunity.
173]]
174function ice_cave_undead_demon_monster_set(e, reaper_glyphs)
175    simul = simulacrum_monsters()
176
177    local reaper_equip = " ; scythe ego:freezing"
178    -- Make sure this reaper has rC+++ so it doesn't die in freezing vapour.
179    if reaper_glyphs ~= nil then
180        reaper_equip = reaper_equip .. " . robe ego:cold_resistance" ..
181            " . ring of protection from cold | ring of ice"
182    end
183
184    if dgn.persist.ice_cave_hard then
185        e.kmons("1 = " .. simul["mocking"] .. " / ice devil")
186        e.kmons("2 = " .. simul["savage"] .. " / freezing wraith")
187        e.kmons("3 = obsidian statue")
188        e.kmons("4 = freezing wraith")
189        e.kmons("5 = " .. simul["cruel"])
190        e.kmons("6 = bog body / white very ugly thing w:2")
191        e.kmons("7 = blizzard demon")
192        if reaper_glyphs ~= nil then
193            e.kmons(reaper_glyphs .. " = reaper" .. reaper_equip)
194        end
195        e.kmons("8 = ice fiend")
196
197        e.set_random_mon_list(
198            -- 144 * 5 = 720 total weight for tier 1.
199            dgn.random_entry_arg(simul["mocking"] .. " / ice devil",
200                "w:144") ..
201            -- 48 * 5 = 240 total weight for tier 2.
202            " / " .. dgn.random_entry_arg(simul["savage"], "w:48") ..
203            -- 80 weight for tier 4.
204            " / freezing wraith w:80" ..
205            -- 40 total weight for tier 5.
206            " / " .. simul["cruel"])
207    else
208        -- Default case, meaning glyph 8 and no rC gear.
209        if reaper_glyphs == nil then
210            reaper_glyphs = "8"
211        end
212
213        e.kmons("1 = " .. simul["mocking"] .. "/ white imp / ufetubus")
214        e.kmons("2 = " .. simul["savage"])
215        e.kmons("3 = ice statue")
216        e.kmons("4 = ice devil")
217        e.kmons("5 = " .. simul["cruel"])
218        e.kmons("6 = freezing wraith / white ugly thing w:2")
219        e.kmons("7 = bog body")
220        e.kmons(reaper_glyphs .. " = reaper" .. reaper_equip)
221
222        e.set_random_mon_list(
223            -- 120 * 6 = 720 total weight for tier 1.
224            dgn.random_entry_arg(simul["mocking"] .. " / white imp / ufetubus",
225                "w:120") ..
226            -- 48 * 5 = 240 total weight for tier 2.
227            " / " .. dgn.random_entry_arg(simul["savage"], "w:48") ..
228            -- 80 weight for tier 4.
229            " / ice devil w:80" ..
230            -- 40 total weight for tier 5.
231            " / " .. simul["cruel"])
232    end
233end
234
235--[[
236Define natural monsters on glyphs 1 through 8 using KMONS, with the monster
237types modified by ice cave difficulty. The glyph definitions are roughly in
238order of difficulty. Glyph 3 defines a statue monster, which is ice statue for
239easy ice caves and orange crystal statue for hard ice caves. The glyph 6
240monster is a "miniboss" that should be used sparingly in easy ice caves. The
241"boss" monsters are on glyphs 7 and 8, with 7 being appropriate for a 2+ size
242boss group and 8 being appropriate for a solo boss on easy ice caves or a small
243group for hard ice caves.
244
245Also set a random monster list for shadow creatures purposes containing
246monsters on glyphs 1,2,4, and 5, with total weights for each glyph having
247ratios 18:6:2:1.
248
249@tab e The map environment.
250]]
251function ice_cave_natural_monster_set(e)
252    if dgn.persist.ice_cave_hard then
253        e.kmons("1 = polar bear / rime drake")
254        e.kmons("2 = white ugly thing")
255        e.kmons("3 = orange crystal statue")
256        e.kmons("4 = ice dragon")
257        e.kmons("5 = ironbound frostheart")
258        e.kmons("6 = white draconian ; " ..
259            dgn.random_item_def({["scimitar"] = 2, ["halberd"] = 2,
260                                 ["broad axe"] = 1, ["morningstar"] = 2},
261                                "freezing", nil, "|") .. " . cloak")
262        e.kmons("7 = frost giant")
263        e.kmons("8 = shard shrike")
264
265        -- Weights applied by monster difficulty tiers in a way similar to
266        -- ice_cave_undead_demon().
267        e.set_random_mon_list("polar bear w:15 / rime drake w:15 \
268                              / ice dragon / ironbound frostheart w:5")
269    else
270        e.kmons("1 = wolf / yak")
271        e.kmons("2 = polar bear")
272        e.kmons("3 = ice statue")
273        e.kmons("4 = rime drake")
274        e.kmons("5 = death yak")
275        e.kmons("6 = white ugly thing")
276        e.kmons("7 = ironbound frostheart")
277        e.kmons("8 = frost giant")
278
279        e.set_random_mon_list("wolf w:30 / yak w:30 / polar bear w:15 \
280                              / rime drake / death yak w:5")
281    end
282end
283
284--[[
285Define types of thematic armour loot on two KITEMs using the supplied glyphs.
286The first aux armour and buckler, the second being "light" armour and a kite
287shield, and the third being "heavy" armour and a tower shield. All have some
288kind of cold resistance. For hard ice caves, the items are all good_item.
289
290@tab e The map environment.
291@string[opt="def"] glyphs A string of three glyphs to use for the three KITEM
292    statements.
293]]
294function ice_cave_armour_loot(e, glyphs)
295    if glyphs == nil then
296        glyphs = "def"
297    end
298
299    local coldres = " ego:cold_resistance ident:type"
300    local res = " ego:resistance ident:type"
301
302    local quality = ""
303    if dgn.persist.ice_cave_hard then
304        quality = " good_item"
305    end
306
307    e.kitem(glyphs:sub(1,1) .. " = cloak" .. coldres .. quality .. " w:5" ..
308        " / scarf" .. res .. " w:5" .. " / hat" .. quality .. " w:5" ..
309        " / helmet" .. quality .. " w:5" .. " / pair of gloves" .. quality ..
310        " / pair of boots" .. quality .. " / buckler" .. coldres .. quality)
311    e.kitem(glyphs:sub(2,2) .. " = robe" .. res .. quality ..
312        " / leather armour" .. res .. quality ..
313        " / scale mail" ..  coldres .. quality .. " / skin of zhor w:2" ..
314        " / kite shield" ..  coldres .. quality)
315    e.kitem(glyphs:sub(3,3) .. " = ice dragon scales" ..  quality ..
316        " / chain mail" .. coldres ..  quality ..
317        " / plate armour" ..  coldres .. quality ..
318        " / crystal plate armour" .. coldres .. quality ..
319        " / tower shield" .. coldres .. quality)
320end
321
322--[[
323Define weapon types on two KITEMs using the supplied glyphs, both of which have
324the freezing ego. The first is any weapon, and the second is a large set of
325upper-tier weapons. Both weapons definitions include launchers, and the second
326includes small weights for the unrands Frostbite and Maxwell's thermic engine.
327For easy ice caves, the first definition makes weapons that are 50% good_item,
328and for hard ice caves, both definitions are always good_item.
329
330@tab e The map environment.
331@string[opt="gh"] glyphs A string of two glyphs to use for the two KITEM
332    statements.
333]]
334function ice_cave_weapon_loot(e, glyphs)
335    if glyphs == nil then
336        glyphs = "gh"
337    end
338
339    local ego = " ego:freezing ident:type"
340    if dgn.persist.ice_cave_hard then
341        e.kitem(glyphs:sub(1,1) .. " = any weapon" .. ego .. " good_item")
342    else
343        e.kitem(glyphs:sub(1,1) .. " = any weapon" .. ego ..
344            " / any weapon" .. ego .. " good_item")
345    end
346
347    -- Some higher-end weapons that work well with the freezing ego.
348    local weapons = {
349        ["morningstar"] = 10, ["eveningstar"] = 5, ["demon whip"] = 5,
350        ["great mace"] = 10, ["giant club"] = 5, ["giant spiked club"] = 5,
351        ["demon trident"] = 5, ["halberd"] = 10, ["glaive"] = 10,
352        ["bardiche"] = 5, ["scimitar"] = 10, ["demon blade"] = 5,
353        ["double sword"] = 5, ["maxwell's thermic engine"] = 2,
354        ["great sword"] = 10, ["triple sword"] = 5, ["lajatang"] = 10,
355        ["broad axe"] = 10, ["battleaxe"] = 10, ["frostbite"] = 2,
356        ["executioner's axe"] = 5, ["fustibalus"] = 10, ["longbow"] = 10,
357        ["arbalest"] = 5, ["triple crossbow"] = 5
358    }
359    local quality = ""
360    if dgn.persist.ice_cave_hard then
361        quality = " good_item"
362    end
363    e.kitem(glyphs:sub(2,2) .. " = " ..
364        dgn.random_item_def(weapons, "freezing", "ident:type" .. quality))
365end
366
367--[[
368Define one item slot containing ice or water themed magical items, including
369spellbooks, manual, staff of cold, rC jewellery (good_item quality for hard ice
370caves), wand of iceblast, phial of floods, and condenser vane.
371
372@tab e The map environment.
373@string[opt="i"] glyphs A string of glyphs to use for the single KITEM
374    statement.
375]]
376function ice_cave_magic_loot(e, glyphs)
377    if glyphs == nil then
378        glyphs = "i"
379    end
380
381    local quality = ""
382    if dgn.persist.ice_cave_hard then
383        quality = " good_item"
384    end
385    e.kitem(glyphs .. " = book of ice / book of the tundra" ..
386        " / ozocubu's autobiography / randbook disc:ice" ..
387        " / manual of ice magic / staff of cold / ring of ice" .. quality ..
388        " / ring of protection from cold" .. quality ..
389        " / wand of iceblast / phial of floods / condenser vane")
390end
391
392--[[
393Define some common loot items using six KITEM statments on the supplied glyphs.
394The first three are armour, the next two are weapons, and that last is magical
395items. See comments for ice_cave_armour_loot, ice_cave_weapon_loot, and
396ice_cave_magic_loot for details.
397
398@tab e The map environment.
399@string[opt="defghi"] glyphs A string of six glyphs to use for the six KITEM
400    statements.
401]]
402function ice_cave_common_loot(e, glyphs)
403    if glyphs == nil then
404        glyphs = "defghi"
405    end
406
407    ice_cave_armour_loot(e, glyphs:sub(1,3))
408    ice_cave_weapon_loot(e, glyphs:sub(4,5))
409    ice_cave_magic_loot(e, glyphs:sub(6,6))
410end
411
412--[[
413Define one kitem glyph containing necromancy themed items, including
414spellbooks, a manual, staff of death, and an artefact ring of positive energy.
415
416@tab e The map environment.
417@string[opt="j"] glyphs Glyphs to use for the single KITEM statement.
418]]
419function ice_cave_necro_loot(e, glyphs)
420    if glyphs == nil then
421        glyphs = "j"
422    end
423
424    e.kitem(glyphs .. " = book of unlife / randbook disc:ice" ..
425            "    disc2:necromancy numspells:6" ..
426            "/ manual of necromancy w:5 / staff of death" ..
427            "/ ring of positive energy randart")
428end
429
430}}
431
432###############################################################################
433#
434# <<1>> Entry vaults.
435#
436# All must call the function ice_cave_portal() to set the create the portal
437# timer and set the common CHANCE value. Any entry placing out-of-depth
438# monsters should have a lower weight.
439#
440###############################################################################
441
442
443###############################################################################
444# Entry vaults that place for both ice cave difficulties.
445
446default-depth: D:11-, Lair, Orc, Elf, Swamp, Shoals, Snake, Spider
447
448NAME:   portal_ice_cave_entry_pillars_1
449TAGS:   transparent
450: ice_cave_portal(_G)
451MAP
452  ...
453  .a.
454.......
455.a.O.a.
456.......
457  .a.
458  ...
459ENDMAP
460
461NAME:   portal_ice_cave_entry_pillars_2
462TAGS:   transparent
463: ice_cave_portal(_G)
464MAP
465  ...
466 ..a..
467..a.a..
468.a.O.a.
469..a.a..
470 ..a..
471  ...
472ENDMAP
473
474NAME:   portal_ice_cave_entry_ice_simulacra
475TAGS:   patrolling no_monster_gen transparent
476{{
477ice_cave_portal(_G)
478local simul = simulacrum_monsters()
479mons(simul["mocking"])
480mons(simul["savage"])
481}}
482: if you.in_branch("D") then
483:     if you.depth() < 12 then
484SUBST: 1 = 1.
485:     else
486SUBST: 1 = 112
487:     end
488# Savage only for Lair, but fewer.
489: elseif you.in_branch("Lair") then
490:     if you.depth() < 4 then
491SUBST: 1 = 2...
492:     else
493SUBST: 1 = 2.
494:     end
495# Orc
496: elseif you.in_branch("Orc") then
497SUBST: 1 = 112
498: else
499SUBST: 1 = 12
500: end
501MAP
502..1..
503.1.1.
5041.O.1
505.1.1.
506..1..
507ENDMAP
508
509###############################################################################
510# Entry vaults that only place easy ice cave entrances
511
512default-depth: D:11-13, Lair, Orc
513
514NAME:   portal_ice_cave_entry_imps
515TAGS:   patrolling no_monster_gen transparent
516: ice_cave_portal(_G)
517MONS:   white imp
518MAP
519..1..
520.111.
52111O11
522.111.
523..1..
524ENDMAP
525
526NAME:   portal_ice_cave_entry_animals_and_master
527TAGS:   patrolling no_monster_gen
528DEPTH:  D:11-13, Lair:4-, Orc
529WEIGHT: 5
530: ice_cave_portal(_G)
531MONS:   wolf, yak, polar bear, rime drake, ice dragon
532SUBST:  D = 12 .:1, E = 2 3:5 .:1, F = 3 4:2, H = 4:2 5:8
533MAP
534xx    xxxxxxx
535axxxxxxaaaaaxx
536aaxaaaaa...aax
537@aaaaDa.E.F.ax
538a.a..D...O.Hax
539aa.aaaD.E.F.ax
540xaaaaa.a...aax
541xxxxxaaaaaaaxx
542    xxxxxxxxx
543ENDMAP
544
545NAME:   portal_ice_cave_demonic_guard
546TAGS:   patrolling no_monster_gen
547: ice_cave_portal(_G)
548MONS:   ice devil
549MAP
550xxxxxxxxx
551xaaaaaaax
552xa..O..ax
553xa.....ax
554xa.1.1.ax
555xa.....ax
556xaaa.aaax
557xxaa.aaxx
558xxa...axx
559xxa+a+axx
560ENDMAP
561
562NAME:   portal_ice_cave_rime
563TAGS:   patrolling no_monster_gen no_pool_fixup transparent
564: ice_cave_portal(_G)
565MONS:   rime drake
566MAP
567  '''''
568 wwwww''
569'waaaaa''
570'waO1...'
571'wa1....w
572'wa...wa'
573''a..waw
574 ''..aw
575  ''w'
576ENDMAP
577
578###############################################################################
579# Entry vaults that only place hard ice cave entrances
580
581default-depth: D:14-, Elf, Swamp, Shoals, Snake, Spider
582
583NAME:   portal_ice_cave_entry_pillars_three
584TAGS:   transparent
585: ice_cave_portal(_G)
586MAP
587   ...
588....a...
589.a...aa.
590..aaOaa..
591 .aa...a.
592 ...a....
593   ...
594ENDMAP
595
596NAME:   portal_ice_cave_entry_pillars_four
597TAGS:   transparent
598: ice_cave_portal(_G)
599MAP
600   ...
601  .a.a.
602 .a.a.a.
603.a.a.a.a.
604..a.O.a..
605.a.a.a.a.
606 .a.a.a.
607  .a.a.
608   ...
609ENDMAP
610
611NAME:   portal_ice_cave_entry_horrid_things
612TAGS:   patrolling no_monster_gen transparent
613DEPTH:  D:14-, Elf, Snake, Swamp
614WEIGHT: 5
615: ice_cave_portal(_G)
616MONS:   white ugly thing, freezing wraith, azure jelly / white very ugly thing
617SUBST:  1 = 1., 2 = 2 .:3, 3 = 3:3 2:7
618MAP
619xxxxxxxxxxxxxxxxxxxxxxx
620xxaaaaaxaaaaaaaaaaxxxxx
621xaa...aaa........aaxxxx
622xa.....a....2..1..aaaaa
623xa..O..+..3...1.1.....+
624xa.....a....2..1..aaaaa
625xaa...aaa........aaxxxx
626xxaaaaaxaaaaaaaaaaxxxxx
627xxxxxxxxxxxxxxxxxxxxxxx
628ENDMAP
629
630NAME:   portal_ice_cave_entry_ice_statue_one
631TAGS:   no_monster_gen no_pool_fixup transparent
632: ice_cave_portal(_G)
633MONS:   ice statue
634KFEAT:  ^ = web trap
635: if you.in_branch("Swamp") then
636SUBST:  + = ., x = t
637: elseif you.in_branch("Shoals") then
638SUBST:  x = w
639: elseif you.in_branch("Spider") then
640SUBST:  + = ^
641: end
642MAP
643 xxxxxxx
644xxaaaaaxx
645xaa...aax
646xa..O..ax
647xa.....ax
648xa..1..ax
649xa.....ax
650xaa...aax
651xxaa+aaxx
652ENDMAP
653
654NAME:   portal_ice_cave_entry_ice_statue_two
655TAGS:   transparent patrolling no_monster_gen
656: ice_cave_portal(_G)
657MONS:   ice statue, ice dragon
658SUBST:  2 = 1:9 2:1
659MAP
660   .....
661 .........
662...........
663.....1.....
664.....O.....
665.....2.....
666...........
667 .........
668   .....
669ENDMAP
670
671NAME:   portal_ice_cave_entry_dragon
672TAGS:   no_monster_gen no_pool_fixup patrolling
673MONS:   ice dragon
674: ice_cave_portal(_G)
675: if you.in_branch("Swamp") then
676SUBST:  x = t
677: elseif you.in_branch("Shoals") then
678SUBST:  x = w
679: end
680MAP
681xxxxxxxx
682xaaaaaxx
683xaO..aax
684xa.1a.ax
685xa.a..a@
686xaa..a.'
687xxaaa..'
688xxxx@'''
689ENDMAP
690
691NAME:   portal_ice_cave_entry_frozen_things
692TAGS:   no_monster_gen transparent
693MONS:   freezing wraith, azure jelly
694SUBST:  2 = 12.
695: ice_cave_portal(_G)
696MAP
697  '''''
698 ''aaa''
699''aaOaa''
700'aa.2.aa'
701'a.....a'
702'a.1.1.a'
703'aaa.aaa'
704'aaa.aaa'
705'aaa+aaa'
706'''''''''
707ENDMAP
708
709NAME:     portal_ice_cave_entry_ugly_swarm
710TAGS:     no_monster_gen transparent patrolling
711MONS:     white ugly thing, white very ugly thing
712SHUFFLE:  ABC
713SUBST:    a = aa.
714NSUBST:   1 = 12 / 4=1 / ., . = 8=1. / .
715: ice_cave_portal(_G)
716MAP
717    '''''''
718   '''''''''
719  '''.....'''
720 '''.a.a.a.'''
721'''.........'''
722''.a..111..a.''
723''...11111...''
724''.a.11O11.a.''
725''...11111...''
726''.a..111..a.''
727'''.........'''
728 '''.a.a.a.'''
729  '''.....'''
730   '''''''''
731    '''''''
732ENDMAP
733
734###############################################################################
735#
736# <<2>> Ice Cave maps.
737#
738# Ice caves feature monsters that have some form of ice-themed attack, or at
739# least convey a sense that they could survive in a cold place. Terrain-wise,
740# ice caves have white-colored walls and sometimes use freezing vapour machines
741# and deep water. All maps should have an escape very close to the start, so
742# the player can back away if the challenge is deemed too much to handle. Many
743# maps place equipment at early or midway points that grants cold resistance,
744# so that players lacking that might have a better chance to complete the map.
745# Many maps have randomized shortcuts through deep water or freezing vapour
746# machines that let the player bypass difficult portions of the map, or use the
747# water or clouds to their advantage.
748#
749# Ideally all maps will implement an easy and a hard variant, checking the
750# variable dgn.persist.ice_cave_hard, which is true for hard ice caves. Easy
751# ice caves should be challenging but completable for most characters in the
752# mid Dungeon, Lair, and Orc. Hard ice caves should be challenging for
753# characters in late Dungeon, Lair Branches, and Elf. If a map concept can
754# somehow only work at one of the two difficulties, it should veto for the
755# other difficulty. For example, an easy-only map would veto for hard ice caves
756# with:
757#
758#     veto {{ return dgn.persist.ice_cave_hard }}
759#
760# All maps should also call the function ice_cave_appearance() at the end of
761# their statements define the exit feature and terrain appearance.
762#
763###############################################################################
764
765default-depth: IceCv
766
767###############################################################################
768# The small caves.
769#
770# A set of maps with "small" cave systems that feature a specific theme and a
771# main path without many chokepoints. They feature an early or midway point one
772# can reach for some loot if more difficult challenge at the end can't be
773# finished.
774
775# Foes: Natural monster set with one frost giant for easy difficulty and two or
776# more for hard difficulty.
777#
778# Loot: Common ice cave loot set, with an emphasis on weapons, plus some
779# potions.
780NAME:    ice_cave_small_giant
781TAGS:    no_item_gen no_monster_gen no_pool_fixup
782ORIENT:  encompass
783: ice_cave_common_loot(_G)
784: kitem("j = " .. dgn.loot_potions)
785: ice_cave_natural_monster_set(_G)
786# For easy ice cave, always one frost giant and the potion area has fewer
787# monsters with only 33% chance for the 6 glyph miniboss. For hard ice cave,
788# minimum of two frost giants, with 25% each for up to two more, and the potion
789# area has more monsters and always has a miniboss.
790: if dgn.persist.ice_cave_hard then
791NSUBST:  E8 = 2=7 / 7..., F = 6 / 5 / 2=5. / 4=12.. / .
792: else
793NSUBST:  F = 556 / 2=5. / 2=12.. / .
794: end
795NSUBST:  D = 45
796# Randomize tunnel layout and the loot composition and locations.
797SHUFFLE: "w / 'a
798SUBST:   'a = x, j = j.
799NSUBST:  d = 3=def... / 5=gh.. / 2=i. / .
800: ice_cave_appearance(_G)
801MAP
802                  xxxxx        xxxxxxxx
803                xxx...xxxx  xxxx1D....xx
804         xxxxxxxx...x....xxxx...D.x....xxxx
805      xxxx......1..xxxx...xD1D.xxxxxxx...1xxxx
806     xx.......1..4.xxxxxx....xxxxxxxxxxxxD1..xxx
807   xxx...xxxxE8E2....xxxxxxxxxxxxxxxxxxxxxx....xxx
808  xx...xxxddxxE5..1...xxxxxxxxxxxxxxxxxxxxxxx....xxx
809  x...xxdddddxx..1.....xxxxxxxxxxxxxxxxxxxxxxxx....x
810  x...x$$$$dddx.......xxxxxxxxxxxxxxxxxxxxxxxxxxx..x
811  x...x....$$xx.....xxxxxxxxxxxxxxxxxxxxxxxxxxxx11xx
812  xx.......xxx.....xxxxxxxxxxxxxxxxxxxxxxxxxx...Dxx
813   xx............xxxxxxxxxxxxxxxxxxxxxxxxx......xx
814 xxx"xx.........x'aaaxxxxxxxxxxxxxxxxxxx...x.xxxx
815 xwwwxxxxxxxxxxxxxaaaxxxxxxxxxxxxxxxxxx..xxxxx
816 xxwwwxxxxxxxxxaaaaaxxxxxxxxxxxxxxxxxx..xx
817 xwwwwxxxxxxxxxxxaaa'xxxxxxxxxxxxxxx3...xxx
818 xwwwxxxxxxxxxxxxxx'x'xxxxxxxxxxxxx.......xxx
819xxwwxxxxxxxxxxxxxxxx'xxxxxxx"xxxxxxxx.......xxx
820x""xxxxxxxxxxxxxxxx''xxxxx"""xxxxxxxxx....D...xx
821xx""xxxxxxxxxxxxxx''xxxxxx"""""..xxxxxxxD......x
822 xx""xxxxxxxxxxxx'x'xxxx"""xxx.......xxx.......x
823  x"x"xxxxxxxxxxx''xxxxx"xx'''xx......24x.....xx
824  xx"""xxxxxxxxxxx''xxx""x''x'''x....1..2....xx
825   xxx""""xxxxxxxxx''xx"xx''xxxxxx.1......1.xx
826     xxx"x"xxxxxxxxx'xx""xx''xx  xx.x....x.xx
827      xxx"xxxxxxxxx''x""xxxx''xx  xxxx..xxxx
828     xx"""xxxxxxxx'x'x"x"xxxx''xx   xx..x
829    xx""xxxxxxxxxx''xxx"x"xxxx''x  xx..xx
830   xx""x"xxxxxxxxxx''xxx""xxx''xx  x..xx
831  xx""x"xxxxxxxxxxxx'xxxx""x''xx   x...xx
832  x""xxxxxxxxxxxxxx'x'xxxx""'xx    xx...xx
833  x"x"xxxxxxxxxxxxxx'''xxxx..x      xx12.x
834 xx""xxxxxxxxxxxxxxxx'xF.xF.xx      xx1.1x
835xx""xxxxxxxxxxxxxxxxxxFjx.xxx       x...xx
836x""xxxxxxxxxxxxxxxxF.xjxjxFxx      xx...xx
837x"x"xxxxxxxxxxxxxxx.xjxjxjFxx     xx.....xx
838xx"x"xxxx""x"xxxxxx".F.F.Fxx      x...A...x
839 xx""""x""""x""x""""xxxxxxx       x.......x
840  xxxx"""xxx"x""""xxx             xx..<..xx
841     xxxxx xxxxxxxx                xx...xx
842                                    xxxxx
843ENDMAP
844
845# Foes: Icy dragon-themed monsters. End boss is either a dragon, with ice
846# dragon for easy, golden for hard, or white draconian, with ordinary draconian
847# for easy, draconian knight for hard.
848#
849# Loot: A lot of gold, some jewellery, and possible items from the common loot
850# set.
851NAME:    ice_cave_small_dragons
852TAGS:    no_item_gen no_monster_gen no_pool_fixup
853ORIENT:  encompass
854: ice_cave_common_loot(_G)
855KITEM:   j = any jewellery
856# For easy ice caves, there are two ice statues, the boss is white draconian
857# instead of ice dragon half the time, and the higher quality jewellery is
858# good_item. For hard ice cave, there is one orange crystal statue and another
859# tier 2 monster, whenand the high quality jewellery is always randart.
860: if dgn.persist.ice_cave_hard then
861KITEM:   k = any jewellery randart
862MONS:    lindwurm simulacrum / ice dragon simulacrum \
863         / storm dragon simulacrum / golden dragon simulacrum
864MONS:    ice dragon, orange crystal statue, golden dragon
865{{
866kmons("D = white draconian ; " ..
867    dgn.random_item_def({["scimitar"] = 2, ["halberd"] = 2, ["broad axe"] = 1,
868       ["morningstar"] = 2}, "freezing", nil, "|") .. " . cloak")
869kmons("E = white draconian knight ; " ..
870    dgn.monster_weapon("knight", "freezing", "good_item", "|") ..
871    " . cloak good_item")
872set_random_mon_list("lindwurm simulacrum / swamp dragon simulacrum \
873                     / ice dragon simulacrum / golden dragon simulacrum \
874                     / white draconian / ice dragon")
875}}
876# 50% chance for dragons vs draconians.
877NSUBST:  3 = 3 / 2
878SHUFFLE: 24 / DE
879: else
880KITEM:   k = any jewellery good_item
881MONS:    steam dragon simulacrum / acid dragon simulacrum \
882         / komodo dragon simulacrum / lindwurm simulacrum w:5
883MONS:    rime drake, ice statue, ice dragon, white draconian
884{{
885set_random_mon_list("steam dragon simulacrum / acid dragon simulacrum \
886    / komodo dragon simulacrum / lindwurm simulacrum \
887                     / rime drake w:20")
888}}
889# 50% chance for a white draconian boss instead of an ice dragon.
890SUBST:   4 = 45
891: end
892# Two guaranteed jewellery with 4 pieces on average.
893NSUBST:  j = j / *=j$$$, k = k / *=k$$$
894# Make each of d through i have about a 50% chance of placing, and reduce the
895# gold placed to about 22 piles on-average.
896SUBST:   $ = $:440 d e f g h i .:140
897# Randomize the winding tunnels.
898SHUFFLE: 'w / "a
899SUBST:   "a = x
900: ice_cave_appearance(_G)
901MAP
902                         xxxxxxxx
903                      xxxx......xxxx
904                     xx......x....1xxx
905                     x...xx.xxx..12..xxx
906                   xxxxx..xxx$$..24..jkxx
907                  xx...xx.xx$$$$1...jkjjx
908                  xx.x....x$$$$$$$.jkjjxx
909                 xx..xxx.xxxx$$$$$$xxx''x
910              xxxx11xxxxxxxxxxxxxxxxxwx'x
911           xxxx.111xxxxxxxxxxxxxxxxwwwwwxx
912         xxx.....1xxxxxxxxxxxxxxxxwwwwwwxxx
913        xx...xxxxxxxxxxxxxxxxxxxxxxwwwwxxxx
914       xx..xxxxxxxxxxxxxxxxxxxxxxxxx'xxxxxx
915     xxx..xxxxxxxxxxxxxxxxxxxxxxxxx..xxxxx
916   xxx....xxxxxxxxxxx"xxxxxx""""x....xxxxx
917  xx........xxxxxxxx"""x"x"""x"x.'xx.xxxx
918 xx...........xxxx"""x""x""xxxx"x''xx""xx
919xx..............x""xxxxx"xxxxxxxxx''xx""xx
920x.......2........xxxxxxxxxxxxxxxxxx''x"x"x
921x.................xxxxxxxxxxxxxxxxxx'xx"xx
922xx....1.1.1.....x'''xxxxxxxxxxxxxx'''x""x
923 xx.............xxx''xx''xxxx'''x'x'xx"xx
924  xx..........xxxxxx'''''''x''x''''xx""x
925   xx3x....x3xxxxxxxx'xxxx'''1xxxxx"""xx
926    xxxx..xxxxxxxxxxxxxxxxx$$$xxx""""xx
927      xx..xxxxxxxxxxxxx"""1$2*$xx"x"xx
928     xx..xxxxxxxxxxxxx""x"1$$|$1xx"xx
929     x..xxxx"xxxxxxxxx""xxx1x1x""""x
930     x...x"""""xxxxxxxx"""xxxxxx"xxx
931     xx..."x"x"""xxxxx"x""x    xxx
932      xx.1.xxxxx"""x"xx""xx
933      xx1.1x   xxx""""""xx
934      x...xx     xxxx"xxx
935     xx...xx        xxx
936    xx.....xx
937    x...A...x
938    x.......x
939    xx..<..xx
940     xx...xx
941      xxxxx
942ENDMAP
943
944# Foes: Undead + demons set. For easy ice caves, a necromancer boss, and for
945# hard ice caves, the necromancer is a sub boss with a lich end boss.
946#
947# Loot: Common loot set along with a necromancy loot item.
948NAME:    ice_cave_small_necro
949TAGS:    no_item_gen no_monster_gen no_pool_fixup
950ORIENT:  encompass
951KPROP:   yY'j = bloody
952: ice_cave_common_loot(_G)
953: ice_cave_necro_loot(_G)
954: ice_cave_undead_demon_monster_set(_G)
955KMONS:   D = necromancer
956KFEAT:   _ = altar_kikubaaqudgha
957KFEAT:   ^ = alarm trap
958KFEAT:   y = x
959KFEAT:   " = +
960# For the easy ice cave, necromancer + elephants as boss, second area gets a
961# mix of appropriate monsters. For the hard ice cave, lich and friends as boss
962# and necromancer + dire elephants + friends in second area.
963: if dgn.persist.ice_cave_hard then
964KMONS:   E = lich
965SUBST:   D = E, K = D
966:else
967SUBST:   K = 5
968:end
969SHUFFLE: fghi, def
970SUBST:   f = f*, N = 456, - = ........^
971# Set up two shortcuts, each with a 50% to be open. Each open shortcut has a
972# 50% chance to be open space with a freezing cloud machine and a 50% chance to
973# be deep water.
974SHUFFLE: apq / aa! / zzz / zzz
975SUBST:   a = ., pq = w, z = x
976: place_freezing_vapour_machine(_G, 8)
977# Replace this glyph with floor so we can re-use it.
978SUBST:   ! = .
979SHUFFLE: rsu / rr! / zzz / zzz
980SUBST:   r = ., su = w, z = x
981: place_freezing_vapour_machine(_G, 12)
982: ice_cave_appearance(_G)
983MAP
984                          xxxxxx
985                        xxx....xx
986                      xxx.......x
987              xxxxxx xx...xxx..xx
988             xxpqppxxx...xxx..xx
989            xxppppxxx...xxx..xx
990    xxxxxxxxxpqpxaaxN..xxx...x
991   xx.G...G.aappxx...Nxxxx..xx     xxxxx
992xxxx.........xxxx....xxxxx...xxx xxx...xxxx
993xfx....2_424.xxxx..xxxxxxxx....xxx...2....xx
994x*+.....K...2xxxx...xxxxxxxx.......2.1.2...xx
995xgx....52N.N42xxxx.N.xxxxxxxxxx...1.....1...x
996xxxx..4...N24xxxxxxxN..xxxxxxxxx............x
997   xxxG5.4G...xxxxxxxx...xxxxxxxx2........2xx
998     xxxxxx....xxxxxxxx....xxxxxxx1x....x1xx
999          xxx...xx.xxxxxx....xxxxxxxx..xxxx
1000   xyyyyyxx....xx...xxxxxxx...xxxxxxx..x
1001   xyYj'yxx..xxx..x..xxxxxxxx..xxxxx..xx
1002   xyyy"yxxx.....xxx.....xxx..xxsxx..xx
1003  xxN.'''Nxxx...xxxxx........xxxssr...xx
1004 xx...4D4.2xxxxxxxxxG.N..N...xxssurx...xx
1005xx.2x$**$x.2xxxxxxd%...1.....xxsssxxx.22x
1006x..2xxhixx2..xxxxxe%....N....rsusssxx2.2x
1007x....xxxx...xxxxxxxxx.......xrxsssxx...xx
1008xxx.........xxxxxxxxxxx...xxxxsssxxx...xx
1009  x...3....xxxxxxxxxxxxx..xxxxxxxxx.....xx
1010  xx------xxxxx.xxxxxxxxxx..xx   x...A...x
1011   xx----xxxxx....xxxxx..x...xx  x.......x
1012    x---xx.x...xx....x.....xxx   xx..<..xx
1013    xx.......xxxxxx....xxxxx      xx...xx
1014     xxx.xx.xx    xxxxxx           xxxxx
1015       xxxxxx
1016ENDMAP
1017
1018# Foes: Undead + demon set with a demonic boss.
1019# Loot: Common loot set.
1020NAME:    ice_cave_small_demon
1021TAGS:    no_item_gen no_monster_gen no_pool_fixup
1022ORIENT:  encompass
1023: ice_cave_common_loot(_G)
1024: ice_cave_undead_demon_monster_set(_G, "E")
1025# For hard ice caves, place an obsidian statue and a 50% chance for an OCS.
1026# fiend. For the boss, 50% chance for either reapers or ice fiend. If reapers,
1027# two guaranteed and 33% each for up to two more. If ice fiend, 50% chance for
1028# a second. For easy ice caves, always place a single reaper.
1029: if dgn.persist.ice_cave_hard then
1030KMONS:   D = orange crystal statue
1031SHUFFLE: EF / 8H
1032NSUBST:  3 = 3 / D4, F = E / E.., H = 8. / .
1033: else
1034SUBST:   6 = 56
1035: end
1036SHUFFLE: dg, fh
1037SUBST:   i = e|ii
1038# Place middle-tier monsters and cloud generators in the boss chamber.
1039SHUFFLE: JK / LM / NO / PQ / RS
1040SUBST:   JL = 44., KM = !, MNOPQR = ., Z = 25
1041: place_freezing_vapour_machine(_G)
1042# Add in 1s and 2s throughout the map, doing this last so we have more space.
1043NSUBST:  . = 6=1 / 6=1. / 2 / 2=2. / .
1044# Set up two shortcuts, each with a 50% to be open. Each open shortcut has a
1045# 50% chance to be open space with a freezing vapour machine and a 50% chance
1046# to be deep water.
1047SHUFFLE: apq / aa! / zzz / zzz
1048SUBST:   a = ., pq = w, z = x
1049: place_freezing_vapour_machine(_G, 12)
1050# Replace this glyph with floor so we can re-use it.
1051SUBST:   ! = .
1052SHUFFLE: rsu / rr! / zzz / zzz
1053SUBST:   r = ., su = w, z = x
1054: place_freezing_vapour_machine(_G, 8)
1055: ice_cave_appearance(_G)
1056MAP
1057                    xxxxxx
1058                  xxx....xxx
1059                 xx........xxx
1060                xx....xxx....xx
1061  xxxxx         x...xxx6xxx...xxx
1062 xx...xxxxx     x...xx4...xxxx..xx
1063xx.4..2...xx xxxxxx..xx....2xx...x
1064x1......1..xxx.x...........gxxx..x
1065xx..........x.........xx..dxx...xx
1066x.1.....1.......xxrxxxxxxxxx...xx
1067xx............xxxsssxxxxxxx...xx
1068 x..........xxxxssuxxxxxxK..xxx
1069 x3x....x3xxxxxxxxrr....J..xx
1070 xxxx..xxxxxxxxxx......JKJ..xxx
1071   xx..axxpxxxx....xx.........xxx
1072  xx..xapqpax.....xx..xxxx..Q...xx
1073  x..xxpppxaZ.M.x.....N..x...P...xx
1074  x...xxxxxx..L.xxx..O.N.xx.PQP..Zxx
1075  xx...xxxxxZLML..xx..N...xx.......x
1076   xx.-.xxxxx.........x.O........Zxx
1077   xx---xxxxxx...xxx..x..xxx.....xx
1078   x---xxxxxxxxxxx....x.....x..xxx
1079  xx---xxxxxxxxx...S..x.....xxxx
1080 xx-----xxxxxxxxx.xx.R...Sxxx
1081 x---A---xxxxxccccc.R.R.ccccc
1082 x-------xxxxxc...cccFccc...c
1083 xx--<--xxxxxxc.f...FEF...h.c
1084  xx---xxxxxxxc...cc*i*cc...c
1085   xxxxxxxxxxxccccccccccccccc
1086         xxxxx
1087ENDMAP
1088
1089# This is an ice cave which is also a tomb of a necromancer who likes staying
1090# alive and simulacrums, or just a chillout of an ice fiend. By Zaba.
1091#
1092# Foes: Undead + demon set with necromancer + bog body or demon boss for easy
1093# ice caves, or either reapers or fiend for hard ice caves.
1094#
1095# Loot: Common loot set with a necromancy themed item.
1096NAME:    ice_cave_tombish
1097TAGS:    no_item_gen no_monster_gen
1098ORIENT:  encompass
1099: ice_cave_common_loot(_G)
1100: ice_cave_necro_loot(_G)
1101# Scroll loot under statues.
1102KITEM:   3 = any scroll
1103: kitem("D8 = " .. dgn.loot_scrolls)
1104KITEM:   D = any scroll
1105# For easy ice caves, small chance for freezing wraiths in tomb area. For the
1106# boss, a 50% chance for either necromancer plus bog body or reaper. For hard
1107# ice caves, bog bodies in tomb area. The boss is 50% chance reapers versus one
1108# or two ice fiends. For reapers, minimum of two, 33% chance each for up to two
1109# more. For ice fiend, minimum of one and 50% chance for another.
1110: if dgn.persist.ice_cave_hard then
1111: ice_cave_undead_demon_monster_set(_G)
1112KMONS:   D7 = reaper ; scythe ego:freezing
1113SHUFFLE: D7 / 88
1114NSUBST:  7 = 7 / 7.., 8 = 8 / 8. / .
1115NSUBST:  4 = 6 / 446, F = 122445
1116: else
1117: ice_cave_undead_demon_monster_set(_G)
1118KMONS:   D = necromancer
1119SHUFFLE: D7 / 88
1120NSUBST:  7 = 7 / ., 8 = 8 / .
1121SUBST:   4 = 4:70 6, F = .12244
1122: end
1123# Shuffle main loot chamber items, and then the locations of the non-necro loot
1124# items to possibly be at other locations and to possibly include magical loot.
1125SHUFFLE: fghi, defgh
1126SUBST:   d = d*, e = e*, f = f*, g = g*, h = h*
1127: ice_cave_appearance(_G)
1128MAP
1129      xxxxx
1130     xx...xx
1131    xx.....xx
1132    x...A...x
1133    x...<...x
1134    xx.....xx
1135     xx...xx
1136      x...xx
1137      xx..1x
1138      xx..1x
1139      x...xx
1140   xxxx...xxxx
1141  xx3x.....x3xx
1142 xx...........xx
1143 x.............x
1144xx.............xx
1145x.......F.......x
1146x....F.....F....x
1147x.......U.......x
1148x....F.....F....x
1149x.......F.......x
1150xx.............xx
1151 x.cnnc...cnnc.x
1152 xxc44c...c44cxx
1153  xcVdcc+cceVcx
1154  ccc+c...c+ccc
1155  c...c...c...c
1156ccc.ccc...ccc.ccc
1157c...c5c...c5c...c
1158c+ccc+c...c+ccc+c
1159c.c5+.......+5c.c
1160c.ccc.G...G.ccc.c
1161c.c5+.......+5c.c
1162c.ccc.G...G.ccc.c
1163c.+...........+.c
1164c.ccc.G...G.ccc.c
1165c.c5+.......+5c.c
1166c.ccc.G...G.ccc.c
1167c.c5+.......+5c.c
1168c+cccccc+cccccc+c
1169c...............c
1170ccccG.ccccc.Gcccc
1171   cc.cfDgc.cc
1172    c.c7U7c.c
1173    c.ch7ic.c
1174    c.cc+cc.c
1175    c.......c
1176    ccccVcccc
1177       ccc
1178ENDMAP
1179
1180############################################################################
1181# The sprawling caverns.
1182#
1183# A winding, tight cavern with a hard challenge at the end. You can always go
1184# back to the beginning to retreat. The caverns are more rare than the caves.
1185#
1186# Details below are common to all caverns maps we have thus far.
1187# Foes: 50% chance each of either the undead+demons set or the natural set.
1188# Loot: Common loot set plus random wands/misc, potions, and scrolls.
1189
1190NAME:    ice_cave_caverns_01
1191TAGS:    no_item_gen no_monster_gen no_pool_fixup
1192ORIENT:  encompass
1193: ice_cave_common_loot(_G)
1194: kitem("j = any wand / any potion w:5 / any scroll w:5")
1195: kitem("k = any misc / " .. dgn.loot_potions .. " / " .. dgn.loot_scrolls)
1196# Pick one of two themes, undead/demons or natural monsters.
1197: if crawl.coinflip() then
1198:     ice_cave_undead_demon_monster_set(_G)
1199: else
1200:     ice_cave_natural_monster_set(_G)
1201: end
1202# Randomize bosses tiers and shuffle statue monster and miniboss locations.
1203SHUFFLE: 7F / F8, 3H / UJ
1204# For easy ice caves, 33% chance for the "miniboss" fight to be a solo 6,
1205# otherwise two or three tier 5s. For the boss, either a fight with two tier 7
1206# or one tier 8, along with other friends. For hard ice cave, the miniboss is
1207# always includes a 6 tier along with one to two tier 5s. For the boss, still
1208# two tier 7s or one tier 8.
1209: if dgn.persist.ice_cave_hard then
1210NSUBST:  J = 6 / 5.
1211: else
1212SUBST:   J : JJK
1213NSUBST:  J = 2=5 / 5., K = 6 / .
1214: end
1215# Randomize loot so that two armour pieces will be at various places in the
1216# map, and randomize loot locations at the end stash.
1217SHUFFLE: efghi, def
1218SUBST:   D = 12, E = 2 4:2 5:5, 2 = 2 .:5
1219# Choose one of two possible paths to open up.
1220SHUFFLE: '-
1221SUBST:   ' = x
1222# Set up three shortcuts, each with a 50% to be open. Each open shortcut has a
1223# 50% chance to be open space with a freezing vapour machine and a 50% chance
1224# to be deep water.
1225SHUFFLE: apq / aa! / ZZZ / ZZZ
1226SUBST:   a = ., pq = w, Z = x
1227: place_freezing_vapour_machine(_G, 12)
1228# Replace this glyph with floor so we can re-use it.
1229SUBST:   ! = .
1230SHUFFLE: rsu / rr! / ZZZ / ZZZ
1231SUBST:   r = ., su = w, Z = x
1232: place_freezing_vapour_machine(_G, 12)
1233SUBST:   ! = .
1234SHUFFLE: yz" / yy! / ZZZ / ZZZ
1235SUBST:   y = ., z" = w, Z = x
1236: place_freezing_vapour_machine(_G, 12)
1237: ice_cave_appearance(_G)
1238MAP
1239   xxx         xxxx     xxxx xxxx
1240 xxx.xx       xx-'xx  xxxppxxxppxxxxx xxxx      xxxxxxxxxx      xxx
1241xx....x    xxxx....xxxxppppppppppxx*xxx$$xxxxxxxx...xx...xxxxxxxxkxx
1242x...A.xxxxxx....xx....xxpppppppaaa*x*xxx$$x-.x...xx...xx...xxxxxjxjx
1243x.<....'-....xxxxxxx...aaqppqppqpxx*x.xxxx.'x..xxxxxxxxxx....Hxxx.xx
1244xx..xx....xxxxxxxx1111xxppppppppppxxxx...xxxxx..xxxxxxxxxx..3.Hx.xx
1245xxxxxxxxxxxxxxx....xxxxxxxxppppppxx11..x...x..xxxxxxxxxxxxx....Hxx
1246        xxx.....xxxx------xxppxxxxD1xxxxxx..xxxxxxxxxxxxxx...xxyxxx
1247     xxxx..xxxxxx---xx-----xxxx...xxxxxxxxxxxxxxxxxxxxxxx...xxxzzzx
1248   xxx....xxxxx--xxxxxxxx---xx..xxxxxxxxxxxxxxxxxxxxxx....xxxxzzzxxx
1249  xx...xxxxxxx-xxxx....xxx--xxx..xxxxxxxxxxxxxxx....x...xxxxxzzxz"zxx
1250xxx..xxxxxxxx-xxx...xx...xxx-xxx..xxxxxxxxxxx...xx....xxxxxxxxxxxxzzx
1251x...xxxxxxxxxx-...x.xxxx...xx-x..xxxxxxxxxxx..xxxxxxxxxxxxxxxx.xxxyzx
1252x..xxxxxxxxxxx1E1xxxjxxxx...x-xx.11xxxxxxxxxx...xxxxxxxxxe.*x.x.xxyxx
1253xx..xxxxxxxxx...xxxdxxx...xxx-xxxxD1xxxxxxxxxx..1.xxxxxx.JUJ.xxx..x
1254xx..xxxxxxxxx....xxxx..xxxwxx-xx...xxxxxxxxxxxx.1..xxxxxx..Jxx..xxx
1255 x..xxxxxxxxx'x.xxxxxD...xxwwx-xxxx1.xxxxxxxxxxxxDE.D.xxxxx..xx...xx
1256 x...xxxxxxx..'xxxxxxx1..Dxxwwx--xxxD.xxsxsxxxxxxxD.E1.xxxx..xxxE5Exx
1257 xx..-xxxxx..xxxxxxxxxxxD.1xxwwxx---11rrssssxxxxxxxx.D..x...xxxD7F7Dx
1258  x...-xx-..xxxxxxxxxxxx-x1.xxwwxx'''xxxsssusssxxxxxxx-...xxxxxxD5Dxxx
1259  x...x--xx..1xxxxxxxx--x-..'xxwx'x'xxxxxxssssssssxx..xxxxx.xxx..xxx|x
1260  x222x''x''x..xx1xxx----xxxx'xx'''xx    xxssussusrrx.xxxx.<.xxx.$*fgx
1261  xx'.'xx'xx1.x.1...2xxxxx  xx'''xxx      xxxssssssxxx''........x|hikx
1262   xxxxxxxxxxxxxxxxxxx       xx'xx          xssxsxxx xxxxxx.xxxxxxxxxx
1263                              xxx           xxxxxx        xxx
1264ENDMAP
1265
1266# See ice_cave_caverns_01 for comments on most statements; only statements
1267# different in this map are commented.
1268NAME:    ice_cave_caverns_02
1269TAGS:    no_item_gen no_monster_gen no_pool_fixup
1270ORIENT:  encompass
1271: ice_cave_common_loot(_G)
1272: kitem("j = any wand / any potion w:5 / any scroll w:5")
1273: kitem("k = any misc / " .. dgn.loot_potions .. " / " .. dgn.loot_scrolls)
1274: if crawl.coinflip() then
1275:     ice_cave_undead_demon_monster_set(_G)
1276: else
1277:     ice_cave_natural_monster_set(_G)
1278: end
1279KFEAT:   y = w
1280SHUFFLE: 7F / F8, 3H / UJ
1281: if dgn.persist.ice_cave_hard then
1282NSUBST:  J = 6 / 5.
1283: else
1284SUBST:   J : JJK
1285NSUBST:  J = 2=5 / 5., K = 6 / .
1286: end
1287SHUFFLE: fghik, def
1288SUBST:   D = 12, E = 2 4:2 5:5, 2 = 2 .:5
1289SHUFFLE: '-
1290SUBST:   '=x
1291# A fixed shortcut through a freezing vapour generators with a 50% chance to
1292# place.
1293SUBST:   r = rx
1294: place_freezing_vapour_machine(_G, 6, "r")
1295# Two shortcut set up in a similar fashion to ice_cave_caverns_01.
1296SHUFFLE: apq / aa! / zzz / zzz
1297SUBST:   a = ., pq = w, z = x
1298: place_freezing_vapour_machine(_G, 8)
1299SUBST:   ! = .
1300SHUFFLE: suy / ss! / zzz / zzz
1301SUBST:   s = ., uy = w, z = x
1302: place_freezing_vapour_machine(_G, 12)
1303: ice_cave_appearance(_G)
1304MAP
1305 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx    xxxxxxxx    xxxxxxxx
1306 x..xappppxax.x.'x-.xD..Dxxxxxxxxxx....x.Wxxxxxx1DE1D.xx  xx......xx
1307 x.<.xppqpax...x.x.x.x1D.Dxxxxxxx'''..x.xxWWxx1DxxD.E1.xxxx..xxxJJJxx
1308 xx..xxppxx..xxx-.'xx.xxD.1xxxx'''xxx.-xxxxWWWxxxxxx....x...xxxe.U.*x
1309  x.A.xxxx..xxxxxxxwwwwxxx1.x'''xxxxx---xxxxWWwwwwwxxx-...xxxxxx...xx
1310  x...xxxxx...xxxxxwwwwwxx..'xxxxxxxxxx--xxwwwwwwwxx--xxxxxxxxx..xxx
1311  x...xxxxxxx..xx1-'xxwwxxx--xxxxx'''x--xxwwwwwwwxx'x-xxxx..xxxx..x
1312  xx.11xxxxx1.x...1.2xxwx---xx.*.*.xx..xxxwwwwwwwww'.x.x..xx.x..xxx
1313  x11.xxxxxxxx1xxxxx1.xxxx--x.j.T.j.xxx..xwwwwwwwwx'x-..xxxxx.xxx
1314  xx..xxxxxxxx2..1x11..xxxx-...*.*..xx...xxwwwwwwx'...xxx   xxx
1315   xx.xxxxxxxxxxxx.xxx..xxxx...xxxxxxxxx..xxwwwxxx.-xxx
1316xxxxx..xxxx.x*...xxxx...xxxxxx.-xxxxxxx1xxxxxxxxx..xx
1317xdx$xx..xr....-'..xxxxx..xxx''.-xxxxx.Dxxxxsxxxxxx..xxx
1318xx$x.xx..xx..xxxx..xxxxxx..''xx--xxxx11Dsxuuuuxxxxx...xxx
1319x$x..x....xx..xxx..xxxxxxx--xxxx-xx.1.xxsuuuuuuxxxxx....xxx
1320xx.xx.x..xxx..xx.HHxxxxxxxx1.xxxx...xxxxxuyuuuxxxxxxx.D.5.xx
1321xxxxxx..xxxx...xxH3.xxxxxx'-.1x'''xxxxxxuuuuyuuxxxxxx.DE.D.xx
1322   xx..xxxx...xxxx...xxxx..x..''xxxxxxxxxuuuusxxx$$x.5E.D...xx
1323   x...xx...xxxx.x.xxxxx...x.xxxx  xxxxxxuxuxsxi*$$...7F7.xx.xxx
1324   x..xxD..xx  xx|x.xx...xx.xx      xxxxxxxxxxfk|$$$...xxxxxx..xxxxx
1325   x...2.2xx    xx....xxxxxxx        xxxxxxxxxxgh|$$$$.x    xxx....xxx
1326   xx11Dxxx     xxxxxxx                       xxxxxxxxxx      xxx...<x
1327    xxxxx                                                       xxxxxx
1328ENDMAP
1329
1330# See ice_cave_caverns_01 for comments on most statements; only statements
1331# different in this map are commented.
1332NAME:    ice_cave_caverns_03
1333TAGS:    no_item_gen no_monster_gen no_pool_fixup
1334ORIENT:  encompass
1335: ice_cave_common_loot(_G)
1336: kitem("j = any wand / any potion w:5 / any scroll w:5")
1337: kitem("k = any misc / " .. dgn.loot_potions .. " / " .. dgn.loot_scrolls)
1338: if crawl.coinflip() then
1339:     ice_cave_undead_demon_monster_set(_G)
1340: else
1341:     ice_cave_natural_monster_set(_G)
1342: end
1343SHUFFLE: 7F / F8, 3H / UJ
1344: if dgn.persist.ice_cave_hard then
1345NSUBST:  J = 6 / 5.
1346: else
1347SUBST:   J : JJK
1348NSUBST:  J = 2=5 / 5., K = 6 / .
1349: end
1350SHUFFLE: fghik, def
1351SUBST:   D = 12, E = 2 4:2 5:5, 2 = 2 .:5
1352SHUFFLE: '-
1353# Two shortcut set up in a similar fashion to ice_cave_caverns_01.
1354SHUFFLE: apq / aa! / zzz / zzz
1355SUBST:   a = ., pq = w, z = x
1356: place_freezing_vapour_machine(_G, 8)
1357SUBST:   ! = .
1358SHUFFLE: rsu / rr! / zzz / zzz
1359SUBST:   r = ., su = w, z = x
1360: place_freezing_vapour_machine(_G, 12)
1361: ice_cave_appearance(_G)
1362MAP
1363                                 xxxxx
1364                                 x$e*xx      xxxxxxxxxx
1365                                 x.UJxxxxxxxxx...xx...xxx
1366                              xxxx.JJ..x..x...xx...xx.DDxxx
1367                              xWxxxxx....x..xxxxxxxxxx.DDExxx
1368                              xWxWxWW.xxxxx..xxxxxxxxxx.2D2Dx
1369                              xxWWWWxW..xx..xxxxxxxxxxxxE7F7x
1370                           xxxxWWxwWWxx...xxxxxxxxxxxxx.2Dxxx
1371                          xx.WWxxxxxrrxxxxxxxxxxxxxxxx...xx
1372               xxxxxxxxxxxx..xxxxsssssssssssxxxxxxx....xxxx
1373             xxx....xxxxxxxx..xxxssssusssssrr<...x...xx.xkxx
1374           xxx...xx...xxxxxxx..xxxxsssssussxxxx....xxxxxix|x
1375          xx.EEx.xxxxD1Dxxxx..xxx xxssssssxxxxxxxxxx  x$x$xhx
1376         xx.E.xxx$xxxxDDDxxxx...xx xxsxssxxx          xx|xgxx
1377         x...xxx$xxx11Dxxxxxxxx..x  xxxxxxx            xxfxx
1378         xx....xxxx..xxxxxxxxx...xx                     xxx
1379        xx.x.xxxpx....xxxxxxxxxx..xx
1380       xx...xxxppxx....xxxxxxx'''..xx
1381      xx..xxxxxpqpxxx...xxxx''xxxx.-xx
1382      x.1xxxxxapppppaxx..x'''xxxxx---xx
1383      xx.11xxxaxxxxxxa...''xxxxx'xxx--x
1384       xxx1.xx.xxxxxx-xx--xxxxx''''--xx
1385        x..x......xxxx---xx.*.*.xx..xxx
1386        xxx.xxxxx..xxxx--x.j.T.j.xxx..x
1387          x2..2x....xxxx-...*.*..xx...xx
1388       xxxxxxxx.xxx.1xxxx...xxxxxxxxx..x
1389      xx1x...'xxxx.1.xxxxxx.-xxxxxxx1xxx
1390  xxxxx1...-x..xxxxx11xxxx'.--x---1Dxx
1391 xx..<xx..xxxx..xxxxxx..''xx-x-xxx11Dx
1392 xA..xxxx..xxx..xxxxxxx--xxxx-xx.11xxx
1393 x....xxx..xx.HHxxxxxxxx1.xxx-...xxx
1394 x...xxxx...xxH3.xxxxxxxx.1x'''xxx
1395xx..xxxx21.xxxx...xxxx..x..''xxx
1396x...xx.12xxxxdx.xxxxx...x.xxxx
1397x..xx...xx  xx*x.xx...xx.xx
1398x......xx   xxx....xxxxxxx
1399xx...xxx     xxxxxxx
1400 xxxxxx
1401ENDMAP
1402
1403###############################################################################
1404# The ice statue gardens.
1405#
1406# These vaults rely on devious placement of ice or orange crystal statues and
1407# forcing players to face them (if they want loot, that is).
1408#
1409# Foes: Simulacra, ice or orange crystal statue monsters, freezing wraiths, and
1410# white (very) ugly things.
1411#
1412# Loot: Some items from the common loot set, random items, star_item and
1413# superb_item.
1414
1415# Previously called ice_cave_statue_garden_teleport, when it used the old
1416# teleporter lua feature.
1417NAME:   ice_cave_statue_garden_transporter
1418TAGS:   no_item_gen no_monster_gen no_pool_fixup
1419ORIENT: encompass
1420{{
1421ice_cave_common_loot(_G)
1422local simul = simulacrum_monsters()
1423mons(simul["savage"])
1424mons(simul["cruel"])
1425}}
1426# For easy ice caves, both statues are ice statues, and a freezing wraith has a
1427# 50% chance of replacing one of the two white ugly thing. For hard ice caves,
1428# there is one orange crystal statue with two freezing wraiths, always two
1429# white very ugly things, the first chamber has more cruel simulacra, and there
1430# are two more star_items.
1431: if dgn.persist.ice_cave_hard then
1432MONS:   orange crystal statue, freezing wraith, white very ugly thing
1433# 12 * 5 = 60 total weight for savage simulacra, 4 * 5 = 20 total weight for
1434# cruel simulacra, and 10 weight for freezing wraiths.
1435: set_random_mon_list(dgn.random_entry_arg(simul["savage"], "w:12") ..
1436:     " / " .. dgn.random_entry_arg(simul["cruel"], "w:5")  ..
1437:     " / freezing wraith")
1438SUBST:  1 = 112, 3 = 4, D = 3, E = *
1439NSUBST: % = * / %
1440:else
1441MONS:   ice statue, freezing wraith, white ugly thing
1442: set_random_mon_list(dgn.random_entry_arg(simul["savage"], "w:16") ..
1443:     " / " .. simul["cruel"])
1444NSUBST: 1 = 2=1 / 4=1112.... / ., 5 = 45 / 5
1445SUBST:  D = *
1446:end
1447SUBST:  d = def***, g = gh**, i = i*
1448MARKER: P = lua:transp_loc("statue_garden_entry")
1449MARKER: Q = lua:transp_dest_loc("statue_garden_entry")
1450MARKER: R = lua:transp_loc("statue_garden_exit")
1451MARKER: S = lua:transp_dest_loc("statue_garden_exit")
1452: ice_cave_appearance(_G)
1453MAP
1454ccccccccccccccc
1455cR..3EgDiE3..<c
1456c.....*|*.....c
1457ccG....5....Gcc
1458 ccG.......Gcc
1459  ccG..Q..Gcc
1460  xccnnnnnccx
1461 xx...GPG...xx
1462 x...%.S.%...x
1463xx.1..*d*..1.xx
1464x......%......x
1465x..1.G.5.G.1..x
1466x.............x
1467xx.1.......1.xx
1468 x...........x
1469 x.1...A...1.x
1470 xx.........xx
1471  xx...<...xx
1472   xx.....xx
1473    xxxxxxx
1474ENDMAP
1475
1476NAME:   ice_cave_statue_garden_chambered
1477TAGS:   no_item_gen no_monster_gen no_pool_fixup
1478ORIENT: encompass
1479{{
1480ice_cave_common_loot(_G)
1481local simul = simulacrum_monsters()
1482mons(simul["savage"])
1483mons(simul["cruel"])
1484}}
1485# For easy ice caves, three ice statues in the middle chamber, and a freezing
1486# wraith has a 50% chance of replacing one of the two white ugly thing. For
1487# hard ice caves, there are two orange crystal statues in the middle chamber,
1488# always two white very ugly things total. Two freezing wraiths are added to
1489# the final chamber, and there two more star_items.
1490: if dgn.persist.ice_cave_hard then
1491MONS:   orange crystal statue, freezing wraith, white very ugly thing
1492# 12 * 5 = 60 total weight for savage simulacra, 4 * 5 = 20 total weight for
1493# cruel simulacra, and 10 weight for freezing wraiths.
1494: set_random_mon_list(dgn.random_entry_arg(simul["savage"], "w:12") ..
1495:     " / " .. dgn.random_entry_arg(simul["cruel"], "w:5")  ..
1496:     " / freezing wraith")
1497NSUBST: D = 3 / 1
1498SUBST:  E = 124, F = 4, 1 = 112, J = *
1499: else
1500MONS:   ice statue, freezing wraith, white ugly thing
1501: set_random_mon_list(dgn.random_entry_arg(simul["savage"], "w:16") ..
1502:    " / " .. simul["cruel"])
1503NSUBST: 1 = 2=1 / 4=1112.... / ., D = 2=3 / 1, 5 = 45 / 5
1504: end
1505NSUBST: d = def*** / *
1506SUBST:  g = gh||, i = i|
1507: ice_cave_appearance(_G)
1508MAP
1509ccccccccc
1510cg*JiJ*|c
1511c*.....*c
1512c%.....%c
1513c.......c
1514c2..5..2c
1515cc.....cc
1516cccF.Fccc
1517cccc3cccc
1518ccc.E.ccc
1519cc.....cc
1520cD.....Dc
1521c...5...c
1522c.......c
1523cE.....Ec
1524cD.....Dc
1525cccc.cccc
1526xd%...%dx
1527x*E...E*x
1528x%.....%x
1529x.11111.x
1530x..111..x
1531xx.....xx
1532xxx...xxx
1533xxxx.xxxx
1534xxx...xxx
1535xx.....xx
1536x...A...x
1537x.......x
1538x.......x
1539x...<...x
1540x.......x
1541xxxxxxxxx
1542ENDMAP
1543
1544###############################################################################
1545# A jelly themed ice cave
1546#
1547# Foes: Simulacra, ice statue, slime creatures, and a few high level jellies,
1548# especially azure jellies.
1549#
1550# Loot: Guaranteed randart ice-themed weapon, armour, jewellery, or book, along
1551# with some items from the common loot set and star_items.
1552NAME:    ice_cave_hellmonk_azure_passage
1553TAGS:    no_item_gen no_monster_gen
1554ORIENT:  encompass
1555: ice_cave_common_loot(_G)
1556# Loot always includes at least one randart so Jiyva worshipers get something
1557KITEM:   j = any weapon randart ego:freezing ident:all / any armour randart \
1558             / ring of ice randart ident:all / ice dragon scales randart w:5 \
1559             / ring of protection from cold randart ident:all \
1560             / any ring randart / any amulet randart \
1561             / randbook disc:ice numspells:3
1562KMONS:   _ = azure jelly
1563KFEAT:   _ = altar_jiyva
1564KFEAT:   D = slimy_wall
1565SUBST:   * = dj *:60, d = defghi, 1 = 1.., 3 = 113334
1566SHUFFLE: qrs
1567# For easy ice cave, use ice statues,
1568# boss slimes, including a rockslime.
1569: if dgn.persist.ice_cave_hard then
1570MONS:    ugly thing simulacrum / demonic crawler simulacrum \
1571         / entropy weaver simulacrum / very ugly thing simulacrum
1572MONS:    orange crystal statue, slime creature band, quicksilver ooze
1573MONS:    azure jelly, rockslime
1574{{
1575set_random_mon_list("ugly thing simulacrum w:15" ..
1576    " / demonic crawler simulacrum w:15 / entropy weaver simulacrum w:15" ..
1577    " / very ugly thing simulacrum w:15 / slime creature w:40" ..
1578    " / quicksilver ooze w:20 / azure jelly")
1579}}
1580SUBST:   p = 4, q = 455, r = 5, s = 6
1581: else
1582MONS:    glowing shapeshifter simulacrum / ugly thing simulacrum \
1583         / demonic crawler simulacrum / entropy weaver simulacrum
1584MONS:    ice statue, slime creature band, quicksilver ooze, azure jelly
1585{{
1586set_random_mon_list("glowing shapeshifter simulacrum" ..
1587    " / ugly thing simulacrum / demonic crawler simulacrum" ..
1588    " / entropy weaver simulacrum / slime creature w:20 / quicksilver ooze")
1589}}
1590SUBST:   q = 34455
1591:end
1592NSUBST:  2 = 2 / 2=2. / .
1593# 50% chance for slimy wall passages, otherwise fill with rock.
1594SHUFFLE: DE / FF
1595SUBST:   E = ., F = x
1596: ice_cave_appearance(_G)
1597MAP
1598xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1599xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1600xxxxxxxxx..3......xxxxxxxx.....xxxxxxxxx
1601xxxxxxx.......11...pxxxx.......rxxxxxxxx
1602xxxxx1.....xxx.....xxxx.....D....**xxxxx
1603xxxx2....DDDD.....xxx.....D........*xxxx
1604xxxx....EEEE....3.x.......s._.D....jxxxx
1605xxxx31...DDDD.....1.......D........*xxxx
1606xxxxx..1....xxxxxxxxxx......D....**xxxxx
1607xxxxxx...11...xxxxxxxxxx.......qxxxxxxxx
1608xxxxxxxxx3....21....xxxxxx.....xxxxxxxxx
1609xxxxxxxxxx........1......xxxxxxxxxxxxxxx
1610xxxxxxxxxxxxxDEDxxxx.....1.xxxxxxxxxxxxx
1611xxxxxxxxxxxxxDEDxxxxxx.....3.xxxxxxxxxxx
1612xxxxxxx....2....xxxxxxxx....xxxxxxxxxxxx
1613xxxxx..1........xxxxxxx..1.xxx..1..xxxxx
1614xxxx..1...xxx..1..xxx2...DDx.1......xxxx
1615xxxx.....DDxxxx..1......EE....x2..1.xxxx
1616xxxx3...EEE.d*xxx....xxDD...1xx.....xxxx
1617xxxxx.....Dx*d..xxxxxxxx..1.xx...3.xxxxx
1618xxxxxx1....xx.p..2xx...1..xxx.....xxxxxx
1619xxxxxxxxx...xxxx.......xxxx...1xxxxxxxxx
1620xxxxxxxxxx.1..xxxx.p.xxx..1..xxxxxxxxxxx
1621xxxxxxxxxxxx.1..1xxxxx.....xxxxxxxxxxxxx
1622xxxxxxxxxxxxxxx...111...xxxxxxxxxxxxxxxx
1623xxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxx
1624xxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx
1625xxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx
1626xxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxx
1627xxxxxxxxxxxxxxxxx..A..xxxxxxxxxxxxxxxxxx
1628xxxxxxxxxxxxxxxxxx.<.xxxxxxxxxxxxxxxxxxx
1629xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1630ENDMAP
1631