From 4f7e0ea354d80a37f2af6322e972a5235a612c6e Mon Sep 17 00:00:00 2001 From: Stephen Oman Date: Sun, 31 May 2026 15:38:22 +0100 Subject: [PATCH] Update /dat directory with NetHack5 file --- dat/Arc-fila.lua | 59 + dat/Arc-filb.lua | 59 + dat/Arc-goal.lua | 115 ++ dat/Arc-loca.lua | 145 ++ dat/Arc-strt.lua | 116 ++ dat/Arch.des | 472 ------- dat/Bar-fila.lua | 33 + dat/Bar-filb.lua | 44 + dat/Bar-goal.lua | 95 ++ dat/Bar-loca.lua | 107 ++ dat/Bar-strt.lua | 99 ++ dat/Barb.des | 377 ----- dat/Cav-fila.lua | 35 + dat/Cav-filb.lua | 41 + dat/Cav-goal.lua | 59 + dat/Cav-loca.lua | 101 ++ dat/Cav-strt.lua | 94 ++ dat/Caveman.des | 316 ----- dat/GENFILES | 36 +- dat/Hea-fila.lua | 42 + dat/Hea-filb.lua | 50 + dat/Hea-goal.lua | 90 ++ dat/Hea-loca.lua | 97 ++ dat/Hea-strt.lua | 109 ++ dat/Healer.des | 380 ----- dat/Kni-fila.lua | 35 + dat/Kni-filb.lua | 40 + dat/Kni-goal.lua | 99 ++ dat/Kni-loca.lua | 137 ++ dat/Kni-strt.lua | 109 ++ dat/Knight.des | 408 ------ dat/Mon-fila.lua | 61 + dat/Mon-filb.lua | 60 + dat/Mon-goal.lua | 75 + dat/Mon-loca.lua | 98 ++ dat/Mon-strt.lua | 108 ++ dat/Monk.des | 378 ----- dat/Pri-fila.lua | 55 + dat/Pri-filb.lua | 62 + dat/Pri-goal.lua | 84 ++ dat/Pri-loca.lua | 73 + dat/Pri-strt.lua | 102 ++ dat/Priest.des | 356 ----- dat/Ran-fila.lua | 35 + dat/Ran-filb.lua | 39 + dat/Ran-goal.lua | 106 ++ dat/Ran-loca.lua | 79 ++ dat/Ran-strt.lua | 101 ++ dat/Ranger.des | 356 ----- dat/Rog-fila.lua | 64 + dat/Rog-filb.lua | 64 + dat/Rog-goal.lua | 110 ++ dat/Rog-loca.lua | 99 ++ dat/Rog-strt.lua | 166 +++ dat/Rogue.des | 485 ------- dat/Sam-fila.lua | 37 + dat/Sam-filb.lua | 60 + dat/Sam-goal.lua | 111 ++ dat/Sam-loca.lua | 141 ++ dat/Sam-strt.lua | 98 ++ dat/Samurai.des | 440 ------ dat/Tou-fila.lua | 35 + dat/Tou-filb.lua | 39 + dat/Tou-goal.lua | 159 +++ dat/Tou-loca.lua | 153 ++ dat/Tou-strt.lua | 134 ++ dat/Tourist.des | 519 ------- dat/Val-fila.lua | 40 + dat/Val-filb.lua | 42 + dat/Val-goal.lua | 104 ++ dat/Val-loca.lua | 85 ++ dat/Val-strt.lua | 100 ++ dat/Valkyrie.des | 353 ----- dat/Wiz-fila.lua | 59 + dat/Wiz-filb.lua | 58 + dat/Wiz-goal.lua | 132 ++ dat/Wiz-loca.lua | 151 ++ dat/Wiz-strt.lua | 107 ++ dat/Wizard.des | 472 ------- dat/air.lua | 108 ++ dat/asmodeus.lua | 96 ++ dat/astral.lua | 187 +++ dat/baalz.lua | 66 + dat/bigrm-1.lua | 81 ++ dat/bigrm-10.lua | 61 + dat/bigrm-11.lua | 39 + dat/bigrm-12.lua | 85 ++ dat/bigrm-13.lua | 82 ++ dat/bigrm-2.lua | 71 + dat/bigrm-3.lua | 83 ++ dat/bigrm-4.lua | 59 + dat/bigrm-5.lua | 54 + dat/bigrm-6.lua | 48 + dat/bigrm-7.lua | 52 + dat/bigrm-8.lua | 53 + dat/bigrm-9.lua | 52 + dat/bigroom.des | 723 ---------- dat/bogusmon.txt | 41 +- dat/castle.des | 249 ---- dat/castle.lua | 257 ++++ dat/cmdhelp | 4 +- dat/data.base | 971 +++++++++++-- dat/dungeon.def | 143 -- dat/dungeon.lua | 333 +++++ dat/earth.lua | 130 ++ dat/endgame.des | 655 --------- dat/engrave.txt | 5 +- dat/epitaph.txt | 4 +- dat/fakewiz1.lua | 44 + dat/fakewiz2.lua | 44 + dat/fire.lua | 158 +++ dat/gehennom.des | 713 ---------- dat/hellfill.lua | 443 ++++++ dat/hh | 10 +- dat/history | 307 ++-- dat/juiblex.lua | 122 ++ dat/knox.des | 153 -- dat/knox.lua | 167 +++ dat/luahelper | 102 ++ dat/medusa-1.lua | 123 ++ dat/medusa-2.lua | 129 ++ dat/medusa-3.lua | 138 ++ dat/medusa-4.lua | 152 ++ dat/medusa.des | 416 ------ dat/minefill.lua | 51 + dat/minend-1.lua | 119 ++ dat/minend-2.lua | 159 +++ dat/minend-3.lua | 107 ++ dat/mines.des | 1209 ---------------- dat/minetn-1.lua | 150 ++ dat/minetn-2.lua | 182 +++ dat/minetn-3.lua | 150 ++ dat/minetn-4.lua | 133 ++ dat/minetn-5.lua | 137 ++ dat/minetn-6.lua | 102 ++ dat/minetn-7.lua | 198 +++ dat/nhcore.lua | 144 ++ dat/nhlib.lua | 242 ++++ dat/opthelp | 322 +++-- dat/optmenu | 43 + dat/oracle.des | 65 - dat/oracle.lua | 69 + dat/oracles.txt | 3 +- dat/orcus.lua | 159 +++ dat/quest.lua | 3087 ++++++++++++++++++++++++++++++++++++++++ dat/quest.txt | 3521 ---------------------------------------------- dat/rumors.fal | 37 +- dat/rumors.tru | 37 +- dat/sanctum.lua | 133 ++ dat/soko1-1.lua | 112 ++ dat/soko1-2.lua | 113 ++ dat/soko2-1.lua | 70 + dat/soko2-2.lua | 72 + dat/soko3-1.lua | 82 ++ dat/soko3-2.lua | 74 + dat/soko4-1.lua | 104 ++ dat/soko4-2.lua | 74 + dat/sokoban.des | 637 --------- dat/symbols | 710 ++++++++-- dat/themerms.lua | 1097 +++++++++++++++ dat/tower.des | 147 -- dat/tower1.lua | 74 + dat/tower2.lua | 62 + dat/tower3.lua | 50 + dat/tribute | 1356 ++++++++++++++++-- dat/tut-1.lua | 347 +++++ dat/tut-2.lua | 27 + dat/usagehlp | 139 ++ dat/valley.lua | 174 +++ dat/water.lua | 102 ++ dat/wizard1.lua | 102 ++ dat/wizard2.lua | 62 + dat/wizard3.lua | 90 ++ dat/wizhelp | 27 +- dat/yendor.des | 281 ---- 175 files changed, 20817 insertions(+), 14784 deletions(-) create mode 100644 dat/Arc-fila.lua create mode 100644 dat/Arc-filb.lua create mode 100644 dat/Arc-goal.lua create mode 100644 dat/Arc-loca.lua create mode 100644 dat/Arc-strt.lua delete mode 100644 dat/Arch.des create mode 100644 dat/Bar-fila.lua create mode 100644 dat/Bar-filb.lua create mode 100644 dat/Bar-goal.lua create mode 100644 dat/Bar-loca.lua create mode 100644 dat/Bar-strt.lua delete mode 100644 dat/Barb.des create mode 100644 dat/Cav-fila.lua create mode 100644 dat/Cav-filb.lua create mode 100644 dat/Cav-goal.lua create mode 100644 dat/Cav-loca.lua create mode 100644 dat/Cav-strt.lua delete mode 100644 dat/Caveman.des create mode 100644 dat/Hea-fila.lua create mode 100644 dat/Hea-filb.lua create mode 100644 dat/Hea-goal.lua create mode 100644 dat/Hea-loca.lua create mode 100644 dat/Hea-strt.lua delete mode 100644 dat/Healer.des create mode 100644 dat/Kni-fila.lua create mode 100644 dat/Kni-filb.lua create mode 100644 dat/Kni-goal.lua create mode 100644 dat/Kni-loca.lua create mode 100644 dat/Kni-strt.lua delete mode 100644 dat/Knight.des create mode 100644 dat/Mon-fila.lua create mode 100644 dat/Mon-filb.lua create mode 100644 dat/Mon-goal.lua create mode 100644 dat/Mon-loca.lua create mode 100644 dat/Mon-strt.lua delete mode 100644 dat/Monk.des create mode 100644 dat/Pri-fila.lua create mode 100644 dat/Pri-filb.lua create mode 100644 dat/Pri-goal.lua create mode 100644 dat/Pri-loca.lua create mode 100644 dat/Pri-strt.lua delete mode 100644 dat/Priest.des create mode 100644 dat/Ran-fila.lua create mode 100644 dat/Ran-filb.lua create mode 100644 dat/Ran-goal.lua create mode 100644 dat/Ran-loca.lua create mode 100644 dat/Ran-strt.lua delete mode 100644 dat/Ranger.des create mode 100644 dat/Rog-fila.lua create mode 100644 dat/Rog-filb.lua create mode 100644 dat/Rog-goal.lua create mode 100644 dat/Rog-loca.lua create mode 100644 dat/Rog-strt.lua delete mode 100644 dat/Rogue.des create mode 100644 dat/Sam-fila.lua create mode 100644 dat/Sam-filb.lua create mode 100644 dat/Sam-goal.lua create mode 100644 dat/Sam-loca.lua create mode 100644 dat/Sam-strt.lua delete mode 100644 dat/Samurai.des create mode 100644 dat/Tou-fila.lua create mode 100644 dat/Tou-filb.lua create mode 100644 dat/Tou-goal.lua create mode 100644 dat/Tou-loca.lua create mode 100644 dat/Tou-strt.lua delete mode 100644 dat/Tourist.des create mode 100644 dat/Val-fila.lua create mode 100644 dat/Val-filb.lua create mode 100644 dat/Val-goal.lua create mode 100644 dat/Val-loca.lua create mode 100644 dat/Val-strt.lua delete mode 100644 dat/Valkyrie.des create mode 100644 dat/Wiz-fila.lua create mode 100644 dat/Wiz-filb.lua create mode 100644 dat/Wiz-goal.lua create mode 100644 dat/Wiz-loca.lua create mode 100644 dat/Wiz-strt.lua delete mode 100644 dat/Wizard.des create mode 100644 dat/air.lua create mode 100644 dat/asmodeus.lua create mode 100644 dat/astral.lua create mode 100644 dat/baalz.lua create mode 100644 dat/bigrm-1.lua create mode 100644 dat/bigrm-10.lua create mode 100644 dat/bigrm-11.lua create mode 100644 dat/bigrm-12.lua create mode 100644 dat/bigrm-13.lua create mode 100644 dat/bigrm-2.lua create mode 100644 dat/bigrm-3.lua create mode 100644 dat/bigrm-4.lua create mode 100644 dat/bigrm-5.lua create mode 100644 dat/bigrm-6.lua create mode 100644 dat/bigrm-7.lua create mode 100644 dat/bigrm-8.lua create mode 100644 dat/bigrm-9.lua delete mode 100644 dat/bigroom.des delete mode 100644 dat/castle.des create mode 100644 dat/castle.lua delete mode 100644 dat/dungeon.def create mode 100644 dat/dungeon.lua create mode 100644 dat/earth.lua delete mode 100644 dat/endgame.des create mode 100644 dat/fakewiz1.lua create mode 100644 dat/fakewiz2.lua create mode 100644 dat/fire.lua delete mode 100644 dat/gehennom.des create mode 100644 dat/hellfill.lua create mode 100644 dat/juiblex.lua delete mode 100644 dat/knox.des create mode 100644 dat/knox.lua create mode 100644 dat/luahelper create mode 100644 dat/medusa-1.lua create mode 100644 dat/medusa-2.lua create mode 100644 dat/medusa-3.lua create mode 100644 dat/medusa-4.lua delete mode 100644 dat/medusa.des create mode 100644 dat/minefill.lua create mode 100644 dat/minend-1.lua create mode 100644 dat/minend-2.lua create mode 100644 dat/minend-3.lua delete mode 100644 dat/mines.des create mode 100644 dat/minetn-1.lua create mode 100644 dat/minetn-2.lua create mode 100644 dat/minetn-3.lua create mode 100644 dat/minetn-4.lua create mode 100644 dat/minetn-5.lua create mode 100644 dat/minetn-6.lua create mode 100644 dat/minetn-7.lua create mode 100644 dat/nhcore.lua create mode 100644 dat/nhlib.lua create mode 100644 dat/optmenu delete mode 100644 dat/oracle.des create mode 100644 dat/oracle.lua create mode 100644 dat/orcus.lua create mode 100644 dat/quest.lua delete mode 100644 dat/quest.txt create mode 100644 dat/sanctum.lua create mode 100644 dat/soko1-1.lua create mode 100644 dat/soko1-2.lua create mode 100644 dat/soko2-1.lua create mode 100644 dat/soko2-2.lua create mode 100644 dat/soko3-1.lua create mode 100644 dat/soko3-2.lua create mode 100644 dat/soko4-1.lua create mode 100644 dat/soko4-2.lua delete mode 100644 dat/sokoban.des create mode 100644 dat/themerms.lua delete mode 100644 dat/tower.des create mode 100644 dat/tower1.lua create mode 100644 dat/tower2.lua create mode 100644 dat/tower3.lua create mode 100644 dat/tut-1.lua create mode 100644 dat/tut-2.lua create mode 100644 dat/usagehlp create mode 100644 dat/valley.lua create mode 100644 dat/water.lua create mode 100644 dat/wizard1.lua create mode 100644 dat/wizard2.lua create mode 100644 dat/wizard3.lua delete mode 100644 dat/yendor.des diff --git a/dat/Arc-fila.lua b/dat/Arc-fila.lua new file mode 100644 index 000000000..1a869dd0f --- /dev/null +++ b/dat/Arc-fila.lua @@ -0,0 +1,59 @@ +-- NetHack Archeologist Arc-fila.lua $NHDT-Date: 1652195998 2022/05/10 15:19:58 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster("S") + end +}); + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster("S") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster("S") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.monster("S") + des.monster("human mummy") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster("S") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.monster("S") + end +}) + +des.random_corridors() diff --git a/dat/Arc-filb.lua b/dat/Arc-filb.lua new file mode 100644 index 000000000..a5334874b --- /dev/null +++ b/dat/Arc-filb.lua @@ -0,0 +1,59 @@ +-- NetHack Archeologist Arc-filb.lua $NHDT-Date: 1652195998 2022/05/10 15:19:58 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster("M") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster("M") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster("M") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.monster("S") + des.monster("human mummy") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster("S") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.monster("S") + end +}) + +des.random_corridors() diff --git a/dat/Arc-goal.lua b/dat/Arc-goal.lua new file mode 100644 index 000000000..0561d1a85 --- /dev/null +++ b/dat/Arc-goal.lua @@ -0,0 +1,115 @@ +-- NetHack Archeologist Arc-goal.lua $NHDT-Date: 1652195998 2022/05/10 15:19:58 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ + + --------- + |..|.|..| + -----------|..S.S..|----------- + |.|........|+-|.|-+|........|.| + |.S........S..|.|..S........S.| + |.|........|..|.|..|........|.| + ------------------+------------------ + |..|..........|.......|..........|..| + |..|..........+.......|..........S..| + |..S..........|.......+..........|..| + |..|..........|.......|..........|..| + ------------------+------------------ + |.|........|..|.|..|........|.| + |.S........S..|.|..S........S.| + |.|........|+-|.|-+|........|.| + -----------|..S.S..|----------- + |..|.|..| + --------- + +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region(selection.area(35,02,36,03), "unlit") +des.region(selection.area(40,02,41,03), "unlit") +des.region(selection.area(24,04,24,06), "unlit") +des.region(selection.area(26,04,33,06), "lit") +des.region(selection.area(38,02,38,06), "unlit") +des.region(selection.area(43,04,50,06), "lit") +des.region(selection.area(52,04,52,06), "unlit") +des.region(selection.area(35,05,36,06), "unlit") +des.region(selection.area(40,05,41,06), "unlit") +des.region(selection.area(21,08,22,11), "unlit") +des.region(selection.area(24,08,33,11), "lit") +des.region(selection.area(35,08,41,11), "unlit") +des.region(selection.area(43,08,52,11), "lit") +des.region(selection.area(54,08,55,11), "unlit") +des.region(selection.area(24,13,24,15), "unlit") +des.region(selection.area(26,13,33,15), "unlit") +des.region(selection.area(35,13,36,14), "unlit") +des.region(selection.area(35,16,36,17), "unlit") +des.region(selection.area(38,13,38,17), "unlit") +des.region(selection.area(40,13,41,14), "unlit") +des.region(selection.area(40,16,41,17), "unlit") +des.region({ region={43,13, 50,15}, lit=0, type="temple", filled=2 }) +des.region(selection.area(52,13,52,15), "unlit") +-- Stairs +des.stair("up", 38,10) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- The altar of Huhetotl. Unattended. +des.altar({ x=50,y=14,align="chaos",type="altar" }) +-- Objects +des.object({ id = "crystal ball", x=50, y=14,buc="blessed",spe=5,name="The Orb of Detection" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap("rolling boulder",46,14) +-- Random monsters. +des.monster("Minion of Huhetotl", 50, 14) +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("M") diff --git a/dat/Arc-loca.lua b/dat/Arc-loca.lua new file mode 100644 index 000000000..ec08e9849 --- /dev/null +++ b/dat/Arc-loca.lua @@ -0,0 +1,145 @@ +-- NetHack Archeologist Arc-loca.lua $NHDT-Date: 1652195999 2022/05/10 15:19:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") + +des.map([[ +............................................................................ +............................................................................ +............................................................................ +........................-------------------------------..................... +........................|....|.S......................|..................... +........................|....|.|.|+------------------.|..................... +........................|....|.|.|.|.........|......|.|..................... +........................|....|.|.|.|.........|......|.|..................... +........................|---+-.|.|.|..---....+......|.|..................... +........................|....|.|.|.---|.|....|......|.|..................... +........................|....S.|.|.+..S.|--S-----S--|.|..................... +........................|....|.|.|.---|.|....|......+.|..................... +........................|---+-.|.|.|..---....|.------.|..................... +........................|....|.|.|.|.........|.|....+.|..................... +........................|....|.|.|.|.........|+|....|-|..................... +........................|....|.|.|------------+------.S..................... +........................|....|.S......................|..................... +........................-------------------------------..................... +............................................................................ +............................................................................ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region({ region={25,04, 28,07}, lit=1, type="temple", filled=2 }) +des.region({ region={25,09, 28,11}, lit=0, type="temple", filled=2 }) +des.region({ region={25,13, 28,16}, lit=1, type="temple", filled=2 }) +des.region(selection.area(30,04,30,16), "lit") +des.region(selection.area(32,04,32,16), "unlit") +des.region({ region={33,04, 53,04}, lit=0, type="ordinary", irregular=1 }) +des.region(selection.area(36,10,37,10), "unlit") +des.region(selection.area(39,09,39,11), "unlit") +des.region({ region={36,06, 42,08}, lit=0, type="ordinary", irregular=1 }) +des.region({ region={36,12, 42,14}, lit=0, type="ordinary", irregular=1 }) +des.region(selection.area(46,06,51,09), "unlit") +des.region({ region={46,11, 49,11}, lit=0, type="ordinary", irregular=1 }) +des.region(selection.area(48,13,51,14), "unlit") +-- Doors +des.door("closed",31,04) +des.door("closed",28,08) +des.door("locked",29,10) +des.door("closed",28,12) +des.door("closed",31,16) +des.door("locked",34,05) +des.door("locked",35,10) +des.door("locked",38,10) +des.door("closed",43,10) +des.door("closed",45,08) +des.door("locked",46,14) +des.door("locked",46,15) +des.door("locked",49,10) +des.door("locked",52,11) +des.door("closed",52,13) +des.door("closed",54,15) +-- Stairs +des.stair("up", 03,17) +des.stair("down", 39,10) +-- Altars - three types. All are unattended. +des.altar({ x=26,y=05,align=align[1], type="altar" }) +des.altar({ x=26,y=10,align=align[2], type="altar" }) +des.altar({ x=26,y=15,align=align[3], type="altar" }) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Treasure? +des.engraving({ type="engrave", text="X marks the spot." }) +des.engraving({ type="engrave", text="X marks the spot." }) +des.engraving({ type="engrave", text="X marks the spot." }) +des.engraving({ type="engrave", text="X marks the spot." }) +-- Random traps +des.trap("spiked pit",24,02) +des.trap("spiked pit",37,00) +des.trap("spiked pit",23,05) +des.trap("spiked pit",26,19) +des.trap("spiked pit",55,10) +des.trap("spiked pit",55,08) +des.trap("pit",51,01) +des.trap("pit",23,18) +des.trap("pit",31,18) +des.trap("pit",48,19) +des.trap("pit",55,15) +des.trap("magic",60,04) +des.trap("statue",72,07) +des.trap("statue") +des.trap("statue") +des.trap("anti magic",64,12) +des.trap("sleep gas") +des.trap("sleep gas") +des.trap("dart") +des.trap("dart") +des.trap("dart") +des.trap("rolling boulder",32,10) +des.trap("rolling boulder",40,16) +-- Random monsters. +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("S") +des.monster("M") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("human mummy") +des.monster("M") diff --git a/dat/Arc-strt.lua b/dat/Arc-strt.lua new file mode 100644 index 000000000..cad40375b --- /dev/null +++ b/dat/Arc-strt.lua @@ -0,0 +1,116 @@ +-- NetHack Archeologist Arc-strt.lua $NHDT-Date: 1652195999 2022/05/10 15:19:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Lord Carnarvon +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +............................................................................ +............................................................................ +............................................................................ +............................................................................ +....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................. +....................}-------------------------------------}................. +....................}|..S......+.................+.......|}................. +....................}-S---------------+----------|.......|}................. +....................}|.|...............|.......+.|.......|}................. +....................}|.|...............---------.---------}................. +....................}|.S.\.............+.................+.................. +....................}|.|...............---------.---------}................. +....................}|.|...............|.......+.|.......|}................. +....................}-S---------------+----------|.......|}................. +....................}|..S......+.................+.......|}................. +....................}-------------------------------------}................. +....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................. +............................................................................ +............................................................................ +............................................................................ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region(selection.area(22,06,23,06), "unlit") +des.region(selection.area(25,06,30,06), "unlit") +des.region(selection.area(32,06,48,06), "unlit") +des.region(selection.area(50,06,56,08), "lit") +des.region(selection.area(40,08,46,08), "unlit") +des.region(selection.area(22,08,22,12), "unlit") +des.region(selection.area(24,08,38,12), "unlit") +des.region(selection.area(48,08,48,08), "lit") +des.region(selection.area(40,10,56,10), "lit") +des.region(selection.area(48,12,48,12), "lit") +des.region(selection.area(40,12,46,12), "unlit") +des.region(selection.area(50,12,56,14), "lit") +des.region(selection.area(22,14,23,14), "unlit") +des.region(selection.area(25,14,30,14), "unlit") +des.region(selection.area(32,14,48,14), "unlit") +-- Stairs +des.stair("down", 55,07) +-- Portal arrival point +des.levregion({ region = {63,06,63,06}, type="branch" }) +-- Doors +des.door("closed",22,07) +des.door("closed",38,07) +des.door("locked",47,08) +des.door("locked",23,10) +des.door("locked",39,10) +des.door("locked",57,10) +des.door("locked",47,12) +des.door("closed",22,13) +des.door("closed",38,13) +des.door("locked",24,14) +des.door("closed",31,14) +des.door("locked",49,14) +-- Lord Carnarvon +des.monster({ id = "Lord Carnarvon", coord = {25, 10}, inventory = function() + des.object({ id = "fedora", spe = 5 }); + des.object({ id = "bullwhip", spe = 4 }); +end }) +-- The treasure of Lord Carnarvon +des.object("chest", 25, 10) +-- student guards for the audience chamber +des.monster("student", 26, 09) +des.monster("student", 27, 09) +des.monster("student", 28, 09) +des.monster("student", 26, 10) +des.monster("student", 28, 10) +des.monster("student", 26, 11) +des.monster("student", 27, 11) +des.monster("student", 28, 11) +-- city watch guards in the antechambers +des.monster("watchman", 50, 06) +des.monster("watchman", 50, 14) +-- Eels in the moat +des.monster("giant eel", 20, 10) +des.monster("giant eel", 45, 04) +des.monster("giant eel", 33, 16) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +des.monster("S", 60, 09) +des.monster("M", 60, 10) +des.monster("S", 60, 11) +des.monster("S", 60, 12) +des.monster("M", 60, 13) +des.monster("S", 61, 10) +des.monster("S", 61, 11) +des.monster("S", 61, 12) +des.monster("S", 30, 03) +des.monster("M", 20, 17) +des.monster("S", 67, 02) +des.monster("S", 10, 19) diff --git a/dat/Arch.des b/dat/Arch.des deleted file mode 100644 index 9335f7d2f..000000000 --- a/dat/Arch.des +++ /dev/null @@ -1,472 +0,0 @@ -# NetHack 3.6 Arch.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Lord Carnarvon -# and receive your quest assignment. -# -MAZE: "Arc-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -............................................................................ -............................................................................ -............................................................................ -............................................................................ -....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................. -....................}-------------------------------------}................. -....................}|..S......+.................+.......|}................. -....................}-S---------------+----------|.......|}................. -....................}|.|...............|.......+.|.......|}................. -....................}|.|...............---------.---------}................. -....................}|.S.\.............+.................+.................. -....................}|.|...............---------.---------}................. -....................}|.|...............|.......+.|.......|}................. -....................}-S---------------+----------|.......|}................. -....................}|..S......+.................+.......|}................. -....................}-------------------------------------}................. -....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................. -............................................................................ -............................................................................ -............................................................................ -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION: (22,06,23,06),unlit,"ordinary" -REGION: (25,06,30,06),unlit,"ordinary" -REGION: (32,06,48,06),unlit,"ordinary" -REGION: (50,06,56,08),lit,"ordinary" -REGION: (40,08,46,08),unlit,"ordinary" -REGION: (22,08,22,12),unlit,"ordinary" -REGION: (24,08,38,12),unlit,"ordinary" -REGION: (48,08,48,08),lit,"ordinary" -REGION: (40,10,56,10),lit,"ordinary" -REGION: (48,12,48,12),lit,"ordinary" -REGION: (40,12,46,12),unlit,"ordinary" -REGION: (50,12,56,14),lit,"ordinary" -REGION: (22,14,23,14),unlit,"ordinary" -REGION: (25,14,30,14),unlit,"ordinary" -REGION: (32,14,48,14),unlit,"ordinary" -# Stairs -STAIR:(55,07),down -# Portal arrival point -BRANCH:(63,06,63,06),(0,0,0,0) -# Doors -DOOR:closed,(22,07) -DOOR:closed,(38,07) -DOOR:locked,(47,08) -DOOR:locked,(23,10) -DOOR:locked,(39,10) -DOOR:locked,(57,10) -DOOR:locked,(47,12) -DOOR:closed,(22,13) -DOOR:closed,(38,13) -DOOR:locked,(24,14) -DOOR:closed,(31,14) -DOOR:locked,(49,14) -# Lord Carnarvon -MONSTER:('@',"Lord Carnarvon"),(25,10) -# The treasure of Lord Carnarvon -OBJECT:('(',"chest"),(25,10) -# student guards for the audience chamber -MONSTER:('@',"student"),(26,09) -MONSTER:('@',"student"),(27,09) -MONSTER:('@',"student"),(28,09) -MONSTER:('@',"student"),(26,10) -MONSTER:('@',"student"),(28,10) -MONSTER:('@',"student"),(26,11) -MONSTER:('@',"student"),(27,11) -MONSTER:('@',"student"),(28,11) -# city watch guards in the antechambers -MONSTER:('@',"watchman"),(50,06) -MONSTER:('@',"watchman"),(50,14) -# Eels in the moat -MONSTER:(';',"giant eel"),(20,10) -MONSTER:(';',"giant eel"),(45,04) -MONSTER:(';',"giant eel"),(33,16) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: 'S',(60,09) -MONSTER: 'M',(60,10) -MONSTER: 'S',(60,11) -MONSTER: 'S',(60,12) -MONSTER: 'M',(60,13) -MONSTER: 'S',(61,10) -MONSTER: 'S',(61,11) -MONSTER: 'S',(61,12) -MONSTER: 'S',(30,03) -MONSTER: 'M',(20,17) -MONSTER: 'S',(67,02) -MONSTER: 'S',(10,19) - -# -# The "locate" level for the quest. -# -# Here you have to find the Entrance to the Tomb of the Toltec Kings -# to go further towards your assigned quest. -# - -MAZE: "Arc-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -MAP -............................................................................ -............................................................................ -............................................................................ -........................-------------------------------..................... -........................|....|.S......................|..................... -........................|....|.|.|+------------------.|..................... -........................|....|.|.|.|.........|......|.|..................... -........................|....|.|.|.|.........|......|.|..................... -........................|---+-.|.|.|..---....+......|.|..................... -........................|....|.|.|.---|.|....|......|.|..................... -........................|....S.|.|.+..S.|--S-----S--|.|..................... -........................|....|.|.|.---|.|....|......+.|..................... -........................|---+-.|.|.|..---....|.------.|..................... -........................|....|.|.|.|.........|.|....+.|..................... -........................|....|.|.|.|.........|+|....|-|..................... -........................|....|.|.|------------+------.S..................... -........................|....|.S......................|..................... -........................-------------------------------..................... -............................................................................ -............................................................................ -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(25,04,28,07),lit,"temple" -REGION:(25,09,28,11),unlit,"temple" -REGION:(25,13,28,16),lit,"temple" -REGION:(30,04,30,16),lit,"ordinary" -REGION:(32,04,32,16),unlit,"ordinary" -REGION:(33,04,53,04),unlit,"ordinary",unfilled,irregular -REGION:(36,10,37,10),unlit,"ordinary" -REGION:(39,09,39,11),unlit,"ordinary" -REGION:(36,06,42,08),unlit,"ordinary",unfilled,irregular -REGION:(36,12,42,14),unlit,"ordinary",unfilled,irregular -REGION:(46,06,51,09),unlit,"ordinary" -REGION:(46,11,49,11),unlit,"ordinary",unfilled,irregular -REGION:(48,13,51,14),unlit,"ordinary" -# Doors -DOOR:closed,(31,04) -DOOR:closed,(28,08) -DOOR:locked,(29,10) -DOOR:closed,(28,12) -DOOR:closed,(31,16) -DOOR:locked,(34,05) -DOOR:locked,(35,10) -DOOR:locked,(38,10) -DOOR:closed,(43,10) -DOOR:closed,(45,08) -DOOR:locked,(46,14) -DOOR:locked,(46,15) -DOOR:locked,(49,10) -DOOR:locked,(52,11) -DOOR:closed,(52,13) -DOOR:closed,(54,15) -# Stairs -STAIR:(03,17),up -STAIR:(39,10),down -# Altars - three types. All are unattended. -ALTAR:(26,05),align[0],altar -ALTAR:(26,10),align[1],altar -ALTAR:(26,15),align[2],altar -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Treasure? -ENGRAVING:random,engrave,"X marks the spot." -ENGRAVING:random,engrave,"X marks the spot." -ENGRAVING:random,engrave,"X marks the spot." -ENGRAVING:random,engrave,"X marks the spot." -# Random traps -TRAP:"spiked pit",(24,02) -TRAP:"spiked pit",(37,00) -TRAP:"spiked pit",(23,05) -TRAP:"spiked pit",(26,19) -TRAP:"spiked pit",(55,10) -TRAP:"spiked pit",(55,08) -TRAP:"pit",(51,01) -TRAP:"pit",(23,18) -TRAP:"pit",(31,18) -TRAP:"pit",(48,19) -TRAP:"pit",(55,15) -TRAP:"magic",(60,04) -TRAP:"statue",(72,07) -TRAP:"statue",random -TRAP:"statue",random -TRAP:"anti magic",(64,12) -TRAP:"sleep gas",random -TRAP:"sleep gas",random -TRAP:"dart",random -TRAP:"dart",random -TRAP:"dart",random -TRAP:"rolling boulder",(32,10) -TRAP:"rolling boulder",(40,16) -# Random monsters. -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'M',random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:'M',random - -# -# The "goal" level for the quest. -# -# Here you meet Minion of Huhetotl your nemesis monster. You have to -# defeat Minion of Huhetotl in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Arc-goal", ' ' -GEOMETRY:center,center -MAP - - --------- - |..|.|..| - -----------|..S.S..|----------- - |.|........|+-|.|-+|........|.| - |.S........S..|.|..S........S.| - |.|........|..|.|..|........|.| - ------------------+------------------ - |..|..........|.......|..........|..| - |..|..........+.......|..........S..| - |..S..........|.......+..........|..| - |..|..........|.......|..........|..| - ------------------+------------------ - |.|........|..|.|..|........|.| - |.S........S..|.|..S........S.| - |.|........|+-|.|-+|........|.| - -----------|..S.S..|----------- - |..|.|..| - --------- - -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(35,02,36,03),unlit,"ordinary" -REGION:(40,02,41,03),unlit,"ordinary" -REGION:(24,04,24,06),unlit,"ordinary" -REGION:(26,04,33,06),lit,"ordinary" -REGION:(38,02,38,06),unlit,"ordinary" -REGION:(43,04,50,06),lit,"ordinary" -REGION:(52,04,52,06),unlit,"ordinary" -REGION:(35,05,36,06),unlit,"ordinary" -REGION:(40,05,41,06),unlit,"ordinary" -REGION:(21,08,22,11),unlit,"ordinary" -REGION:(24,08,33,11),lit,"ordinary" -REGION:(35,08,41,11),unlit,"ordinary" -REGION:(43,08,52,11),lit,"ordinary" -REGION:(54,08,55,11),unlit,"ordinary" -REGION:(24,13,24,15),unlit,"ordinary" -REGION:(26,13,33,15),unlit,"ordinary" -REGION:(35,13,36,14),unlit,"ordinary" -REGION:(35,16,36,17),unlit,"ordinary" -REGION:(38,13,38,17),unlit,"ordinary" -REGION:(40,13,41,14),unlit,"ordinary" -REGION:(40,16,41,17),unlit,"ordinary" -REGION:(43,13,50,15),unlit,"temple" -REGION:(52,13,52,15),unlit,"ordinary" -# Stairs -STAIR:(38,10),up -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# The altar of Huhetotl. Unattended. -ALTAR:(50,14),chaos,altar -# Objects -OBJECT:('(',"crystal ball"),(50,14),blessed,5,name:"The Orb of Detection" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:"rolling boulder",(46,14) -# Random monsters. -MONSTER:('&',"Minion of Huhetotl"),(50,14) -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:'S',random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:('M',"human mummy"),random -MONSTER:'M',random - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -LEVEL: "Arc-fila" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: 'S', random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: 'S', random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: 'S', random -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: 'S', random - MONSTER: ('M', "human mummy"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: 'S', random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: 'S', random -} - -RANDOM_CORRIDORS - -LEVEL: "Arc-filb" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: 'M', random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: 'M', random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: 'M', random -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: 'S', random - MONSTER: ('M', "human mummy"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: 'S', random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: 'S', random -} - -RANDOM_CORRIDORS diff --git a/dat/Bar-fila.lua b/dat/Bar-fila.lua new file mode 100644 index 000000000..64ea97e54 --- /dev/null +++ b/dat/Bar-fila.lua @@ -0,0 +1,33 @@ +-- NetHack Barbarian Bar-fila.lua $NHDT-Date: 1652195999 2022/05/10 15:19:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg=".", smoothed=true, joined=true, lit=0, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ class = "O", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) diff --git a/dat/Bar-filb.lua b/dat/Bar-filb.lua new file mode 100644 index 000000000..9764c3128 --- /dev/null +++ b/dat/Bar-filb.lua @@ -0,0 +1,44 @@ +-- NetHack Barbarian Bar-filb.lua $NHDT-Date: 1652196000 2022/05/10 15:20:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, lit=0, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ class = "O", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ class = "T", peaceful=0 }) diff --git a/dat/Bar-goal.lua b/dat/Bar-goal.lua new file mode 100644 index 000000000..760f36ad9 --- /dev/null +++ b/dat/Bar-goal.lua @@ -0,0 +1,95 @@ +-- NetHack Barbarian Bar-goal.lua $NHDT-Date: 1652196000 2022/05/10 15:20:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ + + ............. + .................. + .... ......................... .... + ....... .......................... ....... + ...... ........................ ....... + .. ...................................... .. + .. ..................... .. + .. .................. .. + .. ..S...S.............. ................ + .. ........ ... + ......... .. + ...... .. ... .... + .. ... .. ...... ........ + .... .. .................. ........ ...... + ...... ...................... ...... .. + .... .................. ........... + .............. + ........... + +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "unlit") +-- Secret doors +des.door("locked",22,09) +des.door("locked",26,09) +-- Stairs +des.stair("up", 36,05) +-- The altar. Unattended. +des.altar({ x=63,y=04,align="noncoaligned", type="altar" }) +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object({ id = "luckstone", x=63, y=04,buc="blessed",spe=0,name="The Heart of Ahriman" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "Thoth Amon", x=63, y=04, peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ class = "O", peaceful=0 }) +des.monster({ class = "O", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ class = "T", peaceful=0 }) +des.wallify() + diff --git a/dat/Bar-loca.lua b/dat/Bar-loca.lua new file mode 100644 index 000000000..a11a896e5 --- /dev/null +++ b/dat/Bar-loca.lua @@ -0,0 +1,107 @@ +-- NetHack Barbarian Bar-loca.lua $NHDT-Date: 1652196000 2022/05/10 15:20:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") + +des.map([[ +..........PPP......................................... +...........PP.......................................... ....... +..........PP...........-----..........------------------ .......... +...........PP..........+...|..........|....S...........|.. ............ +..........PPP..........|...|..........|-----...........|... ............. +...........PPP.........-----..........+....+...........|... ............. +..........PPPPPPPPP...................+....+...........S................. +........PPPPPPPPPPPPP.........-----...|-----...........|................ +......PPPPPPPPPPPPPP..P.......+...|...|....S...........| ... +.....PPPPPPP......P..PPPP.....|...|...------------------.. ... +....PPPPPPP.........PPPPPP....-----........................ ........ +...PPPPPPP..........PPPPPPP.................................. .......... +....PPPPPPP........PPPPPPP.................................... .......... +.....PPPPP........PPPPPPP.........-----........................ ........ +......PPP..PPPPPPPPPPPP...........+...|......................... ..... +..........PPPPPPPPPPP.............|...|......................... .... +..........PPPPPPPPP...............-----......................... . +..............PPP................................................. +...............PP.................................................... +................PPP................................................... +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region(selection.area(24,03,26,04), "unlit") +des.region(selection.area(31,08,33,09), "unlit") +des.region(selection.area(35,14,37,15), "unlit") +des.region(selection.area(39,03,54,08), "lit") +des.region(selection.area(56,00,75,08), "unlit") +des.region(selection.area(64,09,75,16), "unlit") +-- Doors +des.door("open",23,03) +des.door("open",30,08) +des.door("open",34,14) +des.door("locked",38,05) +des.door("locked",38,06) +des.door("closed",43,03) +des.door("closed",43,05) +des.door("closed",43,06) +des.door("closed",43,08) +des.door("locked",55,06) +-- Stairs +des.stair("up", 05,02) +des.stair("down", 70,13) +-- Objects +des.object({ x = 42, y = 03 }) +des.object({ x = 42, y = 03 }) +des.object({ x = 42, y = 03 }) +des.object({ x = 41, y = 03 }) +des.object({ x = 41, y = 03 }) +des.object({ x = 41, y = 03 }) +des.object({ x = 41, y = 03 }) +des.object({ x = 41, y = 08 }) +des.object({ x = 41, y = 08 }) +des.object({ x = 42, y = 08 }) +des.object({ x = 42, y = 08 }) +des.object({ x = 42, y = 08 }) +des.object({ x = 71, y = 13 }) +des.object({ x = 71, y = 13 }) +des.object({ x = 71, y = 13 }) +-- Random traps +des.trap("spiked pit",10,13) +des.trap("spiked pit",21,07) +des.trap("spiked pit",67,08) +des.trap("spiked pit",68,09) +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "ogre", x=12, y=09, peaceful=0 }) +des.monster({ id = "ogre", x=18, y=11, peaceful=0 }) +des.monster({ id = "ogre", x=45, y=05, peaceful=0 }) +des.monster({ id = "ogre", x=45, y=06, peaceful=0 }) +des.monster({ id = "ogre", x=47, y=05, peaceful=0 }) +des.monster({ id = "ogre", x=46, y=05, peaceful=0 }) +des.monster({ id = "ogre", x=56, y=03, peaceful=0 }) +des.monster({ id = "ogre", x=56, y=04, peaceful=0 }) +des.monster({ id = "ogre", x=56, y=05, peaceful=0 }) +des.monster({ id = "ogre", x=56, y=06, peaceful=0 }) +des.monster({ id = "ogre", x=57, y=03, peaceful=0 }) +des.monster({ id = "ogre", x=57, y=04, peaceful=0 }) +des.monster({ id = "ogre", x=57, y=05, peaceful=0 }) +des.monster({ id = "ogre", x=57, y=06, peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ id = "ogre", peaceful=0 }) +des.monster({ class = "O", peaceful=0 }) +des.monster({ class = "T", peaceful=0 }) +des.monster({ id = "rock troll", x=46, y=06, peaceful=0 }) +des.monster({ id = "rock troll", x=47, y=06, peaceful=0 }) +des.monster({ id = "rock troll", x=56, y=07, peaceful=0 }) +des.monster({ id = "rock troll", x=57, y=07, peaceful=0 }) +des.monster({ id = "rock troll", x=70, y=13, peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ id = "rock troll", peaceful=0 }) +des.monster({ class = "T", peaceful=0 }) + diff --git a/dat/Bar-strt.lua b/dat/Bar-strt.lua new file mode 100644 index 000000000..28cacf028 --- /dev/null +++ b/dat/Bar-strt.lua @@ -0,0 +1,99 @@ +-- NetHack Barbarian Bar-strt.lua $NHDT-Date: 1652196001 2022/05/10 15:20:01 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Pelias, +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +..................................PP........................................ +...................................PP....................................... +...................................PP....................................... +....................................PP...................................... +........--------------......-----....PPP.................................... +........|...S........|......+...|...PPP..................................... +........|----........|......|...|....PP..................................... +........|.\..........+......-----........................................... +........|----........|...............PP..................................... +........|...S........|...-----.......PPP.................................... +........--------------...+...|......PPPPP................................... +.........................|...|.......PPP.................................... +...-----......-----......-----........PP.................................... +...|...+......|...+..--+--.............PP................................... +...|...|......|...|..|...|..............PP.................................. +...-----......-----..|...|.............PPPP................................. +.....................-----............PP..PP................................ +.....................................PP...PP................................ +....................................PP...PP................................. +....................................PP....PP................................ +]]); + +-- the forest beyond the river +des.replace_terrain({ region={37,00, 59,19}, fromterrain=".", toterrain="T", chance=5 }) +des.replace_terrain({ region={60,00, 64,19}, fromterrain=".", toterrain="T", chance=10 }) +des.replace_terrain({ region={65,00, 75,19}, fromterrain=".", toterrain="T", chance=20 }) +-- guarantee a path and free spot for the portal +des.terrain(selection.randline(selection.new(), 37,7, 62,02, 7), ".") +des.terrain({62,02}, ".") + +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region(selection.area(09,05,11,05), "unlit") +des.region(selection.area(09,07,11,07), "lit") +des.region(selection.area(09,09,11,09), "unlit") +des.region(selection.area(13,05,20,09), "lit") +des.region(selection.area(29,05,31,06), "lit") +des.region(selection.area(26,10,28,11), "lit") +des.region(selection.area(04,13,06,14), "lit") +des.region(selection.area(15,13,17,14), "lit") +des.region(selection.area(22,14,24,15), "lit") +-- Stairs +des.stair("down", 09,09) +-- Portal arrival point +des.levregion({ region = {62,02,62,02}, type="branch" }) +-- Doors +des.door("locked",12,05) +des.door("locked",12,09) +des.door("closed",21,07) +des.door("open",07,13) +des.door("open",18,13) +des.door("open",23,13) +des.door("open",25,10) +des.door("open",28,05) +-- Elder +des.monster({ id = "Pelias", coord = {10, 07}, inventory = function() + des.object({ id = "runesword", spe = 5 }); + des.object({ id = "chain mail", spe = 5 }); +end }) +-- The treasure of Pelias +des.object("chest", 09, 05) +-- chieftain guards for the audience chamber +des.monster("chieftain", 10, 05) +des.monster("chieftain", 10, 09) +des.monster("chieftain", 11, 05) +des.monster("chieftain", 11, 09) +des.monster("chieftain", 14, 05) +des.monster("chieftain", 14, 09) +des.monster("chieftain", 16, 05) +des.monster("chieftain", 16, 09) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- One trap to keep the ogres at bay. +des.trap("spiked pit",37,07) +-- Eels in the river +des.monster("giant eel", 36, 01) +des.monster("giant eel", 37, 09) +des.monster("giant eel", 39, 15) +-- Monsters on siege duty. +local ogrelocs = selection.floodfill(37,7) & selection.area(40,03, 45,20) +for i = 0, 11 do + des.monster({ id = "ogre", coord = ogrelocs:rndcoord(1), peaceful = 0 }) +end diff --git a/dat/Barb.des b/dat/Barb.des deleted file mode 100644 index 0be480636..000000000 --- a/dat/Barb.des +++ /dev/null @@ -1,377 +0,0 @@ -# NetHack 3.6 Barb.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Pelias, -# and receive your quest assignment. -# -MAZE: "Bar-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -..................................PP........................................ -...................................PP....................................... -...................................PP....................................... -....................................PP...................................... -........--------------......-----....PPP.................................... -........|...S........|......+...|...PPP..................................... -........|----........|......|...|....PP..................................... -........|.\..........+......-----........................................... -........|----........|...............PP..................................... -........|...S........|...-----.......PPP.................................... -........--------------...+...|......PPPPP................................... -.........................|...|.......PPP.................................... -...-----......-----......-----........PP.................................... -...|...+......|...+..--+--.............PP................................... -...|...|......|...|..|...|..............PP.................................. -...-----......-----..|...|.............PPPP................................. -.....................-----............PP..PP................................ -.....................................PP...PP................................ -....................................PP...PP................................. -....................................PP....PP................................ -ENDMAP - -# the forest beyond the river -REPLACE_TERRAIN:(37,0,59,19),'.','T', 5% -REPLACE_TERRAIN:(60,0,64,19),'.','T', 10% -REPLACE_TERRAIN:(65,0,75,19),'.','T', 20% -# guarantee a path and free spot for the portal -TERRAIN:(randline (37,7),(62,02),7), '.' -TERRAIN:(62,02),'.' - -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(09,05,11,05),unlit,"ordinary" -REGION:(09,07,11,07),lit,"ordinary" -REGION:(09,09,11,09),unlit,"ordinary" -REGION:(13,05,20,09),lit,"ordinary" -REGION:(29,05,31,06),lit,"ordinary" -REGION:(26,10,28,11),lit,"ordinary" -REGION:(04,13,06,14),lit,"ordinary" -REGION:(15,13,17,14),lit,"ordinary" -REGION:(22,14,24,15),lit,"ordinary" -# Stairs -STAIR:(09,09),down -# Portal arrival point -BRANCH:(62,02,62,02),(0,0,0,0) -# Doors -DOOR:locked,(12,05) -DOOR:locked,(12,09) -DOOR:closed,(21,07) -DOOR:open,(07,13) -DOOR:open,(18,13) -DOOR:open,(23,13) -DOOR:open,(25,10) -DOOR:open,(28,05) -# Elder -MONSTER:('@',"Pelias"),(10,07) -# The treasure of Pelias -OBJECT:('(',"chest"),(09,05) -# chieftain guards for the audience chamber -MONSTER:('@',"chieftain"),(10,05) -MONSTER:('@',"chieftain"),(10,09) -MONSTER:('@',"chieftain"),(11,05) -MONSTER:('@',"chieftain"),(11,09) -MONSTER:('@',"chieftain"),(14,05) -MONSTER:('@',"chieftain"),(14,09) -MONSTER:('@',"chieftain"),(16,05) -MONSTER:('@',"chieftain"),(16,09) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# One trap to keep the ogres at bay. -TRAP:"spiked pit",(37,07) -# Eels in the river -MONSTER:(';',"giant eel"),(36,01) -MONSTER:(';',"giant eel"),(37,09) -MONSTER:(';',"giant eel"),(39,15) -# Monsters on siege duty. -MONSTER:('O',"ogre"),(40,08),hostile -MONSTER:('O',"ogre"),(41,06),hostile -MONSTER:('O',"ogre"),(41,07),hostile -MONSTER:('O',"ogre"),(41,08),hostile -MONSTER:('O',"ogre"),(41,09),hostile -MONSTER:('O',"ogre"),(41,10),hostile -MONSTER:('O',"ogre"),(42,06),hostile -MONSTER:('O',"ogre"),(42,07),hostile -MONSTER:('O',"ogre"),(42,08),hostile -MONSTER:('O',"ogre"),(42,09),hostile -MONSTER:('O',"ogre"),(42,10),hostile - -# -# The "locate" level for the quest. -# -# Here you have to infiltrate the Duali Oasis to go -# further towards your assigned quest. -# - -MAZE: "Bar-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -MAP -..........PPP......................................... -...........PP.......................................... ....... -..........PP...........-----..........------------------ .......... -...........PP..........+...|..........|....S...........|.. ............ -..........PPP..........|...|..........|-----...........|... ............. -...........PPP.........-----..........+....+...........|... ............. -..........PPPPPPPPP...................+....+...........S................. -........PPPPPPPPPPPPP.........-----...|-----...........|................ -......PPPPPPPPPPPPPP..P.......+...|...|....S...........| ... -.....PPPPPPP......P..PPPP.....|...|...------------------.. ... -....PPPPPPP.........PPPPPP....-----........................ ........ -...PPPPPPP..........PPPPPPP.................................. .......... -....PPPPPPP........PPPPPPP.................................... .......... -.....PPPPP........PPPPPPP.........-----........................ ........ -......PPP..PPPPPPPPPPPP...........+...|......................... ..... -..........PPPPPPPPPPP.............|...|......................... .... -..........PPPPPPPPP...............-----......................... . -..............PPP................................................. -...............PP.................................................... -................PPP................................................... -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(24,03,26,04),unlit,"ordinary" -REGION:(31,08,33,09),unlit,"ordinary" -REGION:(35,14,37,15),unlit,"ordinary" -REGION:(39,03,54,08),lit,"ordinary" -REGION:(56,00,75,08),unlit,"ordinary" -REGION:(64,09,75,16),unlit,"ordinary" -# Doors -DOOR:open,(23,03) -DOOR:open,(30,08) -DOOR:open,(34,14) -DOOR:locked,(38,05) -DOOR:locked,(38,06) -DOOR:closed,(43,03) -DOOR:closed,(43,05) -DOOR:closed,(43,06) -DOOR:closed,(43,08) -DOOR:locked,(55,06) -# Stairs -STAIR:(05,02),up -STAIR:(70,13),down -# Objects -OBJECT:random,(42,03) -OBJECT:random,(42,03) -OBJECT:random,(42,03) -OBJECT:random,(41,03) -OBJECT:random,(41,03) -OBJECT:random,(41,03) -OBJECT:random,(41,03) -OBJECT:random,(41,08) -OBJECT:random,(41,08) -OBJECT:random,(42,08) -OBJECT:random,(42,08) -OBJECT:random,(42,08) -OBJECT:random,(71,13) -OBJECT:random,(71,13) -OBJECT:random,(71,13) -# Random traps -TRAP:"spiked pit",(10,13) -TRAP:"spiked pit",(21,07) -TRAP:"spiked pit",(67,08) -TRAP:"spiked pit",(68,09) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('O',"ogre"),(12,09),hostile -MONSTER:('O',"ogre"),(18,11),hostile -MONSTER:('O',"ogre"),(45,05),hostile -MONSTER:('O',"ogre"),(45,06),hostile -MONSTER:('O',"ogre"),(47,05),hostile -MONSTER:('O',"ogre"),(46,05),hostile -MONSTER:('O',"ogre"),(56,03),hostile -MONSTER:('O',"ogre"),(56,04),hostile -MONSTER:('O',"ogre"),(56,05),hostile -MONSTER:('O',"ogre"),(56,06),hostile -MONSTER:('O',"ogre"),(57,03),hostile -MONSTER:('O',"ogre"),(57,04),hostile -MONSTER:('O',"ogre"),(57,05),hostile -MONSTER:('O',"ogre"),(57,06),hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:'O',random,hostile -MONSTER:'T',random,hostile -MONSTER:('T',"rock troll"),(46,06),hostile -MONSTER:('T',"rock troll"),(47,06),hostile -MONSTER:('T',"rock troll"),(56,07),hostile -MONSTER:('T',"rock troll"),(57,07),hostile -MONSTER:('T',"rock troll"),(70,13),hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:'T',random,hostile - -# -# The "goal" level for the quest. -# -# Here you meet Thoth Amon, your nemesis monster. You have to -# defeat Thoth Amon in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Bar-goal", ' ' -GEOMETRY:center,center -MAP - - ............. - .................. - .... ......................... .... - ....... .......................... ....... - ...... ........................ ....... - .. ...................................... .. - .. ..................... .. - .. .................. .. - .. ..S...S.............. ................ - .. ........ ... - ......... .. - ...... .. ... .... - .. ... .. ...... ........ - .... .. .................. ........ ...... - ...... ...................... ...... .. - .... .................. ........... - .............. - ........... - -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),unlit,"ordinary" -# Secret doors -DOOR:locked,(22,09) -DOOR:locked,(26,09) -# Stairs -STAIR:(36,05),up -# The altar. Unattended. -ALTAR:(63,04),noncoaligned,altar -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:('*',"luckstone"),(63,04),blessed,0,name:"The Heart of Ahriman" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"Thoth Amon"),(63,04),hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:('O',"ogre"),random,hostile -MONSTER:'O',random,hostile -MONSTER:'O',random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:('T',"rock troll"),random,hostile -MONSTER:'T',random,hostile -WALLIFY - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -MAZE: "Bar-fila" , ' ' -INIT_MAP: mines, '.' , '.' , true , true , unlit , false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: 'O', random, hostile -MONSTER: ('T', "rock troll"), random, hostile - -MAZE: "Bar-filb" , ' ' -INIT_MAP: mines, '.' , ' ' , true , true , unlit , true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: ('O', "ogre"), random, hostile -MONSTER: 'O' , random, hostile -MONSTER: ('T', "rock troll"), random, hostile -MONSTER: ('T', "rock troll"), random, hostile -MONSTER: ('T', "rock troll"), random, hostile -MONSTER: 'T' , random, hostile diff --git a/dat/Cav-fila.lua b/dat/Cav-fila.lua new file mode 100644 index 000000000..d1b0b2000 --- /dev/null +++ b/dat/Cav-fila.lua @@ -0,0 +1,35 @@ +-- NetHack Caveman Cav-fila.lua $NHDT-Date: 1652196001 2022/05/10 15:20:01 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style = "mines", fg = ".", bg = " ", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ class = "h", peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) diff --git a/dat/Cav-filb.lua b/dat/Cav-filb.lua new file mode 100644 index 000000000..a18fed77c --- /dev/null +++ b/dat/Cav-filb.lua @@ -0,0 +1,41 @@ +-- NetHack Caveman Cav-filb.lua $NHDT-Date: 1652196001 2022/05/10 15:20:01 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style = "mines", fg = ".", bg = " ", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ class = "h", peaceful=0 }) +des.monster({ class = "h", peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) diff --git a/dat/Cav-goal.lua b/dat/Cav-goal.lua new file mode 100644 index 000000000..871579f9d --- /dev/null +++ b/dat/Cav-goal.lua @@ -0,0 +1,59 @@ +-- NetHack Caveman Cav-goal.lua $NHDT-Date: 1652196002 2022/05/10 15:20:02 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ + + ..................... + ....................... + ......................... + ........................... + ............................. + ............................... + ................................. + ................................... + ..................................... + ....................................... + ..................................... + ................................... + ................................. + ............................... + ............................. + ........................... + ......................... + ....................... + +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +-- Stairs +des.stair("up") +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object({ id = "mace", x=23, y=10, buc="blessed", spe=0, name="The Sceptre of Might" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- monsters. +des.monster({ id = "Chromatic Dragon", x=23, y=10, asleep=1 }) +des.monster("shrieker", 26, 13) +des.monster("shrieker", 25, 8) +des.monster("shrieker", 45, 11) +des.wallify() diff --git a/dat/Cav-loca.lua b/dat/Cav-loca.lua new file mode 100644 index 000000000..d779d601a --- /dev/null +++ b/dat/Cav-loca.lua @@ -0,0 +1,101 @@ +-- NetHack Caveman Cav-loca.lua $NHDT-Date: 1652196002 2022/05/10 15:20:02 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") + +des.map([[ + + ............. ........... + ............... ............. + ............. ............... .......... + ........... ............. ............... + ... ... .................. + ... .......... ... .................. + ... ............ BBB................... + ... .......... ...................... + ..... .. .....B........................ + .... ............... . ........B.......................... + ...... .. .............S.............. .................. + .... .. ........... ............... + .. ... .................... + .... BB................... + .. .. .. ............... + .. ....... .... ..... .... .. ....... S + ............ ....... .. ....... ..... ... .... + ....... ..... ...... ....... + +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "unlit") +des.region({ region={52,06, 73,15}, lit=1, type="ordinary", irregular=1 }) +-- Doors +des.door("locked",28,11) +-- Stairs +des.stair("up", 04,03) +des.stair("down", 73,10) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "bugbear", x=02, y=10, peaceful=0 }) +des.monster({ id = "bugbear", x=03, y=11, peaceful=0 }) +des.monster({ id = "bugbear", x=04, y=12, peaceful=0 }) +des.monster({ id = "bugbear", x=02, y=11, peaceful=0 }) +des.monster({ id = "bugbear", x=16, y=16, peaceful=0 }) +des.monster({ id = "bugbear", x=17, y=17, peaceful=0 }) +des.monster({ id = "bugbear", x=18, y=18, peaceful=0 }) +des.monster({ id = "bugbear", x=19, y=16, peaceful=0 }) +des.monster({ id = "bugbear", x=30, y=06, peaceful=0 }) +des.monster({ id = "bugbear", x=31, y=07, peaceful=0 }) +des.monster({ id = "bugbear", x=32, y=08, peaceful=0 }) +des.monster({ id = "bugbear", x=33, y=06, peaceful=0 }) +des.monster({ id = "bugbear", x=34, y=07, peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ id = "bugbear", peaceful=0 }) +des.monster({ class = "h", peaceful=0 }) +des.monster({ class = "H", peaceful=0 }) +des.monster({ id = "hill giant", x=03, y=12, peaceful=0 }) +des.monster({ id = "hill giant", x=20, y=17, peaceful=0 }) +des.monster({ id = "hill giant", x=35, y=08, peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) +des.monster({ id = "hill giant", peaceful=0 }) +des.monster({ class = "H", peaceful=0 }) +des.wallify() + +-- +-- The "goal" level for the quest. +-- +-- Here you meet Tiamat your nemesis monster. You have to +-- defeat Tiamat in combat to gain the artifact you have +-- been assigned to retrieve. +-- diff --git a/dat/Cav-strt.lua b/dat/Cav-strt.lua new file mode 100644 index 000000000..224ed7455 --- /dev/null +++ b/dat/Cav-strt.lua @@ -0,0 +1,94 @@ +-- NetHack Caveman Cav-strt.lua $NHDT-Date: 1652196002 2022/05/10 15:20:02 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Shaman Karnov +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ + + ...... .......................... ... .... ...... + ...... .......................... ........ .... ..... + ..BB ............................. ......... .... .. + .. ...................... ....... .. .... .. + .. .................... .. ....... .. ... + .. S BB ..... ....... .... .... + .. ... . .. ........ .. .. .. ... + .. ...... .. ............ .. ... + . .... .. ........ .. ........... + ... .. .. ............. ................... + ..... ..... ............................... ........... + .....B................ ... ... + ..... . .......... .... . ... .......... ... + ... .. ............. .. ................... .... + BB .. ......... BB ... .......... .. ... ... + ...... ..... B ........ .. .. .... ... + .......... .......... ..... ... ..... ........ + .. ... . ..... .... .. ... .. + +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "unlit") +des.region({ region={13,01, 40,05}, lit=1, type="temple", filled=1, irregular=1 }) +-- The occupied rooms. +des.region({ region={02,01, 08,03}, lit=1, type="ordinary", irregular=1 }) +des.region({ region={01,11, 06,14}, lit=1, type="ordinary", irregular=1 }) +des.region({ region={13,08, 18,10}, lit=1, type="ordinary", irregular=1 }) +des.region({ region={05,17, 14,18}, lit=1, type="ordinary", irregular=1 }) +des.region({ region={17,16, 23,18}, lit=1, type="ordinary", irregular=1 }) +des.region({ region={35,16, 44,18}, lit=1, type="ordinary", irregular=1 }) +-- Stairs +des.stair("down", 02,03) +-- Portal arrival point +des.levregion({ region = {71,09,71,09}, type="branch" }) +-- Doors +des.door("locked",19,06) +-- The temple altar (this will force a priest(ess) to be created) +des.altar({ x=36,y=02, align="coaligned", type="shrine" }) +-- Shaman Karnov +des.monster({ id = "Shaman Karnov", coord = {35, 02}, inventory = function() + des.object({ id = "leather armor", spe = 5 }); + des.object({ id = "club", spe = 5 }); +end }) +-- The treasure of Shaman Karnov +des.object("chest", 34, 02) +-- neanderthal guards for the audience chamber +des.monster("neanderthal", 20, 03) +des.monster("neanderthal", 20, 02) +des.monster("neanderthal", 20, 01) +des.monster("neanderthal", 21, 03) +des.monster("neanderthal", 21, 02) +des.monster("neanderthal", 21, 01) +des.monster("neanderthal", 22, 01) +des.monster("neanderthal", 26, 09) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Random traps +des.trap("pit",47,11) +des.trap("pit",57,10) +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty (in the outer caves). +des.monster({ id ="bugbear", x=47, y=02, peaceful=0 }) +des.monster({ id ="bugbear", x=48, y=03, peaceful=0 }) +des.monster({ id ="bugbear", x=49, y=04, peaceful=0 }) +des.monster({ id ="bugbear", x=67, y=03, peaceful=0 }) +des.monster({ id ="bugbear", x=69, y=04, peaceful=0 }) +des.monster({ id ="bugbear", x=51, y=13, peaceful=0 }) +des.monster({ id ="bugbear", x=53, y=14, peaceful=0 }) +des.monster({ id ="bugbear", x=55, y=15, peaceful=0 }) +des.monster({ id ="bugbear", x=63, y=10, peaceful=0 }) +des.monster({ id ="bugbear", x=65, y=09, peaceful=0 }) +des.monster({ id ="bugbear", x=67, y=10, peaceful=0 }) +des.monster({ id ="bugbear", x=69, y=11, peaceful=0 }) +des.wallify() diff --git a/dat/Caveman.des b/dat/Caveman.des deleted file mode 100644 index a2e2ec9b8..000000000 --- a/dat/Caveman.des +++ /dev/null @@ -1,316 +0,0 @@ -# NetHack 3.6 Caveman.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Shaman Karnov -# and receive your quest assignment. -# -MAZE: "Cav-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP - - ...... .......................... ... .... ...... - ...... .......................... ........ .... ..... - ..BB ............................. ......... .... .. - .. ...................... ....... .. .... .. - .. .................... .. ....... .. ... - .. S BB ..... ....... .... .... - .. ... . .. ........ .. .. .. ... - .. ...... .. ............ .. ... - . .... .. ........ .. ........... - ... .. .. ............. ................... - ..... ..... ............................... ........... - .....B................ ... ... - ..... . .......... .... . ... .......... ... - ... .. ............. .. ................... .... - BB .. ......... BB ... .......... .. ... ... - ...... ..... B ........ .. .. .... ... - .......... .......... ..... ... ..... ........ - .. ... . ..... .... .. ... .. - -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),unlit,"ordinary" -REGION:(13,01,40,05),lit,"temple",unfilled,irregular -# The occupied rooms. -REGION:(02,01,08,03),lit,"ordinary",unfilled,irregular -REGION:(01,11,06,14),lit,"ordinary",unfilled,irregular -REGION:(13,08,18,10),lit,"ordinary",unfilled,irregular -REGION:(05,17,14,18),lit,"ordinary",unfilled,irregular -REGION:(17,16,23,18),lit,"ordinary",unfilled,irregular -REGION:(35,16,44,18),lit,"ordinary",unfilled,irregular -# Stairs -STAIR:(02,03),down -# Portal arrival point -BRANCH:(71,09,71,09),(0,0,0,0) -# Doors -DOOR:locked,(19,06) -# The temple altar (this will force a priest(ess) to be created) -ALTAR:(36,02),coaligned,shrine -# Shaman Karnov -MONSTER:('@',"Shaman Karnov"),(35,02) -# The treasure of Shaman Karnov -OBJECT:('(',"chest"),(34,02) -# neanderthal guards for the audience chamber -MONSTER:('@',"neanderthal"),(20,03) -MONSTER:('@',"neanderthal"),(20,02) -MONSTER:('@',"neanderthal"),(20,01) -MONSTER:('@',"neanderthal"),(21,03) -MONSTER:('@',"neanderthal"),(21,02) -MONSTER:('@',"neanderthal"),(21,01) -MONSTER:('@',"neanderthal"),(22,01) -MONSTER:('@',"neanderthal"),(26,09) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Random traps -TRAP:"pit",(47,11) -TRAP:"pit",(57,10) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty (in the outer caves). -MONSTER: ('h',"bugbear"),(47,02),hostile -MONSTER: ('h',"bugbear"),(48,03),hostile -MONSTER: ('h',"bugbear"),(49,04),hostile -MONSTER: ('h',"bugbear"),(67,03),hostile -MONSTER: ('h',"bugbear"),(69,04),hostile -MONSTER: ('h',"bugbear"),(51,13),hostile -MONSTER: ('h',"bugbear"),(53,14),hostile -MONSTER: ('h',"bugbear"),(55,15),hostile -MONSTER: ('h',"bugbear"),(63,10),hostile -MONSTER: ('h',"bugbear"),(65,09),hostile -MONSTER: ('h',"bugbear"),(67,10),hostile -MONSTER: ('h',"bugbear"),(69,11),hostile -WALLIFY - -# -# The "locate" level for the quest. -# -# Here you have to find the lair of Tiamat to go -# further towards your assigned quest. -# - -MAZE: "Cav-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -MAP - - ............. ........... - ............... ............. - ............. ............... .......... - ........... ............. ............... - ... ... .................. - ... .......... ... .................. - ... ............ BBB................... - ... .......... ...................... - ..... .. .....B........................ - .... ............... . ........B.......................... - ...... .. .............S.............. .................. - .... .. ........... ............... - .. ... .................... - .... BB................... - .. .. .. ............... - .. ....... .... ..... .... .. ....... S - ............ ....... .. ....... ..... ... .... - ....... ..... ...... ....... - -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),unlit,"ordinary" -REGION:(52,06,73,15),lit,"ordinary",unfilled,irregular -# Doors -DOOR:locked,(28,11) -# Stairs -STAIR:(04,03),up -STAIR:(73,10),down -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('h',"bugbear"),(02,10),hostile -MONSTER:('h',"bugbear"),(03,11),hostile -MONSTER:('h',"bugbear"),(04,12),hostile -MONSTER:('h',"bugbear"),(02,11),hostile -MONSTER:('h',"bugbear"),(16,16),hostile -MONSTER:('h',"bugbear"),(17,17),hostile -MONSTER:('h',"bugbear"),(18,18),hostile -MONSTER:('h',"bugbear"),(19,16),hostile -MONSTER:('h',"bugbear"),(30,06),hostile -MONSTER:('h',"bugbear"),(31,07),hostile -MONSTER:('h',"bugbear"),(32,08),hostile -MONSTER:('h',"bugbear"),(33,06),hostile -MONSTER:('h',"bugbear"),(34,07),hostile -MONSTER:('h',"bugbear"),random,hostile -MONSTER:('h',"bugbear"),random,hostile -MONSTER:('h',"bugbear"),random,hostile -MONSTER:('h',"bugbear"),random,hostile -MONSTER:'h',random,hostile -MONSTER:'H',random,hostile -MONSTER:('H',"hill giant"),(03,12),hostile -MONSTER:('H',"hill giant"),(20,17),hostile -MONSTER:('H',"hill giant"),(35,08),hostile -MONSTER:('H',"hill giant"),random,hostile -MONSTER:('H',"hill giant"),random,hostile -MONSTER:('H',"hill giant"),random,hostile -MONSTER:('H',"hill giant"),random,hostile -MONSTER:'H',random,hostile -WALLIFY - -# -# The "goal" level for the quest. -# -# Here you meet Tiamat your nemesis monster. You have to -# defeat Tiamat in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Cav-goal", ' ' -GEOMETRY:center,center -MAP - - ..................... - ....................... - ......................... - ........................... - ............................. - ............................... - ................................. - ................................... - ..................................... - ....................................... - ..................................... - ................................... - ................................. - ............................... - ............................. - ........................... - ......................... - ....................... - -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -# Stairs -STAIR:random,up -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:(')',"mace"),(23,10),blessed,0,name:"The Sceptre of Might" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# monsters. -MONSTER:('D',"Chromatic Dragon"),(23,10),asleep -MONSTER:('F',"shrieker"),(26,13) -MONSTER:('F',"shrieker"),(25,8) -MONSTER:('F',"shrieker"),(45,11) -WALLIFY - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -MAZE: "Cav-fila" , ' ' -INIT_MAP: mines, '.' , ' ' , true , true , random , true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: 'h', random, hostile -MONSTER: ('H', "hill giant"), random, hostile - -MAZE: "Cav-filb" , ' ' -INIT_MAP: mines, '.' , ' ' , true , true , random , true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: ('h', "bugbear"), random, hostile -MONSTER: 'h', random, hostile -MONSTER: 'h', random, hostile -MONSTER: ('H', "hill giant"), random, hostile -MONSTER: ('H', "hill giant"), random, hostile diff --git a/dat/GENFILES b/dat/GENFILES index c360d940f..056dde16d 100755 --- a/dat/GENFILES +++ b/dat/GENFILES @@ -1,5 +1,5 @@ #!/usr/bin/perl -# NetHack 3.6 GENFILES $NHDT-Date: 1550799147 2019/02/22 01:32:27 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.0 $ +# NetHack 5.0 GENFILES $NHDT-Date: 1596498242 2020/08/03 23:44:02 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ # Copyright (c) 2018 by Kenneth Lorber # NetHack may be freely redistributed. See license for details. @@ -9,17 +9,17 @@ ($dir = $0) =~ s!^(.*/)(.*)!$1!; -print "T (files generated by lev_comp at playground creation time)\n"; - -foreach $des (<$dir*.des>){ - open IN, "<", $des or warn("Can't open $des: $!"); - while(){ - m/^(MAZE|LEVEL):\s*"(.*?)"/ && do { - print "F $2.lev\n"; - }; - } - close IN; -} +#print "T (files generated by lev_comp at playground creation time)\n"; +# +#foreach $des (<$dir*.des>){ +# open IN, "<", $des or warn("Can't open $des: $!"); +# while(){ +# m/^(MAZE|LEVEL):\s*"(.*?)"/ && do { +# print "F $2.lev\n"; +# }; +# } +# close IN; +#} while(){ print; } @@ -29,22 +29,18 @@ T (tile files optionally generated for X ports at playground creation time) F pet_mark.xbm F rip.xpm F x11tiles -T (files generated for Qt interface on Mac OS X) +T (files generated for Qt interface on macOS) F nethack.icns F Info.plist -T (files generated for win32 at compile time) +T (files generated for windows at compile time) F porthelp F dlb.lst -T (files generated for win32 tty at compile time) +T (files generated for windows tty at compile time) F ttyoptions -T (files generated for win32 gui at compile time) +T (files generated for windows gui at compile time) F guioptions T (files generated by makedefs at playground creation time) F data -F dungeon.pdf F options F oracles -F quest.dat F rumors -T (file generated by dgn_comp at playground creation time) -F dungeon diff --git a/dat/Hea-fila.lua b/dat/Hea-fila.lua new file mode 100644 index 000000000..7fa038ddc --- /dev/null +++ b/dat/Hea-fila.lua @@ -0,0 +1,42 @@ +-- NetHack Healer Hea-fila.lua $NHDT-Date: 1652196003 2022/05/10 15:20:03 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991, 1993 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "P" }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster("rabid rat") +des.monster({ class = "r", peaceful=0 }) +des.monster({ class = "r", peaceful=0 }) +des.monster("giant eel") +des.monster("giant eel") +des.monster("electric eel") +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +-- +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Hea-filb.lua b/dat/Hea-filb.lua new file mode 100644 index 000000000..778402363 --- /dev/null +++ b/dat/Hea-filb.lua @@ -0,0 +1,50 @@ +-- NetHack Healer Hea-filb.lua $NHDT-Date: 1652196003 2022/05/10 15:20:03 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991, 1993 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "P" }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster("rabid rat") +des.monster("rabid rat") +des.monster({ class = "r", peaceful=0 }) +des.monster({ class = "r", peaceful=0 }) +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +-- +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Hea-goal.lua b/dat/Hea-goal.lua new file mode 100644 index 000000000..0499a1248 --- /dev/null +++ b/dat/Hea-goal.lua @@ -0,0 +1,90 @@ +-- NetHack Healer Hea-goal.lua $NHDT-Date: 1652196003 2022/05/10 15:20:03 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991, 1993 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "P" }); + +des.level_flags("mazelevel"); + +-- +des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false }) + +des.map([[ +.P....................................PP. +PP.......PPPPPPP....PPPPPPP....PPPP...PP. +...PPPPPPP....PPPPPPP.....PPPPPP..PPP...P +...PP..............................PPP... +..PP..............................PP..... +..PP..............................PPP.... +..PPP..............................PP.... +.PPP..............................PPPP... +...PP............................PPP...PP +..PPPP...PPPPP..PPPP...PPPPP.....PP...PP. +P....PPPPP...PPPP..PPPPP...PPPPPPP...PP.. +PPP..................................PPP. +]]); +-- Dungeon Description +des.region(selection.area(00,00,40,11), "lit") +-- Stairs +des.stair("up", 39,10) +-- Non diggable walls +des.non_diggable(selection.area(00,00,40,11)) +-- Objects +des.object({ id = "quarterstaff", x=20, y=06, buc="blessed", spe=0, name="The Staff of Aesculapius" }) +des.object("wand of lightning", 20, 06) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "Cyclops", x=20, y=06, peaceful=0 }) +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster({ class = "r", peaceful=0 }) +des.monster({ class = "r", peaceful=0 }) +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("shark") +des.monster("shark") +des.monster({ class = ";", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) + diff --git a/dat/Hea-loca.lua b/dat/Hea-loca.lua new file mode 100644 index 000000000..a05020f17 --- /dev/null +++ b/dat/Hea-loca.lua @@ -0,0 +1,97 @@ +-- NetHack Healer Hea-loca.lua $NHDT-Date: 1652196004 2022/05/10 15:20:04 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991, 1993 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor"); +-- +des.level_init({ style="mines", fg=".", bg="P", smoothed=true ,joined=true, lit=1, walled=false }) + +des.map([[ +PPPPPPPPPPPPP.......PPPPPPPPPPP +PPPPPPPP...............PPPPPPPP +PPPP.....-------------...PPPPPP +PPPPP....|.S.........|....PPPPP +PPP......+.|.........|...PPPPPP +PPP......+.|.........|..PPPPPPP +PPPP.....|.S.........|..PPPPPPP +PPPPP....-------------....PPPPP +PPPPPPPP...............PPPPPPPP +PPPPPPPPPPP........PPPPPPPPPPPP +]]); +-- Dungeon Description +des.region(selection.area(00,00,30,09), "lit") +des.region({ region={12,03, 20,06}, lit=1, type="temple", filled=1 }) +-- Doors +des.door("closed",09,04) +des.door("closed",09,05) +des.door("locked",11,03) +des.door("locked",11,06) +-- Stairs +des.stair("up", 04,04) +des.stair("down", 20,06) +-- Non diggable walls +des.non_diggable(selection.area(11,02,21,07)) +-- Altar in the temple. +des.altar({ x=13,y=05, align="chaos", type="shrine" }) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster({ class = "r", peaceful=0 }) +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("kraken") +des.monster("shark") +des.monster("shark") +des.monster({ class = ";", peaceful=0 }) +des.monster({ class = ";", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) diff --git a/dat/Hea-strt.lua b/dat/Hea-strt.lua new file mode 100644 index 000000000..9e9e35247 --- /dev/null +++ b/dat/Hea-strt.lua @@ -0,0 +1,109 @@ +-- NetHack Healer Hea-strt.lua $NHDT-Date: 1652196004 2022/05/10 15:20:04 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991, 1993 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Hippocrates +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +PPPP........PPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.P..PPPPP......PPPPPPPP +PPP..........PPPP...PPPPP.........................PPPP..PPPPP........PPPPPPP +PP............PPPPPPPP..............................PPP...PPPP......PPPPPPPP +P.....PPPPPPPPPPPPPPP................................PPPPPPPPPPPPPPPPPPPPPPP +PPPP....PPPPPPPPPPPP...................................PPPPP.PPPPPPPPPPPPPPP +PPPP........PPPPP.........-----------------------........PP...PPPPPPP.....PP +PPP............PPPPP....--|.|......S..........S.|--.....PPPP.PPPPPPP.......P +PPPP..........PPPPP.....|.S.|......-----------|S|.|......PPPPPP.PPP.......PP +PPPPPP......PPPPPP......|.|.|......|...|......|.|.|.....PPPPPP...PP.......PP +PPPPPPPPPPPPPPPPPPP.....+.|.|......S.\.S......|.|.+......PPPPPP.PPPP.......P +PPP...PPPPP...PPPP......|.|.|......|...|......|.|.|.......PPPPPPPPPPP.....PP +PP.....PPP.....PPP......|.|S|-----------......|.S.|......PPPPPPPPPPPPPPPPPPP +PPP..PPPPP...PPPP.......--|.S..........S......|.|--.....PPPPPPPPP....PPPPPPP +PPPPPPPPPPPPPPPP..........-----------------------..........PPPPP..........PP +PPPPPPPPPPPPPPPPP........................................PPPPPP............P +PPP.............PPPP...................................PPP..PPPP..........PP +PP...............PPPPP................................PPPP...PPPP........PPP +PPP.............PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPP +PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +]]); + +des.replace_terrain({ region={01,01, 74,18}, fromterrain="P", toterrain=".", chance=10 }) + +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +-- Stairs +des.stair("down", 37,9) +-- Portal arrival point +des.levregion({ region = {04,12,04,12}, type="branch" }) +-- altar for the Temple +des.altar({ x=32,y=09,align="neutral",type="altar" }) +-- Doors +des.door("locked",24,10) +des.door("closed",26,08) +des.door("closed",27,12) +des.door("locked",28,13) +des.door("closed",35,07) +des.door("locked",35,10) +des.door("locked",39,10) +des.door("closed",39,13) +des.door("locked",46,07) +des.door("closed",47,08) +des.door("closed",48,12) +des.door("locked",50,10) +-- Hippocrates +des.monster({ id = "Hippocrates", coord = {37, 10}, inventory = function() + des.object({ id = "silver dagger", spe = 5 }); +end }) +-- The treasure of Hippocrates +des.object("chest", 37, 10) +-- intern guards for the audience chamber +des.monster("attendant", 29, 08) +des.monster("attendant", 29, 09) +des.monster("attendant", 29, 10) +des.monster("attendant", 29, 11) +des.monster("attendant", 40, 09) +des.monster("attendant", 40, 10) +des.monster("attendant", 40, 11) +des.monster("attendant", 40, 13) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("rabid rat") +des.monster("giant eel") +des.monster("shark") +des.monster(";") +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) +des.monster({ class = "S", peaceful=0 }) diff --git a/dat/Healer.des b/dat/Healer.des deleted file mode 100644 index 1f8e3497d..000000000 --- a/dat/Healer.des +++ /dev/null @@ -1,380 +0,0 @@ -# NetHack 3.6 Healer.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991, 1993 by M. Stephenson, P. Winner -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Hippocrates -# and receive your quest assignment. -# -MAZE: "Hea-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -PPPP........PPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.P..PPPPP......PPPPPPPP -PPP..........PPPP...PPPPP.........................PPPP..PPPPP........PPPPPPP -PP............PPPPPPPP..............................PPP...PPPP......PPPPPPPP -P.....PPPPPPPPPPPPPPP................................PPPPPPPPPPPPPPPPPPPPPPP -PPPP....PPPPPPPPPPPP...................................PPPPP.PPPPPPPPPPPPPPP -PPPP........PPPPP.........-----------------------........PP...PPPPPPP.....PP -PPP............PPPPP....--|.|......S..........S.|--.....PPPP.PPPPPPP.......P -PPPP..........PPPPP.....|.S.|......-----------|S|.|......PPPPPP.PPP.......PP -PPPPPP......PPPPPP......|.|.|......|...|......|.|.|.....PPPPPP...PP.......PP -PPPPPPPPPPPPPPPPPPP.....+.|.|......S.\.S......|.|.+......PPPPPP.PPPP.......P -PPP...PPPPP...PPPP......|.|.|......|...|......|.|.|.......PPPPPPPPPPP.....PP -PP.....PPP.....PPP......|.|S|-----------......|.S.|......PPPPPPPPPPPPPPPPPPP -PPP..PPPPP...PPPP.......--|.S..........S......|.|--.....PPPPPPPPP....PPPPPPP -PPPPPPPPPPPPPPPP..........-----------------------..........PPPPP..........PP -PPPPPPPPPPPPPPPPP........................................PPPPPP............P -PPP.............PPPP...................................PPP..PPPP..........PP -PP...............PPPPP................................PPPP...PPPP........PPP -PPP.............PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPP -PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP -ENDMAP - -REPLACE_TERRAIN:(01,01,74,18), 'P', '.', 10% - -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -# Stairs -STAIR:(37,9),down -# Portal arrival point -BRANCH:(04,12,04,12),(0,0,0,0) -# altar for the Temple -ALTAR:(32,09),neutral,altar -# Doors -DOOR:locked,(24,10) -DOOR:closed,(26,08) -DOOR:closed,(27,12) -DOOR:locked,(28,13) -DOOR:closed,(35,07) -DOOR:locked,(35,10) -DOOR:locked,(39,10) -DOOR:closed,(39,13) -DOOR:locked,(46,07) -DOOR:closed,(47,08) -DOOR:closed,(48,12) -DOOR:locked,(50,10) -# Hippocrates -MONSTER:('@',"Hippocrates"),(37,10) -# The treasure of Hippocrates -OBJECT:('(',"chest"),(37,10) -# intern guards for the audience chamber -MONSTER:('@',"attendant"),(29,08) -MONSTER:('@',"attendant"),(29,09) -MONSTER:('@',"attendant"),(29,10) -MONSTER:('@',"attendant"),(29,11) -MONSTER:('@',"attendant"),(40,09) -MONSTER:('@',"attendant"),(40,10) -MONSTER:('@',"attendant"),(40,11) -MONSTER:('@',"attendant"),(40,13) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: ('r',"rabid rat"),random -MONSTER: (';',"giant eel"),random -MONSTER: (';',"shark"),random -MONSTER: ';', random -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -# -# The "locate" level for the quest. -# -# Here you have to find the Temple of Coeus to go -# further towards your assigned quest. -# - -MAZE: "Hea-loca",' ' -FLAGS: hardfloor -# -INIT_MAP: mines, '.' , 'P', true , true , lit , false -GEOMETRY:center,center -MAP -PPPPPPPPPPPPP.......PPPPPPPPPPP -PPPPPPPP...............PPPPPPPP -PPPP.....-------------...PPPPPP -PPPPP....|.S.........|....PPPPP -PPP......+.|.........|...PPPPPP -PPP......+.|.........|..PPPPPPP -PPPP.....|.S.........|..PPPPPPP -PPPPP....-------------....PPPPP -PPPPPPPP...............PPPPPPPP -PPPPPPPPPPP........PPPPPPPPPPPP -ENDMAP -# Dungeon Description -REGION:(00,00,30,09),lit,"ordinary" -REGION:(12,03,20,06),lit,"temple" -# Doors -DOOR:closed,(09,04) -DOOR:closed,(09,05) -DOOR:locked,(11,03) -DOOR:locked,(11,06) -# Stairs -STAIR:(04,04),up -STAIR:(20,06),down -# Non diggable walls -NON_DIGGABLE:(11,02,21,07) -# Altar in the temple. -ALTAR:(13,05), chaos, shrine -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:'r',random,hostile -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"shark"),random -MONSTER:(';',"shark"),random -MONSTER:';', random,hostile -MONSTER:';', random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile - -# -# The "goal" level for the quest. -# -# Here you meet Cyclops your nemesis monster. You have to -# defeat Cyclops in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Hea-goal", 'P' -# -INIT_MAP: mines, '.' , 'P' , false , true , lit , false -GEOMETRY:center,center -MAP -.P....................................PP. -PP.......PPPPPPP....PPPPPPP....PPPP...PP. -...PPPPPPP....PPPPPPP.....PPPPPP..PPP...P -...PP..............................PPP... -..PP..............................PP..... -..PP..............................PPP.... -..PPP..............................PP.... -.PPP..............................PPPP... -...PP............................PPP...PP -..PPPP...PPPPP..PPPP...PPPPP.....PP...PP. -P....PPPPP...PPPP..PPPPP...PPPPPPP...PP.. -PPP..................................PPP. -ENDMAP -# Dungeon Description -REGION:(00,00,40,11),lit,"ordinary" -# Stairs -STAIR:(39,10),up -# Non diggable walls -NON_DIGGABLE:(00,00,40,11) -# Objects -OBJECT:(')',"quarterstaff"),(20,06),blessed,0,name:"The Staff of Aesculapius" -OBJECT:('/',"lightning"),(20,06) -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('H',"Cyclops"),(20,06),hostile -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:('r',"rabid rat"),random -MONSTER:'r',random,hostile -MONSTER:'r',random,hostile -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"shark"),random -MONSTER:(';',"shark"),random -MONSTER:';',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -MAZE: "Hea-fila" , 'P' -INIT_MAP: mines, '.' , 'P' , false , true , lit , false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('r', "rabid rat"), random -MONSTER: 'r', random,hostile -MONSTER: 'r', random,hostile -MONSTER: (';', "giant eel"), random -MONSTER: (';', "giant eel"), random -MONSTER: (';', "electric eel"), random -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random - -MAZE: "Hea-filb" , 'P' -INIT_MAP: mines, '.' , 'P' , false , true , lit , false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('r', "rabid rat"), random -MONSTER: ('r', "rabid rat"), random -MONSTER: 'r', random,hostile -MONSTER: 'r', random,hostile -MONSTER: (';', "giant eel"), random -MONSTER: (';', "giant eel"), random -MONSTER: (';', "giant eel"), random -MONSTER: (';', "giant eel"), random -MONSTER: (';', "giant eel"), random -MONSTER: (';', "electric eel"), random -MONSTER: (';', "electric eel"), random -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'D',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -MONSTER: 'S',random,hostile -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random diff --git a/dat/Kni-fila.lua b/dat/Kni-fila.lua new file mode 100644 index 000000000..362d0674b --- /dev/null +++ b/dat/Kni-fila.lua @@ -0,0 +1,35 @@ +-- NetHack Knight Kni-fila.lua $NHDT-Date: 1652196004 2022/05/10 15:20:04 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "." }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ class = "i", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +-- +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Kni-filb.lua b/dat/Kni-filb.lua new file mode 100644 index 000000000..14a414f4e --- /dev/null +++ b/dat/Kni-filb.lua @@ -0,0 +1,40 @@ +-- NetHack Knight Kni-filb.lua $NHDT-Date: 1652196005 2022/05/10 15:20:05 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "." }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ class = "i", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +-- +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Kni-goal.lua b/dat/Kni-goal.lua new file mode 100644 index 000000000..08a8dff78 --- /dev/null +++ b/dat/Kni-goal.lua @@ -0,0 +1,99 @@ +-- NetHack Knight Kni-goal.lua $NHDT-Date: 1652196005 2022/05/10 15:20:05 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ +....PPPP..PPP.. +.PPPPP...PP.. .......... ................................. +..PPPPP...P.. ........... ................................... +..PPP....... ........... ...................................... +...PPP....... ......... ............... ..................... +........... ............ ............ ...................... +............ ............. ....... ..................... +.............................. ......................... +............................... .................................. +............................. .................................... +......... ...................................................... +.....PP... ..................................................... +.....PPP.... .................................................... +......PPP.... .............. .................................... +.......PPP.... ............. ..................................... +........PP... ............ ...................................... +...PPP........ .......... .................................. +..PPPPP........ .......... .............................. +....PPPPP...... ......... .......................... +.......PPPP... +]]); +-- Dungeon Description +des.region(selection.area(00,00,14,19), "lit") +des.region(selection.area(15,00,75,19), "unlit") +-- Stairs +des.stair("up", 03,08) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object({ id = "mirror", x=50,y=06, buc="blessed", spe=0, name="The Magic Mirror of Merlin" }) +des.object({ coord = { 33, 01 } }) +des.object({ coord = { 33, 02 } }) +des.object({ coord = { 33, 03 } }) +des.object({ coord = { 33, 04 } }) +des.object({ coord = { 33, 05 } }) +des.object({ coord = { 34, 01 } }) +des.object({ coord = { 34, 02 } }) +des.object({ coord = { 34, 03 } }) +des.object({ coord = { 34, 04 } }) +des.object({ coord = { 34, 05 } }) +des.object({ coord = { 35, 01 } }) +des.object({ coord = { 35, 02 } }) +des.object({ coord = { 35, 03 } }) +des.object({ coord = { 35, 04 } }) +des.object({ coord = { 35, 05 } }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap("spiked pit",13,07) +des.trap("spiked pit",12,08) +des.trap("spiked pit",12,09) +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "Ixoth", x=50, y=06, peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ class = "i", peaceful=0 }) +des.monster({ class = "i", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ class = "j", peaceful=0 }) diff --git a/dat/Kni-loca.lua b/dat/Kni-loca.lua new file mode 100644 index 000000000..91d557a70 --- /dev/null +++ b/dat/Kni-loca.lua @@ -0,0 +1,137 @@ +-- NetHack Knight Kni-loca.lua $NHDT-Date: 1652196005 2022/05/10 15:20:05 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") + +des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false }) + +des.map([[ +xxxxxxxxx......xxxx...........xxxxxxxxxx +xxxxxxx.........xxx.............xxxxxxxx +xxxx..............................xxxxxx +xx.................................xxxxx +....................................xxxx +.......................................x +........................................ +xx...................................xxx +xxxx..............................xxxxxx +xxxxxx..........................xxxxxxxx +xxxxxxxx.........xx..........xxxxxxxxxxx +xxxxxxxxx.......xxxxxx.....xxxxxxxxxxxxx +]]); +-- Dungeon Description +-- The Isle of Glass is a Tor rising out of the swamps surrounding it. +des.region(selection.area(00,00,39,11), "lit") +-- The top area of the Tor is a holy site. +des.region({ region={09,02, 27,09}, lit=1, type="temple", filled=2 }) +-- Stairs +des.stair("up", 38,0) +des.stair("down", 18,05) +-- The altar atop the Tor and its attendant (creating altar makes the priest). +des.altar({ x=17, y=05, align="neutral", type="shrine" }) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +-- All of the avenues are guarded by magic except for the East. +-- South +des.trap("magic",08,11) +des.trap("magic",09,11) +des.trap("magic",10,11) +des.trap("magic",11,11) +des.trap("magic",12,11) +des.trap("magic",13,11) +des.trap("magic",14,11) +des.trap("magic",15,11) +des.trap("magic",16,11) +des.trap("magic",20,11) +des.trap("magic",21,11) +des.trap("magic",22,11) +des.trap("magic",23,11) +des.trap("magic",24,11) +des.trap("magic",25,11) +des.trap("magic",26,11) +des.trap("magic",27,11) +des.trap("magic",28,11) +-- West +des.trap("magic",00,03) +des.trap("magic",00,04) +des.trap("magic",00,05) +des.trap("magic",00,06) +-- North +des.trap("magic",06,00) +des.trap("magic",07,00) +des.trap("magic",08,00) +des.trap("magic",09,00) +des.trap("magic",10,00) +des.trap("magic",11,00) +des.trap("magic",12,00) +des.trap("magic",13,00) +des.trap("magic",14,00) +des.trap("magic",19,00) +des.trap("magic",20,00) +des.trap("magic",21,00) +des.trap("magic",22,00) +des.trap("magic",23,00) +des.trap("magic",24,00) +des.trap("magic",25,00) +des.trap("magic",26,00) +des.trap("magic",27,00) +des.trap("magic",28,00) +des.trap("magic",29,00) +des.trap("magic",30,00) +des.trap("magic",31,00) +des.trap("magic",32,00) +-- Even so, there are magic "sinkholes" around. +des.trap("anti magic") +des.trap("anti magic") +des.trap("anti magic") +des.trap("anti magic") +des.trap("anti magic") +des.trap("anti magic") +des.trap("anti magic") +-- Random monsters. +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ id = "quasit", peaceful=0 }) +des.monster({ class = "i", peaceful=0 }) +des.monster({ class = "j", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ id = "ochre jelly", peaceful=0 }) +des.monster({ class = "j", peaceful=0 }) diff --git a/dat/Kni-strt.lua b/dat/Kni-strt.lua new file mode 100644 index 000000000..9873fb42e --- /dev/null +++ b/dat/Kni-strt.lua @@ -0,0 +1,109 @@ +-- NetHack Knight Kni-strt.lua $NHDT-Date: 1652196006 2022/05/10 15:20:06 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, King Arthur +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = "." }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") +-- This is a kludge to init the level as a lit field. +des.level_init({ style="mines", fg=".", bg=".", smoothed=false, joined=false, lit=1, walled=false }) + +des.map([[ +.................................................. +.-----......................................-----. +.|...|......................................|...|. +.--|+-------------------++-------------------+|--. +...|...................+..+...................|... +...|.|-----------------|++|-----------------|.|... +...|.|.................|..|.........|.......|.|... +...|.|...\.............+..+.........|.......|.|... +...|.|.................+..+.........+.......|.|... +...|.|.................|..|.........|.......|.|... +...|.|--------------------------------------|.|... +...|..........................................|... +.--|+----------------------------------------+|--. +.|...|......................................|...|. +.-----......................................-----. +.................................................. +]]); +-- Dungeon Description +des.region(selection.area(00,00,49,15), "lit") +des.region(selection.area(04,04,45,11), "unlit") +des.region({ region={06,06,22,09}, lit=1, type="throne", filled=2 }) +des.region(selection.area(27,06,43,09), "lit") +-- Portal arrival point +des.levregion({ region = {20,14,20,14}, type="branch" }) +-- Stairs +des.stair("down", 40,7) +-- Doors +-- Outside Doors +des.door("locked",24,03) +des.door("locked",25,03) +-- Inside Doors +des.door("closed",23,04) +des.door("closed",26,04) +des.door("locked",24,05) +des.door("locked",25,05) +des.door("closed",23,07) +des.door("closed",26,07) +des.door("closed",23,08) +des.door("closed",26,08) +des.door("closed",36,08) +-- Watchroom Doors +des.door("closed",04,03) +des.door("closed",45,03) +des.door("closed",04,12) +des.door("closed",45,12) +-- King Arthur +des.monster({ id = "King Arthur", coord = {09, 07}, inventory = function() + des.object({ id = "long sword", spe = 4, buc = "blessed", name = "Excalibur" }); + des.object({ id = "plate mail", spe = 4 }); +end }) +-- The treasure of King Arthur +des.object("chest", 09, 07) +-- knight guards for the watchrooms +des.monster({ id = "knight", x=04, y=02, peaceful = 1 }) +des.monster({ id = "knight", x=04, y=13, peaceful = 1 }) +des.monster({ id = "knight", x=45, y=02, peaceful = 1 }) +des.monster({ id = "knight", x=45, y=13, peaceful = 1 }) +-- page guards for the audience chamber +des.monster("page", 16, 06) +des.monster("page", 18, 06) +des.monster("page", 20, 06) +des.monster("page", 16, 09) +des.monster("page", 18, 09) +des.monster("page", 20, 09) +-- Non diggable walls +des.non_diggable(selection.area(00,00,49,15)) +-- Random traps +des.trap("sleep gas",24,04) +des.trap("sleep gas",25,04) +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +des.monster({ id = "quasit", x=14, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=16, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=18, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=20, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=22, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=24, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=26, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=28, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=30, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=32, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=34, y=00, peaceful=0 }) +des.monster({ id = "quasit", x=36, y=00, peaceful=0 }) + +-- Some warhorses +for i = 1, 2 + nh.rn2(3) do + des.monster({ id = "warhorse", peaceful = 1, inventory = function() if percent(50) then des.object("saddle"); end end }); +end diff --git a/dat/Knight.des b/dat/Knight.des deleted file mode 100644 index d5db2e01c..000000000 --- a/dat/Knight.des +++ /dev/null @@ -1,408 +0,0 @@ -# NetHack 3.6 Knight.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991,92 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, King Arthur -# and receive your quest assignment. -# -MAZE: "Kni-strt",'.' -FLAGS: noteleport,hardfloor -# This is a kludge to init the level as a lit field. -INIT_MAP: mines, '.' , '.' , false , false , lit , false -GEOMETRY:center,center -MAP -.................................................. -.-----......................................-----. -.|...|......................................|...|. -.--|+-------------------++-------------------+|--. -...|...................+..+...................|... -...|.|-----------------|++|-----------------|.|... -...|.|.................|..|.........|.......|.|... -...|.|...\.............+..+.........|.......|.|... -...|.|.................+..+.........+.......|.|... -...|.|.................|..|.........|.......|.|... -...|.|--------------------------------------|.|... -...|..........................................|... -.--|+----------------------------------------+|--. -.|...|......................................|...|. -.-----......................................-----. -.................................................. -ENDMAP -# Dungeon Description -REGION:(00,00,49,15),lit,"ordinary" -REGION:(04,04,45,11),unlit,"ordinary" -REGION:(06,06,22,09),lit,"throne" , unfilled -REGION:(27,06,43,09),lit,"ordinary" -# Portal arrival point -BRANCH:(20,14,20,14),(0,0,0,0) -# Stairs -STAIR:(40,7),down -# Doors -# Outside Doors -DOOR:locked,(24,03) -DOOR:locked,(25,03) -# Inside Doors -DOOR:closed,(23,04) -DOOR:closed,(26,04) -DOOR:locked,(24,05) -DOOR:locked,(25,05) -DOOR:closed,(23,07) -DOOR:closed,(26,07) -DOOR:closed,(23,08) -DOOR:closed,(26,08) -DOOR:closed,(36,08) -# Watchroom Doors -DOOR:closed,(04,03) -DOOR:closed,(45,03) -DOOR:closed,(04,12) -DOOR:closed,(45,12) -# King Arthur -MONSTER:('@',"King Arthur"),(09,07) -# The treasure of King Arthur -OBJECT:('(',"chest"),(09,07) -# knight guards for the watchrooms -MONSTER:('@',"knight"),(04,02),peaceful -MONSTER:('@',"knight"),(04,13),peaceful -MONSTER:('@',"knight"),(45,02),peaceful -MONSTER:('@',"knight"),(45,13),peaceful -# page guards for the audience chamber -MONSTER:('@',"page"),(16,06) -MONSTER:('@',"page"),(18,06) -MONSTER:('@',"page"),(20,06) -MONSTER:('@',"page"),(16,09) -MONSTER:('@',"page"),(18,09) -MONSTER:('@',"page"),(20,09) -# Non diggable walls -NON_DIGGABLE:(00,00,49,15) -# Random traps -TRAP:"sleep gas",(24,04) -TRAP:"sleep gas",(25,04) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: ('i',"quasit"),(14,00),hostile -MONSTER: ('i',"quasit"),(16,00),hostile -MONSTER: ('i',"quasit"),(18,00),hostile -MONSTER: ('i',"quasit"),(20,00),hostile -MONSTER: ('i',"quasit"),(22,00),hostile -MONSTER: ('i',"quasit"),(24,00),hostile -MONSTER: ('i',"quasit"),(26,00),hostile -MONSTER: ('i',"quasit"),(28,00),hostile -MONSTER: ('i',"quasit"),(30,00),hostile -MONSTER: ('i',"quasit"),(32,00),hostile -MONSTER: ('i',"quasit"),(34,00),hostile -MONSTER: ('i',"quasit"),(36,00),hostile - -# -# The "locate" level for the quest. -# -# Here you have to find your way to the Isle of Glass to go -# further towards your assigned quest. -# - -MAZE: "Kni-loca",' ' -FLAGS: hardfloor -INIT_MAP: mines, '.' , 'P' , false , true , lit , false -GEOMETRY:center,center -MAP -xxxxxxxxx......xxxx...........xxxxxxxxxx -xxxxxxx.........xxx.............xxxxxxxx -xxxx..............................xxxxxx -xx.................................xxxxx -....................................xxxx -.......................................x -........................................ -xx...................................xxx -xxxx..............................xxxxxx -xxxxxx..........................xxxxxxxx -xxxxxxxx.........xx..........xxxxxxxxxxx -xxxxxxxxx.......xxxxxx.....xxxxxxxxxxxxx -ENDMAP -# Dungeon Description -# The Isle of Glass is a Tor rising out of the swamps surrounding it. -REGION:(00,00,39,11),lit,"ordinary" -# The top area of the Tor is a holy site. -REGION:(09,02,27,09),lit,"temple" -# Stairs -STAIR:(38,0),up -STAIR:(18,05),down -# The altar atop the Tor and its attendant (creating altar makes the priest). -ALTAR:(17,05),neutral,shrine -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -# All of the avenues are guarded by magic except for the East. -# South -TRAP:"magic",(08,11) -TRAP:"magic",(09,11) -TRAP:"magic",(10,11) -TRAP:"magic",(11,11) -TRAP:"magic",(12,11) -TRAP:"magic",(13,11) -TRAP:"magic",(14,11) -TRAP:"magic",(15,11) -TRAP:"magic",(16,11) -TRAP:"magic",(20,11) -TRAP:"magic",(21,11) -TRAP:"magic",(22,11) -TRAP:"magic",(23,11) -TRAP:"magic",(24,11) -TRAP:"magic",(25,11) -TRAP:"magic",(26,11) -TRAP:"magic",(27,11) -TRAP:"magic",(28,11) -# West -TRAP:"magic",(00,03) -TRAP:"magic",(00,04) -TRAP:"magic",(00,05) -TRAP:"magic",(00,06) -# North -TRAP:"magic",(06,00) -TRAP:"magic",(07,00) -TRAP:"magic",(08,00) -TRAP:"magic",(09,00) -TRAP:"magic",(10,00) -TRAP:"magic",(11,00) -TRAP:"magic",(12,00) -TRAP:"magic",(13,00) -TRAP:"magic",(14,00) -TRAP:"magic",(19,00) -TRAP:"magic",(20,00) -TRAP:"magic",(21,00) -TRAP:"magic",(22,00) -TRAP:"magic",(23,00) -TRAP:"magic",(24,00) -TRAP:"magic",(25,00) -TRAP:"magic",(26,00) -TRAP:"magic",(27,00) -TRAP:"magic",(28,00) -TRAP:"magic",(29,00) -TRAP:"magic",(30,00) -TRAP:"magic",(31,00) -TRAP:"magic",(32,00) -# Even so, there are magic "sinkholes" around. -TRAP:"anti magic",random -TRAP:"anti magic",random -TRAP:"anti magic",random -TRAP:"anti magic",random -TRAP:"anti magic",random -TRAP:"anti magic",random -TRAP:"anti magic",random -# Random monsters. -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:'i',random,hostile -MONSTER:'j',random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:'j',random,hostile - -# -# The "goal" level for the quest. -# -# Here you meet Ixoth your nemesis monster. You have to -# defeat Ixoth in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Kni-goal", ' ' -GEOMETRY:center,center -MAP -....PPPP..PPP.. -.PPPPP...PP.. .......... ................................. -..PPPPP...P.. ........... ................................... -..PPP....... ........... ...................................... -...PPP....... ......... ............... ..................... -........... ............ ............ ...................... -............ ............. ....... ..................... -.............................. ......................... -............................... .................................. -............................. .................................... -......... ...................................................... -.....PP... ..................................................... -.....PPP.... .................................................... -......PPP.... .............. .................................... -.......PPP.... ............. ..................................... -........PP... ............ ...................................... -...PPP........ .......... .................................. -..PPPPP........ .......... .............................. -....PPPPP...... ......... .......................... -.......PPPP... -ENDMAP -# Dungeon Description -REGION:(00,00,14,19),lit,"ordinary" -REGION:(15,00,75,19),unlit,"ordinary" -# Stairs -STAIR:(03,08),up -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:('(',"mirror"),(50,06),blessed,0,name:"The Magic Mirror of Merlin" -OBJECT:random,(33,01) -OBJECT:random,(33,02) -OBJECT:random,(33,03) -OBJECT:random,(33,04) -OBJECT:random,(33,05) -OBJECT:random,(34,01) -OBJECT:random,(34,02) -OBJECT:random,(34,03) -OBJECT:random,(34,04) -OBJECT:random,(34,05) -OBJECT:random,(35,01) -OBJECT:random,(35,02) -OBJECT:random,(35,03) -OBJECT:random,(35,04) -OBJECT:random,(35,05) -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:"spiked pit",(13,07) -TRAP:"spiked pit",(12,08) -TRAP:"spiked pit",(12,09) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('D',"Ixoth"),(50,06),hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:('i',"quasit"),random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:('j',"ochre jelly"),random,hostile -MONSTER:'j',random,hostile - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -MAZE: "Kni-fila" , '.' -INIT_MAP: mines, '.' , 'P' , false , true , lit , false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('i', "quasit"), random, hostile -MONSTER: ('i', "quasit"), random, hostile -MONSTER: ('i', "quasit"), random, hostile -MONSTER: ('i', "quasit"), random, hostile -MONSTER: 'i', random, hostile -MONSTER: ('j', "ochre jelly"), random, hostile -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random - -MAZE: "Kni-filb" , '.' -INIT_MAP: mines, '.' , 'P' , false , true , lit , false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('i', "quasit"), random, hostile -MONSTER: ('i', "quasit"), random, hostile -MONSTER: ('i', "quasit"), random, hostile -MONSTER: ('i', "quasit"), random, hostile -MONSTER: 'i', random, hostile -MONSTER: ('j', "ochre jelly"), random, hostile -MONSTER: ('j', "ochre jelly"), random, hostile -MONSTER: ('j', "ochre jelly"), random, hostile -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random diff --git a/dat/Mon-fila.lua b/dat/Mon-fila.lua new file mode 100644 index 000000000..c62801a83 --- /dev/null +++ b/dat/Mon-fila.lua @@ -0,0 +1,61 @@ +-- NetHack Monk Mon-fila.lua $NHDT-Date: 1652196006 2022/05/10 15:20:06 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- + +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster({ class = "E", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster({ class = "E", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster("xorn") + des.monster("earth elemental") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.monster({ class = "E", peaceful=0 }) + des.monster("earth elemental") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster({ class = "X", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.monster("earth elemental") + end +}) + +des.random_corridors() diff --git a/dat/Mon-filb.lua b/dat/Mon-filb.lua new file mode 100644 index 000000000..98e98f12d --- /dev/null +++ b/dat/Mon-filb.lua @@ -0,0 +1,60 @@ +-- NetHack Monk Mon-filb.lua $NHDT-Date: 1652196006 2022/05/10 15:20:06 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- + +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster({ class = "X", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster({ class = "X", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster({ class = "E", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.monster({ class = "E", peaceful=0 }) + des.monster("earth elemental") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster({ class = "X", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.monster("earth elemental") + end +}) + +des.random_corridors() diff --git a/dat/Mon-goal.lua b/dat/Mon-goal.lua new file mode 100644 index 000000000..c19bfef54 --- /dev/null +++ b/dat/Mon-goal.lua @@ -0,0 +1,75 @@ +-- NetHack Monk Mon-goal.lua $NHDT-Date: 1652196007 2022/05/10 15:20:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.level_init({ style="mines", fg="L", bg=".", smoothed=false, joined=false, lit=0, walled=false }) + +des.map([[ +xxxxxx..xxxxxx...xxxxxxxxx +xxxx......xx......xxxxxxxx +xx.xx.............xxxxxxxx +x....................xxxxx +......................xxxx +......................xxxx +xx........................ +xxx......................x +xxx................xxxxxxx +xxxx.....x.xx.......xxxxxx +xxxxx...xxxxxx....xxxxxxxx +]]); +-- Dungeon Description +local place = { {14,04},{13,07} } +local placeidx = math.random(1, #place); + +des.region(selection.area(00,00,25,10), "unlit") +-- Stairs +des.stair("up", 20,05) +-- Objects +des.object({ id = "lenses", coord = place[placeidx], buc="blessed", spe=0, name="The Eyes of the Overworld" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap() +des.trap() +-- Random monsters. +des.monster("Master Kaen",place[placeidx]) +des.altar({ coord = place[placeidx], align="noalign", type="altar" }) +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") diff --git a/dat/Mon-loca.lua b/dat/Mon-loca.lua new file mode 100644 index 000000000..598b364eb --- /dev/null +++ b/dat/Mon-loca.lua @@ -0,0 +1,98 @@ +-- NetHack Monk Mon-loca.lua $NHDT-Date: 1652196007 2022/05/10 15:20:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +-- 1 2 3 4 5 6 7 +--123456789012345678901234567890123456789012345678901234567890123456789012345 +des.map([[ + ---------------------------------------------------- -------- + ---.................................................- --.....| + ---...--------........------........................--- ---...| + ---.....- --.......- ----..................---- --.-- + ---.....---- --------- --..................-- --..| + ---...----- ----.----.....----.....--- --..|| +----..---- -----..--- |...--- |.......--- --...| +|...--- ----....--- |.--- |.........-- --...|| +|...- ----.....--- ---- |..........---....| +|...---- ----......--- | |...|.......-....|| +|......----- ---.........- | -----...|............| +|..........----- ----...........--- -------......||...........|| +|..............-----................--- |............|||..........| +|-S----...............................--- |...........|| |.........|| +|.....|..............------.............-----..........|| ||........| +|.....|.............-- ---.........................|| |.......|| +|.....|.............- ---.....................--| ||......| +|---S--------.......---- --.................---- |.....|| +|...........|..........--------..............----- ||....| +|...........|............................----- |....| +------------------------------------------ ------ +]]); +-- Random Monsters + +-- Dungeon Description +des.region(selection.area(00,00,75,20), "lit") +-- Stairs +des.stair("up") +des.stair("down") +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,20)) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- since vegetarian monks shouldn't eat giant corpses, give a chance for +-- Str boost that isn't throttled by exercise restrictions; +-- make a modest effort (Elbereth only) to prevent xorns from eating the tins +local tinplace = selection.negate():filter_mapchar('.') +local tinloc = tinplace:rndcoord(0) +des.object({ id="tin", coord=tinloc, quantity=2, buc="blessed", + montype="spinach" }) +des.engraving({ coord=tinloc, type="burn", text="Elbereth" }) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("earth elemental") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") +des.monster("xorn") diff --git a/dat/Mon-strt.lua b/dat/Mon-strt.lua new file mode 100644 index 000000000..0396c56f7 --- /dev/null +++ b/dat/Mon-strt.lua @@ -0,0 +1,108 @@ +-- NetHack Monk Mon-strt.lua $NHDT-Date: 1652196007 2022/05/10 15:20:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, the Grand Master +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +............................................................................ +............................................................................ +............................................................................ +....................------------------------------------.................... +....................|................|.....|.....|.....|.................... +....................|..------------..|--+-----+-----+--|.................... +....................|..|..........|..|.................|.................... +....................|..|..........|..|+---+---+-----+--|.................... +..................---..|..........|......|...|...|.....|.................... +..................+....|..........+......|...|...|.....|.................... +..................+....|..........+......|...|...|.....|.................... +..................---..|..........|......|...|...|.....|.................... +....................|..|..........|..|+-----+---+---+--|.................... +....................|..|..........|..|.................|.................... +....................|..------------..|--+-----+-----+--|.................... +....................|................|.....|.....|.....|.................... +....................------------------------------------.................... +............................................................................ +............................................................................ +............................................................................ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region({ region={24,06, 33,13}, lit=1, type="temple" }) + +des.replace_terrain({ region={00,00, 10,19}, fromterrain=".", toterrain="T", chance=10 }) +des.replace_terrain({ region={65,00, 75,19}, fromterrain=".", toterrain="T", chance=10 }) + +local spacelocs = selection.floodfill(05,04); + +-- Portal arrival point +des.terrain({05,04}, ".") +des.levregion({ region = {05,04,05,04}, type="branch" }) +-- Stairs +des.stair("down", 52,09) +-- Doors +des.door("locked",18,09) +des.door("locked",18,10) +des.door("closed",34,09) +des.door("closed",34,10) +des.door("closed",40,05) +des.door("closed",46,05) +des.door("closed",52,05) +des.door("locked",38,07) +des.door("closed",42,07) +des.door("closed",46,07) +des.door("closed",52,07) +des.door("locked",38,12) +des.door("closed",44,12) +des.door("closed",48,12) +des.door("closed",52,12) +des.door("closed",40,14) +des.door("closed",46,14) +des.door("closed",52,14) +-- Unattended Altar - unaligned due to conflict - player must align it. +des.altar({ x=28,y=09, align="noalign", type="altar" }) +-- The Grand Master +des.monster({ id = "Grand Master", coord = {28, 10}, inventory = function() + des.object({ id = "robe", spe = 6 }); +end }) +-- No treasure chest! +-- guards for the audience chamber +des.monster("abbot", 32, 07) +des.monster("abbot", 32, 08) +des.monster("abbot", 32, 11) +des.monster("abbot", 32, 12) +des.monster("abbot", 33, 07) +des.monster("abbot", 33, 08) +des.monster("abbot", 33, 11) +des.monster("abbot", 33, 12) +-- Non diggable walls +des.non_diggable(selection.area(18,03,55,16)) +-- Random traps +for i = 1, 2 do + des.trap("dart", spacelocs:rndcoord(1)) +end +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +for i = 1, 8 do + des.monster("earth elemental", spacelocs:rndcoord(1)) +end +for i = 1, 4 do + des.monster("xorn", spacelocs:rndcoord(1)) +end +-- next to leader, so possibly tricky to pick up if not ready for quest yet; +-- there's no protection against a xorn eating these tins; BUC state is random +des.object({ id="tin", coord = {29, 9}, quantity=2, montype="spinach" }) +-- ensure enough vegetarian food generates for vegetarian games +des.object({ id="food ration", coord = {46, 4}, quantity = 4}) diff --git a/dat/Monk.des b/dat/Monk.des deleted file mode 100644 index 5b1ba7caa..000000000 --- a/dat/Monk.des +++ /dev/null @@ -1,378 +0,0 @@ -# NetHack 3.6 Monk.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991-2 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, the Grand Master -# and receive your quest assignment. -# -MAZE: "Mon-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -............................................................................ -............................................................................ -............................................................................ -....................------------------------------------.................... -....................|................|.....|.....|.....|.................... -....................|..------------..|--+-----+-----+--|.................... -....................|..|..........|..|.................|.................... -....................|..|..........|..|+---+---+-----+--|.................... -..................---..|..........|......|...|...|.....|.................... -..................+....|..........+......|...|...|.....|.................... -..................+....|..........+......|...|...|.....|.................... -..................---..|..........|......|...|...|.....|.................... -....................|..|..........|..|+-----+---+---+--|.................... -....................|..|..........|..|.................|.................... -....................|..------------..|--+-----+-----+--|.................... -....................|................|.....|.....|.....|.................... -....................------------------------------------.................... -............................................................................ -............................................................................ -............................................................................ -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(24,06,33,13),lit,"temple" - -REPLACE_TERRAIN:(0,0,10,19),'.','T',10% -REPLACE_TERRAIN:(65,0,75,19),'.','T',10% - -# Portal arrival point -TERRAIN:(05,04),'.' -BRANCH:(05,04,05,04),(0,0,0,0) -# Stairs -STAIR:(52,09),down -# Doors -DOOR:locked,(18,09) -DOOR:locked,(18,10) -DOOR:closed,(34,09) -DOOR:closed,(34,10) -DOOR:closed,(40,05) -DOOR:closed,(46,05) -DOOR:closed,(52,05) -DOOR:locked,(38,07) -DOOR:closed,(42,07) -DOOR:closed,(46,07) -DOOR:closed,(52,07) -DOOR:locked,(38,12) -DOOR:closed,(44,12) -DOOR:closed,(48,12) -DOOR:closed,(52,12) -DOOR:closed,(40,14) -DOOR:closed,(46,14) -DOOR:closed,(52,14) -# Unattended Altar - unaligned due to conflict - player must align it. -ALTAR:(28,09),noalign,altar -# The Grand Master -MONSTER:('@',"Grand Master"),(28,10) -# No treasure chest! -# guards for the audience chamber -MONSTER:('@',"abbot"),(32,07) -MONSTER:('@',"abbot"),(32,08) -MONSTER:('@',"abbot"),(32,11) -MONSTER:('@',"abbot"),(32,12) -MONSTER:('@',"abbot"),(33,07) -MONSTER:('@',"abbot"),(33,08) -MONSTER:('@',"abbot"),(33,11) -MONSTER:('@',"abbot"),(33,12) -# Non diggable walls -NON_DIGGABLE:(18,03,55,16) -# Random traps -TRAP:"dart",(20,09) -TRAP:"dart",(20,10) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: ('E',"earth elemental"),(37,01) -MONSTER: ('E',"earth elemental"),(37,18) -MONSTER: ('E',"earth elemental"),(03,03) -MONSTER: ('E',"earth elemental"),(65,04) -MONSTER: ('E',"earth elemental"),(12,11) -MONSTER: ('E',"earth elemental"),(60,12) -MONSTER: ('E',"earth elemental"),(14,08) -MONSTER: ('E',"earth elemental"),(55,00) -MONSTER: ('X',"xorn"),(18,18) -MONSTER: ('X',"xorn"),(59,10) -MONSTER: ('X',"xorn"),(13,09) -MONSTER: ('X',"xorn"),(01,17) - -# -# The "locate" level for the quest. -# -# Here you have to locate the Monastery of the Earth-Lord to -# go further towards your assigned quest. -# - -MAZE: "Mon-loca",' ' -GEOMETRY:center,center -# 1 2 3 4 5 6 7 -#123456789012345678901234567890123456789012345678901234567890123456789012345 -MAP - ---------------------------------------------------- -------- - ---.................................................- --.....| - ---...--------........------........................--- ---...| - ---.....- --.......- ----..................---- --.-- - ---.....---- --------- --..................-- --..| - ---...----- ----.----.....----.....--- --..|| -----..---- -----..--- |...--- |.......--- --...| -|...--- ----....--- |.--- |.........-- --...|| -|...- ----.....--- ---- |..........---....| -|...---- ----......--- | |...|.......-....|| -|......----- ---.........- | -----...|............| -|..........----- ----...........--- -------......||...........|| -|..............-----................--- |............|||..........| -|-S----...............................--- |...........|| |.........|| -|.....|..............------.............-----..........|| ||........| -|.....|.............-- ---.........................|| |.......|| -|.....|.............- ---.....................--| ||......| -|---S--------.......---- --.................---- |.....|| -|...........|..........--------..............----- ||....| -|...........|............................----- |....| ------------------------------------------- ------ -ENDMAP -# Random Monsters -$monster = monster: { 'E', 'X' } -SHUFFLE: $monster - -# Dungeon Description -REGION:(00,00,75,20),lit,"ordinary" -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,75,20) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random - -# -# The "goal" level for the quest. -# -# Here you meet Master Kaen, your nemesis monster. You have to -# defeat Master Kaen in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Mon-goal", ' ' -INIT_MAP: mines, 'L' , '.' , false , false , unlit , false -GEOMETRY:center,center -MAP -xxxxxx..xxxxxx...xxxxxxxxx -xxxx......xx......xxxxxxxx -xx.xx.............xxxxxxxx -x....................xxxxx -......................xxxx -......................xxxx -xx........................ -xxx......................x -xxx................xxxxxxx -xxxx.....x.xx.......xxxxxx -xxxxx...xxxxxx....xxxxxxxx -ENDMAP -# Dungeon Description -$place = { (14,04),(13,07) } -SHUFFLE: $place - -REGION:(00,00,25,10),unlit,"ordinary" -# Stairs -STAIR:(20,05),up -# Objects -OBJECT:('(',"lenses"),$place[0],blessed,0,name:"The Eyes of the Overworld" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"Master Kaen"),$place[0] -ALTAR:$place[0],noalign,altar -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('E',"earth elemental"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random -MONSTER: ('X',"xorn"),random - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "fila" is the upper filler, between the -# start and locate levels, and "filb" the lower between the locate -# and goal levels. -# - -LEVEL: "Mon-fila" -# Random Monsters -$monster = monster: { 'E', 'X' } -SHUFFLE: $monster - -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: 'E', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: 'E', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: ('X', "xorn"), random - MONSTER: ('E', "earth elemental"), random -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: 'E', random, hostile - MONSTER: ('E', "earth elemental"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: 'X', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: ('E', "earth elemental"), random -} - -RANDOM_CORRIDORS - -LEVEL: "Mon-filb" -# Random Monsters -$monster = monster: { 'E', 'X' } -SHUFFLE: $monster - -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: 'X', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: 'X', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: 'E', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: 'E', random, hostile - MONSTER: ('E', "earth elemental"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: 'X', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: ('E', "earth elemental"), random -} - -RANDOM_CORRIDORS - diff --git a/dat/Pri-fila.lua b/dat/Pri-fila.lua new file mode 100644 index 000000000..c65683cf1 --- /dev/null +++ b/dat/Pri-fila.lua @@ -0,0 +1,55 @@ +-- NetHack Priest Pri-fila.lua $NHDT-Date: 1652196008 2022/05/10 15:20:08 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster("human zombie") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster("human zombie") + end +}) + +des.room({ type = "morgue", + contents = function() + des.stair("down") + des.object() + des.trap() + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster("wraith") + end +}) + +des.room({ type = "morgue", + contents = function() + des.object() + des.trap() + end +}) + +des.random_corridors() diff --git a/dat/Pri-filb.lua b/dat/Pri-filb.lua new file mode 100644 index 000000000..ad0a84ec9 --- /dev/null +++ b/dat/Pri-filb.lua @@ -0,0 +1,62 @@ +-- NetHack Priest Pri-filb.lua $NHDT-Date: 1652196008 2022/05/10 15:20:08 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- + +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster("human zombie") + des.monster("wraith") + end +}) + +des.room({ type = "morgue", + contents = function() + des.object() + des.object() + des.object() + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster("human zombie") + des.monster("wraith") + end +}) + +des.room({ type = "morgue", + contents = function() + des.stair("down") + des.object() + des.object() + des.trap() + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster("human zombie") + des.monster("wraith") + end +}) + + +des.room({ type = "morgue", + contents = function() + des.object() + des.trap() + end +}) + +des.random_corridors() diff --git a/dat/Pri-goal.lua b/dat/Pri-goal.lua new file mode 100644 index 000000000..1e29d9713 --- /dev/null +++ b/dat/Pri-goal.lua @@ -0,0 +1,84 @@ +-- NetHack Priest Pri-goal.lua $NHDT-Date: 1687033651 2023/06/17 20:27:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.level_init({ style="mines", fg="L", bg=".", smoothed=false, joined=false, lit=0, walled=false }) + +des.map([[ +xxxxxx..xxxxxx...xxxxxxxxx +xxxx......xx......xxxxxxxx +xx.xx.............xxxxxxxx +x....................xxxxx +......................xxxx +......................xxxx +xx........................ +xxx......................x +xxx................xxxxxxx +xxxx.....x.xx.......xxxxxx +xxxxx...xxxxxx....xxxxxxxx +]]); +-- Dungeon Description +local place = { {14,04}, {13,07} } +local placeidx = math.random(1, #place); + +des.region(selection.area(00,00,25,10), "unlit") +-- Stairs +des.stair("up", 20,05) +-- Objects [note: eroded=-1 => obj->oerodeproof=1] +des.object({ id = "helm of brilliance", coord = place[placeidx], + buc="blessed", spe=0, eroded=-1, name="The Mitre of Holiness" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap() +des.trap() +-- Random monsters. +des.monster("Nalzok",place[placeidx]) +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("human zombie") +des.monster("Z") +des.monster("Z") +des.monster("wraith") +des.monster("wraith") +des.monster("wraith") +des.monster("wraith") +des.monster("wraith") +des.monster("wraith") +des.monster("wraith") +des.monster("wraith") +des.monster("W") diff --git a/dat/Pri-loca.lua b/dat/Pri-loca.lua new file mode 100644 index 000000000..6c8909721 --- /dev/null +++ b/dat/Pri-loca.lua @@ -0,0 +1,73 @@ +-- NetHack Priest Pri-loca.lua $NHDT-Date: 1652196009 2022/05/10 15:20:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor", "noflip") +-- This is a kludge to init the level as a lit field. +des.level_init({ style="mines", fg=".", bg=".", smoothed=false, joined=false, lit=1, walled=false }) + +des.map([[ +........................................ +........................................ +..........----------+----------......... +..........|........|.|........|......... +..........|........|.|........|......... +..........|----.----.----.----|......... +..........+...................+......... +..........+...................+......... +..........|----.----.----.----|......... +..........|........|.|........|......... +..........|........|.|........|......... +..........----------+----------......... +........................................ +........................................ +]]); +-- Dungeon Description +des.region({ region={00,00, 09,13}, lit=0, type="morgue", filled=1 }) +des.region({ region={09,00, 30,01}, lit=0, type="morgue", filled=1 }) +des.region({ region={09,12, 30,13}, lit=0, type="morgue", filled=1 }) +des.region({ region={31,00, 39,13}, lit=0, type="morgue", filled=1 }) +des.region({ region={11,03, 29,10}, lit=1, type="temple", filled=1, irregular=1 }) +-- The altar inside the temple +des.altar({ x=20,y=07, align="noalign", type="shrine" }) +des.monster({ id = "aligned cleric", x=20, y=07, align="noalign", peaceful = 0 }) +-- Doors +des.door("locked",10,06) +des.door("locked",10,07) +des.door("locked",20,02) +des.door("locked",20,11) +des.door("locked",30,06) +des.door("locked",30,07) +-- Stairs +-- Note: The up stairs are *intentionally* off of the map. +des.stair("up", 43,05) +des.stair("down", 20,06) +-- Non diggable walls +des.non_diggable(selection.area(10,02,30,13)) +-- Objects (inside the antechambers). +des.object({ coord = { 14, 03 } }) +des.object({ coord = { 15, 03 } }) +des.object({ coord = { 16, 03 } }) +des.object({ coord = { 14, 10 } }) +des.object({ coord = { 15, 10 } }) +des.object({ coord = { 16, 10 } }) +des.object({ coord = { 17, 10 } }) +des.object({ coord = { 24, 03 } }) +des.object({ coord = { 25, 03 } }) +des.object({ coord = { 26, 03 } }) +des.object({ coord = { 27, 03 } }) +des.object({ coord = { 24, 10 } }) +des.object({ coord = { 25, 10 } }) +des.object({ coord = { 26, 10 } }) +des.object({ coord = { 27, 10 } }) +-- Random traps +des.trap({ coord = { 15,04 } }) +des.trap({ coord = { 25,04 } }) +des.trap({ coord = { 15,09 } }) +des.trap({ coord = { 25,09 } }) +des.trap() +des.trap() +-- No random monsters - the morgue generation will put them in. diff --git a/dat/Pri-strt.lua b/dat/Pri-strt.lua new file mode 100644 index 000000000..29edb6d15 --- /dev/null +++ b/dat/Pri-strt.lua @@ -0,0 +1,102 @@ +-- NetHack Priest Pri-strt.lua $NHDT-Date: 1652196009 2022/05/10 15:20:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, High Priest +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +............................................................................ +............................................................................ +............................................................................ +....................------------------------------------.................... +....................|................|.....|.....|.....|.................... +....................|..------------..|--+-----+-----+--|.................... +....................|..|..........|..|.................|.................... +....................|..|..........|..|+---+---+-----+--|.................... +..................---..|..........|......|...|...|.....|.................... +..................+....|..........+......|...|...|.....|.................... +..................+....|..........+......|...|...|.....|.................... +..................---..|..........|......|...|...|.....|.................... +....................|..|..........|..|+-----+---+---+--|.................... +....................|..|..........|..|.................|.................... +....................|..------------..|--+-----+-----+--|.................... +....................|................|.....|.....|.....|.................... +....................------------------------------------.................... +............................................................................ +............................................................................ +............................................................................ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region({ region={24,06, 33,13}, lit=1, type="temple", filled=2 }) + +des.replace_terrain({ region={00,00, 10,19}, fromterrain=".", toterrain="T", chance=10 }) +des.replace_terrain({ region={65,00, 75,19}, fromterrain=".", toterrain="T", chance=10 }) +des.terrain({05,04}, ".") + +local spacelocs = selection.floodfill(05,04); + +-- Portal arrival point +des.levregion({ region = {05,04,05,04}, type="branch" }) +-- Stairs +des.stair("down", 52,09) +-- Doors +des.door("locked",18,09) +des.door("locked",18,10) +des.door("closed",34,09) +des.door("closed",34,10) +des.door("closed",40,05) +des.door("closed",46,05) +des.door("closed",52,05) +des.door("locked",38,07) +des.door("closed",42,07) +des.door("closed",46,07) +des.door("closed",52,07) +des.door("locked",38,12) +des.door("closed",44,12) +des.door("closed",48,12) +des.door("closed",52,12) +des.door("closed",40,14) +des.door("closed",46,14) +des.door("closed",52,14) +-- Unattended Altar - unaligned due to conflict - player must align it. +des.altar({ x=28, y=09, align="noalign", type="altar" }) +-- High Priest +des.monster({ id = "Arch Priest", coord = {28, 10}, inventory = function() + des.object({ id = "robe", spe = 4 }); + des.object({ id = "mace", spe = 4 }); +end }) +-- The treasure of High Priest +des.object("chest", 27, 10) +-- knight guards for the audience chamber +des.monster("acolyte", 32, 07) +des.monster("acolyte", 32, 08) +des.monster("acolyte", 32, 11) +des.monster("acolyte", 32, 12) +des.monster("acolyte", 33, 07) +des.monster("acolyte", 33, 08) +des.monster("acolyte", 33, 11) +des.monster("acolyte", 33, 12) +-- Non diggable walls +des.non_diggable(selection.area(18,03,55,16)) +-- Random traps +for i = 1, 2 do + des.trap("dart", spacelocs:rndcoord(1)) +end +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +for i = 1, 12 do + des.monster("human zombie", spacelocs:rndcoord(1)); +end diff --git a/dat/Priest.des b/dat/Priest.des deleted file mode 100644 index d6cfdcef5..000000000 --- a/dat/Priest.des +++ /dev/null @@ -1,356 +0,0 @@ -# NetHack 3.6 Priest.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991-2 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, High Priest -# and receive your quest assignment. -# -MAZE: "Pri-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -............................................................................ -............................................................................ -............................................................................ -....................------------------------------------.................... -....................|................|.....|.....|.....|.................... -....................|..------------..|--+-----+-----+--|.................... -....................|..|..........|..|.................|.................... -....................|..|..........|..|+---+---+-----+--|.................... -..................---..|..........|......|...|...|.....|.................... -..................+....|..........+......|...|...|.....|.................... -..................+....|..........+......|...|...|.....|.................... -..................---..|..........|......|...|...|.....|.................... -....................|..|..........|..|+-----+---+---+--|.................... -....................|..|..........|..|.................|.................... -....................|..------------..|--+-----+-----+--|.................... -....................|................|.....|.....|.....|.................... -....................------------------------------------.................... -............................................................................ -............................................................................ -............................................................................ -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(24,06,33,13),lit,"temple" - -REPLACE_TERRAIN:(0,0,10,19),'.','T',10% -REPLACE_TERRAIN:(65,0,75,19),'.','T',10% -TERRAIN:(05,04),'.' - -# Portal arrival point -BRANCH:(05,04,05,04),(0,0,0,0) -# Stairs -STAIR:(52,09),down -# Doors -DOOR:locked,(18,09) -DOOR:locked,(18,10) -DOOR:closed,(34,09) -DOOR:closed,(34,10) -DOOR:closed,(40,05) -DOOR:closed,(46,05) -DOOR:closed,(52,05) -DOOR:locked,(38,07) -DOOR:closed,(42,07) -DOOR:closed,(46,07) -DOOR:closed,(52,07) -DOOR:locked,(38,12) -DOOR:closed,(44,12) -DOOR:closed,(48,12) -DOOR:closed,(52,12) -DOOR:closed,(40,14) -DOOR:closed,(46,14) -DOOR:closed,(52,14) -# Unattended Altar - unaligned due to conflict - player must align it. -ALTAR:(28,09),noalign,altar -# High Priest -MONSTER:('@',"Arch Priest"),(28,10) -# The treasure of High Priest -OBJECT:('(',"chest"),(27,10) -# knight guards for the audience chamber -MONSTER:('@',"acolyte"),(32,07) -MONSTER:('@',"acolyte"),(32,08) -MONSTER:('@',"acolyte"),(32,11) -MONSTER:('@',"acolyte"),(32,12) -MONSTER:('@',"acolyte"),(33,07) -MONSTER:('@',"acolyte"),(33,08) -MONSTER:('@',"acolyte"),(33,11) -MONSTER:('@',"acolyte"),(33,12) -# Non diggable walls -NON_DIGGABLE:(18,03,55,16) -# Random traps -TRAP:"dart",(20,09) -TRAP:"dart",(20,10) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: ('Z',"human zombie"),(37,01) -MONSTER: ('Z',"human zombie"),(37,18) -MONSTER: ('Z',"human zombie"),(03,03) -MONSTER: ('Z',"human zombie"),(65,04) -MONSTER: ('Z',"human zombie"),(12,11) -MONSTER: ('Z',"human zombie"),(60,12) -MONSTER: ('Z',"human zombie"),(14,08) -MONSTER: ('Z',"human zombie"),(55,00) -MONSTER: ('Z',"human zombie"),(18,18) -MONSTER: ('Z',"human zombie"),(59,10) -MONSTER: ('Z',"human zombie"),(13,09) -MONSTER: ('Z',"human zombie"),(01,17) - -# -# The "locate" level for the quest. -# -# Here you have to locate the Temple of Nalzok to go -# further towards your assigned quest. -# - -MAZE: "Pri-loca",' ' -FLAGS: hardfloor -# This is a kludge to init the level as a lit field. -INIT_MAP: mines, '.' , '.' , false , false , lit , false -GEOMETRY:center,center -MAP -........................................ -........................................ -..........----------+----------......... -..........|........|.|........|......... -..........|........|.|........|......... -..........|----.----.----.----|......... -..........+...................+......... -..........+...................+......... -..........|----.----.----.----|......... -..........|........|.|........|......... -..........|........|.|........|......... -..........----------+----------......... -........................................ -........................................ -ENDMAP -# Dungeon Description -REGION:(00,00,09,13),unlit,"morgue" -REGION:(09,00,30,01),unlit,"morgue" -REGION:(09,12,30,13),unlit,"morgue" -REGION:(31,00,39,13),unlit,"morgue" -REGION:(11,03,29,10),lit,"temple",filled,irregular -# The altar inside the temple -ALTAR:(20,07),noalign,shrine -MONSTER:('@',"aligned priest"),(20,07),noalign,hostile -# Doors -DOOR:locked,(10,06) -DOOR:locked,(10,07) -DOOR:locked,(20,02) -DOOR:locked,(20,11) -DOOR:locked,(30,06) -DOOR:locked,(30,07) -# Stairs -# Note: The up stairs are *intentionally* off of the map. -STAIR:(43,05),up -STAIR:(20,06),down -# Non diggable walls -NON_DIGGABLE:(10,02,30,13) -# Objects (inside the antechambers). -OBJECT:random,(14,03) -OBJECT:random,(15,03) -OBJECT:random,(16,03) -OBJECT:random,(14,10) -OBJECT:random,(15,10) -OBJECT:random,(16,10) -OBJECT:random,(17,10) -OBJECT:random,(24,03) -OBJECT:random,(25,03) -OBJECT:random,(26,03) -OBJECT:random,(27,03) -OBJECT:random,(24,10) -OBJECT:random,(25,10) -OBJECT:random,(26,10) -OBJECT:random,(27,10) -# Random traps -TRAP:random,(15,04) -TRAP:random,(25,04) -TRAP:random,(15,09) -TRAP:random,(25,09) -TRAP:random,random -TRAP:random,random -# No random monsters - the morgue generation will put them in. - -# -# The "goal" level for the quest. -# -# Here you meet Nalzok your nemesis monster. You have to -# defeat Nalzok in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Pri-goal", ' ' -INIT_MAP: mines, 'L' , '.' , false , false , unlit , false -GEOMETRY:center,center -MAP -xxxxxx..xxxxxx...xxxxxxxxx -xxxx......xx......xxxxxxxx -xx.xx.............xxxxxxxx -x....................xxxxx -......................xxxx -......................xxxx -xx........................ -xxx......................x -xxx................xxxxxxx -xxxx.....x.xx.......xxxxxx -xxxxx...xxxxxx....xxxxxxxx -ENDMAP -# Dungeon Description -$place = { (14,04),(13,07) } -SHUFFLE: $place - -REGION:(00,00,25,10),unlit,"ordinary" -# Stairs -STAIR:(20,05),up -# Objects -OBJECT:('[',"helm of brilliance"),$place[0],blessed,0,name:"The Mitre of Holiness" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('&',"Nalzok"),$place[0] -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:('W',"wraith"),random -MONSTER:'W',random - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -LEVEL: "Pri-fila" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: ('Z', "human zombie"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: ('Z', "human zombie"), random -} - -ROOM: "morgue" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: ('W', "wraith"), random -} - -ROOM: "morgue" , random, random, random, random { - OBJECT: random, random - TRAP: random, random -} - -RANDOM_CORRIDORS - -LEVEL: "Pri-filb" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: ('Z', "human zombie"), random - MONSTER: ('W', "wraith"), random -} - -ROOM: "morgue" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - OBJECT: random,random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: ('Z', "human zombie"), random - MONSTER: ('W', "wraith"), random -} - -ROOM: "morgue" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - OBJECT: random, random - TRAP: random, random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: ('Z', "human zombie"), random - MONSTER: ('W', "wraith"), random -} - -ROOM: "morgue" , random, random, random, random { - OBJECT: random, random - TRAP: random, random -} - -RANDOM_CORRIDORS diff --git a/dat/Ran-fila.lua b/dat/Ran-fila.lua new file mode 100644 index 000000000..c9c02cfdd --- /dev/null +++ b/dat/Ran-fila.lua @@ -0,0 +1,35 @@ +-- NetHack Ranger Ran-fila.lua $NHDT-Date: 1652196009 2022/05/10 15:20:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg="T", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ class = "C", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) diff --git a/dat/Ran-filb.lua b/dat/Ran-filb.lua new file mode 100644 index 000000000..48275fa95 --- /dev/null +++ b/dat/Ran-filb.lua @@ -0,0 +1,39 @@ +-- NetHack Ranger Ran-filb.lua $NHDT-Date: 1652196010 2022/05/10 15:20:10 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ class = "C", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) diff --git a/dat/Ran-goal.lua b/dat/Ran-goal.lua new file mode 100644 index 000000000..a28b0c10b --- /dev/null +++ b/dat/Ran-goal.lua @@ -0,0 +1,106 @@ +-- NetHack Ranger Ran-goal.lua $NHDT-Date: 1652196010 2022/05/10 15:20:10 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ + + ... ... + .......................................................................... + ... + ... + . ............ ....... . ....... . + . ............................. . ........ .........S.. . + . ............ . ...... . . . ....... .. . + . ......... . .... + . ... . .. . + . S . ......... .S. .S............... . + . ... . ... . ......... . . + . ........ .....S.+.......+....\....+........+. . + . ... ... S ......... .. ..... . + . .. ......... .. ...... . + . ....... ... + .... .... .......... . + . .............. .. . ...... .. ............. . + . ............. . .......... ...... . + ... + ... + .......................................................................... + ... ... + +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +-- Stairs +des.stair("up", 19,10) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object({ id = "bow", x=37, y=10, buc="blessed", spe=0, name="The Longbow of Diana" }) +des.object("chest", 37, 10) +des.object({ coord = { 36, 09 } }) +des.object({ coord = { 36, 10 } }) +des.object({ coord = { 36, 11 } }) +des.object({ coord = { 37, 09 } }) +des.object({ coord = { 37, 11 } }) +des.object({ coord = { 38, 09 } }) +des.object({ coord = { 38, 10 } }) +des.object({ coord = { 38, 11 } }) +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- doors +des.door("locked",12,08) +des.door("closed",22,10) +des.door("locked",24,10) +des.door("closed",25,11) +des.door("closed",32,10) +des.door("closed",37,03) +des.door("closed",37,07) +des.door("closed",37,13) +des.door("closed",37,16) +des.door("closed",42,10) +des.door("locked",46,08) +des.door("closed",51,10) +des.door("locked",53,08) +des.door("closed",65,05) +-- Random monsters. +des.monster({ id = "Scorpius", x=37, y=10, peaceful=0 }) +des.monster({ id = "forest centaur", x=36, y=09, peaceful=0 }) +des.monster({ id = "forest centaur", x=36, y=10, peaceful=0 }) +des.monster({ id = "forest centaur", x=36, y=11, peaceful=0 }) +des.monster({ id = "forest centaur", x=37, y=09, peaceful=0 }) +des.monster({ id = "forest centaur", x=37, y=11, peaceful=0 }) +des.monster({ id = "forest centaur", x=38, y=09, peaceful=0 }) +des.monster({ id = "mountain centaur", x=38, y=10, peaceful=0 }) +des.monster({ id = "mountain centaur", x=38, y=11, peaceful=0 }) +des.monster({ id = "mountain centaur", x=02, y=02, peaceful=0 }) +des.monster({ id = "mountain centaur", x=71, y=02, peaceful=0 }) +des.monster({ id = "mountain centaur", x=02, y=16, peaceful=0 }) +des.monster({ id = "mountain centaur", x=71, y=16, peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ class = "C", peaceful=0 }) +des.monster({ class = "C", peaceful=0 }) +des.monster({ id = "scorpion", x=03, y=02, peaceful=0 }) +des.monster({ id = "scorpion", x=72, y=02, peaceful=0 }) +des.monster({ id = "scorpion", x=03, y=17, peaceful=0 }) +des.monster({ id = "scorpion", x=72, y=17, peaceful=0 }) +des.monster({ id = "scorpion", x=41, y=10, peaceful=0 }) +des.monster({ id = "scorpion", x=33, y=09, peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ class = "s", peaceful=0 }) + +des.wallify() diff --git a/dat/Ran-loca.lua b/dat/Ran-loca.lua new file mode 100644 index 000000000..386c3e785 --- /dev/null +++ b/dat/Ran-loca.lua @@ -0,0 +1,79 @@ +-- NetHack Ranger Ran-loca.lua $NHDT-Date: 1652196010 2022/05/10 15:20:10 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") +--1234567890123456789012345678901234567890123456789012345678901234567890 +des.map([[ + ....... ......... ....... + ................... ................... + .... ....... ....... .... +... ..... . ..... . ..... ... +. .......... ..... ........... ..... .......... . +. .. ..... .......... ..... .......... ..... .. . +. . . ..... . ..... . . . +. . ..... ............. ..... . . +. . ................ ....... ................ . . +. . ..... ....... ..... . . +. . . ...... ...... . . . +. . ........... ......... ........... . . +. . .......... .......... . . +. .. ..... . ..... . ..... .. . +. .......... ..... ........... ..... .......... . +. ..... .......... ..... .......... ..... . +. . ..... . ..... . . +... ....... ....... ....... ... + .............. ............. .............. + ....... ....... ....... ....... ....... +]]); +-- Dungeon Description +des.region(selection.area(00,00,54,19), "lit") +-- Stairs +des.stair("up", 25,05) +des.stair("down", 27,18) +-- Non diggable walls +des.non_diggable(selection.area(00,00,54,19)) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap("spiked pit") +des.trap("spiked pit") +des.trap("teleport") +des.trap("teleport") +des.trap("arrow") +des.trap("arrow") +-- Random monsters. +des.monster({ id = "wumpus", x=27, y=18, peaceful=0, asleep=1 }) +des.monster({ id = "giant bat", peaceful=0 }) +des.monster({ id = "giant bat", peaceful=0 }) +des.monster({ id = "giant bat", peaceful=0 }) +des.monster({ id = "giant bat", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "forest centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "mountain centaur", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ class = "s", peaceful=0 }) +des.monster({ class = "s", peaceful=0 }) + diff --git a/dat/Ran-strt.lua b/dat/Ran-strt.lua new file mode 100644 index 000000000..8628bcc39 --- /dev/null +++ b/dat/Ran-strt.lua @@ -0,0 +1,101 @@ +-- NetHack Ranger Ran-strt.lua $NHDT-Date: 1652196011 2022/05/10 15:20:11 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Orion, +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = "." }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "arboreal") + +des.level_init({ style="mines", fg=".", bg=".", smoothed=true, joined=true, lit=1, walled=false }) +des.replace_terrain({ region={00,00, 76,19}, fromterrain=".", toterrain="T", chance=5 }) +--1234567890123456789012345678901234567890123456789012345678901234567890 +des.map({ halign = "left", valign = "center", map = [[ + xx + ................................... x + .. .. + .. ...............F............... .. + . .. .F. .. . + . .. .............F............. .. . + . . .. .. . . + . . .. ....................... .. ... + . . . .. .. . + ... . .. .|..................... ...... + FFF . . ..S.................. + ... . .. .|................. .... ... + . . . .. .. . . . + . . .. ....................... .. . . + . . .. .. . . + . .. .............F............. .. . + . .. .F. .. . + .. ...............F............... .. + .. .. + ................................... x + xx +]] }); +-- Dungeon Description +des.region(selection.area(00,00,40,20), "lit") +-- Stairs +des.stair("down", 10,10) +-- Portal arrival point; just about anywhere on the right hand side of the map +des.levregion({ region = {51,2,77,18}, region_islev = 1, type="branch" }) +-- Orion +des.monster({ id = "Orion", coord = {20, 10}, inventory = function() + des.object({ id = "leather armor", spe = 4 }); + des.object({ id = "yumi", spe = 4 }); + des.object({ id = "ya", spe = 4, quantity = 50 }); +end }) +-- The treasure of Orion +des.object("chest", 20, 10) +-- Guards for the audience chamber +des.monster("hunter", 19, 09) +des.monster("hunter", 20, 09) +des.monster("hunter", 21, 09) +des.monster("hunter", 19, 10) +des.monster("hunter", 21, 10) +des.monster("hunter", 19, 11) +des.monster("hunter", 20, 11) +des.monster("hunter", 21, 11) +-- Non diggable walls +des.non_diggable(selection.area(00,00,40,20)) +-- Traps +des.trap("arrow",30,09) +des.trap("arrow",30,10) +des.trap("pit",40,09) +des.trap("spiked pit") +des.trap("bear") +des.trap("bear") +-- Monsters on siege duty. +des.monster({ id = "minotaur", x=33, y=09, peaceful=0, asleep=1 }) +des.monster({ id = "forest centaur", x=19, y=03, peaceful=0 }) +des.monster({ id = "forest centaur", x=19, y=04, peaceful=0 }) +des.monster({ id = "forest centaur", x=19, y=05, peaceful=0 }) +des.monster({ id = "forest centaur", x=21, y=03, peaceful=0 }) +des.monster({ id = "forest centaur", x=21, y=04, peaceful=0 }) +des.monster({ id = "forest centaur", x=21, y=05, peaceful=0 }) +des.monster({ id = "forest centaur", x=01, y=09, peaceful=0 }) +des.monster({ id = "forest centaur", x=02, y=09, peaceful=0 }) +des.monster({ id = "forest centaur", x=03, y=09, peaceful=0 }) +des.monster({ id = "forest centaur", x=01, y=11, peaceful=0 }) +des.monster({ id = "forest centaur", x=02, y=11, peaceful=0 }) +des.monster({ id = "forest centaur", x=03, y=11, peaceful=0 }) +des.monster({ id = "forest centaur", x=19, y=15, peaceful=0 }) +des.monster({ id = "forest centaur", x=19, y=16, peaceful=0 }) +des.monster({ id = "forest centaur", x=19, y=17, peaceful=0 }) +des.monster({ id = "forest centaur", x=21, y=15, peaceful=0 }) +des.monster({ id = "forest centaur", x=21, y=16, peaceful=0 }) +des.monster({ id = "forest centaur", x=21, y=17, peaceful=0 }) +des.monster({ id = "plains centaur", peaceful=0 }) +des.monster({ id = "plains centaur", peaceful=0 }) +des.monster({ id = "plains centaur", peaceful=0 }) +des.monster({ id = "plains centaur", peaceful=0 }) +des.monster({ id = "plains centaur", peaceful=0 }) +des.monster({ id = "plains centaur", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) +des.monster({ id = "scorpion", peaceful=0 }) diff --git a/dat/Ranger.des b/dat/Ranger.des deleted file mode 100644 index aa081cfe8..000000000 --- a/dat/Ranger.des +++ /dev/null @@ -1,356 +0,0 @@ -# NetHack 3.6 Ranger.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Orion, -# and receive your quest assignment. -# -MAZE: "Ran-strt",'.' -FLAGS: noteleport,hardfloor,arboreal -INIT_MAP:mines,'.','.',true,true,lit,false -REPLACE_TERRAIN:(0,0,76,19),'.', 'T', 5% -GEOMETRY:left,center -#1234567890123456789012345678901234567890123456789012345678901234567890 -MAP - xx - ................................... x - .. .. - .. ...............F............... .. - . .. .F. .. . - . .. .............F............. .. . - . . .. .. . . - . . .. ....................... .. ... - . . . .. .. . - ... . .. .|..................... ...... - FFF . . ..S.................. - ... . .. .|................. .... ... - . . . .. .. . . . - . . .. ....................... .. . . - . . .. .. . . - . .. .............F............. .. . - . .. .F. .. . - .. ...............F............... .. - .. .. - ................................... x - xx -ENDMAP -# Dungeon Description -REGION:(00,00,40,20),lit,"ordinary" -# Stairs -STAIR:(10,10),down -# Portal arrival point; just about anywhere on the right hand side of the map -BRANCH:levregion(51,2,77,18),(0,0,40,20) -# Orion -MONSTER:('@',"Orion"),(20,10) -# The treasure of Orion -OBJECT:('(',"chest"),(20,10) -# Guards for the audience chamber -MONSTER:('@',"hunter"),(19,09) -MONSTER:('@',"hunter"),(20,09) -MONSTER:('@',"hunter"),(21,09) -MONSTER:('@',"hunter"),(19,10) -MONSTER:('@',"hunter"),(21,10) -MONSTER:('@',"hunter"),(19,11) -MONSTER:('@',"hunter"),(20,11) -MONSTER:('@',"hunter"),(21,11) -# Non diggable walls -NON_DIGGABLE:(00,00,40,20) -# Traps -TRAP:"arrow",(30,09) -TRAP:"arrow",(30,10) -TRAP:"pit",(40,09) -TRAP:"spiked pit",random -TRAP:"bear",random -TRAP:"bear",random -# Monsters on siege duty. -MONSTER: ('H',"minotaur"),(33,09),hostile,asleep -MONSTER: ('C',"forest centaur"),(19,03),hostile -MONSTER: ('C',"forest centaur"),(19,04),hostile -MONSTER: ('C',"forest centaur"),(19,05),hostile -MONSTER: ('C',"forest centaur"),(21,03),hostile -MONSTER: ('C',"forest centaur"),(21,04),hostile -MONSTER: ('C',"forest centaur"),(21,05),hostile -MONSTER: ('C',"forest centaur"),(01,09),hostile -MONSTER: ('C',"forest centaur"),(02,09),hostile -MONSTER: ('C',"forest centaur"),(03,09),hostile -MONSTER: ('C',"forest centaur"),(01,11),hostile -MONSTER: ('C',"forest centaur"),(02,11),hostile -MONSTER: ('C',"forest centaur"),(03,11),hostile -MONSTER: ('C',"forest centaur"),(19,15),hostile -MONSTER: ('C',"forest centaur"),(19,16),hostile -MONSTER: ('C',"forest centaur"),(19,17),hostile -MONSTER: ('C',"forest centaur"),(21,15),hostile -MONSTER: ('C',"forest centaur"),(21,16),hostile -MONSTER: ('C',"forest centaur"),(21,17),hostile -MONSTER: ('C',"plains centaur"),random,hostile -MONSTER: ('C',"plains centaur"),random,hostile -MONSTER: ('C',"plains centaur"),random,hostile -MONSTER: ('C',"plains centaur"),random,hostile -MONSTER: ('C',"plains centaur"),random,hostile -MONSTER: ('C',"plains centaur"),random,hostile -MONSTER: ('s',"scorpion"),random,hostile -MONSTER: ('s',"scorpion"),random,hostile - - -# -# The "locate" level for the quest. -# -# Here you have to infiltrate the Cave of the Wumpus to go -# further towards your assigned quest. -# - -MAZE: "Ran-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -#1234567890123456789012345678901234567890123456789012345678901234567890 -MAP - ....... ......... ....... - ................... ................... - .... ....... ....... .... -... ..... . ..... . ..... ... -. .......... ..... ........... ..... .......... . -. .. ..... .......... ..... .......... ..... .. . -. . . ..... . ..... . . . -. . ..... ............. ..... . . -. . ................ ....... ................ . . -. . ..... ....... ..... . . -. . . ...... ...... . . . -. . ........... ......... ........... . . -. . .......... .......... . . -. .. ..... . ..... . ..... .. . -. .......... ..... ........... ..... .......... . -. ..... .......... ..... .......... ..... . -. . ..... . ..... . . -... ....... ....... ....... ... - .............. ............. .............. - ....... ....... ....... ....... ....... -ENDMAP -# Dungeon Description -REGION:(00,00,54,19),lit,"ordinary" -# Stairs -STAIR:(25,05),up -STAIR:(27,18),down -# Non diggable walls -NON_DIGGABLE:(00,00,54,19) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:"spiked pit",random -TRAP:"spiked pit",random -TRAP:"teleport",random -TRAP:"teleport",random -TRAP:"arrow",random -TRAP:"arrow",random -# Random monsters. -MONSTER:('q',"wumpus"),(27,18),hostile,asleep -MONSTER:('B',"giant bat"),random,hostile -MONSTER:('B',"giant bat"),random,hostile -MONSTER:('B',"giant bat"),random,hostile -MONSTER:('B',"giant bat"),random,hostile -MONSTER:('C',"forest centaur"),random,hostile -MONSTER:('C',"forest centaur"),random,hostile -MONSTER:('C',"forest centaur"),random,hostile -MONSTER:('C',"forest centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('s',"scorpion"),random,hostile -MONSTER:('s',"scorpion"),random,hostile -MONSTER:('s',"scorpion"),random,hostile -MONSTER:('s',"scorpion"),random,hostile -MONSTER:'s',random,hostile -MONSTER:'s',random,hostile - - -# -# The "goal" level for the quest. -# -# Here you meet Scorpius, your nemesis monster. You have to -# defeat Scorpius in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Ran-goal", ' ' -GEOMETRY:center,center -MAP - - ... ... - .......................................................................... - ... + ... - . ............ ....... . ....... . - . ............................. . ........ .........S.. . - . ............ . ...... . . . ....... .. . - . ......... . .... + . ... . .. . - . S . ......... .S. .S............... . - . ... . ... . ......... . . - . ........ .....S.+.......+....\....+........+. . - . ... ... S ......... .. ..... . - . .. ......... .. ...... . - . ....... ... + .... .... .......... . - . .............. .. . ...... .. ............. . - . ............. . .......... ...... . - ... + ... - .......................................................................... - ... ... - -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -# Stairs -STAIR:(19,10),up -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:(')',"bow"),(37,10),blessed,0,name:"The Longbow of Diana" -OBJECT:('(',"chest"),(37,10) -OBJECT:random,(36,09) -OBJECT:random,(36,10) -OBJECT:random,(36,11) -OBJECT:random,(37,09) -OBJECT:random,(37,11) -OBJECT:random,(38,09) -OBJECT:random,(38,10) -OBJECT:random,(38,11) -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# doors -DOOR:locked,(12,08) -DOOR:closed,(22,10) -DOOR:locked,(24,10) -DOOR:closed,(25,11) -DOOR:closed,(32,10) -DOOR:closed,(37,03) -DOOR:closed,(37,07) -DOOR:closed,(37,13) -DOOR:closed,(37,16) -DOOR:closed,(42,10) -DOOR:locked,(46,08) -DOOR:closed,(51,10) -DOOR:locked,(53,08) -DOOR:closed,(65,05) -# Random monsters. -MONSTER:('s',"Scorpius"),(37,10),hostile -MONSTER:('C',"forest centaur"),(36,09),hostile -MONSTER:('C',"forest centaur"),(36,10),hostile -MONSTER:('C',"forest centaur"),(36,11),hostile -MONSTER:('C',"forest centaur"),(37,09),hostile -MONSTER:('C',"forest centaur"),(37,11),hostile -MONSTER:('C',"forest centaur"),(38,09),hostile -MONSTER:('C',"mountain centaur"),(38,10),hostile -MONSTER:('C',"mountain centaur"),(38,11),hostile -MONSTER:('C',"mountain centaur"),(02,02),hostile -MONSTER:('C',"mountain centaur"),(71,02),hostile -MONSTER:('C',"mountain centaur"),(02,16),hostile -MONSTER:('C',"mountain centaur"),(71,16),hostile -MONSTER:('C',"forest centaur"),random,hostile -MONSTER:('C',"forest centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:('C',"mountain centaur"),random,hostile -MONSTER:'C',random,hostile -MONSTER:'C',random,hostile -MONSTER:('s',"scorpion"),(03,02),hostile -MONSTER:('s',"scorpion"),(72,02),hostile -MONSTER:('s',"scorpion"),(03,17),hostile -MONSTER:('s',"scorpion"),(72,17),hostile -MONSTER:('s',"scorpion"),(41,10),hostile -MONSTER:('s',"scorpion"),(33,09),hostile -MONSTER:('s',"scorpion"),random,hostile -MONSTER:('s',"scorpion"),random,hostile -MONSTER:'s',random,hostile - -WALLIFY - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "fila" is the upper filler, between the -# start and locate levels, and "filb" the lower between the locate -# and goal levels. -# - -MAZE: "Ran-fila" , ' ' -INIT_MAP: mines, '.' , 'T', true, true, random, true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('C', "mountain centaur"), random, hostile -MONSTER: ('C', "mountain centaur"), random, hostile -MONSTER: ('C', "forest centaur"), random, hostile -MONSTER: ('C', "forest centaur"), random, hostile -MONSTER: ('C', "forest centaur"), random, hostile -MONSTER: 'C', random, hostile -MONSTER: ('s', "scorpion"), random, hostile - -MAZE: "Ran-filb" , ' ' -INIT_MAP: mines, '.' , ' ', true, true, random, true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('C', "mountain centaur"), random, hostile -MONSTER: ('C', "mountain centaur"), random, hostile -MONSTER: ('C', "mountain centaur"), random, hostile -MONSTER: ('C', "mountain centaur"), random, hostile -MONSTER: 'C', random, hostile -MONSTER: ('s', "scorpion"), random, hostile -MONSTER: ('s', "scorpion"), random, hostile - diff --git a/dat/Rog-fila.lua b/dat/Rog-fila.lua new file mode 100644 index 000000000..6b4a80fa2 --- /dev/null +++ b/dat/Rog-fila.lua @@ -0,0 +1,64 @@ +-- NetHack Rogue Rog-fila.lua $NHDT-Date: 1652196011 2022/05/10 15:20:11 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1992 by Dean Luick +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster({ id = "leprechaun", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster({ id = "leprechaun", peaceful=0 }) + des.monster({ id = "guardian naga", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.trap() + des.object() + des.monster({ id = "water nymph", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.trap() + des.monster({ class = "l", peaceful=0 }) + des.monster({ id = "guardian naga", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.trap() + des.monster({ id = "leprechaun", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.trap() + des.monster({ id = "leprechaun", peaceful=0 }) + des.monster({ id = "water nymph", peaceful=0 }) + end +}) + +des.random_corridors() diff --git a/dat/Rog-filb.lua b/dat/Rog-filb.lua new file mode 100644 index 000000000..83b5969f1 --- /dev/null +++ b/dat/Rog-filb.lua @@ -0,0 +1,64 @@ +-- NetHack Rogue Rog-filb.lua $NHDT-Date: 1652196011 2022/05/10 15:20:11 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1992 by Dean Luick +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster({ id = "leprechaun", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster({ id = "leprechaun", peaceful=0 }) + des.monster({ id = "guardian naga", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.trap() + des.object() + des.monster({ id = "water nymph", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.trap() + des.monster({ class = "l", peaceful=0 }) + des.monster({ id = "guardian naga", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.trap() + des.monster({ id = "leprechaun", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.trap() + des.monster({ id = "leprechaun", peaceful=0 }) + des.monster({ id = "water nymph", peaceful=0 }) + end +}) + +des.random_corridors() diff --git a/dat/Rog-goal.lua b/dat/Rog-goal.lua new file mode 100644 index 000000000..4eb58f30b --- /dev/null +++ b/dat/Rog-goal.lua @@ -0,0 +1,110 @@ +-- NetHack Rogue Rog-goal.lua $NHDT-Date: 1652196012 2022/05/10 15:20:12 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1992 by Dean Luick +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport") + +-- 1 2 3 4 5 6 7 +--123456789012345678901234567890123456789012345678901234567890123456789012345 +des.map([[ +----- -------.......................................|-----------------| +|...| -----.....|.......................................|.................| +|...----...|.....|.......................................|....---------....| +|.---......---..--.................................------------.......|....| +|...............|..................................|..|...|...----........-| +|.....-----....--.................................|-..--..-|.....----S----| +|--S---...|....|.................................|-........-|....|........| +|.........---------.............................|-....}}....-|...|...|....| +|....|.....S......|............................|-.....}}.....-|..--.------| +|-----.....--.....|...........................|-...}}}}}}}}...-|....|.....-- +|...........--....------S-----...............|-....}}}}}}}}....-|..........| +|............--........|...| |..............--.....}}.}}........----------S- +|.............|........|...| |..............|......}}}}}}}}......|...|.....| +|S-.---.---.---.---.---|...| ------------...--........}}.}}.....--..---....| +|.---.---.---.---.-S-..----- |....|.....|....|-....}}}}}}}}....---..S.|--..| +|...|.......|..........|...---....---...S.....|-...}}}}}}}}...-|.S..|...|..| +|...|..|....|..........|............|..--..----|-.....}}.....-|..----...-S-- +|...|---....----.......|----- ......|...---| |-....}}....-|...|..--.--..| +-----.....---.....--.---....--...--------..| |-........-|....|.........| + |.............|..........|.............S... |S-------|.....|..-----..| + ---------------------------------------- ...... ---------- ---- +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,20), "lit") +-- Stairs +des.levregion({ region={01,00,15,20}, region_islev=1, exclude={01,18,04,20}, type="stair-up" }); +-- Doors +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,20)) +-- One trap to keep the gnomes at bay. +des.trap("spiked pit",37,07) +-- Objects +des.object({ id = "skeleton key", x=38, y=10, buc="blessed", spe=0, name="The Master Key of Thievery" }) +des.object({ id = "tin", x=26, y=12, montype="chameleon" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "Master Assassin", x=38, y=10, peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ class = "l", peaceful=0 }) +des.monster({ class = "l", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ class = "N", peaceful=0 }) +des.monster({ class = "N", peaceful=0 }) +des.monster({ class = "N", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "shark", x=51, y=14, peaceful=0 }) +des.monster({ id = "shark", x=53, y=09, peaceful=0 }) +des.monster({ id = "shark", x=55, y=15, peaceful=0 }) +des.monster({ id = "shark", x=58, y=10, peaceful=0 }) diff --git a/dat/Rog-loca.lua b/dat/Rog-loca.lua new file mode 100644 index 000000000..3a88e11fe --- /dev/null +++ b/dat/Rog-loca.lua @@ -0,0 +1,99 @@ +-- NetHack Rogue Rog-loca.lua $NHDT-Date: 1652196012 2022/05/10 15:20:12 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1992 by Dean Luick +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +-- 1 2 3 4 5 6 7 +--123456789012345678901234567890123456789012345678901234567890123456789012345 +des.map([[ + ---------------------------------------------------- -------- + ---.................................................- --.....| + ---...--------........-------.......................--- ---...| + ---.....- ---......- ---..................---- --.-- + ---.....---- -------- --..................-- --..| + ---...----- ----.----.....----.....--- --..|| +----..---- -----..--- |...--- |.......--- --...| +|...--- ----....--- |.--- |.........-- --...|| +|...- ----.....--- ---- |..........---....| +|...---- ----......--- | |...|.......-....|| +|......----- ---.........- | -----...|............| +|..........----- ----...........--- -------......||...........|| +|..............-----................--- |............|||..........| +|------...............................--- |...........|| |.........|| +|.....|..............------.............-----..........|| ||........| +|.....|.............-- ---.........................|| |.......|| +|.....|.............- ---.....................--| ||......| +|-S----------.......---- --.................---- |.....|| +|...........|..........--------..............----- ||....| +|...........|............................----- |....| +------------------------------------------ ------ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,20), "lit") +-- Doors +--DOOR:locked|closed|open,(xx,yy) +-- Stairs +des.stair("up") +des.stair("down") +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,20)) +-- Objects +des.object({ id = "scroll of teleportation", x=11, y=18, buc="cursed", spe=0 }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ id = "leprechaun", peaceful=0 }) +des.monster({ class = "l", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ id = "guardian naga", peaceful=0 }) +des.monster({ class = "N", peaceful=0 }) +des.monster({ class = "N", peaceful=0 }) +des.monster({ class = "N", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) +des.monster({ id = "chameleon", peaceful=0 }) diff --git a/dat/Rog-strt.lua b/dat/Rog-strt.lua new file mode 100644 index 000000000..1e4700d49 --- /dev/null +++ b/dat/Rog-strt.lua @@ -0,0 +1,166 @@ +-- NetHack Rogue Rog-strt.lua $NHDT-Date: 1652196012 2022/05/10 15:20:12 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1992 by Dean Luick +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Master of Thieves +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "nommap") + +-- 1 2 3 4 5 6 7 +--123456789012345678901234567890123456789012345678901234567890123456789012345 +des.map([[ +---------------------------------.------------------------------------------ +|.....|.||..........|....|......|.|.........|.......+............---.......| +|.....|..+..........+....---....S.|...-S-----.-----.|............+.+.......| +|.....+.||........---......|....|.|...|.....|.|...|.---.....------.--------| +|-----|.-------|..|........------.-----.....|.--..|...-------..............| +|.....|........------+------..........+.....|..--S---.........------.-----.. +|.....|.------...............-----.}}.--------.|....-------.---....|.+...--| +|..-+--.|....|-----.--------.|...|.....+.....|.|....|.....+.+......|.--....| +|..|....|....|....+.|......|.|...-----.|.....|.--...|.....|.|......|..|....| +|..|.-----S----...|.+....-----...|...|.----..|..|.---....--.---S-----.|----| +|..|.|........|...------.|.S.....|...|....-----.+.|......|..|.......|.|....| +|---.-------..|...|....|.|.|.....|...----.|...|.|---.....|.|-.......|.---..| +...........|..S...|....---.----S----..|...|...+.|..-------.---+-....|...--+| +|---------.---------...|......|....S..|.---...|.|..|...........----.---....| +|........|.........|...+.------....|---.---...|.--+-.----.----....|.+...--+| +|........|.---+---.|----.--........|......-----......|..|..|.--+-.|.-S-.|..| +|........|.|.....|........----------.----.......---.--..|-.|....|.-----.|..| +|----....+.|.....----+---............|..|--------.+.|...SS.|....|.......|..| +|...--+-----.....|......|.------------............---...||.------+--+----..| +|..........S.....|......|.|..........S............|.....||...|.....|....|..| +-------------------------.-------------------------------------------------- +]]); +-- Dungeon Description +--REGION:(00,00,75,20),lit,"ordinary" + +local streets = selection.floodfill(0,12) + +-- The down stairs is at one of the 4 "exits". The others are mimics, +-- mimicking stairwells. +local place = { {33,0}, {0,12}, {25,20}, {75,05} } +shuffle(place) + +des.stair({ dir = "down", coord = place[1] }) +des.monster({ id = "giant mimic", coord = place[2], appear_as = "ter:staircase down" }) +des.monster({ id = "large mimic", coord = place[3], appear_as = "ter:staircase down" }) +des.monster({ id = "small mimic", coord = place[4], appear_as = "ter:staircase down" }) +-- Portal arrival point +des.levregion({ region = {19,09,19,09}, type="branch" }) +-- Doors (secret) +--DOOR:locked|closed|open,(xx,yy) +des.door("locked", 32, 2) +des.door("locked", 63, 9) +des.door("locked", 27,10) +des.door("locked", 31,12) +des.door("locked", 35,13) +des.door("locked", 69,15) +des.door("locked", 56,17) +des.door("locked", 57,17) +des.door("locked", 11,19) +des.door("locked", 37,19) +des.door("locked", 39, 2) +des.door("locked", 49, 5) +des.door("locked", 10, 9) +des.door("locked", 14,12) +-- Doors (regular) +des.door("closed", 52, 1) +des.door("closed", 9, 2) +des.door("closed", 20, 2) +des.door("closed", 65, 2) +des.door("closed", 67, 2) +des.door("closed", 6, 3) +des.door("closed", 21, 5) +des.door("closed", 38, 5) +des.door("closed", 69, 6) +des.door("closed", 4, 7) +des.door("closed", 39, 7) +des.door("closed", 58, 7) +des.door("closed", 60, 7) +des.door("closed", 18, 8) +des.door("closed", 20, 9) +des.door("closed", 48,10) +des.door("closed", 46,12) +des.door("closed", 62,12) +des.door("closed", 74,12) +des.door("closed", 23,14) +des.door("closed", 23,14) +des.door("closed", 50,14) +des.door("closed", 68,14) +des.door("closed", 74,14) +des.door("closed", 14,15) +des.door("closed", 63,15) +des.door("closed", 9,17) +des.door("closed", 21,17) +des.door("closed", 50,17) +des.door("closed", 6,18) +des.door("closed", 65,18) +des.door("closed", 68,18) +-- Master of Thieves +des.monster({ id = "Master of Thieves", coord = {36, 11}, inventory = function() + des.object({ id = "leather armor", spe = 5 }); + des.object({ id = "silver dagger", spe = 4 }); + des.object({ id = "dagger", spe = 2, quantity = d(2,4), buc = "not-cursed" }); +end }) +-- The treasure of Master of Thieves +des.object("chest", 36, 11) +-- thug guards, room #1 +des.monster("thug", 28, 10) +des.monster("thug", 29, 11) +des.monster("thug", 30, 09) +des.monster("thug", 31, 07) +-- thug guards, room #2 +des.monster("thug", 31, 13) +des.monster("thug", 33, 14) +des.monster("thug", 30, 15) +--thug guards, room #3 +des.monster("thug", 35, 09) +des.monster("thug", 36, 13) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,20)) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- +-- Monsters to get in the way. +-- +-- West exit +des.monster({ id = "leprechaun", x=01, y=12, peaceful=0 }) +des.monster({ id = "water nymph", x=02, y=12, peaceful=0 }) +-- North exit +des.monster({ id = "water nymph", x=33, y=01, peaceful=0 }) +des.monster({ id = "leprechaun", x=33, y=02, peaceful=0 }) +-- East exit +des.monster({ id = "water nymph", x=74, y=05, peaceful=0 }) +des.monster({ id = "leprechaun", x=74, y=04, peaceful=0 }) +-- South exit +des.monster({ id = "leprechaun", x=25, y=19, peaceful=0 }) +des.monster({ id = "water nymph", x=25, y=18, peaceful=0 }) +-- Wandering the streets. +for i = 1, math.random(4,7) do + des.monster({ id = "water nymph", coord = streets:rndcoord(1), peaceful=0 }) + des.monster({ id = "leprechaun", coord = streets:rndcoord(1), peaceful=0 }) +end +for i = 1, math.random(7,10) do + des.monster({ id = "chameleon", coord = streets:rndcoord(1), peaceful=0 }) +end diff --git a/dat/Rogue.des b/dat/Rogue.des deleted file mode 100644 index 1f0c4eb6c..000000000 --- a/dat/Rogue.des +++ /dev/null @@ -1,485 +0,0 @@ -# NetHack 3.6 Rogue.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ -# Copyright (c) 1992 by Dean Luick -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Master of Thieves -# and receive your quest assignment. -# -MAZE: "Rog-strt",' ' -FLAGS: noteleport, hardfloor, nommap -GEOMETRY:center,center -# 1 2 3 4 5 6 7 -#123456789012345678901234567890123456789012345678901234567890123456789012345 -MAP ----------------------------------.------------------------------------------ -|.....|.||..........|....|......|.|.........|.......+............---.......| -|.....|..+..........+....---....S.|...-S-----.-----.|............+.+.......| -|.....+.||........---......|....|.|...|.....|.|...|.---.....------.--------| -|-----|.-------|..|........------.-----.....|.--..|...-------..............| -|.....|........------+------..........+.....|..--S---.........------.-----.. -|.....|.------...............-----.}}.--------.|....-------.---....|.+...--| -|..-+--.|....|-----.--------.|...|.....+.....|.|....|.....+.+......|.--....| -|..|....|....|....+.|......|.|...-----.|.....|.--...|.....|.|......|..|....| -|..|.-----S----...|.+....-----...|...|.----..|..|.---....--.---S-----.|----| -|..|.|........|...------.|.S.....|...|....-----.+.|......|..|.......|.|....| -|---.-------..|...|....|.|.|.....|...----.|...|.|---.....|.|-.......|.---..| -...........|..S...|....---.----S----..|...|...+.|..-------.---+-....|...--+| -|---------.---------...|......|....S..|.---...|.|..|...........----.---....| -|........|.........|...+.------....|---.---...|.--+-.----.----....|.+...--+| -|........|.---+---.|----.--........|......-----......|..|..|.--+-.|.-S-.|..| -|........|.|.....|........----------.----.......---.--..|-.|....|.-----.|..| -|----....+.|.....----+---............|..|--------.+.|...SS.|....|.......|..| -|...--+-----.....|......|.------------............---...||.------+--+----..| -|..........S.....|......|.|..........S............|.....||...|.....|....|..| --------------------------.-------------------------------------------------- -ENDMAP -# Dungeon Description -#REGION:(00,00,75,20),lit,"ordinary" - -$streets = selection: floodfill(0,12) - - -# The down stairs is at one of the 4 "exits". The others are mimics, -# mimicing stairwells. -$place = { (33,0), (0,12), (25,20), (75,05) } -SHUFFLE: $place - -STAIR:$place[0],down -MONSTER:('m',"giant mimic"), $place[1], m_feature "staircase down" -MONSTER:('m',"large mimic"), $place[2], m_feature "staircase down" -MONSTER:('m',"small mimic"), $place[3], m_feature "staircase down" -# Portal arrival point -BRANCH:(19,09,19,09),(0,0,0,0) -# Doors (secret) -#DOOR:locked|closed|open,(xx,yy) -DOOR: locked, (32, 2) -DOOR: locked, (63, 9) -DOOR: locked, (27,10) -DOOR: locked, (31,12) -DOOR: locked, (35,13) -DOOR: locked, (69,15) -DOOR: locked, (56,17) -DOOR: locked, (57,17) -DOOR: locked, (11,19) -DOOR: locked, (37,19) -DOOR: locked, (39, 2) -DOOR: locked, (49, 5) -DOOR: locked, (10, 9) -DOOR: locked, (14,12) -# Doors (regular) -DOOR: closed, (52, 1) -DOOR: closed, ( 9, 2) -DOOR: closed, (20, 2) -DOOR: closed, (65, 2) -DOOR: closed, (67, 2) -DOOR: closed, ( 6, 3) -DOOR: closed, (21, 5) -DOOR: closed, (38, 5) -DOOR: closed, (69, 6) -DOOR: closed, ( 4, 7) -DOOR: closed, (39, 7) -DOOR: closed, (58, 7) -DOOR: closed, (60, 7) -DOOR: closed, (18, 8) -DOOR: closed, (20, 9) -DOOR: closed, (48,10) -DOOR: closed, (46,12) -DOOR: closed, (62,12) -DOOR: closed, (74,12) -DOOR: closed, (23,14) -DOOR: closed, (23,14) -DOOR: closed, (50,14) -DOOR: closed, (68,14) -DOOR: closed, (74,14) -DOOR: closed, (14,15) -DOOR: closed, (63,15) -DOOR: closed, ( 9,17) -DOOR: closed, (21,17) -DOOR: closed, (50,17) -DOOR: closed, ( 6,18) -DOOR: closed, (65,18) -DOOR: closed, (68,18) -# Master of Thieves -MONSTER:('@',"Master of Thieves"),(36,11) -# The treasure of Master of Thieves -OBJECT:('(',"chest"),(36,11) -# thug guards, room #1 -MONSTER:('@',"thug"),(28,10) -MONSTER:('@',"thug"),(29,11) -MONSTER:('@',"thug"),(30,09) -MONSTER:('@',"thug"),(31,07) -# thug guards, room #2 -MONSTER:('@',"thug"),(31,13) -MONSTER:('@',"thug"),(33,14) -MONSTER:('@',"thug"),(30,15) -#thug guards, room #3 -MONSTER:('@',"thug"),(35,09) -MONSTER:('@',"thug"),(36,13) -# Non diggable walls -NON_DIGGABLE:(00,00,75,20) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# -# Monsters to get in the way. -# -# West exit -MONSTER: ('l',"leprechaun"),(01,12),hostile -MONSTER: ('n',"water nymph"),(02,12),hostile -# North exit -MONSTER: ('n',"water nymph"),(33,01),hostile -MONSTER: ('l',"leprechaun"),(33,02),hostile -# East exit -MONSTER: ('n',"water nymph"),(74,05),hostile -MONSTER: ('l',"leprechaun"),(74,04),hostile -# South exit -MONSTER: ('l',"leprechaun"),(25,19),hostile -MONSTER: ('n',"water nymph"),(25,18),hostile -# Wandering the streets. -LOOP [ 4 + 1d3 ] { - MONSTER: ('n',"water nymph"),rndcoord($streets),hostile - MONSTER: ('l',"leprechaun"),rndcoord($streets),hostile -} -LOOP [ 7 + 1d3 ] { - MONSTER: (':',"chameleon"),rndcoord($streets),hostile -} - -# -# The "locate" level for the quest. -# -# Here you have to find the entrance to the Assassins' Guild to go -# further towards your assigned quest. -# - -MAZE: "Rog-loca",' ' -GEOMETRY:center,center -# 1 2 3 4 5 6 7 -#123456789012345678901234567890123456789012345678901234567890123456789012345 -MAP - ---------------------------------------------------- -------- - ---.................................................- --.....| - ---...--------........-------.......................--- ---...| - ---.....- ---......- ---..................---- --.-- - ---.....---- -------- --..................-- --..| - ---...----- ----.----.....----.....--- --..|| -----..---- -----..--- |...--- |.......--- --...| -|...--- ----....--- |.--- |.........-- --...|| -|...- ----.....--- ---- |..........---....| -|...---- ----......--- | |...|.......-....|| -|......----- ---.........- | -----...|............| -|..........----- ----...........--- -------......||...........|| -|..............-----................--- |............|||..........| -|------...............................--- |...........|| |.........|| -|.....|..............------.............-----..........|| ||........| -|.....|.............-- ---.........................|| |.......|| -|.....|.............- ---.....................--| ||......| -|-S----------.......---- --.................---- |.....|| -|...........|..........--------..............----- ||....| -|...........|............................----- |....| ------------------------------------------- ------ -ENDMAP -# Dungeon Description -REGION:(00,00,75,20),lit,"ordinary" -# Doors -#DOOR:locked|closed|open,(xx,yy) -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,75,20) -# Objects -OBJECT:('?',"teleportation"),(11,18),cursed,0 -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:'l',random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:'N',random,hostile -MONSTER:'N',random,hostile -MONSTER:'N',random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile - -# -# The "goal" level for the quest. Teleportation and digging are -# disallowed. -# -# You have to reach The Master Assassin via some means other than -# simple searching or digging since there is no path between your -# arrival point and his location. -# -MAZE: "Rog-goal", ' ' -FLAGS: noteleport -GEOMETRY:center,center -# 1 2 3 4 5 6 7 -#123456789012345678901234567890123456789012345678901234567890123456789012345 -MAP ------ -------.......................................|-----------------| -|...| -----.....|.......................................|.................| -|...----...|.....|.......................................|....---------....| -|.---......---..--.................................------------.......|....| -|...............|..................................|..|...|...----........-| -|.....-----....--.................................|-..--..-|.....----S----| -|--S---...|....|.................................|-........-|....|........| -|.........---------.............................|-....}}....-|...|...|....| -|....|.....S......|............................|-.....}}.....-|..--.------| -|-----.....--.....|...........................|-...}}}}}}}}...-|....|.....-- -|...........--....------S-----...............|-....}}}}}}}}....-|..........| -|............--........|...| |..............--.....}}.}}........----------S- -|.............|........|...| |..............|......}}}}}}}}......|...|.....| -|S-.---.---.---.---.---|...| ------------...--........}}.}}.....--..---....| -|.---.---.---.---.-S-..----- |....|.....|....|-....}}}}}}}}....---..S.|--..| -|...|.......|..........|...---....---...S.....|-...}}}}}}}}...-|.S..|...|..| -|...|..|....|..........|............|..--..----|-.....}}.....-|..----...-S-- -|...|---....----.......|----- ......|...---| |-....}}....-|...|..--.--..| ------.....---.....--.---....--...--------..| |-........-|....|.........| - |.............|..........|.............S... |S-------|.....|..-----..| - ---------------------------------------- ...... ---------- ---- -ENDMAP -# Dungeon Description -REGION:(00,00,75,20),lit,"ordinary" -# Stairs -STAIR:levregion(01,00,15,20),(01,18,04,20),up -# Doors -# Non diggable walls -NON_DIGGABLE:(00,00,75,20) -# One trap to keep the gnomes at bay. -TRAP:"spiked pit",(37,07) -# Objects -OBJECT:('(',"skeleton key"),(38,10),blessed,0,name:"The Master Key of Thievery" -OBJECT:('%',"tin"),(26,12),montype:"chameleon" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"Master Assassin"),(38,10),hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:('l',"leprechaun"),random,hostile -MONSTER:'l',random,hostile -MONSTER:'l',random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:('N',"guardian naga"),random,hostile -MONSTER:'N',random,hostile -MONSTER:'N',random,hostile -MONSTER:'N',random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER:(';',"shark"),(51,14),hostile -MONSTER:(';',"shark"),(53,09),hostile -MONSTER:(';',"shark"),(55,15),hostile -MONSTER:(';',"shark"),(58,10),hostile - -# -# The "fill" level for the quest. -# -# This level is used to fill out any levels not occupied by specific -# levels as defined above. -# -LEVEL: "Rog-fila" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: ('l', "leprechaun"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: ('l', "leprechaun"), random, hostile - MONSTER: ('N', "guardian naga"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: ('n', "water nymph"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - TRAP: random, random - MONSTER: 'l', random, hostile - MONSTER: ('N', "guardian naga"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - TRAP: random, random - MONSTER: ('l', "leprechaun"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - TRAP: random, random - MONSTER: ('l', "leprechaun"), random, hostile - MONSTER: ('n', "water nymph"), random, hostile -} - -RANDOM_CORRIDORS - -# -# currently a & b are the same. -# -LEVEL: "Rog-filb" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: ('l', "leprechaun"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: ('l', "leprechaun"), random, hostile - MONSTER: ('N', "guardian naga"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: ('n', "water nymph"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - TRAP: random, random - MONSTER: 'l', random, hostile - MONSTER: ('N', "guardian naga"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - TRAP: random, random - MONSTER: ('l', "leprechaun"), random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - TRAP: random, random - MONSTER: ('l', "leprechaun"), random, hostile - MONSTER: ('n', "water nymph"), random, hostile -} - -RANDOM_CORRIDORS diff --git a/dat/Sam-fila.lua b/dat/Sam-fila.lua new file mode 100644 index 000000000..53d23d5f6 --- /dev/null +++ b/dat/Sam-fila.lua @@ -0,0 +1,37 @@ +-- NetHack Samurai Sam-fila.lua $NHDT-Date: 1652196013 2022/05/10 15:20:13 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg="P", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster("d") +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("stalker") +-- +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Sam-filb.lua b/dat/Sam-filb.lua new file mode 100644 index 000000000..69e61032d --- /dev/null +++ b/dat/Sam-filb.lua @@ -0,0 +1,60 @@ +-- NetHack Samurai Sam-filb.lua $NHDT-Date: 1652196013 2022/05/10 15:20:13 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ +------------- ------------- +|...........| |...........| +|...-----...|----------------------------------|...-----...| +|...| |...|..................................|...| |...| +|...-----..........................................-----...| +|...........|--S----------------------------S--|...........| +----...--------.|..........................|.--------...---- + |...|........+..........................+........|...| + |...|........+..........................+........|...| +----...--------.|..........................|.--------...---- +|...........|--S----------------------------S--|...........| +|...-----..........................................-----...| +|...| |...|..................................|...| |...| +|...-----...|----------------------------------|...-----...| +|...........| |...........| +------------- ------------- +]]); +des.region(selection.area(00,00,59,15), "unlit") +-- Doors +des.door("closed",16,07) +des.door("closed",16,08) +des.door("closed",43,07) +des.door("closed",43,08) +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster("d") +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +-- +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Sam-goal.lua b/dat/Sam-goal.lua new file mode 100644 index 000000000..eb3f95608 --- /dev/null +++ b/dat/Sam-goal.lua @@ -0,0 +1,111 @@ +-- NetHack Samurai Sam-goal.lua $NHDT-Date: 1652196013 2022/05/10 15:20:13 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport"); + +des.map([[ + + ....................... + ......-------------------...... + ......----.................----...... + ....----.....-------------.....----.... + ....--.....----...........----.....--.... + ...||....---....---------....---....||... + ...|....--....---.......---....--....|... + ....|...||...---...--+--...---...||...|.... + ....|...|....|....|-...-|....|....|...|.... + ....|...|....|....+.....+....|....|...|.... + ....|...|....|....|-...-|....|....|...|.... + ....|...||...---...--+--...---...||...|.... + ...|....--....---.......---....--....|... + ...||....---....---------....---....||... + ....--.....----...........----.....--.... + ....----.....-------------.....----.... + ......----.................----...... + ......-------------------...... + ....................... +]]); +-- Dungeon Description +local place = { {02,11},{42,09} } +local placeidx = math.random(1, #place); + +des.region(selection.area(00,00,44,19), "unlit") +-- Doors +des.door("closed",19,10) +des.door("closed",22,08) +des.door("closed",22,12) +des.door("closed",25,10) +-- Stairs +des.stair({ dir = "up", coord = place[placeidx] }) + +-- Holes in the concentric ring walls +local place = { {22,14},{30,10},{22, 6},{14,10} } +local placeidx = math.random(1, #place); +des.terrain(place[placeidx], ".") +local place = { {22, 4},{35,10},{22,16},{ 9,10} } +local placeidx = math.random(1, #place); +des.terrain(place[placeidx], ".") +local place = { {22, 2},{22,18} } +local placeidx = math.random(1, #place); +des.terrain(place[placeidx], ".") + +-- Non diggable walls +des.non_diggable(selection.area(00,00,44,19)) +-- Objects +des.object({ id = "tsurugi", x=22, y=10, buc="blessed", spe=0, name="The Tsurugi of Muramasa" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap("board",22,09) +des.trap("board",24,10) +des.trap("board",22,11) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster("Ashikaga Takauji", 22, 10) +des.monster({ id = "samurai", peaceful=0 }) +des.monster({ id = "samurai", peaceful=0 }) +des.monster({ id = "samurai", peaceful=0 }) +des.monster({ id = "samurai", peaceful=0 }) +des.monster({ id = "samurai", peaceful=0 }) +des.monster({ id = "ninja", peaceful=0 }) +des.monster({ id = "ninja", peaceful=0 }) +des.monster({ id = "ninja", peaceful=0 }) +des.monster({ id = "ninja", peaceful=0 }) +des.monster({ id = "ninja", peaceful=0 }) +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("wolf") +des.monster("d") +des.monster("d") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") diff --git a/dat/Sam-loca.lua b/dat/Sam-loca.lua new file mode 100644 index 000000000..95bf247f2 --- /dev/null +++ b/dat/Sam-loca.lua @@ -0,0 +1,141 @@ +-- NetHack Samurai Sam-loca.lua $NHDT-Date: 1652196014 2022/05/10 15:20:14 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor"); + +des.map([[ +............................................................................ +............................................................................ +........-----..................................................-----........ +........|...|..................................................|...|........ +........|...---..}..--+------------------------------+--..}..---...|........ +........|-|...|.....|...|....|....|....|....|....|.|...|.....|...|-|........ +..........|...-------...|....|....|....|....|....S.|...-------...|.......... +..........|-|.........------+----+-+-------+-+--------.........|-|.......... +............|..--------.|}........................}|.--------..|............ +............|..+........+..........................+........+..|............ +............|..+........+..........................+........+..|............ +............|..--------.|}........................}|.--------..|............ +..........|-|.........--------+-+-------+-+----+------.........|-|.......... +..........|...-------...|.S....|....|....|....|....|...-------...|.......... +........|-|...|.....|...|.|....|....|....|....|....|...|.....|...|-|........ +........|...---..}..--+------------------------------+--..}..---...|........ +........|...|..................................................|...|........ +........-----..................................................-----........ +............................................................................ +............................................................................ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +-- Doors +des.door("locked",22,04) +des.door("locked",22,15) +des.door("locked",53,04) +des.door("locked",53,15) +des.door("locked",49,06) +des.door("locked",26,13) +des.door("locked",28,07) +des.door("locked",30,12) +des.door("locked",33,07) +des.door("locked",32,12) +des.door("locked",35,07) +des.door("locked",40,12) +des.door("locked",43,07) +des.door("locked",42,12) +des.door("locked",45,07) +des.door("locked",47,12) +des.door("closed",15,09) +des.door("closed",15,10) +des.door("closed",24,09) +des.door("closed",24,10) +des.door("closed",51,09) +des.door("closed",51,10) +des.door("closed",60,09) +des.door("closed",60,10) +-- Stairs +des.stair("up", 10,10) +des.stair("down", 25,14) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Objects +des.object("*", 25, 05) +des.object("*", 26, 05) +des.object("*", 27, 05) +des.object("*", 28, 05) +des.object("*", 25, 06) +des.object("*", 26, 06) +des.object("*", 27, 06) +des.object("*", 28, 06) +-- +des.object("[", 40, 05) +des.object("[", 41, 05) +des.object("[", 42, 05) +des.object("[", 43, 05) +des.object("[", 40, 06) +des.object("[", 41, 06) +des.object("[", 42, 06) +des.object("[", 43, 06) +-- +des.object(")", 27, 13) +des.object(")", 28, 13) +des.object(")", 29, 13) +des.object(")", 30, 13) +des.object(")", 27, 14) +des.object(")", 28, 14) +des.object(")", 29, 14) +des.object(")", 30, 14) +-- +des.object("(", 37, 13) +des.object("(", 38, 13) +des.object("(", 39, 13) +des.object("(", 40, 13) +des.object("(", 37, 14) +des.object("(", 38, 14) +des.object("(", 39, 14) +des.object("(", 40, 14) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster({ id = "ninja", x=15, y=05, peaceful=0 }) +des.monster({ id = "ninja", x=16, y=05, peaceful=0 }) +des.monster("wolf", 17, 05) +des.monster("wolf", 18, 05) +des.monster({ id = "ninja", x=19, y=05, peaceful=0 }) +des.monster("wolf", 15, 14) +des.monster("wolf", 16, 14) +des.monster({ id = "ninja", x=17, y=14, peaceful=0 }) +des.monster({ id = "ninja", x=18, y=14, peaceful=0 }) +des.monster("wolf", 56, 05) +des.monster({ id = "ninja", x=57, y=05, peaceful=0 }) +des.monster("wolf", 58, 05) +des.monster("wolf", 59, 05) +des.monster({ id = "ninja", x=56, y=14, peaceful=0 }) +des.monster("wolf", 57, 14) +des.monster({ id = "ninja", x=58, y=14, peaceful=0 }) +des.monster("d", 59, 14) +des.monster("wolf", 60, 14) +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +des.monster("stalker") +-- "guards" for the central courtyard. +des.monster({ id = "samurai", x=30, y=05, peaceful=0 }) +des.monster({ id = "samurai", x=31, y=05, peaceful=0 }) +des.monster({ id = "samurai", x=32, y=05, peaceful=0 }) +des.monster({ id = "samurai", x=32, y=14, peaceful=0 }) +des.monster({ id = "samurai", x=33, y=14, peaceful=0 }) +des.monster({ id = "samurai", x=34, y=14, peaceful=0 }) diff --git a/dat/Sam-strt.lua b/dat/Sam-strt.lua new file mode 100644 index 000000000..e6cac093c --- /dev/null +++ b/dat/Sam-strt.lua @@ -0,0 +1,98 @@ +-- NetHack Samurai Sam-strt.lua $NHDT-Date: 1695932714 2023/09/28 20:25:14 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Lord Sato +-- and receive your quest assignment. +-- +-- The throne room designation produces random atmospheric +-- messages (until the room is entered) but this one doesn't +-- actually contain any throne. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +..............................................................PP............ +...............................................................PP........... +..........---------------------------------------------------...PPP......... +..........|......|.........|...|..............|...|.........|....PPPPP...... +......... |......|.........S...|..............|...S.........|.....PPPP...... +..........|......|.........|---|..............|---|.........|.....PPP....... +..........+......|.........+...-------++-------...+.........|......PP....... +..........+......|.........|......................|.........|......PP....... +......... |......---------------------++--------------------|........PP..... +..........|.................................................|.........PP.... +..........|.................................................|...........PP.. +..........----------------------------------------...-------|............PP. +..........................................|.................|.............PP +.............. ................. .........|.................|..............P +............. } ............... } ........|.................|............... +.............. ........PP....... .........|.................|............... +.....................PPP..................|.................|............... +......................PP..................-------------------............... +............................................................................ +............................................................................ +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region({ region={18,03, 26,07}, lit=1, type="throne", filled=2 }) +-- Portal arrival zone +des.levregion({ region = {62,12,70,17}, type="branch" }) +-- Stairs +des.stair("down", 29,04) +-- Doors +des.door("locked",10,06) +des.door("locked",10,07) +des.door("closed",27,04) +des.door("closed",27,06) +des.door("closed",38,06) +des.door("locked",38,08) +des.door("closed",39,06) +des.door("locked",39,08) +des.door("closed",50,04) +des.door("closed",50,06) +-- Lord Sato +des.monster({ id = "Lord Sato", coord = {20, 04}, inventory = function() + des.object({ id = "splint mail", spe = 5, eroded=-1, buc="not-cursed" }); + des.object({ id = "katana", spe = 4, eroded=-1, buc="not-cursed" }); +end }) +-- The treasure of Lord Sato +des.object("chest", 20, 04) +-- roshi guards for the audience chamber +des.monster("roshi", 18, 04) +des.monster("roshi", 18, 05) +des.monster("roshi", 18, 06) +des.monster("roshi", 18, 07) +des.monster("roshi", 26, 04) +des.monster("roshi", 26, 05) +des.monster("roshi", 26, 06) +des.monster("roshi", 26, 07) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +des.monster({ id = "ninja", x=64, y=00, peaceful=0 }) +des.monster("wolf", 65, 01) +des.monster({ id = "ninja", x=67, y=02, peaceful=0 }) +des.monster({ id = "ninja", x=69, y=05, peaceful=0 }) +des.monster({ id = "ninja", x=69, y=06, peaceful=0 }) +des.monster("wolf", 69, 07) +des.monster({ id = "ninja", x=70, y=06, peaceful=0 }) +des.monster({ id = "ninja", x=70, y=07, peaceful=0 }) +des.monster({ id = "ninja", x=72, y=01, peaceful=0 }) +des.monster("wolf", 75, 09) +des.monster({ id = "ninja", x=73, y=05, peaceful=0 }) +des.monster({ id = "ninja", x=68, y=02, peaceful=0 }) +des.monster("stalker") diff --git a/dat/Samurai.des b/dat/Samurai.des deleted file mode 100644 index 1b3fa8785..000000000 --- a/dat/Samurai.des +++ /dev/null @@ -1,440 +0,0 @@ -# NetHack 3.6 Samurai.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991-92 by M. Stephenson, P. Winner -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Lord Sato -# and receive your quest assignment. -# -MAZE: "Sam-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -..............................................................PP............ -...............................................................PP........... -..........---------------------------------------------------...PPP......... -..........|......|.........|...|..............|...|.........|....PPPPP...... -......... |......|.........S...|..............|...S.........|.....PPPP...... -..........|......|.........|---|..............|---|.........|.....PPP....... -..........+......|.........+...-------++-------...+.........|......PP....... -..........+......|.........|......................|.........|......PP....... -......... |......---------------------++--------------------|........PP..... -..........|.................................................|.........PP.... -..........|.................................................|...........PP.. -..........----------------------------------------...-------|............PP. -..........................................|.................|.............PP -.............. ................. .........|.................|..............P -............. } ............... } ........|.................|............... -.............. ........PP....... .........|.................|............... -.....................PPP..................|.................|............... -......................PP..................-------------------............... -............................................................................ -............................................................................ -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(18,03,26,07),lit,"throne",unfilled -# Portal arrival zone -BRANCH:(62,12,70,17),(0,0,0,0) -# Stairs -STAIR:(29,04),down -# Doors -DOOR:locked,(10,06) -DOOR:locked,(10,07) -DOOR:closed,(27,04) -DOOR:closed,(27,06) -DOOR:closed,(38,06) -DOOR:locked,(38,08) -DOOR:closed,(39,06) -DOOR:locked,(39,08) -DOOR:closed,(50,04) -DOOR:closed,(50,06) -# Lord Sato -MONSTER:('@',"Lord Sato"),(20,04) -# The treasure of Lord Sato -OBJECT:('(',"chest"),(20,04) -# roshi guards for the audience chamber -MONSTER:('@',"roshi"),(18,04) -MONSTER:('@',"roshi"),(18,05) -MONSTER:('@',"roshi"),(18,06) -MONSTER:('@',"roshi"),(18,07) -MONSTER:('@',"roshi"),(26,04) -MONSTER:('@',"roshi"),(26,05) -MONSTER:('@',"roshi"),(26,06) -MONSTER:('@',"roshi"),(26,07) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: ('@',"ninja"),(64,00),hostile -MONSTER: ('d',"wolf"),(65,01) -MONSTER: ('@',"ninja"),(67,02),hostile -MONSTER: ('@',"ninja"),(69,05),hostile -MONSTER: ('@',"ninja"),(69,06),hostile -MONSTER: ('d',"wolf"),(69,07) -MONSTER: ('@',"ninja"),(70,06),hostile -MONSTER: ('@',"ninja"),(70,07),hostile -MONSTER: ('@',"ninja"),(72,01),hostile -MONSTER: ('d',"wolf"),(75,09) -MONSTER: ('@',"ninja"),(73,05),hostile -MONSTER: ('@',"ninja"),(68,02),hostile -MONSTER:('E',"stalker"),random - -# -# The "locate" level for the quest. -# -# Here you have to invade the Shogun's Castle to go -# further towards your assigned quest. -# - -MAZE: "Sam-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -MAP -............................................................................ -............................................................................ -........-----..................................................-----........ -........|...|..................................................|...|........ -........|...---..}..--+------------------------------+--..}..---...|........ -........|-|...|.....|...|....|....|....|....|....|.|...|.....|...|-|........ -..........|...-------...|....|....|....|....|....S.|...-------...|.......... -..........|-|.........------+----+-+-------+-+--------.........|-|.......... -............|..--------.|}........................}|.--------..|............ -............|..+........+..........................+........+..|............ -............|..+........+..........................+........+..|............ -............|..--------.|}........................}|.--------..|............ -..........|-|.........--------+-+-------+-+----+------.........|-|.......... -..........|...-------...|.S....|....|....|....|....|...-------...|.......... -........|-|...|.....|...|.|....|....|....|....|....|...|.....|...|-|........ -........|...---..}..--+------------------------------+--..}..---...|........ -........|...|..................................................|...|........ -........-----..................................................-----........ -............................................................................ -............................................................................ -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -# Doors -DOOR:locked,(22,04) -DOOR:locked,(22,15) -DOOR:locked,(53,04) -DOOR:locked,(53,15) -DOOR:locked,(49,06) -DOOR:locked,(26,13) -DOOR:locked,(28,07) -DOOR:locked,(30,12) -DOOR:locked,(33,07) -DOOR:locked,(32,12) -DOOR:locked,(35,07) -DOOR:locked,(40,12) -DOOR:locked,(43,07) -DOOR:locked,(42,12) -DOOR:locked,(45,07) -DOOR:locked,(47,12) -DOOR:closed,(15,09) -DOOR:closed,(15,10) -DOOR:closed,(24,09) -DOOR:closed,(24,10) -DOOR:closed,(51,09) -DOOR:closed,(51,10) -DOOR:closed,(60,09) -DOOR:closed,(60,10) -# Stairs -STAIR:(10,10),up -STAIR:(25,14),down -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Objects -OBJECT:'*',(25,05) -OBJECT:'*',(26,05) -OBJECT:'*',(27,05) -OBJECT:'*',(28,05) -OBJECT:'*',(25,06) -OBJECT:'*',(26,06) -OBJECT:'*',(27,06) -OBJECT:'*',(28,06) -# -OBJECT:'[',(40,05) -OBJECT:'[',(41,05) -OBJECT:'[',(42,05) -OBJECT:'[',(43,05) -OBJECT:'[',(40,06) -OBJECT:'[',(41,06) -OBJECT:'[',(42,06) -OBJECT:'[',(43,06) -# -OBJECT:')',(27,13) -OBJECT:')',(28,13) -OBJECT:')',(29,13) -OBJECT:')',(30,13) -OBJECT:')',(27,14) -OBJECT:')',(28,14) -OBJECT:')',(29,14) -OBJECT:')',(30,14) -# -OBJECT:'(',(37,13) -OBJECT:'(',(38,13) -OBJECT:'(',(39,13) -OBJECT:'(',(40,13) -OBJECT:'(',(37,14) -OBJECT:'(',(38,14) -OBJECT:'(',(39,14) -OBJECT:'(',(40,14) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"ninja"),(15,05),hostile -MONSTER:('@',"ninja"),(16,05),hostile -MONSTER:('d',"wolf"),(17,05) -MONSTER:('d',"wolf"),(18,05) -MONSTER:('@',"ninja"),(19,05),hostile -MONSTER:('d',"wolf"),(15,14) -MONSTER:('d',"wolf"),(16,14) -MONSTER:('@',"ninja"),(17,14),hostile -MONSTER:('@',"ninja"),(18,14),hostile -MONSTER:('d',"wolf"),(56,05) -MONSTER:('@',"ninja"),(57,05),hostile -MONSTER:('d',"wolf"),(58,05) -MONSTER:('d',"wolf"),(59,05) -MONSTER:('@',"ninja"),(56,14),hostile -MONSTER:('d',"wolf"),(57,14) -MONSTER:('@',"ninja"),(58,14),hostile -MONSTER:'d',(59,14) -MONSTER:('d',"wolf"),(60,14) -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -# "guards" for the central courtyard. -MONSTER:('@',"samurai"),(30,05),hostile -MONSTER:('@',"samurai"),(31,05),hostile -MONSTER:('@',"samurai"),(32,05),hostile -MONSTER:('@',"samurai"),(32,14),hostile -MONSTER:('@',"samurai"),(33,14),hostile -MONSTER:('@',"samurai"),(34,14),hostile - -# -# The "goal" level for the quest. -# -# Here you meet Takauji, your nemesis monster. You have to -# defeat him in combat to gain the artifact you have been -# assigned to retrieve. -# - -MAZE: "Sam-goal", ' ' -FLAGS: noteleport -GEOMETRY:center,center -MAP - - ....................... - ......-------------------...... - ......----.................----...... - ....----.....-------------.....----.... - ....--.....----...........----.....--.... - ...||....---....---------....---....||... - ...|....--....---.......---....--....|... - ....|...||...---...--+--...---...||...|.... - ....|...|....|....|-...-|....|....|...|.... - ....|...|....|....+.....+....|....|...|.... - ....|...|....|....|-...-|....|....|...|.... - ....|...||...---...--+--...---...||...|.... - ...|....--....---.......---....--....|... - ...||....---....---------....---....||... - ....--.....----...........----.....--.... - ....----.....-------------.....----.... - ......----.................----...... - ......-------------------...... - ....................... -ENDMAP -# Dungeon Description -$place = { (02,11),(42,09) } -SHUFFLE: $place - -REGION:(00,00,44,19),unlit,"ordinary" -# Doors -DOOR:closed,(19,10) -DOOR:closed,(22,08) -DOOR:closed,(22,12) -DOOR:closed,(25,10) -# Stairs -STAIR:$place[0],up - -# Holes in the concentric ring walls -$place = { (22,14),(30,10),(22, 6),(14,10) } -SHUFFLE:$place -TERRAIN:$place[0],'.' -$place = { (22, 4),(35,10),(22,16),( 9,10) } -SHUFFLE:$place -TERRAIN:$place[0],'.' -$place = { (22, 2),(22,18) } -SHUFFLE:$place -TERRAIN:$place[0],'.' - -# Non diggable walls -NON_DIGGABLE:(00,00,44,19) -# Objects -OBJECT:(')',"tsurugi"),(22,10),blessed,0,name:"The Tsurugi of Muramasa" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# -TRAP:"board",(22,09) -TRAP:"board",(24,10) -TRAP:"board",(22,11) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"Ashikaga Takauji"),(22,10) -MONSTER:('@',"samurai"),random,hostile -MONSTER:('@',"samurai"),random,hostile -MONSTER:('@',"samurai"),random,hostile -MONSTER:('@',"samurai"),random,hostile -MONSTER:('@',"samurai"),random,hostile -MONSTER:('@',"ninja"),random,hostile -MONSTER:('@',"ninja"),random,hostile -MONSTER:('@',"ninja"),random,hostile -MONSTER:('@',"ninja"),random,hostile -MONSTER:('@',"ninja"),random,hostile -MONSTER:('d',"wolf"),random -MONSTER:('d',"wolf"),random -MONSTER:('d',"wolf"),random -MONSTER:('d',"wolf"),random -MONSTER:'d',random -MONSTER:'d',random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random -MONSTER:('E',"stalker"),random - - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -MAZE: "Sam-fila", ' ' -INIT_MAP: mines, '.' , 'P', true, true, random, true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: 'd', random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('E', "stalker"), random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random - -MAZE: "Sam-filb", ' ' -GEOMETRY:center,center -MAP -------------- ------------- -|...........| |...........| -|...-----...|----------------------------------|...-----...| -|...| |...|..................................|...| |...| -|...-----..........................................-----...| -|...........|--S----------------------------S--|...........| -----...--------.|..........................|.--------...---- - |...|........+..........................+........|...| - |...|........+..........................+........|...| -----...--------.|..........................|.--------...---- -|...........|--S----------------------------S--|...........| -|...-----..........................................-----...| -|...| |...|..................................|...| |...| -|...-----...|----------------------------------|...-----...| -|...........| |...........| -------------- ------------- -ENDMAP -REGION:(00,00,59,15),unlit,"ordinary" -# Doors -DOOR:closed,(16,07) -DOOR:closed,(16,08) -DOOR:closed,(43,07) -DOOR:closed,(43,08) -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: 'd', random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('d', "wolf"), random -MONSTER: ('E', "stalker"), random -MONSTER: ('E', "stalker"), random -MONSTER: ('E', "stalker"), random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random diff --git a/dat/Tou-fila.lua b/dat/Tou-fila.lua new file mode 100644 index 000000000..6465b5d78 --- /dev/null +++ b/dat/Tou-fila.lua @@ -0,0 +1,35 @@ +-- NetHack Tourist Tou-fila.lua $NHDT-Date: 1652196014 2022/05/10 15:20:14 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "soldier", peaceful = 0 }) +des.monster({ id = "soldier", peaceful = 0 }) +des.monster({ id = "soldier", peaceful = 0 }) +des.monster({ id = "soldier", peaceful = 0 }) +des.monster({ id = "soldier", peaceful = 0 }) +des.monster({ class = "H", peaceful = 0 }) +des.monster({ class = "C", peaceful = 0 }) diff --git a/dat/Tou-filb.lua b/dat/Tou-filb.lua new file mode 100644 index 000000000..54855015c --- /dev/null +++ b/dat/Tou-filb.lua @@ -0,0 +1,39 @@ +-- NetHack Tourist Tou-filb.lua $NHDT-Date: 1652196015 2022/05/10 15:20:15 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.trap() +des.trap() +des.trap() +des.trap() +-- +des.monster({ id = "soldier", peaceful = 0 }) +des.monster({ id = "captain", peaceful = 0 }) +des.monster({ id = "captain", peaceful = 0 }) +des.monster({ class = "H", peaceful = 0 }) +des.monster({ class = "H", peaceful = 0 }) +des.monster({ class = "C", peaceful = 0 }) +des.monster("s") diff --git a/dat/Tou-goal.lua b/dat/Tou-goal.lua new file mode 100644 index 000000000..f0f3ca8ef --- /dev/null +++ b/dat/Tou-goal.lua @@ -0,0 +1,159 @@ +-- NetHack Tourist Tou-goal.lua $NHDT-Date: 1652196015 2022/05/10 15:20:15 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ +---------------------------------------------------------------------------- +|.........|.........|..........|..| |.................|........|........|..| +|.........|.........|..........|..| |....--------.....|........|........|..| +|------S--|--+-----------+------..| |....|......|.....|........|........|..| +|.........|.......................| |....|......+.....--+-------------+--..| +|.........|.......................| |....|......|..........................| +|-S-----S-|......----------.......| |....|......|..........................| +|..|..|...|......|........|.......| |....-----------.........----..........| +|..+..+...|......|........|.......| |....|.........|.........|}}|..........| +|..|..|...|......+........|.......| |....|.........+.........|}}|..........| +|..|..|...|......|........|.......S.S....|.........|.........----..........| +|---..----|......|........|.......| |....|.........|.......................| +|.........+......|+F-+F-+F|.......| |....-----------.......................| +|---..----|......|..|..|..|.......| |......................--------------..| +|..|..|...|......--F-F--F--.......| |......................+............|..| +|..+..+...|.......................| |--.---...-----+-----..|............|..| +|--|..----|--+-----------+------..| |.....|...|.........|..|------------|..| +|..+..+...|.........|..........|..| |.....|...|.........|..+............|..| +|..|..|...|.........|..........|..| |.....|...|.........|..|............|..| +---------------------------------------------------------------------------- +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +-- The Inn +des.region(selection.area(01,01,09,02), "lit") +des.region({ region = {01,04,09,05}, lit=1, type = "barracks", filled = 1 }) +des.region(selection.area(01,07,02,10), "unlit") +des.region(selection.area(07,07,09,10), "unlit") +des.region(selection.area(01,14,02,15), "unlit") +des.region(selection.area(07,14,09,15), "unlit") +des.region(selection.area(01,17,02,18), "unlit") +des.region(selection.area(07,17,09,18), "unlit") +-- +des.region({ region = {11,01,19,02}, lit = 0, type = "barracks", filled = 1 }) +des.region(selection.area(21,01,30,02), "unlit") +des.region({ region = {11,17,19,18}, lit = 0, type = "barracks", filled = 1 }) +des.region(selection.area(21,17,30,18), "unlit") +-- Police Station +des.region(selection.area(18,07,25,11), "lit") +des.region(selection.area(18,13,19,13), "unlit") +des.region(selection.area(21,13,22,13), "unlit") +des.region(selection.area(24,13,25,13), "unlit") +-- The town itself +des.region(selection.area(42,03,47,06), "unlit") +des.region(selection.area(42,08,50,11), "unlit") +des.region({ region = {37,16,41,18}, lit = 0, type = "morgue", filled = 1 }) +des.region(selection.area(47,16,55,18), "unlit") +des.region(selection.area(55,01,62,03), "unlit") +des.region(selection.area(64,01,71,03), "unlit") +des.region({ region = {60,14,71,15}, lit = 1, type = "shop", filled = 1 }) +des.region({ region = {60,17,71,18}, lit = 1, type = "shop", filled = 1 }) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Stairs +des.stair("up", 70,08) +-- Doors +des.door("locked",07,03) +des.door("locked",02,06) +des.door("locked",08,06) +des.door("closed",03,08) +des.door("closed",06,08) +des.door("open",10,12) +des.door("closed",03,15) +des.door("closed",06,15) +des.door("closed",03,17) +des.door("closed",06,17) +des.door("closed",13,03) +des.door("random",25,03) +des.door("closed",13,16) +des.door("random",25,16) +des.door("locked",17,09) +des.door("locked",18,12) +des.door("locked",21,12) +des.door("locked",24,12) +des.door("locked",34,10) +des.door("locked",36,10) +des.door("random",48,04) +des.door("random",56,04) +des.door("random",70,04) +des.door("random",51,09) +des.door("random",51,15) +des.door("open",59,14) +des.door("open",59,17) +-- Objects +des.object({ id = "credit card", x=04, y=01, buc="blessed", spe=0, name="The Platinum Yendorian Express Card" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps - must avoid the 2 shops +local validtraps = selection.area(00,00,75,19):filter_mapchar('.') +validtraps = validtraps - selection.area(60,14,71,18) +for i=1,6 do + des.trap(validtraps:rndcoord(1)) +end +-- Random monsters. +des.monster({ id = "Master of Thieves", x=04, y=01, peaceful = 0 }) +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("s") +des.monster("s") +-- ladies of the evening +des.monster("succubus", 02, 08) +des.monster("succubus", 08, 08) +des.monster("incubus", 02, 14) +des.monster("incubus", 08, 14) +des.monster("incubus", 02, 17) +des.monster("incubus", 08, 17) +-- Police station (with drunken prisoners) +des.monster({ id = "Kop Kaptain", x=24, y=09, peaceful = 0 }) +des.monster({ id = "Kop Lieutenant", x=20, y=09, peaceful = 0 }) +des.monster({ id = "Kop Lieutenant", x=22, y=11, peaceful = 0 }) +des.monster({ id = "Kop Lieutenant", x=22, y=07, peaceful = 0 }) +des.monster({ id = "Keystone Kop", x=19, y=07, peaceful = 0 }) +des.monster({ id = "Keystone Kop", x=19, y=08, peaceful = 0 }) +des.monster({ id = "Keystone Kop", x=22, y=09, peaceful = 0 }) +des.monster({ id = "Keystone Kop", x=24, y=11, peaceful = 0 }) +des.monster({ id = "Keystone Kop", x=19, y=11, peaceful = 0 }) +des.monster("prisoner", 19, 13) +des.monster("prisoner", 21, 13) +des.monster("prisoner", 24, 13) +-- +des.monster({ id = "watchman", x=33, y=10, peaceful = 0 }) + +des.wallify() diff --git a/dat/Tou-loca.lua b/dat/Tou-loca.lua new file mode 100644 index 000000000..68885a91e --- /dev/null +++ b/dat/Tou-loca.lua @@ -0,0 +1,153 @@ +-- NetHack Tourist Tou-loca.lua $NHDT-Date: 1652196015 2022/05/10 15:20:15 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") +des.map([[ +---------------------------------------------------------------------------- +|....|......|..........|......|......|...|....|.....|......|...............| +|....|......|.|------|.|......|......|.|.|....|..}..|......|.|----------|..| +|....|--+----.|......|.|-S---+|+-----|.|.S....|.....|---+--|.|..........+..| +|....|........|......|.|...|.........|.|------|..............|..........|-+| +|....+...}}...+......|.|...|.|-----|.|..............|--+----------------|..| +|----|........|------|.|---|.|.....|......|-----+-|.|.......|...........|--| +|............................|.....|.|--+-|.......|.|.......|...........|..| +|----|.....|-------------|...|--+--|.|....|.......|.|-----------+-------|..| +|....+.....+.........S...|...........|....|-------|........................| +|....|.....|.........|...|.|---------|....|.........|-------|.|----------|.| +|....|.....|---------|---|.|......|..+....|-------|.|.......|.+......S.\.|.| +|....|.....+.........S...|.|......|..|....|.......|.|.......|.|......|...|.| +|-------|..|.........|---|.|+-------------------+-|.|.......+.|----------|.| +|.......+..|---------|.........|.........|..........|.......|.|..........|.| +|.......|..............|--+--|.|.........|.|----+-----------|.|..........|.| +|---------+-|--+-----|-|.....|.|.........|.|........|.|.....+.|..........+.| +|...........|........|.S.....|.|----+----|.|--------|.|.....|.|----------|.| +|...........|........|.|.....|........................|.....|..............| +---------------------------------------------------------------------------- +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.non_diggable(selection.area(00,00,75,19)) +-- +des.region({ region={01,01, 04,05}, lit=0, type="morgue", filled=1 }) +des.region({ region={15,03, 20,05}, lit=1, type="shop", filled=1 }) +des.region({ region={62,03, 71,04}, lit=1, type="shop", filled=1 }) +des.region({ region={01,17, 11,18}, lit=1, type="barracks", filled=1 }) +des.region({ region={12,09, 20,10}, lit=1, type="barracks", filled=1 }) +des.region({ region={53,11, 59,14}, lit=1, type="zoo", filled=1 }) +des.region({ region={63,14, 72,16}, lit=1, type="barracks", filled=1 }) +des.region({ region={32,14, 40,16}, lit=1, type="temple", filled=1 }) +-- +des.region({ region = {06,01,11,02}, type = "ordinary" }) +des.region({ region = {24,01,29,02}, type = "ordinary" }) +des.region({ region = {31,01,36,02}, type = "ordinary" }) +des.region({ region = {42,01,45,03}, type = "ordinary" }) +des.region({ region = {53,01,58,02}, type = "ordinary" }) +des.region({ region = {24,04,26,05}, type = "ordinary" }) +des.region({ region = {30,06,34,07}, type = "ordinary" }) +des.region(selection.area(73,05,74,05), "unlit") +des.region({ region = {01,09,04,12}, type = "ordinary" }) +des.region({ region = {01,14,07,15}, type = "ordinary" }) +des.region({ region = {12,12,20,13}, type = "ordinary" }) +des.region({ region = {13,17,20,18}, type = "ordinary" }) +des.region({ region = {22,09,24,10}, type = "ordinary" }) +des.region({ region = {22,12,24,12}, type = "ordinary" }) +des.region({ region = {24,16,28,18}, type = "ordinary" }) +des.region({ region = {28,11,33,12}, type = "ordinary" }) +des.region(selection.area(35,11,36,12), "lit") +des.region({ region = {38,08,41,12}, type = "ordinary" }) +des.region({ region = {43,07,49,08}, type = "ordinary" }) +des.region({ region = {43,12,49,12}, type = "ordinary" }) +des.region({ region = {44,16,51,16}, type = "ordinary" }) +des.region({ region = {53,06,59,07}, type = "ordinary" }) +des.region({ region = {61,06,71,07}, type = "ordinary" }) +des.region({ region = {55,16,59,18}, type = "ordinary" }) +des.region({ region = {63,11,68,12}, type = "ordinary" }) +des.region({ region = {70,11,72,12}, type = "ordinary" }) +-- Stairs +des.stair("up", 10,04) +des.stair("down", 73,05) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +des.door("closed",05,05) +des.door("closed",05,09) +des.door("closed",08,14) +des.door("closed",08,03) +des.door("closed",11,09) +des.door("closed",11,12) +des.door("closed",10,16) +des.door("closed",14,05) +des.door("closed",15,16) +des.door("locked",21,09) +des.door("locked",21,12) +des.door("closed",23,17) +des.door("closed",25,03) +des.door("closed",26,15) +des.door("closed",29,03) +des.door("closed",28,13) +des.door("closed",31,03) +des.door("closed",32,08) +des.door("closed",37,11) +des.door("closed",36,17) +des.door("locked",41,03) +des.door("closed",40,07) +des.door("closed",48,06) +des.door("closed",48,13) +des.door("closed",48,15) +des.door("closed",56,03) +des.door("closed",55,05) +des.door("closed",72,03) +des.door("locked",74,04) +des.door("closed",64,08) +des.door("closed",62,11) +des.door("closed",69,11) +des.door("closed",60,13) +des.door("closed",60,16) +des.door("closed",73,16) + +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Toilet paper +des.object("blank paper", 71, 12) +des.object("blank paper", 71, 12) +-- Random traps - must avoid the 2 shops +local validtraps = selection.area(00,00,75,19):filter_mapchar('.') +validtraps = validtraps - (selection.area(15,03,20,05) + selection.area(62,03,71,04)) +for i = 1,9 do + des.trap(validtraps:rndcoord(1)) +end +-- Random monsters. +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("s") +des.monster("s") diff --git a/dat/Tou-strt.lua b/dat/Tou-strt.lua new file mode 100644 index 000000000..5c3a0bc32 --- /dev/null +++ b/dat/Tou-strt.lua @@ -0,0 +1,134 @@ +-- NetHack Tourist Tou-strt.lua $NHDT-Date: 1652196016 2022/05/10 15:20:16 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991,92 by M. Stephenson, P. Winner +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Twoflower +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") +des.map([[ +.......}}....---------..-------------------------------------------------... +........}}...|.......|..|.-------------------------------------------...|... +.........}}..|.......|..|.|......|......|.............|......|......|...|... +..........}}.|.......|..|.|......+......+.............+......+..\...|...|... +...........}}}..........|.|......|......|.............|......|......|...|... +.............}}.........|.|----S-|--S---|S----------S-|---S--|------|...|... +..............}}}.......|...............................................|... +................}}}.....----S------++--S----------S----------S-----------... +..................}}........... .. ................................... +......-------......}}}}........}}}}..}}}}..}}}}..}}}}....................... +......|.....|.......}}}}}}..}}}} .. }}}}..}}}}..}}}..................... +......|.....+...........}}}}}}........................}}}..}}}}..}}}..}}}... +......|.....|...........................................}}}}..}}}..}}}}.}}}} +......-------............................................................... +............................................................................ +...-------......-------..................................................... +...|.....|......|.....|..................................................... +...|.....+......+.....|..................................................... +...|.....|......|.....|..................................................... +...-------......-------..................................................... +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region({ region={14,01, 20,03}, lit=0, type="morgue", filled=1 }) +des.region(selection.area(07,10,11,12), "unlit") +des.region(selection.area(04,16,08,18), "unlit") +des.region(selection.area(17,16,21,18), "unlit") +des.region(selection.area(27,02,32,04), "unlit") +des.region(selection.area(34,02,39,04), "unlit") +des.region(selection.area(41,02,53,04), "unlit") +des.region(selection.area(55,02,60,04), "unlit") +des.region(selection.area(62,02,67,04), "lit") +-- Stairs +des.stair("down", 66,03) +-- Portal arrival point +des.levregion({ region = {68,14,68,14}, type="branch" }) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Doors +des.door("locked",31,05) +des.door("locked",36,05) +des.door("locked",41,05) +des.door("locked",52,05) +des.door("locked",58,05) +des.door("locked",28,07) +des.door("locked",39,07) +des.door("locked",50,07) +des.door("locked",61,07) +des.door("closed",33,03) +des.door("closed",40,03) +des.door("closed",54,03) +des.door("closed",61,03) +des.door("open",12,11) +des.door("open",09,17) +des.door("open",16,17) +des.door("locked",35,07) +des.door("locked",36,07) +-- Monsters on siege duty. +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("giant spider") +des.monster("s") +des.monster("s") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("forest centaur") +des.monster("C") +-- Twoflower +des.monster({ id = "Twoflower", coord = {64, 03}, inventory = function() + des.object({ id = "walking shoes", spe = 3 }); + des.object({ id = "hawaiian shirt", spe = 3 }); +end }) +-- The treasure of Twoflower +des.object("chest", 64, 03) +-- guides for the audience chamber +des.monster("guide", 29, 03) +des.monster("guide", 32, 04) +des.monster("guide", 35, 02) +des.monster("guide", 38, 03) +des.monster("guide", 45, 03) +des.monster("guide", 48, 02) +des.monster("guide", 49, 04) +des.monster("guide", 51, 03) +des.monster("guide", 57, 03) +des.monster("guide", 62, 04) +des.monster("guide", 66, 04) +-- path guards +des.monster("watchman", 35, 08) +des.monster("watchman", 36, 08) +-- river monsters +des.monster("giant eel", 62, 12) +des.monster("piranha", 47, 10) +des.monster("piranha", 29, 11) +des.monster("kraken", 34, 09) +des.monster("kraken", 37, 09) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Tourist.des b/dat/Tourist.des deleted file mode 100644 index c88372fd5..000000000 --- a/dat/Tourist.des +++ /dev/null @@ -1,519 +0,0 @@ -# NetHack 3.6 Tourist.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991,92 by M. Stephenson, P. Winner -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Twoflower -# and receive your quest assignment. -# -MAZE: "Tou-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -.......}}....---------..-------------------------------------------------... -........}}...|.......|..|.-------------------------------------------...|... -.........}}..|.......|..|.|......|......|.............|......|......|...|... -..........}}.|.......|..|.|......+......+.............+......+..\...|...|... -...........}}}..........|.|......|......|.............|......|......|...|... -.............}}.........|.|----S-|--S---|S----------S-|---S--|------|...|... -..............}}}.......|...............................................|... -................}}}.....----S------++--S----------S----------S-----------... -..................}}........... .. ................................... -......-------......}}}}........}}}}..}}}}..}}}}..}}}}....................... -......|.....|.......}}}}}}..}}}} .. }}}}..}}}}..}}}..................... -......|.....+...........}}}}}}........................}}}..}}}}..}}}..}}}... -......|.....|...........................................}}}}..}}}..}}}}.}}}} -......-------............................................................... -............................................................................ -...-------......-------..................................................... -...|.....|......|.....|..................................................... -...|.....+......+.....|..................................................... -...|.....|......|.....|..................................................... -...-------......-------..................................................... -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(14,01,20,03),unlit,"morgue" -REGION:(07,10,11,12),unlit,"ordinary" -REGION:(04,16,08,18),unlit,"ordinary" -REGION:(17,16,21,18),unlit,"ordinary" -REGION:(27,02,32,04),unlit,"ordinary" -REGION:(34,02,39,04),unlit,"ordinary" -REGION:(41,02,53,04),unlit,"ordinary" -REGION:(55,02,60,04),unlit,"ordinary" -REGION:(62,02,67,04),lit,"ordinary" -# Stairs -STAIR:(66,03),down -# Portal arrival point -BRANCH:(68,14,68,14),(0,0,0,0) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Doors -DOOR:locked,(31,05) -DOOR:locked,(36,05) -DOOR:locked,(41,05) -DOOR:locked,(52,05) -DOOR:locked,(58,05) -DOOR:locked,(28,07) -DOOR:locked,(39,07) -DOOR:locked,(50,07) -DOOR:locked,(61,07) -DOOR:closed,(33,03) -DOOR:closed,(40,03) -DOOR:closed,(54,03) -DOOR:closed,(61,03) -DOOR:open,(12,11) -DOOR:open,(09,17) -DOOR:open,(16,17) -DOOR:locked,(35,07) -DOOR:locked,(36,07) -# Monsters on siege duty. -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: ('s',"giant spider"),random -MONSTER: 's',random -MONSTER: 's',random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: ('C',"forest centaur"),random -MONSTER: 'C',random -# Twoflower -MONSTER:('@',"Twoflower"),(64,03) -# The treasure of Twoflower -OBJECT:('(',"chest"),(64,03) -# guides for the audience chamber -MONSTER:('@',"guide"),(29,03) -MONSTER:('@',"guide"),(32,04) -MONSTER:('@',"guide"),(35,02) -MONSTER:('@',"guide"),(38,03) -MONSTER:('@',"guide"),(45,03) -MONSTER:('@',"guide"),(48,02) -MONSTER:('@',"guide"),(49,04) -MONSTER:('@',"guide"),(51,03) -MONSTER:('@',"guide"),(57,03) -MONSTER:('@',"guide"),(62,04) -MONSTER:('@',"guide"),(66,04) -# path guards -MONSTER:('@',"watchman"),(35,08) -MONSTER:('@',"watchman"),(36,08) -# river monsters -MONSTER:(';',"giant eel"),(62,12) -MONSTER:(';',"piranha"),(47,10) -MONSTER:(';',"piranha"),(29,11) -MONSTER:(';',"kraken"),(34,09) -MONSTER:(';',"kraken"),(37,09) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random - -# -# The "locate" level for the quest. -# -# Here you have to find the Thieves' Guild Hall to go -# further towards your assigned quest. -# - -MAZE: "Tou-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -MAP ----------------------------------------------------------------------------- -|....|......|..........|......|......|...|....|.....|......|...............| -|....|......|.|------|.|......|......|.|.|....|..}..|......|.|----------|..| -|....|--+----.|......|.|-S---+|+-----|.|.S....|.....|---+--|.|..........+..| -|....|........|......|.|...|.........|.|------|..............|..........|-+| -|....+...}}...+......|.|...|.|-----|.|..............|--+----------------|..| -|----|........|------|.|---|.|.....|......|-----+-|.|.......|...........|--| -|............................|.....|.|--+-|.......|.|.......|...........|..| -|----|.....|-------------|...|--+--|.|....|.......|.|-----------+-------|..| -|....+.....+.........S...|...........|....|-------|........................| -|....|.....|.........|...|.|---------|....|.........|-------|.|----------|.| -|....|.....|---------|---|.|......|..+....|-------|.|.......|.+......S.\.|.| -|....|.....+.........S...|.|......|..|....|.......|.|.......|.|......|...|.| -|-------|..|.........|---|.|+-------------------+-|.|.......+.|----------|.| -|.......+..|---------|.........|.........|..........|.......|.|..........|.| -|.......|..............|--+--|.|.........|.|----+-----------|.|..........|.| -|---------+-|--+-----|-|.....|.|.........|.|........|.|.....+.|..........+.| -|...........|........|.S.....|.|----+----|.|--------|.|.....|.|----------|.| -|...........|........|.|.....|........................|.....|..............| ----------------------------------------------------------------------------- -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -NON_DIGGABLE:(00,00,75,19) -# -REGION:(01,01,04,05),unlit,"morgue" -REGION:(15,03,20,05),lit,"shop" -REGION:(62,03,71,04),lit,"shop" -REGION:(01,17,11,18),lit,"barracks" -REGION:(12,09,20,10),lit,"barracks" -REGION:(53,11,59,14),lit,"zoo" -REGION:(63,14,72,16),lit,"barracks" -REGION:(32,14,40,16),lit,"temple" -# -REGION:(06,01,11,02),random,"ordinary" -REGION:(24,01,29,02),random,"ordinary" -REGION:(31,01,36,02),random,"ordinary" -REGION:(42,01,45,03),random,"ordinary" -REGION:(53,01,58,02),random,"ordinary" -REGION:(24,04,26,05),random,"ordinary" -REGION:(30,06,34,07),random,"ordinary" -REGION:(73,05,74,05),unlit,"ordinary" -REGION:(01,09,04,12),random,"ordinary" -REGION:(01,14,07,15),random,"ordinary" -REGION:(12,12,20,13),random,"ordinary" -REGION:(13,17,20,18),random,"ordinary" -REGION:(22,09,24,10),random,"ordinary" -REGION:(22,12,24,12),random,"ordinary" -REGION:(24,16,28,18),random,"ordinary" -REGION:(28,11,33,12),random,"ordinary" -REGION:(35,11,36,12),lit,"ordinary" -REGION:(38,08,41,12),random,"ordinary" -REGION:(43,07,49,08),random,"ordinary" -REGION:(43,12,49,12),random,"ordinary" -REGION:(44,16,51,16),random,"ordinary" -REGION:(53,06,59,07),random,"ordinary" -REGION:(61,06,71,07),random,"ordinary" -REGION:(55,16,59,18),random,"ordinary" -REGION:(63,11,68,12),random,"ordinary" -REGION:(70,11,72,12),random,"ordinary" -# Stairs -STAIR:(10,04),up -STAIR:(73,05),down -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -DOOR:closed,(05,05) -DOOR:closed,(05,09) -DOOR:closed,(08,14) -DOOR:closed,(08,03) -DOOR:closed,(11,09) -DOOR:closed,(11,12) -DOOR:closed,(10,16) -DOOR:closed,(14,05) -DOOR:closed,(15,16) -DOOR:locked,(21,09) -DOOR:locked,(21,12) -DOOR:closed,(23,17) -DOOR:closed,(25,03) -DOOR:closed,(26,15) -DOOR:closed,(29,03) -DOOR:closed,(28,13) -DOOR:closed,(31,03) -DOOR:closed,(32,08) -DOOR:closed,(37,11) -DOOR:closed,(36,17) -DOOR:locked,(41,03) -DOOR:closed,(40,07) -DOOR:closed,(48,06) -DOOR:closed,(48,13) -DOOR:closed,(48,15) -DOOR:closed,(56,03) -DOOR:closed,(55,05) -DOOR:closed,(72,03) -DOOR:locked,(74,04) -DOOR:closed,(64,08) -DOOR:closed,(62,11) -DOOR:closed,(69,11) -DOOR:closed,(60,13) -DOOR:closed,(60,16) -DOOR:closed,(73,16) - -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Toilet paper -OBJECT:('?',"blank paper"),(71,12) -OBJECT:('?',"blank paper"),(71,12) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:'s',random -MONSTER:'s',random - -# -# The "goal" level for the quest. -# -# Here you meet the Master of Thieves your nemesis monster. You have to -# defeat the Master of Thieves in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Tou-goal", ' ' -GEOMETRY:center,center -MAP ----------------------------------------------------------------------------- -|.........|.........|..........|..| |.................|........|........|..| -|.........|.........|..........|..| |....--------.....|........|........|..| -|------S--|--+-----------+------..| |....|......|.....|........|........|..| -|.........|.......................| |....|......+.....--+-------------+--..| -|.........|.......................| |....|......|..........................| -|-S-----S-|......----------.......| |....|......|..........................| -|..|..|...|......|........|.......| |....-----------.........----..........| -|..+..+...|......|........|.......| |....|.........|.........|}}|..........| -|..|..|...|......+........|.......| |....|.........+.........|}}|..........| -|..|..|...|......|........|.......S.S....|.........|.........----..........| -|---..----|......|........|.......| |....|.........|.......................| -|.........+......|+F-+F-+F|.......| |....-----------.......................| -|---..----|......|..|..|..|.......| |......................--------------..| -|..|..|...|......--F-F--F--.......| |......................+............|..| -|..+..+...|.......................| |--.---...-----+-----..|............|..| -|--|..----|--+-----------+------..| |.....|...|.........|..|------------|..| -|..+..+...|.........|..........|..| |.....|...|.........|..+............|..| -|..|..|...|.........|..........|..| |.....|...|.........|..|............|..| ----------------------------------------------------------------------------- -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -# The Inn -REGION:(01,01,09,02),lit,"ordinary" -REGION:(01,04,09,05),lit,"barracks" -REGION:(01,07,02,10),unlit,"ordinary" -REGION:(07,07,09,10),unlit,"ordinary" -REGION:(01,14,02,15),unlit,"ordinary" -REGION:(07,14,09,15),unlit,"ordinary" -REGION:(01,17,02,18),unlit,"ordinary" -REGION:(07,17,09,18),unlit,"ordinary" -# -REGION:(11,01,19,02),unlit,"barracks" -REGION:(21,01,30,02),unlit,"ordinary" -REGION:(11,17,19,18),unlit,"barracks" -REGION:(21,17,30,18),unlit,"ordinary" -# Police Station -REGION:(18,07,25,11),lit,"ordinary" -REGION:(18,13,19,13),unlit,"ordinary" -REGION:(21,13,22,13),unlit,"ordinary" -REGION:(24,13,25,13),unlit,"ordinary" -# The town itself -REGION:(42,03,47,06),unlit,"ordinary" -REGION:(42,08,50,11),unlit,"ordinary" -REGION:(37,16,41,18),unlit,"morgue" -REGION:(47,16,55,18),unlit,"ordinary" -REGION:(55,01,62,03),unlit,"ordinary" -REGION:(64,01,71,03),unlit,"ordinary" -REGION:(60,14,71,15),lit,"shop" -REGION:(60,17,71,18),lit,"shop" -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Stairs -STAIR:(70,08),up -# Doors -DOOR:locked,(07,03) -DOOR:locked,(02,06) -DOOR:locked,(08,06) -DOOR:closed,(03,08) -DOOR:closed,(06,08) -DOOR:open,(10,12) -DOOR:closed,(03,15) -DOOR:closed,(06,15) -DOOR:closed,(03,17) -DOOR:closed,(06,17) -DOOR:closed,(13,03) -DOOR:random,(25,03) -DOOR:closed,(13,16) -DOOR:random,(25,16) -DOOR:locked,(17,09) -DOOR:locked,(18,12) -DOOR:locked,(21,12) -DOOR:locked,(24,12) -DOOR:locked,(34,10) -DOOR:locked,(36,10) -DOOR:random,(48,04) -DOOR:random,(56,04) -DOOR:random,(70,04) -DOOR:random,(51,09) -DOOR:random,(51,15) -DOOR:open,(59,14) -DOOR:open,(59,17) -# Objects -OBJECT:('(',"credit card"),(04,01),blessed,0,name:"The Platinum Yendorian Express Card" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"Master of Thieves"),(04,01),hostile -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:('s',"giant spider"),random -MONSTER:'s',random -MONSTER:'s',random -# ladies of the evening -MONSTER:('&',"succubus"),(02,08) -MONSTER:('&',"succubus"),(08,08) -MONSTER:('&',"incubus"),(02,14) -MONSTER:('&',"incubus"),(08,14) -MONSTER:('&',"incubus"),(02,17) -MONSTER:('&',"incubus"),(08,17) -# Police station (with drunken prisoners) -MONSTER:('K',"Kop Kaptain"),(24,09),hostile -MONSTER:('K',"Kop Lieutenant"),(20,09),hostile -MONSTER:('K',"Kop Lieutenant"),(22,11),hostile -MONSTER:('K',"Kop Lieutenant"),(22,07),hostile -MONSTER:('K',"Keystone Kop"),(19,07),hostile -MONSTER:('K',"Keystone Kop"),(19,08),hostile -MONSTER:('K',"Keystone Kop"),(22,09),hostile -MONSTER:('K',"Keystone Kop"),(24,11),hostile -MONSTER:('K',"Keystone Kop"),(19,11),hostile -MONSTER:('@',"prisoner"),(19,13) -MONSTER:('@',"prisoner"),(21,13) -MONSTER:('@',"prisoner"),(24,13) -# -MONSTER:('@',"watchman"),(33,10),hostile - -WALLIFY - -# -# The "fill" level for the quest. -# -# This level is used to fill out any levels not occupied by specific -# levels as defined above. -# - -MAZE: "Tou-fila" , ' ' -INIT_MAP: mines, '.' , ' ', true, true, random, true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('@', "soldier"), random, hostile -MONSTER: ('@', "soldier"), random, hostile -MONSTER: ('@', "soldier"), random, hostile -MONSTER: ('@', "soldier"), random, hostile -MONSTER: ('@', "soldier"), random, hostile -MONSTER: 'H', random, hostile -MONSTER: 'C', random, hostile - -MAZE: "Tou-filb" , ' ' -INIT_MAP: mines, '.' , ' ', true, true, random, true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -# -MONSTER: ('@', "soldier"), random, hostile -MONSTER: ('@', "captain"), random, hostile -MONSTER: ('@', "captain"), random, hostile -MONSTER: 'H', random, hostile -MONSTER: 'H', random, hostile -MONSTER: 'C', random, hostile -MONSTER: 's', random diff --git a/dat/Val-fila.lua b/dat/Val-fila.lua new file mode 100644 index 000000000..8047f7957 --- /dev/null +++ b/dat/Val-fila.lua @@ -0,0 +1,40 @@ +-- NetHack Valkyrie Val-fila.lua $NHDT-Date: 1652196016 2022/05/10 15:20:16 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "I" }); + +des.level_flags("mazelevel", "icedpools", "noflip") + +des.level_init({ style="mines", fg=".", bg="I", smoothed=true, joined=true, lit=1, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("a") +des.monster({ id = "fire giant", peaceful = 0 }) +-- +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/Val-filb.lua b/dat/Val-filb.lua new file mode 100644 index 000000000..ede6f1e52 --- /dev/null +++ b/dat/Val-filb.lua @@ -0,0 +1,42 @@ +-- NetHack Valkyrie Val-filb.lua $NHDT-Date: 1652196016 2022/05/10 15:20:16 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "L" }); + +des.level_flags("mazelevel", "icedpools", "noflip") + +des.level_init({ style="mines", fg=".", bg="L", smoothed=true, joined=true, lit=1, walled=false }) + +-- +des.stair("up") +des.stair("down") +-- +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("a") +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +-- +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap() +des.trap() diff --git a/dat/Val-goal.lua b/dat/Val-goal.lua new file mode 100644 index 000000000..43179a390 --- /dev/null +++ b/dat/Val-goal.lua @@ -0,0 +1,104 @@ +-- NetHack Valkyrie Val-goal.lua $NHDT-Date: 1652196017 2022/05/10 15:20:17 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = "L" }); + +des.level_flags("mazelevel", "icedpools") + +des.level_init({ style="mines", fg=".", bg="L", smoothed=true, joined=true, lit=1, walled=false }) + +des.map([[ +xxxxxx.....................xxxxxxxx +xxxxx.......LLLLL.LLLLL......xxxxxx +xxxx......LLLLLLLLLLLLLLL......xxxx +xxxx.....LLL|---------|LLL.....xxxx +xxxx....LL|--.........--|LL.....xxx +x......LL|-...LLLLLLL...-|LL.....xx +.......LL|...LL.....LL...|LL......x +......LL|-..LL.......LL..-|LL...... +......LL|.................|LL...... +......LL|-..LL.......LL..-|LL...... +.......LL|...LL.....LL...|LL....... +xx.....LL|-...LLLLLLL...-|LL......x +xxx.....LL|--.........--|LL.....xxx +xxxx.....LLL|---------|LLL...xxxxxx +xxxxx.....LLLLLLLLLLLLLLL...xxxxxxx +xxxxxx......LLLLL.LLLLL.....xxxxxxx +xxxxxxxxx..................xxxxxxxx +]]); +-- Dungeon Description +des.region(selection.area(00,00,34,16), "lit") +-- Stairs +-- Note: The up stairs are *intentionally* off of the map. +-- if the stairs are surrounded by lava, maybe give some room +des.replace_terrain({ region = {44,09, 46,11}, fromterrain='L', toterrain='.', chance=50 }); +des.stair("up", 45,10) +-- Non diggable walls +des.non_diggable(selection.area(00,00,34,16)) +-- Drawbridges; northern one opens from the south (portcullis) to further +-- north (lowered span), southern one from the north to further south +des.drawbridge({ x=17, y=02, dir="south", state="random" }) +if percent(75) then + des.drawbridge({ x=17, y=14, dir="north", state="open" }) +else + des.drawbridge({ x=17, y=14, dir="north", state="random" }) +end +-- Objects +des.object({ id = "crystal ball", x=17, y=08, buc="blessed", spe=5, name="The Orb of Fate" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Traps +des.trap("board",13,08) +des.trap("board",21,08) +-- Random traps +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("board") +des.trap() +des.trap() +-- Random monsters. +des.monster("Lord Surtur", 17, 08) +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("a") +des.monster("a") +des.monster({ id = "fire giant", x=10, y=06, peaceful = 0 }) +des.monster({ id = "fire giant", x=10, y=07, peaceful = 0 }) +des.monster({ id = "fire giant", x=10, y=08, peaceful = 0 }) +des.monster({ id = "fire giant", x=10, y=09, peaceful = 0 }) +des.monster({ id = "fire giant", x=10, y=10, peaceful = 0 }) +des.monster({ id = "fire giant", x=24, y=06, peaceful = 0 }) +des.monster({ id = "fire giant", x=24, y=07, peaceful = 0 }) +des.monster({ id = "fire giant", x=24, y=08, peaceful = 0 }) +des.monster({ id = "fire giant", x=24, y=09, peaceful = 0 }) +des.monster({ id = "fire giant", x=24, y=10, peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ class = "H", peaceful = 0 }) + +-- +-- The "fill" levels for the quest. +-- +-- These levels are used to fill out any levels not occupied by specific +-- levels as defined above. "filla" is the upper filler, between the +-- start and locate levels, and "fillb" the lower between the locate +-- and goal levels. +-- diff --git a/dat/Val-loca.lua b/dat/Val-loca.lua new file mode 100644 index 000000000..a2875839a --- /dev/null +++ b/dat/Val-loca.lua @@ -0,0 +1,85 @@ +-- NetHack Valkyrie Val-loca.lua $NHDT-Date: 1652196017 2022/05/10 15:20:17 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor", "icedpools", "noflip") + +des.level_init({ style="mines", fg=".", bg="I", smoothed=true, joined=false, lit=1, walled=false }) + +des.map([[ +PPPPxxxx xxxxPPPPPx +PLPxxx xPPLLLPP +PPP ....................... PPPLLP +xx ............................ PPPP +x ............................... xxxx + ................................. xx +.................................... x + ................................... +x .................................. x +xx .............................. PP +xPPP .......................... PLP +xPLLP xxPLLP +xPPPPxx xxxxPPPP +]]); +-- Dungeon Description +des.region(selection.area(00,00,39,12), "lit") +-- Stairs +des.stair("up", 48,14) +des.stair("down", 20,06) +-- Non diggable walls +des.non_diggable(selection.area(00,00,39,12)) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap() +des.trap() +-- Random monsters. +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("fire ant") +des.monster("a") +des.monster({ class = "H", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ id = "fire giant", peaceful = 0 }) +des.monster({ class = "H", peaceful = 0 }) + diff --git a/dat/Val-strt.lua b/dat/Val-strt.lua new file mode 100644 index 000000000..906500fcf --- /dev/null +++ b/dat/Val-strt.lua @@ -0,0 +1,100 @@ +-- NetHack Valkyrie Val-strt.lua $NHDT-Date: 1652196017 2022/05/10 15:20:17 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1991-2 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, the Norn, +-- and receive your quest assignment. +-- + +des.level_flags("mazelevel", "noteleport", "hardfloor", "icedpools") +des.level_init({ style = "solidfill", fg = "I" }) + +local pools = selection.new() +-- random locations +for i = 1,13 do + pools:set(); +end +-- some bigger ones +pools = pools | selection.grow(selection.set(selection.new()), "west") +pools = pools | selection.grow(selection.set(selection.new()), "north") +pools = pools | selection.grow(selection.set(selection.new()), "random") + +-- Lava pools surrounded by water +des.terrain(pools:clone():grow("all"), "P") +des.terrain(pools, "L") + +des.map([[ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..{..xxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.....xxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxx +xxxxxxxx.....xxxxxxxxxxxxx|----------------|xxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx +xxxxxxx..xxx...xxxxxxxxxxx|................|xxxxxxxxxx..xxxxxxxxxxxxxxxxxxxx +xxxxxx..xxxxxx......xxxxx.|................|.xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxx +xxxxx..xxxxxxxxxxxx.......+................+...xxxxxxx.xxxxxxxxxxxxxxxxxxxxx +xxxx..xxxxxxxxx.....xxxxx.|................|.x...xxxxx.xxxxxxxxxxxxxxxxxxxxx +xxx..xxxxxxxxx..xxxxxxxxxx|................|xxxx.......xxxxxxxxxxxxxxxxxxxxx +xxxx..xxxxxxx..xxxxxxxxxxx|----------------|xxxxxxxxxx...xxxxxxxxxxxxxxxxxxx +xxxxxx..xxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxx +xxxxxxx......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxx +xxxxxxxxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...x......xxxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.........xxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.......xxxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +]]); +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +-- Portal arrival point +des.levregion({ region = {66,17,66,17}, type="branch" }) +-- Stairs +des.stair("down", 18,01) +des.feature("fountain", 53,02) +-- Doors +des.door("locked",26,10) +des.door("locked",43,10) +-- Norn +des.monster({ id = "Norn", coord = {35, 10}, inventory = function() + des.object({ id = "banded mail", spe = 5 }); + des.object({ id = "long sword", spe = 4 }); +end }) +-- The treasure of the Norn +des.object("chest", 36, 10) +-- valkyrie guards for the audience chamber +des.monster("warrior", 27, 08) +des.monster("warrior", 27, 09) +des.monster("warrior", 27, 11) +des.monster("warrior", 27, 12) +des.monster("warrior", 42, 08) +des.monster("warrior", 42, 09) +des.monster("warrior", 42, 11) +des.monster("warrior", 42, 12) +-- Non diggable walls +des.non_diggable(selection.area(26,07,43,13)) +-- Random traps +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +-- Monsters on siege duty. +des.monster("fire ant", 04, 12) +des.monster("fire ant", 08, 08) +des.monster("fire ant", 14, 04) +des.monster("fire ant", 17, 11) +des.monster("fire ant", 24, 10) +des.monster("fire ant", 45, 10) +des.monster("fire ant", 54, 02) +des.monster("fire ant", 55, 07) +des.monster("fire ant", 58, 14) +des.monster("fire ant", 63, 17) +des.monster({ id = "fire giant", x=18, y=01, peaceful = 0 }) +des.monster({ id = "fire giant", x=10, y=16, peaceful = 0 }) + diff --git a/dat/Valkyrie.des b/dat/Valkyrie.des deleted file mode 100644 index 252c6ce82..000000000 --- a/dat/Valkyrie.des +++ /dev/null @@ -1,353 +0,0 @@ -# NetHack 3.6 Valkyrie.des $NHDT-Date: 1553807172 2019/03/28 21:06:12 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.15 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1991-2 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, the Norn, -# and receive your quest assignment. -# -MAZE: "Val-strt",' ' -FLAGS: noteleport,hardfloor,icedpools -INIT_MAP:solidfill,'I' - -$pools = selection: random & random & random & random & random & - random & random & random & random & random & random & - random & random & - grow(west, random) & - grow(north, random) & - grow(random & random) -# This works because the random coordinates in $pools are evaluated once, -# when the variable is initialized. -TERRAIN:grow($pools), 'P' -TERRAIN:$pools, 'L' - -GEOMETRY:center,center -MAP -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..{..xxxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.....xxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx -xxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxx -xxxxxxxx.....xxxxxxxxxxxxx|----------------|xxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx -xxxxxxx..xxx...xxxxxxxxxxx|................|xxxxxxxxxx..xxxxxxxxxxxxxxxxxxxx -xxxxxx..xxxxxx......xxxxx.|................|.xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxx -xxxxx..xxxxxxxxxxxx.......+................+...xxxxxxx.xxxxxxxxxxxxxxxxxxxxx -xxxx..xxxxxxxxx.....xxxxx.|................|.x...xxxxx.xxxxxxxxxxxxxxxxxxxxx -xxx..xxxxxxxxx..xxxxxxxxxx|................|xxxx.......xxxxxxxxxxxxxxxxxxxxx -xxxx..xxxxxxx..xxxxxxxxxxx|----------------|xxxxxxxxxx...xxxxxxxxxxxxxxxxxxx -xxxxxx..xxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxx -xxxxxxx......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxx -xxxxxxxxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...x......xxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.........xxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.......xxxxxx -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -ENDMAP -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(27,08,42,12),lit,"ordinary" -# Portal arrival point -BRANCH:(66,17,66,17),(0,0,0,0) -# Stairs -STAIR:(18,01),down -FOUNTAIN:(53,02) -# Doors -DOOR:locked,(26,10) -DOOR:locked,(43,10) -# Norn -MONSTER:('@',"Norn"),(35,10) -# The treasure of the Norn -OBJECT:('(',"chest"),(36,10) -# valkyrie guards for the audience chamber -MONSTER:('@',"warrior"),(27,08) -MONSTER:('@',"warrior"),(27,09) -MONSTER:('@',"warrior"),(27,11) -MONSTER:('@',"warrior"),(27,12) -MONSTER:('@',"warrior"),(42,08) -MONSTER:('@',"warrior"),(42,09) -MONSTER:('@',"warrior"),(42,11) -MONSTER:('@',"warrior"),(42,12) -# Non diggable walls -NON_DIGGABLE:(26,07,43,13) -# Random traps -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -# Monsters on siege duty. -MONSTER: ('a',"fire ant"),(04,12) -MONSTER: ('a',"fire ant"),(08,08) -MONSTER: ('a',"fire ant"),(14,04) -MONSTER: ('a',"fire ant"),(17,11) -MONSTER: ('a',"fire ant"),(24,10) -MONSTER: ('a',"fire ant"),(45,10) -MONSTER: ('a',"fire ant"),(54,02) -MONSTER: ('a',"fire ant"),(55,07) -MONSTER: ('a',"fire ant"),(58,14) -MONSTER: ('a',"fire ant"),(63,17) -MONSTER: ('H',"fire giant"),(18,01),hostile -MONSTER: ('H',"fire giant"),(10,16),hostile - -# -# The "locate" level for the quest. -# -# Here you have to find the cave of Surtur to go -# further towards your assigned quest. -# - -MAZE: "Val-loca",' ' -FLAGS: hardfloor,icedpools -INIT_MAP: mines, '.', 'I', true, true, lit, false -GEOMETRY:center,center -MAP -PPPPxxxx xxxxPPPPPx -PLPxxx xPPLLLPP -PPP ....................... PPPLLP -xx ............................ PPPP -x ............................... xxxx - ................................. xx -.................................... x - ................................... -x .................................. x -xx .............................. PP -xPPP .......................... PLP -xPLLP xxPLLP -xPPPPxx xxxxPPPP -ENDMAP -# Dungeon Description -REGION:(00,00,39,12),lit,"ordinary" -# Stairs -STAIR:(48,14),up -STAIR:(20,06),down -# Non diggable walls -NON_DIGGABLE:(00,00,39,12) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:'a',random -MONSTER:'H',random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:'H',random,hostile - -# -# The "goal" level for the quest. -# -# Here you meet Lord Surtur your nemesis monster. You have to -# defeat Lord Surtur in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Val-goal", 'L' -FLAGS: icedpools -INIT_MAP: mines, '.', 'L', true, true, lit, false -GEOMETRY:center,center -MAP -xxxxxx.....................xxxxxxxx -xxxxx.......LLLLL.LLLLL......xxxxxx -xxxx......LLLLLLLLLLLLLLL......xxxx -xxxx.....LLL|---------|LLL.....xxxx -xxxx....LL|--.........--|LL.....xxx -x......LL|-...LLLLLLL...-|LL.....xx -.......LL|...LL.....LL...|LL......x -......LL|-..LL.......LL..-|LL...... -......LL|.................|LL...... -......LL|-..LL.......LL..-|LL...... -.......LL|...LL.....LL...|LL....... -xx.....LL|-...LLLLLLL...-|LL......x -xxx.....LL|--.........--|LL.....xxx -xxxx.....LLL|---------|LLL...xxxxxx -xxxxx.....LLLLLLLLLLLLLLL...xxxxxxx -xxxxxx......LLLLL.LLLLL.....xxxxxxx -xxxxxxxxx..................xxxxxxxx -ENDMAP -# Dungeon Description -REGION:(00,00,34,16),lit,"ordinary" -# Stairs -# Note: The up stairs are *intentionally* off of the map. -STAIR:(45,10),up -# Non diggable walls -NON_DIGGABLE:(00,00,34,16) -# Drawbridges; northern one opens from the south (portcullis) to further -# north (lowered span), southern one from the north to further south -DRAWBRIDGE:(17,02),south,random -IF [75%] { - DRAWBRIDGE:(17,14),north,open -} ELSE { - DRAWBRIDGE:(17,14),north,random -} -# Objects -OBJECT:('(',"crystal ball"),(17,08),blessed,5,name:"The Orb of Fate" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Traps -TRAP:"board",(13,08) -TRAP:"board",(21,08) -# Random traps -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"board",random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('H',"Lord Surtur"),(17,08) -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:('a',"fire ant"),random -MONSTER:'a',random -MONSTER:'a',random -MONSTER:('H',"fire giant"),(10,06),hostile -MONSTER:('H',"fire giant"),(10,07),hostile -MONSTER:('H',"fire giant"),(10,08),hostile -MONSTER:('H',"fire giant"),(10,09),hostile -MONSTER:('H',"fire giant"),(10,10),hostile -MONSTER:('H',"fire giant"),(24,06),hostile -MONSTER:('H',"fire giant"),(24,07),hostile -MONSTER:('H',"fire giant"),(24,08),hostile -MONSTER:('H',"fire giant"),(24,09),hostile -MONSTER:('H',"fire giant"),(24,10),hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:('H',"fire giant"),random,hostile -MONSTER:'H',random,hostile - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -MAZE: "Val-fila" , 'I' -FLAGS: icedpools -INIT_MAP: mines, '.', 'I', true, true, lit, false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('a', "fire ant"), random -MONSTER: ('a', "fire ant"), random -MONSTER: ('a', "fire ant"), random -MONSTER: ('a', "fire ant"), random -MONSTER: ('a', "fire ant"), random -MONSTER: 'a', random -MONSTER: ('H', "fire giant"), random, hostile -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random - -MAZE: "Val-filb" , 'L' -FLAGS: icedpools -INIT_MAP: mines, '.', 'L', true, true, lit, false -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('a', "fire ant"), random -MONSTER: ('a', "fire ant"), random -MONSTER: ('a', "fire ant"), random -MONSTER: 'a', random -MONSTER: ('H', "fire giant"), random, hostile -MONSTER: ('H', "fire giant"), random, hostile -MONSTER: ('H', "fire giant"), random, hostile -# -TRAP: "fire", random -TRAP: "fire", random -TRAP: "fire", random -TRAP: "fire", random -TRAP: "fire", random -TRAP: random, random -TRAP: random, random diff --git a/dat/Wiz-fila.lua b/dat/Wiz-fila.lua new file mode 100644 index 000000000..401067e74 --- /dev/null +++ b/dat/Wiz-fila.lua @@ -0,0 +1,59 @@ +-- NetHack Wizard Wiz-fila.lua $NHDT-Date: 1652196018 2022/05/10 15:20:18 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1992 by David Cohrs +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster({ class = "i", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster({ class = "i", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster("vampire bat") + des.monster("vampire bat") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.monster({ class = "i", peaceful=0 }) + des.monster("vampire bat") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster({ class = "i", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.monster("vampire bat") + end +}) + +des.random_corridors() diff --git a/dat/Wiz-filb.lua b/dat/Wiz-filb.lua new file mode 100644 index 000000000..28dc5e366 --- /dev/null +++ b/dat/Wiz-filb.lua @@ -0,0 +1,58 @@ +-- NetHack Wizard Wiz-filb.lua $NHDT-Date: 1652196018 2022/05/10 15:20:18 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1992 by David Cohrs +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.room({ type = "ordinary", + contents = function() + des.stair("up") + des.object() + des.monster({ class = "X", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.monster({ class = "i", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.object() + des.monster({ class = "X", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.object() + des.trap() + des.monster({ class = "i", peaceful=0 }) + des.monster("vampire bat") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.object() + des.trap() + des.monster({ class = "i", peaceful=0 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.object() + des.trap() + des.monster("vampire bat") + end +}) + +des.random_corridors() diff --git a/dat/Wiz-goal.lua b/dat/Wiz-goal.lua new file mode 100644 index 000000000..8bf86626f --- /dev/null +++ b/dat/Wiz-goal.lua @@ -0,0 +1,132 @@ +-- NetHack Wizard Wiz-goal.lua $NHDT-Date: 1652196018 2022/05/10 15:20:18 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1992 by David Cohrs +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ + + + + ------------- ------------- + |...........| |...........| + -------|...........-------------------...........| + |......S...........|..|..|..|..|..|..|...........| + |......|...........|..|..|..|..|..|..|...........| + |......|...........-F+-F+-F+-F+-F+-F+-...........| + --S----|...........S.................+...........| + |......|...........-F+-F+-F+-F+-F+-F+-...........| + |......|...........|..|..|..|..|..|..|...........| + |......|...........|..|..|..|..|..|..|...........| + -------|...........-------------------...........| + |...........| |...........| + ------------- ------------- + + + + +]]); +-- Dungeon Description +des.region({ region={13,10,18,12}, lit=0, type="temple", filled=2 }) +des.region(selection.area(13,06,18,08), "lit") +des.region(selection.area(20,04,30,14), "unlit") +des.region(selection.area(32,06,33,07), "unlit") +des.region(selection.area(35,06,36,07), "unlit") +des.region(selection.area(38,06,39,07), "unlit") +des.region(selection.area(41,06,42,07), "unlit") +des.region(selection.area(44,06,45,07), "unlit") +des.region(selection.area(47,06,48,07), "unlit") +des.region(selection.area(32,09,48,09), "unlit") +des.region(selection.area(32,11,33,12), "unlit") +des.region(selection.area(35,11,36,12), "unlit") +des.region(selection.area(38,11,39,12), "unlit") +des.region(selection.area(41,11,42,12), "unlit") +des.region(selection.area(44,11,45,12), "unlit") +des.region(selection.area(47,11,48,12), "unlit") +des.region(selection.area(50,04,60,14), "lit") +-- Doors +des.door("locked",19,06) +des.door("locked",14,09) +des.door("locked",31,09) +des.door("locked",33,08) +des.door("locked",36,08) +des.door("locked",39,08) +des.door("locked",42,08) +des.door("locked",45,08) +des.door("locked",48,08) +des.door("locked",33,10) +des.door("locked",36,10) +des.door("locked",39,10) +des.door("locked",42,10) +des.door("locked",45,10) +des.door("locked",48,10) +des.door("locked",49,09) +-- Stairs +des.stair("up", 55,05) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- The altar. This is not a shrine. +des.altar({ coord={16,11}, aligned="noncoaligned", type="altar" }) +-- Objects +des.object({ id = "amulet of ESP", x=16, y=11, buc="blessed", spe=0, name="The Eye of the Aethiopica" }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster("Dark One", 16, 11) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "B",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster({ class = "i",random, peaceful = 0 }) +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster({ class = "i",random, peaceful = 0 }) +-- Captive Monsters in the dungeon +des.monster({ id = "rogue", x=35, y=06, peaceful=1, name="Pug" }) +des.monster({ id = "owlbear", x=47, y=06, peaceful=1, asleep=1 }) +des.monster({ id = "wizard", x=32, y=11, peaceful=1, asleep=1, name="Newt" }) +des.monster({ id = "Grey-elf", x=44, y=11, peaceful=1 }) +des.monster({ id = "hill giant", x=47, y=11, peaceful=1, asleep=1 }) +des.monster({ id = "gnomish wizard", x=38, y=06, peaceful=1 }) +des.monster({ id = "prisoner", x=35, y=11, peaceful=1 }) +des.monster({ id = "prisoner", x=41, y=11, peaceful=1, asleep=1 }) diff --git a/dat/Wiz-loca.lua b/dat/Wiz-loca.lua new file mode 100644 index 000000000..4522d61c2 --- /dev/null +++ b/dat/Wiz-loca.lua @@ -0,0 +1,151 @@ +-- NetHack Wizard Wiz-loca.lua $NHDT-Date: 1652196019 2022/05/10 15:20:19 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1992 by David Cohrs +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "hardfloor") + +des.map([[ +............. ....................................................... +.............. .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....... +.............. ..............}.................................}....... +.............. ..............}.-------------------------------.}....... +............... .........C....}.|.............................|.}....... +............... ..........C....}.|.---------------------------.|.}....... +............... .........CCC...}.|.|.........................|.|.}....... +................ ....C....CCC...}.|.|.-----------------------.|.|.}....... +.......C..C..... .....C....CCC...}.|.|.|......+.......+......|.|.|.}....... +.............C..CC.....C....CCC...}.|.|.|......|-------|......|.|.|.}....... +................ ....C....CCC...}.|.|.|......|.......|......|.|.|.}....... +......C..C..... ....C....CCC...}.|.|.|......|-------|......|.|.|.}....... +............C.. ...C....CCC...}.|.|.|......+.......+......|.|.|.}....... +........C...... ....C....CCC...}.|.|.-----------------------.|.|.}....... +....C......C... ........CCC...}.|.|.........................|.|.}....... +......C..C.... .........C....}.|.---------------------------.|.}....... +.............. .........C....}.|.............................|.}....... +............. ..............}.-------------------------------.}....... +............. .............}.................................}....... +............. .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....... +............. ....................................................... +]]); + +des.replace_terrain({ region = { 0, 0,30,20}, fromterrain=".", toterrain="C", chance=15 }) +des.replace_terrain({ region = {68, 0,75,20}, fromterrain=".", toterrain="}", chance=25 }) +des.replace_terrain({ region = {34, 1,68,19}, fromterrain="}", toterrain=".", chance=2 }) + +-- Dungeon Description +des.region(selection.area(00,00,75,20), "lit") +des.region({ region={37,04,65,16}, lit=0, type="ordinary", irregular=1, + contents = function() + des.door({ state="secret", wall="random" }) + end +}) +des.region({ region={39,06,63,14}, lit=0, type="ordinary", irregular=1, + contents = function() + des.door({ state="secret", wall="random" }) + end +}) + +des.region({ region={41,08,46,12}, lit=1, type="ordinary", irregular=1, + contents = function() + local walls = { "north", "south", "west" } + local widx = math.random(1, #walls) + des.door({ state="secret", wall=walls[widx] }) + end +}) + +des.region({ region={56,08,61,12}, lit=1, type="ordinary", irregular=1, + contents = function() + local walls = { "north", "south", "east" } + local widx = math.random(1, #walls) + des.door({ state="secret", wall=walls[widx] }) + end +}) + +des.region(selection.area(48,08,54,08), "unlit") +des.region(selection.area(48,12,54,12), "unlit") + +des.region({ region={48,10,54,10}, lit=0, type="ordinary", irregular=1, + contents = function() + des.door({ state="secret", wall="random" }) + end +}) + +-- Doors +des.door("locked",55,08) +des.door("locked",55,12) +des.door("locked",47,08) +des.door("locked",47,12) +-- Stairs +des.terrain({03,17}, ".") +des.stair("up", 03,17) +des.stair("down", 48,10) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,20)) +-- Objects +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap("spiked pit",24,02) +des.trap("spiked pit",07,10) +des.trap("spiked pit",23,05) +des.trap("spiked pit",26,19) +des.trap("spiked pit",72,02) +des.trap("spiked pit",72,12) +des.trap("falling rock",45,16) +des.trap("falling rock",65,13) +des.trap("falling rock",55,06) +des.trap("falling rock",39,11) +des.trap("falling rock",57,09) +des.trap("magic") +des.trap("statue") +des.trap("statue") +des.trap("polymorph") +des.trap("anti magic",53,10) +des.trap("sleep gas") +des.trap("sleep gas") +des.trap("dart") +des.trap("dart") +des.trap("dart") +-- Random monsters. +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "B", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster({ class = "i", peaceful = 0 }) +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +des.monster({ class = "i", peaceful = 0 }) diff --git a/dat/Wiz-strt.lua b/dat/Wiz-strt.lua new file mode 100644 index 000000000..96a04bae1 --- /dev/null +++ b/dat/Wiz-strt.lua @@ -0,0 +1,107 @@ +-- NetHack Wizard Wiz-strt.lua $NHDT-Date: 1652196019 2022/05/10 15:20:19 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1992 by David Cohrs +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The "start" level for the quest. +-- +-- Here you meet your (besieged) class leader, Neferet the Green +-- and receive your quest assignment. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +des.map([[ +............................................................................ +.....................C....CC.C........................C..................... +..........CCC.....................CCC....................................... +........CC........-----------.......C.C...C...C....C........................ +.......C.....---------------------...C..C..C..C............................. +......C..C...------....\....------....C.....C............................... +........C...||....|.........|....||......................................... +.......C....||....|.........+....||......................................... +.......C...||---+--.........|....|||........................................ +......C....||...............|--S--||........................................ +...........||--+--|++----|---|..|.SS..........C......C...................... +........C..||.....|..|...|...|--|.||..CC..C.....C..........C................ +.......C...||.....|..|.--|.|.|....||.................C..C................... +.....C......||....|..|.....|.|.--||..C..C..........C...........}}}.......... +......C.C...||....|..-----.|.....||...C.C.C..............C....}}}}}}........ +.........C...------........|------....C..C.....C..CC.C......}}}}}}}}}}}..... +.........CC..---------------------...C.C..C.....CCCCC.C.......}}}}}}}}...... +.........C........-----------..........C.C.......CCC.........}}}}}}}}}...... +..........C.C.........................C............C...........}}}}}........ +......................CCC.C................................................. +]]); + +-- first do cloud everywhere +des.replace_terrain({ region={0,0, 75,19}, fromterrain=".", toterrain="C", chance=10 }) +-- then replace clouds inside the tower back to floor +des.replace_terrain({ region={13,5, 33,15}, fromterrain="C", toterrain=".", chance=100 }) + +-- Dungeon Description +des.region(selection.area(00,00,75,19), "lit") +des.region(selection.area(35,00,49,03), "unlit") +des.region(selection.area(43,12,49,16), "unlit") +des.region({ region={19,11,33,15}, lit=0, type="ordinary", irregular=1 }) +des.region(selection.area(30,10,31,10), "unlit") +-- Stairs +des.stair("down", 30,10) +-- Portal arrival point +des.terrain({63,06}, ".") +des.levregion({ region = {63,06,63,06}, type="branch" }) +-- Doors +des.door("closed",31,09) +des.door("closed",16,08) +des.door("closed",28,07) +des.door("locked",34,10) +des.door("locked",35,10) +des.door("closed",15,10) +des.door("locked",19,10) +des.door("locked",20,10) +-- Neferet the Green, the quest leader +des.monster({ id = "Neferet the Green", coord = {23, 05}, inventory = function() + des.object({ id = "elven cloak", spe = 5 }); + des.object({ id = "quarterstaff", spe = 5 }); +end }) +-- The treasure of the quest leader +des.object("chest", 24, 05) +-- apprentice guards for the audience chamber +des.monster("apprentice", 30, 07) +des.monster("apprentice", 24, 06) +des.monster("apprentice", 15, 06) +des.monster("apprentice", 15, 12) +des.monster("apprentice", 26, 11) +des.monster("apprentice", 27, 11) +des.monster("apprentice", 19, 09) +des.monster("apprentice", 20, 09) +-- Eels in the pond +des.monster("giant eel", 62, 14) +des.monster("giant eel", 69, 15) +des.monster("giant eel", 67, 17) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters on siege duty. +des.monster({ class = "B", x=60, y=09, peaceful = 0 }) +des.monster({ class = "W", x=60, y=10, peaceful = 0 }) +des.monster({ class = "B", x=60, y=11, peaceful = 0 }) +des.monster({ class = "B", x=60, y=12, peaceful = 0 }) +des.monster({ class = "i", x=60, y=13, peaceful = 0 }) +des.monster({ class = "B", x=61, y=10, peaceful = 0 }) +des.monster({ class = "B", x=61, y=11, peaceful = 0 }) +des.monster({ class = "B", x=61, y=12, peaceful = 0 }) +des.monster({ class = "B", x=35, y=03, peaceful = 0 }) +des.monster({ class = "i", x=35, y=17, peaceful = 0 }) +des.monster({ class = "B", x=36, y=17, peaceful = 0 }) +des.monster({ class = "B", x=34, y=16, peaceful = 0 }) +des.monster({ class = "i", x=34, y=17, peaceful = 0 }) +des.monster({ class = "W", x=67, y=02, peaceful = 0 }) +des.monster({ class = "B", x=10, y=19, peaceful = 0 }) diff --git a/dat/Wizard.des b/dat/Wizard.des deleted file mode 100644 index f27f47680..000000000 --- a/dat/Wizard.des +++ /dev/null @@ -1,472 +0,0 @@ -# NetHack 3.6 Wizard.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ -# Copyright (c) 1992 by David Cohrs -# NetHack may be freely redistributed. See license for details. -# -# The "start" level for the quest. -# -# Here you meet your (besieged) class leader, Neferet the Green -# and receive your quest assignment. -# -MAZE: "Wiz-strt",' ' -FLAGS: noteleport,hardfloor -GEOMETRY:center,center -MAP -............................................................................ -.....................C....CC.C........................C..................... -..........CCC.....................CCC....................................... -........CC........-----------.......C.C...C...C....C........................ -.......C.....---------------------...C..C..C..C............................. -......C..C...------....\....------....C.....C............................... -........C...||....|.........|....||......................................... -.......C....||....|.........+....||......................................... -.......C...||---+--.........|....|||........................................ -......C....||...............|--S--||........................................ -...........||--+--|++----|---|..|.SS..........C......C...................... -........C..||.....|..|...|...|--|.||..CC..C.....C..........C................ -.......C...||.....|..|.--|.|.|....||.................C..C................... -.....C......||....|..|.....|.|.--||..C..C..........C...........}}}.......... -......C.C...||....|..-----.|.....||...C.C.C..............C....}}}}}}........ -.........C...------........|------....C..C.....C..CC.C......}}}}}}}}}}}..... -.........CC..---------------------...C.C..C.....CCCCC.C.......}}}}}}}}...... -.........C........-----------..........C.C.......CCC.........}}}}}}}}}...... -..........C.C.........................C............C...........}}}}}........ -......................CCC.C................................................. -ENDMAP - -# first do cloud everywhere -REPLACE_TERRAIN:(0,0, 75,19), '.', 'C', 10% -# then replace clouds inside the tower back to floor -REPLACE_TERRAIN:(13,5, 33,15), 'C', '.', 100% - -# Dungeon Description -REGION:(00,00,75,19),lit,"ordinary" -REGION:(35,00,49,03),unlit,"ordinary" -REGION:(43,12,49,16),unlit,"ordinary" -REGION:(19,11,33,15),unlit,"ordinary",unfilled,irregular -REGION:(30,10,31,10),unlit,"ordinary" -# Stairs -STAIR:(30,10),down -# Portal arrival point -TERRAIN:(63,06),'.' -BRANCH:(63,06,63,06),(0,0,0,0) -# Doors -DOOR:closed,(31,09) -DOOR:closed,(16,08) -DOOR:closed,(28,07) -DOOR:locked,(34,10) -DOOR:locked,(35,10) -DOOR:closed,(15,10) -DOOR:locked,(19,10) -DOOR:locked,(20,10) -# Neferet the Green, the quest leader -MONSTER:('@',"Neferet the Green"),(23,05) -# The treasure of the quest leader -OBJECT:('(',"chest"),(24,05) -# apprentice guards for the audience chamber -MONSTER:('@',"apprentice"),(30,07) -MONSTER:('@',"apprentice"),(24,06) -MONSTER:('@',"apprentice"),(15,06) -MONSTER:('@',"apprentice"),(15,12) -MONSTER:('@',"apprentice"),(26,11) -MONSTER:('@',"apprentice"),(27,11) -MONSTER:('@',"apprentice"),(19,09) -MONSTER:('@',"apprentice"),(20,09) -# Eels in the pond -MONSTER:(';',"giant eel"),(62,14) -MONSTER:(';',"giant eel"),(69,15) -MONSTER:(';',"giant eel"),(67,17) -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty. -MONSTER: 'B',(60,09),hostile -MONSTER: 'W',(60,10),hostile -MONSTER: 'B',(60,11),hostile -MONSTER: 'B',(60,12),hostile -MONSTER: 'i',(60,13),hostile -MONSTER: 'B',(61,10),hostile -MONSTER: 'B',(61,11),hostile -MONSTER: 'B',(61,12),hostile -MONSTER: 'B',(35,03),hostile -MONSTER: 'i',(35,17),hostile -MONSTER: 'B',(36,17),hostile -MONSTER: 'B',(34,16),hostile -MONSTER: 'i',(34,17),hostile -MONSTER: 'W',(67,02),hostile -MONSTER: 'B',(10,19),hostile - -# -# The "locate" level for the quest. -# -# Here you have to find the Entrance to the Tower of Darkness to go -# further towards your assigned quest. -# - -MAZE: "Wiz-loca",' ' -FLAGS: hardfloor -GEOMETRY:center,center -MAP -............. ....................................................... -.............. .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....... -.............. ..............}.................................}....... -.............. ..............}.-------------------------------.}....... -............... .........C....}.|.............................|.}....... -............... ..........C....}.|.---------------------------.|.}....... -............... .........CCC...}.|.|.........................|.|.}....... -................ ....C....CCC...}.|.|.-----------------------.|.|.}....... -.......C..C..... .....C....CCC...}.|.|.|......+.......+......|.|.|.}....... -.............C..CC.....C....CCC...}.|.|.|......|-------|......|.|.|.}....... -................ ....C....CCC...}.|.|.|......|.......|......|.|.|.}....... -......C..C..... ....C....CCC...}.|.|.|......|-------|......|.|.|.}....... -............C.. ...C....CCC...}.|.|.|......+.......+......|.|.|.}....... -........C...... ....C....CCC...}.|.|.-----------------------.|.|.}....... -....C......C... ........CCC...}.|.|.........................|.|.}....... -......C..C.... .........C....}.|.---------------------------.|.}....... -.............. .........C....}.|.............................|.}....... -............. ..............}.-------------------------------.}....... -............. .............}.................................}....... -............. .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....... -............. ....................................................... -ENDMAP - -REPLACE_TERRAIN:(0,0,30,20), '.', 'C', 15% -REPLACE_TERRAIN:(68,0,75,20), '.', '}', 25% -REPLACE_TERRAIN:(34,1,68,19), '}', '.', 2% - -# Dungeon Description -REGION:(00,00,75,20),lit,"ordinary" -REGION:(37,04,65,16),unlit,"ordinary",filled,irregular { - ROOMDOOR:true,closed,north|south|west|east,random -} -REGION:(39,06,63,14),unlit,"ordinary",filled,irregular { - ROOMDOOR:true,closed,north|south|west|east,random -} - -REGION:(41,08,46,12),lit,"ordinary",filled,irregular { - ROOMDOOR:true,closed,north|south|west,random -} -REGION:(56,08,61,12),lit,"ordinary",filled,irregular { - ROOMDOOR:true,closed,north|south|east,random -} -REGION:(48,08,54,08),unlit,"ordinary" -REGION:(48,12,54,12),unlit,"ordinary" -REGION:(48,10,54,10),unlit,"ordinary",filled,irregular { - ROOMDOOR:true,closed,north|south|west|east,random -} - -# Doors -DOOR:locked,(55,08) -DOOR:locked,(55,12) -DOOR:locked,(47,08) -DOOR:locked,(47,12) -# Stairs -TERRAIN:(03,17),'.' -STAIR:(03,17),up -STAIR:(48,10),down -# Non diggable walls -NON_DIGGABLE:(00,00,75,20) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:"spiked pit",(24,02) -TRAP:"spiked pit",(07,10) -TRAP:"spiked pit",(23,05) -TRAP:"spiked pit",(26,19) -TRAP:"spiked pit",(72,02) -TRAP:"spiked pit",(72,12) -TRAP:"falling rock",(45,16) -TRAP:"falling rock",(65,13) -TRAP:"falling rock",(55,06) -TRAP:"falling rock",(39,11) -TRAP:"falling rock",(57,09) -TRAP:"magic",random -TRAP:"statue",random -TRAP:"statue",random -TRAP:"polymorph",random -TRAP:"anti magic",(53,10) -TRAP:"sleep gas",random -TRAP:"sleep gas",random -TRAP:"dart",random -TRAP:"dart",random -TRAP:"dart",random -# Random monsters. -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:'i',random,hostile - -# -# The "goal" level for the quest. -# -# Here you meet the Dark One, your nemesis monster. You have to -# defeat the Dark One in combat to gain the artifact you have -# been assigned to retrieve. -# - -MAZE: "Wiz-goal", ' ' -GEOMETRY:center,center -MAP - - - - ------------- ------------- - |...........| |...........| - -------|...........-------------------...........| - |......S...........|..|..|..|..|..|..|...........| - |......|...........|..|..|..|..|..|..|...........| - |......|...........-F+-F+-F+-F+-F+-F+-...........| - --S----|...........S.................+...........| - |......|...........-F+-F+-F+-F+-F+-F+-...........| - |......|...........|..|..|..|..|..|..|...........| - |......|...........|..|..|..|..|..|..|...........| - -------|...........-------------------...........| - |...........| |...........| - ------------- ------------- - - - - -ENDMAP -# Dungeon Description -REGION:(13,10,18,12),unlit,"temple" -REGION:(13,06,18,08),lit,"ordinary" -REGION:(20,04,30,14),unlit,"ordinary" -REGION:(32,06,33,07),unlit,"ordinary" -REGION:(35,06,36,07),unlit,"ordinary" -REGION:(38,06,39,07),unlit,"ordinary" -REGION:(41,06,42,07),unlit,"ordinary" -REGION:(44,06,45,07),unlit,"ordinary" -REGION:(47,06,48,07),unlit,"ordinary" -REGION:(32,09,48,09),unlit,"ordinary" -REGION:(32,11,33,12),unlit,"ordinary" -REGION:(35,11,36,12),unlit,"ordinary" -REGION:(38,11,39,12),unlit,"ordinary" -REGION:(41,11,42,12),unlit,"ordinary" -REGION:(44,11,45,12),unlit,"ordinary" -REGION:(47,11,48,12),unlit,"ordinary" -REGION:(50,04,60,14),lit,"ordinary" -# Doors -DOOR:locked,(19,06) -DOOR:locked,(14,09) -DOOR:locked,(31,09) -DOOR:locked,(33,08) -DOOR:locked,(36,08) -DOOR:locked,(39,08) -DOOR:locked,(42,08) -DOOR:locked,(45,08) -DOOR:locked,(48,08) -DOOR:locked,(33,10) -DOOR:locked,(36,10) -DOOR:locked,(39,10) -DOOR:locked,(42,10) -DOOR:locked,(45,10) -DOOR:locked,(48,10) -DOOR:locked,(49,09) -# Stairs -STAIR:(55,05),up -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# The altar. This is not a shrine. -ALTAR:(16,11),noncoaligned,altar -# Objects -OBJECT:('"',"amulet of ESP"),(16,11),blessed,0,name:"The Eye of the Aethiopica" -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('@',"Dark One"),(16,11) -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'B',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:'i',random,hostile -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:'i',random,hostile -# Captive Monsters in the dungeon -MONSTER:('@',"rogue"),(35,06),peaceful,"Pug" -MONSTER:('Y',"owlbear"),(47,06),peaceful,asleep -MONSTER:('@',"wizard"),(32,11),peaceful,asleep,"Newt" -MONSTER:('@',"Grey-elf"),(44,11),peaceful -MONSTER:('H',"hill giant"),(47,11),peaceful,asleep -MONSTER:('G',"gnomish wizard"),(38,06),peaceful -MONSTER:('@',"prisoner"),(35,11),peaceful -MONSTER:('@',"prisoner"),(41,11),peaceful,asleep - -# -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. -# - -LEVEL: "Wiz-fila" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: 'i', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: 'i', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: ('B', "vampire bat"), random - MONSTER: ('B', "vampire bat"), random -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: 'i', random, hostile - MONSTER: ('B', "vampire bat"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: 'i', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: ('B', "vampire bat"), random -} - -RANDOM_CORRIDORS - -LEVEL: "Wiz-filb" -# -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random - MONSTER: 'X', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random,random - MONSTER: 'i', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - OBJECT: random,random - MONSTER: 'X', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: 'i', random, hostile - MONSTER: ('B', "vampire bat"), random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - TRAP: random, random - MONSTER: 'i', random, hostile -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: ('B', "vampire bat"), random -} - -RANDOM_CORRIDORS diff --git a/dat/air.lua b/dat/air.lua new file mode 100644 index 000000000..af27b86ac --- /dev/null +++ b/dat/air.lua @@ -0,0 +1,108 @@ +-- NetHack endgame air.lua $NHDT-Date: 1652196019 2022/05/10 15:20:19 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, +-- and Timo Hakulinen +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "shortsighted", "stormy") +-- The following messages are somewhat obtuse, to make then +-- equally meaningful if the player can see or not. +des.message("What a strange feeling!") +des.message("You notice that there is no gravity here.") +-- The player lands, upon arrival, in the +-- lower-left area. The location of the +-- portal to the next level is randomly chosen. +-- This map has no visible outer boundary, and +-- is all "air". +des.map([[ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +]]); +-- Use up and down regions to partition the level into three parts; +-- teleportation can't cross from one part into another. +-- The up region is where you'll arrive after activating the portal from +-- the preceding level; the exit portal is placed inside the down region. +des.teleport_region({ region = {01,00,24,20}, region_islev = 1, exclude = {25,00,79,20}, exclude_islev=1, dir="up" }) +des.teleport_region({ region = {56,00,79,20}, region_islev = 1, exclude = {01,00,55,20}, exclude_islev=1, dir="down" }) + +-- des.portal(levregion(57,01,78,19),(0,0,0,0),"fire") +des.levregion({ region = {57,01,78,19}, region_islev=1, type="portal", name="fire" }); +des.region(selection.area(00,00,75,19),"lit") +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) +des.monster({ id = "air elemental", peaceful = 0 }) + +des.monster({ id = "floating eye", peaceful = 0 }) +des.monster({ id = "floating eye", peaceful = 0 }) +des.monster({ id = "floating eye", peaceful = 0 }) + +des.monster({ id = "yellow light", peaceful = 0 }) +des.monster({ id = "yellow light", peaceful = 0 }) +des.monster({ id = "yellow light", peaceful = 0 }) + +des.monster("couatl") + +des.monster("D") +des.monster("D") +des.monster("D") +des.monster("D") +des.monster("D") + +des.monster("E") +des.monster("E") +des.monster("E") +des.monster("J") +des.monster("J") + +des.monster({ id = "djinni", peaceful = 0 }) +des.monster({ id = "djinni", peaceful = 0 }) +des.monster({ id = "djinni", peaceful = 0 }) + +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "fog cloud", peaceful = 0 }) +des.monster({ id = "energy vortex", peaceful = 0 }) +des.monster({ id = "energy vortex", peaceful = 0 }) +des.monster({ id = "energy vortex", peaceful = 0 }) +des.monster({ id = "energy vortex", peaceful = 0 }) +des.monster({ id = "energy vortex", peaceful = 0 }) +des.monster({ id = "steam vortex", peaceful = 0 }) +des.monster({ id = "steam vortex", peaceful = 0 }) +des.monster({ id = "steam vortex", peaceful = 0 }) +des.monster({ id = "steam vortex", peaceful = 0 }) +des.monster({ id = "steam vortex", peaceful = 0 }) + diff --git a/dat/asmodeus.lua b/dat/asmodeus.lua new file mode 100644 index 000000000..c860e3cbc --- /dev/null +++ b/dat/asmodeus.lua @@ -0,0 +1,96 @@ +-- NetHack gehennom asmodeus.lua $NHDT-Date: 1652196020 2022/05/10 15:20:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel") + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +-- First part +local asmo1 = des.map({ halign = "half-left", valign = "center", map = [[ +--------------------- +|.............|.....| +|.............S.....| +|---+------------...| +|.....|.........|-+-- +|..---|.........|.... +|..|..S.........|.... +|..|..|.........|.... +|..|..|.........|-+-- +|..|..-----------...| +|..S..........|.....| +--------------------- +]], contents = function(rm) + -- Doors + des.door("closed",04,03) + des.door("locked",18,04) + des.door("closed",18,08) + -- + des.stair("down", 13,07) + -- Non diggable walls + des.non_diggable(selection.area(00,00,20,11)) + -- Entire main area + des.region(selection.area(01,01,20,10),"unlit") + -- The fellow in residence + des.monster("Asmodeus",12,07) + -- Some random weapons and armor. + des.object("[") + des.object("[") + des.object(")") + des.object(")") + des.object("*") + des.object("!") + des.object("!") + des.object("?") + des.object("?") + des.object("?") + -- Some traps. + des.trap("spiked pit", 05,02) + des.trap("fire", 08,06) + des.trap("sleep gas") + des.trap("anti magic") + des.trap("fire") + des.trap("magic") + des.trap("magic") + -- Random monsters. + des.monster("ghost",11,07) + des.monster("horned devil",10,05) + des.monster("L") + -- Some Vampires for good measure + des.monster("V") + des.monster("V") + des.monster("V") +end }); + +des.levregion({ region={01,00,6,20}, region_islev=1, exclude={6,1,70,16}, exclude_islev=1, type="stair-up" }); + +des.levregion({ region={01,00,6,20}, region_islev=1, exclude={6,1,70,16}, exclude_islev=1, type="branch" }); +des.teleport_region({ region = {01,00,6,20}, region_islev=1, exclude={6,1,70,16}, exclude_islev=1 }) + +-- Second part +local asmo2 = des.map({ halign = "half-right", valign = "center", map = [[ +--------------------------------- +................................| +................................+ +................................| +--------------------------------- +]], contents = function(rm) + des.mazewalk(32,02,"east") + -- Non diggable walls + des.non_diggable(selection.area(00,00,32,04)) + des.door("closed",32,02) + des.monster("&") + des.monster("&") + des.monster("&") + des.trap("anti magic") + des.trap("fire") + des.trap("magic") +end }); + +local protected = bounds2:negate() | asmo1 | asmo2; +hell_tweaks(protected); diff --git a/dat/astral.lua b/dat/astral.lua new file mode 100644 index 000000000..6d6f0808b --- /dev/null +++ b/dat/astral.lua @@ -0,0 +1,187 @@ +-- NetHack endgame astral.lua $NHDT-Date: 1652196020 2022/05/10 15:20:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.7 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, +-- and Timo Hakulinen +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "nommap", "shortsighted", "solidify") +des.message("You arrive on the Astral Plane!") +des.message("Here the High Temple of %d is located.") +des.message("You sense alarm, hostility, and excitement in the air!") +des.map([[ + --------------- + |.............| + |..---------..| + |..|.......|..| +--------------- |..|.......|..| --------------- +|.............| |..|.......|..| |.............| +|..---------..-| |-------| |..|.......|..| |-------| |-..---------..| +|..|.......|...-| |-.......-| |..|.......|..| |-.......-| |-...|.......|..| +|..|.......|....-|-.........-||..----+----..||-.........-|-....|.......|..| +|..|.......+.....+...........||.............||...........+.....+.......|..| +|..|.......|....-|-.........-|--|.........|--|-.........-|-....|.......|..| +|..|.......|...-| |-.......-| -|---+---|- |-.......-| |-...|.......|..| +|..---------..-| |---+---| |-.......-| |---+---| |-..---------..| +|.............| |...|-----|-.........-|-----|...| |.............| +--------------- |.........|...........|.........| --------------- + -------...|-.........-|...------- + |....|-.......-|....| + ---...|---+---|...--- + |...............| + ----------------- +]]); + +-- chance to alter above map and turn the wings of the bottom-center into +-- a pair of big (5x15) rooms +for i = 1, 2 do + -- 3.6.[01]: 75% chance that both sides opened up, 25% that neither did; + -- 3.6.2: 60% twice == 36% chance that both sides open up, 24% left side + -- only, 24% right side only, 16% that neither side opens up + local hall; + if percent(60) then + if i == 1 then + des.terrain(selection.area(17,14, 30,18),".") + des.wallify() + -- temporarily close off the area to be filled so that it doesn't cover + -- the entire entry area + des.terrain(33,18, "|") + hall = selection.floodfill(30,16) + -- re-connect the opened wing with the rest of the map + des.terrain(33,18, ".") + else + des.terrain(selection.area(44,14, 57,18),".") + des.wallify() + des.terrain(41,18, "|") + hall = selection.floodfill(44,16) + des.terrain(41,18, ".") + end + -- extra monsters; was [6 + 3d4] when both wings were opened up at once + for j = 1, math.random(4,9) do + des.monster({ id="Angel", coord = hall:rndcoord(1), align="noalign", peaceful=0 }) + if percent(50) then + des.monster({ coord = hall:rndcoord(1), peaceful=0 }) + end + end + end +end + +-- Rider locations +local place = selection.new(); +place:set(23,9); +place:set(37,14); +place:set(51,9); + +-- Where the player will land on arrival +des.teleport_region({ region = {29,15,45,15}, exclude = {30,15,44,15} }) +-- Lit courts +des.region({ region={01,05,16,14},lit=1,type="ordinary",irregular=1 }) +des.region({ region={31,01,44,10},lit=1,type="ordinary",irregular=1 }) +des.region({ region={61,05,74,14},lit=1,type="ordinary",irregular=1 }) +-- A Sanctum for each alignment +-- The shrines' alignments are shuffled for +-- each game +des.region({ region={04,07,10,11},lit=1,type="temple",filled=2 }) +des.region({ region={34,03,40,07},lit=1,type="temple",filled=2 }) +des.region({ region={64,07,70,11},lit=1,type="temple",filled=2 }) + +des.altar({ x=07, y=09, align=align[1],type="sanctum" }) +des.altar({ x=37, y=05, align=align[2],type="sanctum" }) +des.altar({ x=67, y=09, align=align[3],type="sanctum" }) +-- Doors +des.door("closed",11,09) +des.door("closed",17,09) +des.door("locked",23,12) +des.door("locked",37,08) +des.door("closed",37,11) +des.door("closed",37,17) +des.door("locked",51,12) +des.door("locked",57,09) +des.door("closed",63,09) +-- Non diggable and phazeable everywhere +des.non_diggable(selection.area(00,00,74,19)) +des.non_passwall(selection.area(00,00,74,19)) +-- Moloch's horde +-- West round room +des.monster({ id = "aligned cleric",x=18,y=09,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=19,y=08,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=19,y=09,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=19,y=10,align="noalign", peaceful=0 }) +des.monster({ id = "Angel",x=20,y=09,align="noalign", peaceful=0 }) +des.monster({ id = "Angel",x=20,y=10,align="noalign", peaceful=0 }) +des.monster({ id = "Pestilence", coord = place:rndcoord(1), peaceful=0 }) +-- South-central round room +des.monster({ id = "aligned cleric",x=36,y=12,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=37,y=12,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=38,y=12,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=36,y=13,align="noalign", peaceful=0 }) +des.monster({ id = "Angel",x=38,y=13,align="noalign", peaceful=0 }) +des.monster({ id = "Angel",x=37,y=13,align="noalign", peaceful=0 }) +des.monster({ id = "Death", coord = place:rndcoord(1), peaceful=0 }) +-- East round room +des.monster({ id = "aligned cleric",x=56,y=09,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=55,y=08,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=55,y=09,align="noalign", peaceful=0 }) +des.monster({ id = "aligned cleric",x=55,y=10,align="noalign", peaceful=0 }) +des.monster({ id = "Angel",x=54,y=09,align="noalign", peaceful=0 }) +des.monster({ id = "Angel",x=54,y=10,align="noalign", peaceful=0 }) +des.monster({ id = "Famine", coord = place:rndcoord(1), peaceful=0 }) +-- +-- The aligned horde +-- +-- We do not know in advance the alignment of the +-- player. The mpeaceful bit will need resetting +-- when the level is created. The setting here is +-- but a place holder. +-- +-- West court +des.monster({ id = "aligned cleric",x=12,y=07,align="chaos", peaceful=0 }) +des.monster({ id = "aligned cleric",x=13,y=07,align="chaos",peaceful=1 }) +des.monster({ id = "aligned cleric",x=14,y=07,align="law", peaceful=0 }) +des.monster({ id = "aligned cleric",x=12,y=11,align="law",peaceful=1 }) +des.monster({ id = "aligned cleric",x=13,y=11,align="neutral", peaceful=0 }) +des.monster({ id = "aligned cleric",x=14,y=11,align="neutral",peaceful=1 }) +des.monster({ id = "Angel",x=11,y=05,align="chaos", peaceful=0 }) +des.monster({ id = "Angel",x=12,y=05,align="chaos",peaceful=1 }) +des.monster({ id = "Angel",x=13,y=05,align="law", peaceful=0 }) +des.monster({ id = "Angel",x=11,y=13,align="law",peaceful=1 }) +des.monster({ id = "Angel",x=12,y=13,align="neutral", peaceful=0 }) +des.monster({ id = "Angel",x=13,y=13,align="neutral",peaceful=1 }) +-- Central court +des.monster({ id = "aligned cleric",x=32,y=09,align="chaos", peaceful=0 }) +des.monster({ id = "aligned cleric",x=33,y=09,align="chaos",peaceful=1 }) +des.monster({ id = "aligned cleric",x=34,y=09,align="law", peaceful=0 }) +des.monster({ id = "aligned cleric",x=40,y=09,align="law",peaceful=1 }) +des.monster({ id = "aligned cleric",x=41,y=09,align="neutral", peaceful=0 }) +des.monster({ id = "aligned cleric",x=42,y=09,align="neutral",peaceful=1 }) +des.monster({ id = "Angel",x=31,y=08,align="chaos", peaceful=0 }) +des.monster({ id = "Angel",x=32,y=08,align="chaos",peaceful=1 }) +des.monster({ id = "Angel",x=31,y=09,align="law", peaceful=0 }) +des.monster({ id = "Angel",x=42,y=08,align="law",peaceful=1 }) +des.monster({ id = "Angel",x=43,y=08,align="neutral", peaceful=0 }) +des.monster({ id = "Angel",x=43,y=09,align="neutral",peaceful=1 }) +-- East court +des.monster({ id = "aligned cleric",x=60,y=07,align="chaos", peaceful=0 }) +des.monster({ id = "aligned cleric",x=61,y=07,align="chaos",peaceful=1 }) +des.monster({ id = "aligned cleric",x=62,y=07,align="law", peaceful=0 }) +des.monster({ id = "aligned cleric",x=60,y=11,align="law",peaceful=1 }) +des.monster({ id = "aligned cleric",x=61,y=11,align="neutral", peaceful=0 }) +des.monster({ id = "aligned cleric",x=62,y=11,align="neutral",peaceful=1 }) +des.monster({ id = "Angel",x=61,y=05,align="chaos", peaceful=0 }) +des.monster({ id = "Angel",x=62,y=05,align="chaos",peaceful=1 }) +des.monster({ id = "Angel",x=63,y=05,align="law", peaceful=0 }) +des.monster({ id = "Angel",x=61,y=13,align="law",peaceful=1 }) +des.monster({ id = "Angel",x=62,y=13,align="neutral", peaceful=0 }) +des.monster({ id = "Angel",x=63,y=13,align="neutral",peaceful=1 }) +-- +-- Assorted nasties +des.monster({ class = "L", peaceful=0 }) +des.monster({ class = "L", peaceful=0 }) +des.monster({ class = "L", peaceful=0 }) +des.monster({ class = "V", peaceful=0 }) +des.monster({ class = "V", peaceful=0 }) +des.monster({ class = "V", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) +des.monster({ class = "D", peaceful=0 }) diff --git a/dat/baalz.lua b/dat/baalz.lua new file mode 100644 index 000000000..233c26c5c --- /dev/null +++ b/dat/baalz.lua @@ -0,0 +1,66 @@ +-- NetHack gehennom baalz.lua $NHDT-Date: 1652196020 2022/05/10 15:20:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + +-- TODO FIXME: see baalz_fixup - the legs get removed currently. + +des.level_flags("mazelevel", "corrmaze") +-- the two pools are fakes used to mark spots which need special wall fixups +-- the two iron bars are eyes and spots to their left will be made diggable +des.map({ halign = "right", valign = "center", map = [[ +------------------------------------------------- +| ---- ---- +| ---- | ----------- | +| ------ | ---------|.........|--P +| F....| -------|...........-------------- +---....|--|..................S............|---- ++...--....S..----------------|............S...| +---....|--|..................|............|---- +| F....| -------|...........-----S-------- +| ------ | ---------|.........|--P +| ---- | ----------- | +| ---- ---- +------------------------------------------------- +]] }); +des.levregion({ region = {01,00,15,20}, region_islev=1, exclude={15,1,70,16}, exclude_islev=1, type="stair-up" }) +des.levregion({ region = {01,00,15,20}, region_islev=1, exclude={15,1,70,16}, exclude_islev=1, type="branch" }) +des.teleport_region({region = {01,00,15,20}, region_islev=1, exclude = {15,1,70,16}, exclude_islev=1 }) +-- this actually leaves the farthest right column diggable +des.non_diggable(selection.area(00,00,47,12)) +des.mazewalk(00,06,"west") +des.stair("down", 44,06) +des.door("locked",00,06) +-- The fellow in residence +des.monster("Baalzebub",35,06) +-- Some random weapons and armor. +des.object("[") +des.object("[") +des.object(")") +des.object(")") +des.object("*") +des.object("!") +des.object("!") +des.object("?") +des.object("?") +des.object("?") +-- Some traps. +des.trap("spiked pit") +des.trap("fire") +des.trap("sleep gas") +des.trap("anti magic") +des.trap("fire") +des.trap("magic") +des.trap("magic") +-- Random monsters. +des.monster("ghost",37,07) +des.monster("horned devil",32,05) +des.monster("barbed devil",38,07) +des.monster("L") +-- Some Vampires for good measure +des.monster("V") +des.monster("V") +des.monster("V") + diff --git a/dat/bigrm-1.lua b/dat/bigrm-1.lua new file mode 100644 index 000000000..2c734a5ac --- /dev/null +++ b/dat/bigrm-1.lua @@ -0,0 +1,81 @@ +-- NetHack bigroom bigrm-1.lua $NHDT-Date: 1652196021 2022/05/10 15:20:21 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +--------------------------------------------------------------------------- +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +--------------------------------------------------------------------------- +]]); + + +if percent(80) then + local terrains = { "-", "F", "L", "T", "C" }; + local tidx = math.random(1, #terrains); + local choice = math.random(0, 5); + if choice == 0 then + -- one horizontal line + des.terrain(selection.line(10,8, 65,8), terrains[tidx]); + elseif choice == 1 then + -- two vertical lines + local sel = selection.line(15,4, 15, 13) | selection.line(59,4, 59, 13); + des.terrain(sel, terrains[tidx]); + elseif choice == 2 then + -- plus sign + local sel = selection.line(10,8, 64, 8) | selection.line(37,3, 37, 14); + des.terrain(sel, terrains[tidx]); + elseif choice == 3 then + -- brackets: [ ] + des.terrain(selection.rect(4,4, 70,13), terrains[tidx]); + local sel = selection.line(25,4, 50,4) | selection.line(25,13, 50,13); + des.terrain(sel, '.'); + elseif choice == 4 then + -- snake + des.terrain(selection.fillrect(5,5, 69, 12), terrains[tidx]); + for i = 0, 7 do + local x = 6 + i*8; + local y = 5 + (i%2); + des.terrain(selection.fillrect(x, y, x+6, y+6), '.'); + end + else + -- nothing + end +end + +des.region(selection.area(01,01, 73, 16), "lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-10.lua b/dat/bigrm-10.lua new file mode 100644 index 000000000..dc51c1e02 --- /dev/null +++ b/dat/bigrm-10.lua @@ -0,0 +1,61 @@ +-- NetHack bigroom bigrm-10.lua $NHDT-Date: 1652196024 2022/05/10 15:20:24 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +....................................................................... +....................................................................... +....................................................................... +....................................................................... +...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... +...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... +...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... +...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... +...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... +...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... +...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... +...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... +...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... +...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... +...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... +....................................................................... +....................................................................... +....................................................................... +....................................................................... +]]); + +if percent(40) then + -- occasionally it's not a fog maze + local terrain = { "L", "}", "T", "-", "F" }; + local tidx = math.random(1, #terrain); + -- break it up a bit + des.replace_terrain({ region={0, 0, 70, 18}, fromterrain="C", toterrain=".", chance=5 }); + des.replace_terrain({ region={0, 0, 70, 18}, fromterrain="C", toterrain=terrain[tidx] }); +end; + +des.region(selection.area(00,00,70,18), "lit"); + +-- when falling down on this level, never end up in the fog maze +des.teleport_region({ region = {00,00,70,18}, exclude = {02,03,68,15}, dir = "down" }); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end + +des.mazewalk({ x=4, y=2, dir="south", stocked=0 }); + +-- Stairs up, not in the fog maze +des.levregion({ region = {00,00,70,18}, exclude = {02,03,68,15}, type="stair-up"}); +des.stair("down"); diff --git a/dat/bigrm-11.lua b/dat/bigrm-11.lua new file mode 100644 index 000000000..db9bcdccd --- /dev/null +++ b/dat/bigrm-11.lua @@ -0,0 +1,39 @@ +-- NetHack bigroom bigrm-11.lua $NHDT-Date: 1652196024 2022/05/10 15:20:24 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.0 $ +-- Copyright (c) 2021 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- +-- Boulder "maze" with wide corridors + +function t_or_f() return percent(50) and true or false; end + +des.level_flags("mazelevel", "noflip"); +des.level_init({ style = "maze", corrwid = 3 + nh.rn2(3), wallthick = 1, deadends=t_or_f() }); + +des.region(selection.area(00,00,75,18), "lit"); +des.non_diggable(); + +function replace_wall_boulder(x,y) + des.terrain(x, y, "."); + des.object("boulder", x, y); +end + +-- replace horizontal and vertical walls +local sel = selection.match([[.w.]]) | selection.match(".\nw\n."); +sel:iterate(replace_wall_boulder); +-- replace the leftover corner walls +local sel = selection.match([[.w.]]); +sel:iterate(replace_wall_boulder); + +des.stair("up"); +des.stair("down"); + +for i = 1,15 do + des.object(); +end +for i = 1,6 do + des.trap("rolling boulder"); +end +for i = 1,28 do + des.monster(); +end + diff --git a/dat/bigrm-12.lua b/dat/bigrm-12.lua new file mode 100644 index 000000000..0e41bd9e4 --- /dev/null +++ b/dat/bigrm-12.lua @@ -0,0 +1,85 @@ +-- NetHack bigroom bigrm-12.lua $NHDT-Date: $ $NHDT-Branch: NetHack-3.7 $ +-- Copyright (c) 2024 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- +-- Two hexagons + +des.level_flags("mazelevel", "noflipy"); +des.level_init({ style = "solidfill", fg = " " }); + +des.map([[ + + ....................... ....................... + ......................... ......................... + ........................... ........................... + ............................. ............................. + ........PPPPPPPPPPPPPPP........ ........LLLLLLLLLLLLLLL........ + ........PPPPPPPPPPPPPPPPP........ ........LLLLLLLLLLLLLLLLL........ + ........PPPWWWWWWWWWWWWWPPP...............LLLZZZZZZZZZZZZZLLL........ + ........PPPWWWWWWWWWWWWWWWPPP.............LLLZZZZZZZZZZZZZZZLLL........ + ........PPPWWWWWWWWWWWWWWWWWPPP...........LLLZZZZZZZZZZZZZZZZZLLL........ + ........PPPWWWWWWWWWWWWWWWPPP.............LLLZZZZZZZZZZZZZZZLLL........ + ........PPPWWWWWWWWWWWWWPPP...............LLLZZZZZZZZZZZZZLLL........ + ........PPPPPPPPPPPPPPPPP........ ........LLLLLLLLLLLLLLLLL........ + ........PPPPPPPPPPPPPPP........ ........LLLLLLLLLLLLLLL........ + ............................. ............................. + ........................... ........................... + ......................... ......................... + ....................... ....................... + +]]); + +-- maybe replace lavawalls/waterwalls with stone walls +if percent(20) then + if percent(50) then + des.replace_terrain({ fromterrain = "W", toterrain = "-" }); + end + if percent(50) then + des.replace_terrain({ fromterrain = "Z", toterrain = "-" }); + end +end + +-- maybe replace pools with floor and then possibly walls with pools +if percent(25) then + des.replace_terrain({ fromterrain = "P", toterrain = "." }); + if percent(75) then + des.replace_terrain({ fromterrain = "W", toterrain = "P" }); + end +end +if percent(25) then + des.replace_terrain({ fromterrain = "L", toterrain = "." }); + if percent(75) then + des.replace_terrain({ fromterrain = "Z", toterrain = "L" }); + end +end + +-- maybe make both sides have the same terrain +if percent(20) then + if percent(50) then + -- both are lava + des.replace_terrain({ fromterrain = "P", toterrain = "L" }); + des.replace_terrain({ fromterrain = "W", toterrain = "Z" }); + else + -- both are water + des.replace_terrain({ fromterrain = "L", toterrain = "P" }); + des.replace_terrain({ fromterrain = "Z", toterrain = "W" }); + end +end + +des.region(selection.area(00,00,75,19), "lit") +des.non_diggable(); + +des.wallify(); + +des.stair("up"); +des.stair("down"); + +for i = 1,15 do + des.object(); +end +for i = 1,6 do + des.trap(); +end +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-13.lua b/dat/bigrm-13.lua new file mode 100644 index 000000000..ff834a666 --- /dev/null +++ b/dat/bigrm-13.lua @@ -0,0 +1,82 @@ +-- NetHack bigroom bigrm-13.lua $NHDT-Date: 1652196024 2022/05/10 15:20:24 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.0 $ +-- Copyright (c) 2026 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- +-- Pillars + +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +--------------------------------------------------------------------------- +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +--------------------------------------------------------------------------- +]]); + +local pillar = [[ +--- +| | +---]]; + +filters = { + -- 1: all pillars + function(x, y) return true; end, + -- 2: 3 vertical lines + function(x, y) return (x%2 == 1); end, + -- 3: checkerboard + function(x, y) return (((x+y)%2) == 0); end, + -- 4: center row + function(x, y) return (y%2 == 1); end, + -- 5: top and bottom rows + function(x, y) return (y%2 == 0); end, + -- 6: random 50% + function(x, y) return (math.random(0,1) == 0); end, + -- 7: corners and center + function(x, y) return ((x/3)%2 == y%2); end, + -- 8: slanted + function(x, y) return ((x+1)//3 == y); end, +}; + +idx = math.random(1, #filters); + +for y = 0,2 do + for x = 0,6 do + if (filters[idx](x, y)) then + des.map({ coord = {12 + x*9, 4 + y*5}, map = pillar, contents=function() end }); + end + end +end + +des.region(selection.area(00,00,75,18), "lit"); +des.wallify(); +des.non_diggable(); + +des.stair("up"); +des.stair("down"); + +for i = 1,15 do + des.object(); +end +for i = 1,6 do + des.trap(); +end +for i = 1,28 do + des.monster(); +end + diff --git a/dat/bigrm-2.lua b/dat/bigrm-2.lua new file mode 100644 index 000000000..53c3e100a --- /dev/null +++ b/dat/bigrm-2.lua @@ -0,0 +1,71 @@ +-- NetHack bigroom bigrm-2.lua $NHDT-Date: 1652196021 2022/05/10 15:20:21 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +--------------------------------------------------------------------------- +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +--------------------------------------------------------------------------- +]]); +-- Dungeon Description +des.region(selection.area(01,01,73,16),"lit"); + +local darkness; + +local choice = math.random(0, 3) +if choice == 0 then + darkness = selection.area(01,07,22,09) + | selection.area(24,01,50,05) + | selection.area(24,11,50,16) + | selection.area(52,07,73,09); +elseif choice == 1 then + darkness = selection.area(24,01,50,16); +elseif choice == 2 then + darkness = selection.area(01,01,22,16) + | selection.area(52,01,73,16); +end + +if darkness ~= nil then + des.region(darkness,"unlit"); + if percent(25) then + des.replace_terrain({ selection = darkness:grow(), + fromterrain = ".", toterrain = "I" }); + end +end + +-- Stairs +des.stair("up"); +des.stair("down"); +-- Non diggable walls +des.non_diggable(); +-- Objects +for i = 1,15 do + des.object(); +end +-- Random traps +for i = 1,6 do + des.trap(); +end +-- Random monsters. +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-3.lua b/dat/bigrm-3.lua new file mode 100644 index 000000000..ee7e0f310 --- /dev/null +++ b/dat/bigrm-3.lua @@ -0,0 +1,83 @@ +-- NetHack bigroom bigrm-3.lua $NHDT-Date: 1652196021 2022/05/10 15:20:21 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +--------------------------------------------------------------------------- +|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|..............---.......................................---..............| +|...............|.........................................|...............| +|.....|.|.|.|.|---|.|.|.|.|...................|.|.|.|.|.|---|.|.|.|.|.....| +|.....|-------- --------|...................|---------- --------|.....| +|.....|.|.|.|.|---|.|.|.|.|...................|.|.|.|.|.|---|.|.|.|.|.....| +|...............|.........................................|...............| +|..............---.......................................---..............| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.........................................................................| +|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.| +--------------------------------------------------------------------------- +]]); + +-- Dungeon Description +des.region(selection.area(01,01,73,16), "lit"); + +-- replace some walls +if percent(66) then + local sel = selection.match("[.w.]"); + local terrains = { "F", "T", "W", "Z" }; + local choice = terrains[math.random(1, #terrains)]; + des.terrain(sel, choice); +end + +-- Stairs +des.stair("up"); +des.stair("down"); + +-- Non diggable walls +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +des.monster({ x = 01, y = 01 }); +des.monster({ x = 13, y = 01 }); +des.monster({ x = 25, y = 01 }); +des.monster({ x = 37, y = 01 }); +des.monster({ x = 49, y = 01 }); +des.monster({ x = 61, y = 01 }); +des.monster({ x = 73, y = 01 }); +des.monster({ x = 07, y = 07 }); +des.monster({ x = 13, y = 07 }); +des.monster({ x = 25, y = 07 }); +des.monster({ x = 37, y = 07 }); +des.monster({ x = 49, y = 07 }); +des.monster({ x = 61, y = 07 }); +des.monster({ x = 67, y = 07 }); +des.monster({ x = 07, y = 09 }); +des.monster({ x = 13, y = 09 }); +des.monster({ x = 25, y = 09 }); +des.monster({ x = 37, y = 09 }); +des.monster({ x = 49, y = 09 }); +des.monster({ x = 61, y = 09 }); +des.monster({ x = 67, y = 09 }); +des.monster({ x = 01, y = 16 }); +des.monster({ x = 13, y = 16 }); +des.monster({ x = 25, y = 16 }); +des.monster({ x = 37, y = 16 }); +des.monster({ x = 49, y = 16 }); +des.monster({ x = 61, y = 16 }); +des.monster({ x = 73, y = 16 }); diff --git a/dat/bigrm-4.lua b/dat/bigrm-4.lua new file mode 100644 index 000000000..a6b9340d1 --- /dev/null +++ b/dat/bigrm-4.lua @@ -0,0 +1,59 @@ +-- NetHack bigroom bigrm-4.lua $NHDT-Date: 1652196022 2022/05/10 15:20:22 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +----------- ----------- +|.........| |.........| +|.........------------- -------------.........| +---...................------------ ------------...................--- + --.............................---------.............................-- + --.................................................................-- + --...............................................................-- + --......LLLLL.......................................LLLLL......-- + --.....LLLLL.......................................LLLLL.....-- + --.....LLLLL.......................................LLLLL.....-- + --......LLLLL.......................................LLLLL......-- + --...............................................................-- + --.................................................................-- + --.............................---------.............................-- +---...................------------ ------------...................--- +|.........------------- -------------.........| +|.........| |.........| +----------- ----------- +]]); + +local terrains = { ".", ".", ".", ".", "P", "L", "-", "T", "W", "Z" }; +local tidx = math.random(1, #terrains); +local toterr = terrains[tidx]; +if (toterr ~= "L") then + des.replace_terrain({ fromterrain = "L", toterrain = toterr }); +end + +des.feature("fountain", 05,02); +des.feature("fountain", 05,15); +des.feature("fountain", 69,02); +des.feature("fountain", 69,15); + +des.region(selection.area(01,01,73,16), "lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-5.lua b/dat/bigrm-5.lua new file mode 100644 index 000000000..3e40812e6 --- /dev/null +++ b/dat/bigrm-5.lua @@ -0,0 +1,54 @@ +-- NetHack bigroom bigrm-5.lua $NHDT-Date: 1652196022 2022/05/10 15:20:22 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ + ------------------ + ---------................--------- + -------................................------- + ------............................................------ + ----......................................................---- + ---............................................................--- + ---................................................................--- +---....................................................................--- +|........................................................................| +|........................................................................| +|........................................................................| +---....................................................................--- + ---................................................................--- + ---............................................................--- + ----......................................................---- + ------............................................------ + -------................................------- + ---------................--------- + ------------------ +]]); + + +if percent(25) then + local sel = selection.match("."):percentage(2):grow(); + des.replace_terrain({ selection=sel, fromterrain=".", toterrain=percent(50) and "I" or "C" }); +end + +des.region(selection.area(00,00,72,18), "lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-6.lua b/dat/bigrm-6.lua new file mode 100644 index 000000000..c6063a818 --- /dev/null +++ b/dat/bigrm-6.lua @@ -0,0 +1,48 @@ +-- NetHack bigroom bigrm-6.lua $NHDT-Date: 1652196022 2022/05/10 15:20:22 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ + --------- --------- --------- --------- + ---.......--- ---.......--- ---.......--- ---.......--- + --...........-- --...........-- --...........-- --...........-- + --.............-- --.............-- --.............-- --.............-- + -...............- -...............- -...............- -...............- +--...............---...............---...............---...............-- +|.................-.................-.................-.................| +|........T.................T.................T.................T........| +|.......................................................................| +|......T.{.....................................................{.T......| +|.......................................................................| +|........T.................T.................T.................T........| +|.................-.................-.................-.................| +--...............---...............---...............---...............-- + -...............- -...............- -...............- -...............- + --.............-- --.............-- --.............-- --.............-- + --...........-- --...........-- --...........-- --...........-- + ---.......--- ---.......--- ---.......--- ---.......--- + --------- --------- --------- --------- +]]); + +des.region(selection.area(01,01,72,17), "lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-7.lua b/dat/bigrm-7.lua new file mode 100644 index 000000000..07038d8d6 --- /dev/null +++ b/dat/bigrm-7.lua @@ -0,0 +1,52 @@ +-- NetHack bigroom bigrm-7.lua $NHDT-Date: 1652196023 2022/05/10 15:20:23 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.0 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel"); + +des.map([[ + ----- + ---------...--- + ---------.........L...--- + ---------.......................--- + ---------.................................--- + ---------...........................................--- + ---------.....................................................--- +---------...............................................................--- +|.........................................................................| +|.L.....................................................................L.| +|.........................................................................| +---...............................................................--------- + ---.....................................................--------- + ---...........................................--------- + ---.................................--------- + ---.......................--------- + ---...L.........--------- + ---...--------- + ----- +]]); + +local terrain = { "L", "T", "{", "." }; +local tidx = math.random(1, #terrain); +des.replace_terrain({ region={00,00, 74,18}, fromterrain="L", toterrain=terrain[tidx] }); + +des.region(selection.area(01,01,73,17), "lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-8.lua b/dat/bigrm-8.lua new file mode 100644 index 000000000..f851411a8 --- /dev/null +++ b/dat/bigrm-8.lua @@ -0,0 +1,53 @@ +-- NetHack bigroom bigrm-8.lua $NHDT-Date: 1652196023 2022/05/10 15:20:23 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel"); + +des.map([[ +---------------------------------------------- +|............................................--- +--.............................................--- + ---......................................FF.....--- + ---...................................FF........--- + ---................................FF...........--- + ---.............................FF..............--- + ---..........................FF.................--- + ---.......................FF....................--- + ---....................FF.......................--- + ---.................FF..........................--- + ---..............FF.............................--- + ---...........FF................................---- + ---........FF...................................--- + ---.....FF......................................--- + ---.............................................-- + ---............................................| + ---------------------------------------------- +]]); + +if percent(40) then + local terrain = { "L", "}", "T", ".", "-", "C" }; + local tidx = math.random(1, #terrain); + des.replace_terrain({ region={00,00, 74,17}, fromterrain="F", toterrain=terrain[tidx] }); +end; + +des.region(selection.area(01,01,73,16), "lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigrm-9.lua b/dat/bigrm-9.lua new file mode 100644 index 000000000..e46543619 --- /dev/null +++ b/dat/bigrm-9.lua @@ -0,0 +1,52 @@ +-- NetHack bigroom bigrm-9.lua $NHDT-Date: 1652196023 2022/05/10 15:20:23 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip"); + +des.map([[ +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}................................}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}............................................}}}}}}}}}}}}}}} +}}}}}}}}}}......................................................}}}}}}}}}} +}}}}}}}............................................................}}}}}}} +}}}}}.......................LLLLLLLLLLLLLLLLLL.......................}}}}} +}}}....................LLLLLLLLLLLLLLLLLLLLLLLLLLL.....................}}} +}....................LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL....................} +}....................LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL....................} +}....................LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL....................} +}}}....................LLLLLLLLLLLLLLLLLLLLLLLLLLL.....................}}} +}}}}}.......................LLLLLLLLLLLLLLLLLL.......................}}}}} +}}}}}}}............................................................}}}}}}} +}}}}}}}}}}......................................................}}}}}}}}}} +}}}}}}}}}}}}}}}............................................}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}................................}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +]]); + +-- Unlit, except 3 mapgrids around the "pupil" +des.region(selection.area(00,00,73,18),"unlit"); +des.region(selection.area(26,04,47,14),"lit"); +des.region(selection.area(21,05,51,13),"lit"); +des.region(selection.area(19,06,54,12),"lit"); + +des.stair("up"); +des.stair("down"); + +des.non_diggable(); + +for i = 1,15 do + des.object(); +end + +for i = 1,6 do + des.trap(); +end + +for i = 1,28 do + des.monster(); +end diff --git a/dat/bigroom.des b/dat/bigroom.des deleted file mode 100644 index dcec9854b..000000000 --- a/dat/bigroom.des +++ /dev/null @@ -1,723 +0,0 @@ -# NetHack 3.6 bigroom.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1990 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# These are the bigroom levels: -# - -MAZE:"bigrm-1",' ' -GEOMETRY:center,center -MAP ---------------------------------------------------------------------------- -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| ---------------------------------------------------------------------------- -ENDMAP - -$terrains = TERRAIN:{'-', 'F', 'L', 'T', 'C'} -SHUFFLE:$terrains - -[50%]: SWITCH [ 4 ] { - CASE 0: - TERRAIN:line (10,8),(65, 8), $terrains[0] - BREAK - CASE 1: - TERRAIN:line (15,4),(15, 13), $terrains[0] - TERRAIN:line (59,4),(59, 13), $terrains[0] - BREAK - CASE 2: - TERRAIN:line (10,8),(38, 8), $terrains[0] - TERRAIN:line (37,8),(65, 8), $terrains[0] - TERRAIN:line (37,3),(37, 8), $terrains[0] - TERRAIN:line (37,8),(37,14), $terrains[0] - BREAK - CASE 3: - TERRAIN:rect (4,4,70,13), $terrains[0] - TERRAIN:line (25, 4),(50, 4), '.' - TERRAIN:line (25,13),(50,13), '.' - BREAK - DEFAULT: -} - -# Dungeon Description -REGION:(01,01,73,16),lit,"ordinary" -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,74,17) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random - -# Here, just play with the lighting... - -MAZE:"bigrm-2",' ' -GEOMETRY:center,center -MAP ---------------------------------------------------------------------------- -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| ---------------------------------------------------------------------------- -ENDMAP -# Dungeon Description -REGION:(01,01,73,16),lit,"ordinary" -SWITCH [ 3 ] { - CASE 0: - REGION:(01,07,22,09),unlit,"ordinary" - REGION:(24,01,50,05),unlit,"ordinary" - REGION:(24,11,50,16),unlit,"ordinary" - REGION:(52,07,73,09),unlit,"ordinary" - BREAK - CASE 1: - REGION:(24,01,50,16),unlit,"ordinary" - BREAK - CASE 2: - REGION:(01,01,22,16),unlit,"ordinary" - REGION:(52,01,73,16),unlit,"ordinary" - BREAK -} -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,74,17) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random - -# Now, let's get fancy... - -MAZE:"bigrm-3",' ' -GEOMETRY:center,center -MAP ---------------------------------------------------------------------------- -|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|..............---.......................................---..............| -|...............|.........................................|...............| -|.....|.|.|.|.|---|.|.|.|.|...................|.|.|.|.|.|---|.|.|.|.|.....| -|.....|-------- --------|...................|---------- --------|.....| -|.....|.|.|.|.|---|.|.|.|.|...................|.|.|.|.|.|---|.|.|.|.|.....| -|...............|.........................................|...............| -|..............---.......................................---..............| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.........................................................................| -|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.| ---------------------------------------------------------------------------- -ENDMAP -# Dungeon Description -REGION:(01,01,73,16),lit,"ordinary" -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,74,17) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:random,(01,01) -MONSTER:random,(13,01) -MONSTER:random,(25,01) -MONSTER:random,(37,01) -MONSTER:random,(49,01) -MONSTER:random,(61,01) -MONSTER:random,(73,01) -MONSTER:random,(07,07) -MONSTER:random,(13,07) -MONSTER:random,(25,07) -MONSTER:random,(37,07) -MONSTER:random,(49,07) -MONSTER:random,(61,07) -MONSTER:random,(67,07) -MONSTER:random,(07,09) -MONSTER:random,(13,09) -MONSTER:random,(25,09) -MONSTER:random,(37,09) -MONSTER:random,(49,09) -MONSTER:random,(61,09) -MONSTER:random,(67,09) -MONSTER:random,(01,16) -MONSTER:random,(13,16) -MONSTER:random,(25,16) -MONSTER:random,(37,16) -MONSTER:random,(49,16) -MONSTER:random,(61,16) -MONSTER:random,(73,16) -MAZE:"bigrm-4",' ' -GEOMETRY:center,center -MAP ------------ ----------- -|.........| |.........| -|.........|-----------| |-----------|.........| -|-|...................|----------| |----------|...................|-| - -|.............................|-------|.............................|- - -|.................................................................|- - -|...............................................................|- - -|.............................................................|- - -|...........................................................|- - -|...........................................................|- - -|.............................................................|- - -|...............................................................|- - -|.................................................................|- - -|.............................|-------|.............................|- -|-|...................|----------| |----------|...................|-| -|.........|-----------| |-----------|.........| -|.........| |.........| ------------ ----------- -ENDMAP -# Dungeon Description -REGION:(01,01,73,16),lit,"ordinary" -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,74,17) -# Fountains -FOUNTAIN:(05,02) -FOUNTAIN:(05,15) -FOUNTAIN:(69,02) -FOUNTAIN:(69,15) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random - -# Try an oval room... - -MAZE:"bigrm-5",' ' -GEOMETRY:center,center -MAP - ------------------ - ---------................--------- - -------................................------- - ------............................................------ - ----......................................................---- - ---............................................................--- - ---................................................................--- ----....................................................................--- -|........................................................................| -|........................................................................| -|........................................................................| ----....................................................................--- - ---................................................................--- - ---............................................................--- - ----......................................................---- - ------............................................------ - -------................................------- - ---------................--------- - ------------------ -ENDMAP -# Dungeon Description -REGION:(00,00,72,18),lit,"ordinary" -# Stairs -STAIR:random,up -STAIR:random,down -# Non diggable walls -NON_DIGGABLE:(00,00,72,18) -# Objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random - - -# The Four Circles - -LEVEL:"bigrm-6" -FLAGS:mazelevel -INIT_MAP:solidfill,' ' -GEOMETRY:center,center -MAP - --------- --------- --------- --------- - ---.......--- ---.......--- ---.......--- ---.......--- - --...........-- --...........-- --...........-- --...........-- - --.............-- --.............-- --.............-- --.............-- - -...............- -...............- -...............- -...............- -|-...............---...............---...............---...............-- -|.................-.................-.................-.................| -|........T.................T.................T.................T........| -|.......................................................................| -|......T.{.....................................................{.T......| -|.......................................................................| -|........T.................T.................T.................T........| -|.................-.................-.................-.................| ---...............---...............---...............---...............-- - -...............- -...............- -...............- -...............- - --.............-- --.............-- --.............-- --.............-- - --...........-- --...........-- --...........-- --...........-- - ---.......--- ---.......--- ---.......--- ---.......--- - --------- --------- --------- --------- -ENDMAP -REGION:(01,01,72,17),lit,"ordinary" - -STAIR:random,up -STAIR:random,down - -NON_DIGGABLE:(00,00,72,18) - -LOOP [15] { - OBJECT:random,random -} -LOOP [6] { - TRAP:random,random -} -LOOP [28] { - MONSTER:random,random -} - - - -# Let's tilt it a bit - -LEVEL:"bigrm-7" -FLAGS:mazelevel -INIT_MAP:solidfill,' ' -GEOMETRY:center,center -MAP - ----- - ---------...--- - ---------.........L...--- - ---------.......................--- - ---------.................................--- - ---------...........................................--- - ---------.....................................................--- -|--------...............................................................--| -|.........................................................................| -|.L.....................................................................L.| -|.........................................................................| -|--...............................................................--------| - ---.....................................................--------- - ---...........................................--------- - ---.................................--------- - ---.......................--------- - ---...L.........--------- - ---...--------- - ----- -ENDMAP - -$terrain = terrain:{ 'L', 'T', '{', '.' } -SHUFFLE:$terrain -REPLACE_TERRAIN:(00,00,74,18),'L',$terrain[0],100% - -REGION:(01,01,73,17),lit,"ordinary" - -STAIR:random,up -STAIR:random,down - -NON_DIGGABLE:(00,00,74,18) - -LOOP [15] { - OBJECT:random,random -} -LOOP [6] { - TRAP:random,random -} -LOOP [28] { - MONSTER:random,random -} - - -# Slanted - -LEVEL:"bigrm-8" -FLAGS:mazelevel -INIT_MAP:solidfill,' ' -GEOMETRY:center,center -MAP ----------------------------------------------- -|............................................--- ---.............................................--- - ---......................................FF.....--- - ---...................................FF........--- - ---................................FF...........--- - ---.............................FF..............--- - ---..........................FF.................--- - ---.......................FF....................--- - ---....................FF.......................--- - ---.................FF..........................--- - ---..............FF.............................--- - ---...........FF................................---- - ---........FF...................................--- - ---.....FF......................................--- - ---.............................................-- - ---............................................| - ---------------------------------------------- -ENDMAP - -IF [40%] { - $terrain = TERRAIN:{ 'L', '}', 'T', '.', '-', 'C' } - SHUFFLE:$terrain - REPLACE_TERRAIN:(0,0,74,17),'F', $terrain[0], 100% -} - -REGION:(01,01,73,16),lit,"ordinary" - -STAIR:random,up -STAIR:random,down - -NON_DIGGABLE:(00,00,74,17) - -LOOP [15] { - OBJECT:random,random -} -LOOP [6] { - TRAP:random,random -} -LOOP [28] { - MONSTER:random,random -} - - - -# The Eye - -LEVEL:"bigrm-9" -FLAGS:mazelevel -GEOMETRY:center,center -MAP -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}................................}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}............................................}}}}}}}}}}}}}}} -}}}}}}}}}}......................................................}}}}}}}}}} -}}}}}}}............................................................}}}}}}} -}}}}}.......................LLLLLLLLLLLLLLLLLL.......................}}}}} -}}}....................LLLLLLLLLLLLLLLLLLLLLLLLLLL.....................}}} -}....................LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL....................} -}....................LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL....................} -}....................LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL....................} -}}}....................LLLLLLLLLLLLLLLLLLLLLLLLLLL.....................}}} -}}}}}.......................LLLLLLLLLLLLLLLLLL.......................}}}}} -}}}}}}}............................................................}}}}}}} -}}}}}}}}}}......................................................}}}}}}}}}} -}}}}}}}}}}}}}}}............................................}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}................................}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -ENDMAP - -# Unlit, except 3 mapgrids around the "pupil" -REGION:(00,00,73,18),unlit,"ordinary" -REGION:(26,04,47,14),lit,"ordinary" -REGION:(21,05,51,13),lit,"ordinary" -REGION:(19,06,54,12),lit,"ordinary" - -STAIR:random,up -STAIR:random,down - -LOOP [15] { - OBJECT:random,random -} -LOOP [6] { - TRAP:random,random -} -LOOP [28] { - MONSTER:random,random -} - - -# Fog Maze - -LEVEL:"bigrm-10" -FLAGS:mazelevel -GEOMETRY:center,center -MAP -....................................................................... -....................................................................... -....................................................................... -....................................................................... -...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... -...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... -...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... -...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... -...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... -...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... -...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... -...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... -...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... -...CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC... -...C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C... -....................................................................... -....................................................................... -....................................................................... -....................................................................... -ENDMAP - -IF [33%] { - # occasionally it's not a fog maze - $terrain = TERRAIN:{ 'L', '}', 'T', '-', 'F' } - SHUFFLE:$terrain - # break it up a bit - REPLACE_TERRAIN:(0,0,70,18),'C', '.', 5% - REPLACE_TERRAIN:(0,0,70,18),'C', $terrain[0], 100% -} - -REGION:(00,00,70,18),lit,"ordinary" - -# when falling down on this level, never end up in the fog maze -TELEPORT_REGION:(00,00,70,18),(02,03,68,15),down - -LOOP [15] { - OBJECT:random,random -} -LOOP [6] { - TRAP:random,random -} -LOOP [28] { - MONSTER:random,random -} - -MAZEWALK:(4, 2), south, false - -# Stairs up, not in the fog maze -STAIR:(00,00,70,18),(02,03,68,15),up -STAIR:random,down - diff --git a/dat/bogusmon.txt b/dat/bogusmon.txt index 7179c8b11..b7474231c 100644 --- a/dat/bogusmon.txt +++ b/dat/bogusmon.txt @@ -1,4 +1,4 @@ -# NetHack 3.6 bogusmon.txt $NHDT-Date: 1574387024 2019/11/22 01:43:44 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.8 $ +# NetHack 5.0 bogusmon.txt $NHDT-Date: 1596498237 2020/08/03 23:43:57 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.10 $ # Copyright (c) 2016 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. # @@ -54,6 +54,7 @@ evil overlord newsgroup troll ninja pirate zombie robot octarine dragon +plaid unicorn gonzo journalist lag monster loan shark @@ -85,10 +86,33 @@ steam dragon omnibus slinky maxotaur +millitaur octahedron dungeon core quale holloway +chiasmus +giant tetrapod +voussoir +barking spider +frog cloud +toothsayer +third eye +owlpug +pugasus +acorn +red dot +robot chicken +doozer +poison cackler +lhurgoyf +phelddagrif +tiktaalik +weremoustache +rapier tapir +choplet +pommelbug +quest sprout # Quendor (Zork, &c.) grue @@ -232,6 +256,9 @@ questing beast # Movie Predator +# Harry Potter +dementor + # common pest mother-in-law @@ -265,6 +292,7 @@ dahu dropbear wild haggis jackalope +flying monkey flying pig hippocampus hippogriff @@ -289,6 +317,7 @@ wiki peer COBOL wire shark +stray tab # bugs bohrbug @@ -372,9 +401,6 @@ little green man # Portal weighted Companion Cube -# /b/ -/b/tard - # South Park manbearpig @@ -407,8 +433,8 @@ Greater Hell Beast # Dungeon Crawl Stone Soup +Sigmund lernaean hydra -+Ijyb -+Gloorx Vloq +-Ijyb +=Gloorx Vloq +Blork the orc # Wil Wheaton, John Scalzi @@ -446,6 +472,9 @@ fraggle # Harry Harrison stainless steel rat +# The Culture +antagonistic undecagonstring + # Spoonerism mock role diff --git a/dat/castle.des b/dat/castle.des deleted file mode 100644 index dd63a1e40..000000000 --- a/dat/castle.des +++ /dev/null @@ -1,249 +0,0 @@ -# NetHack 3.6 castle.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# NetHack may be freely redistributed. See license for details. -# -# This is the stronghold level : -# there are several ways to enter it : -# - opening the drawbridge (wand of opening, knock spell, playing -# the appropriate tune) -# -# - enter via the back entry (this suppose a ring of levitation, boots -# of water walking, etc.) -# -# Note : If you don't play the right tune, you get indications like in the -# MasterMind game... -# -# To motivate the player : there are 4 storerooms (armors, weapons, food and -# gems) and a wand of wishing in one of the 4 towers... - -MAZE:"castle",random -FLAGS: noteleport -GEOMETRY:center,center -MAP -}}}}}}}}}.............................................}}}}}}}}} -}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} -}|.....|-----------------------------------------------|.....|} -}|.....+...............................................+.....|} -}-------------------------------+-----------------------------} -}}}}}}|........|..........+...........|.......S.S.......|}}}}}} -.....}|........|..........|...........|.......|.|.......|}..... -.....}|........------------...........---------S---------}..... -.....}|...{....+..........+.........\.S.................+...... -.....}|........------------...........---------S---------}..... -.....}|........|..........|...........|.......|.|.......|}..... -}}}}}}|........|..........+...........|.......S.S.......|}}}}}} -}-------------------------------+-----------------------------} -}|.....+...............................................+.....|} -}|.....|-----------------------------------------------|.....|} -}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} -}}}}}}}}}.............................................}}}}}}}}} -ENDMAP - -# Random registers initialisation -$object = object: { '[',')','*','%' } -SHUFFLE: $object - -$place = { (04,02),(58,02),(04,14),(58,14) } -SHUFFLE: $place - -$monster = monster: { 'L','N','E','H','M','O','R','T','X','Z' } -SHUFFLE: $monster - - -TELEPORT_REGION:levregion(01,00,10,20),(1,1,61,15),down -TELEPORT_REGION:levregion(69,00,79,20),(1,1,61,15),up -STAIR:levregion(01,00,10,20),(0,0,62,16),up -FOUNTAIN:(10,08) -# Doors -DOOR:closed,(07,03) -DOOR:closed,(55,03) -DOOR:locked,(32,04) -DOOR:locked,(26,05) -DOOR:locked,(46,05) -DOOR:locked,(48,05) -DOOR:locked,(47,07) -DOOR:closed,(15,08) -DOOR:closed,(26,08) -DOOR:locked,(38,08) -DOOR:locked,(56,08) -DOOR:locked,(47,09) -DOOR:locked,(26,11) -DOOR:locked,(46,11) -DOOR:locked,(48,11) -DOOR:locked,(32,12) -DOOR:closed,(07,13) -DOOR:closed,(55,13) -# The drawbridge -DRAWBRIDGE:(05,08),east,closed -# Storeroom number 1 -OBJECT:$object[0],(39,05) -OBJECT:$object[0],(40,05) -OBJECT:$object[0],(41,05) -OBJECT:$object[0],(42,05) -OBJECT:$object[0],(43,05) -OBJECT:$object[0],(44,05) -OBJECT:$object[0],(45,05) -OBJECT:$object[0],(39,06) -OBJECT:$object[0],(40,06) -OBJECT:$object[0],(41,06) -OBJECT:$object[0],(42,06) -OBJECT:$object[0],(43,06) -OBJECT:$object[0],(44,06) -OBJECT:$object[0],(45,06) -# Storeroom number 2 -OBJECT:$object[1],(49,05) -OBJECT:$object[1],(50,05) -OBJECT:$object[1],(51,05) -OBJECT:$object[1],(52,05) -OBJECT:$object[1],(53,05) -OBJECT:$object[1],(54,05) -OBJECT:$object[1],(55,05) -OBJECT:$object[1],(49,06) -OBJECT:$object[1],(50,06) -OBJECT:$object[1],(51,06) -OBJECT:$object[1],(52,06) -OBJECT:$object[1],(53,06) -OBJECT:$object[1],(54,06) -OBJECT:$object[1],(55,06) -# Storeroom number 3 -OBJECT:$object[2],(39,10) -OBJECT:$object[2],(40,10) -OBJECT:$object[2],(41,10) -OBJECT:$object[2],(42,10) -OBJECT:$object[2],(43,10) -OBJECT:$object[2],(44,10) -OBJECT:$object[2],(45,10) -OBJECT:$object[2],(39,11) -OBJECT:$object[2],(40,11) -OBJECT:$object[2],(41,11) -OBJECT:$object[2],(42,11) -OBJECT:$object[2],(43,11) -OBJECT:$object[2],(44,11) -OBJECT:$object[2],(45,11) -# Storeroom number 4 -OBJECT:$object[3],(49,10) -OBJECT:$object[3],(50,10) -OBJECT:$object[3],(51,10) -OBJECT:$object[3],(52,10) -OBJECT:$object[3],(53,10) -OBJECT:$object[3],(54,10) -OBJECT:$object[3],(55,10) -OBJECT:$object[3],(49,11) -OBJECT:$object[3],(50,11) -OBJECT:$object[3],(51,11) -OBJECT:$object[3],(52,11) -OBJECT:$object[3],(53,11) -OBJECT:$object[3],(54,11) -OBJECT:$object[3],(55,11) -# THE WAND OF WISHING in 1 of the 4 towers -CONTAINER:('(',"chest"),not_trapped,$place[0] { -OBJECT:('/',"wishing") -} -# Prevent monsters from eating it. (@'s never eat objects) -ENGRAVING:$place[0],burn,"Elbereth" -OBJECT:('?',"scare monster"),$place[0],cursed -# The treasure of the lord -OBJECT:('(',"chest"),(37,08) -# Traps -TRAP:"trap door",(40,08) -TRAP:"trap door",(44,08) -TRAP:"trap door",(48,08) -TRAP:"trap door",(52,08) -TRAP:"trap door",(55,08) -# Soldiers guarding the entry hall -MONSTER:('@',"soldier"),(08,06) -MONSTER:('@',"soldier"),(09,05) -MONSTER:('@',"soldier"),(11,05) -MONSTER:('@',"soldier"),(12,06) -MONSTER:('@',"soldier"),(08,10) -MONSTER:('@',"soldier"),(09,11) -MONSTER:('@',"soldier"),(11,11) -MONSTER:('@',"soldier"),(12,10) -MONSTER:('@',"lieutenant"),(09,08) -# Soldiers guarding the towers -MONSTER:('@',"soldier"),(03,02) -MONSTER:('@',"soldier"),(05,02) -MONSTER:('@',"soldier"),(57,02) -MONSTER:('@',"soldier"),(59,02) -MONSTER:('@',"soldier"),(03,14) -MONSTER:('@',"soldier"),(05,14) -MONSTER:('@',"soldier"),(57,14) -MONSTER:('@',"soldier"),(59,14) -# The four dragons that are guarding the storerooms -MONSTER:'D',(47,05) -MONSTER:'D',(47,06) -MONSTER:'D',(47,10) -MONSTER:'D',(47,11) -# Sea monsters in the moat -MONSTER:(';',"giant eel"),(05,07) -MONSTER:(';',"giant eel"),(05,09) -MONSTER:(';',"giant eel"),(57,07) -MONSTER:(';',"giant eel"),(57,09) -MONSTER:(';',"shark"),(05,00) -MONSTER:(';',"shark"),(05,16) -MONSTER:(';',"shark"),(57,00) -MONSTER:(';',"shark"),(57,16) -# The throne room and the court monsters -MONSTER:$monster[0],(27,05) -MONSTER:$monster[1],(30,05) -MONSTER:$monster[2],(33,05) -MONSTER:$monster[3],(36,05) -MONSTER:$monster[4],(28,06) -MONSTER:$monster[5],(31,06) -MONSTER:$monster[6],(34,06) -MONSTER:$monster[7],(37,06) -MONSTER:$monster[8],(27,07) -MONSTER:$monster[9],(30,07) -MONSTER:$monster[0],(33,07) -MONSTER:$monster[1],(36,07) -MONSTER:$monster[2],(28,08) -MONSTER:$monster[3],(31,08) -MONSTER:$monster[4],(34,08) -MONSTER:$monster[5],(27,09) -MONSTER:$monster[6],(30,09) -MONSTER:$monster[7],(33,09) -MONSTER:$monster[8],(36,09) -MONSTER:$monster[9],(28,10) -MONSTER:$monster[0],(31,10) -MONSTER:$monster[1],(34,10) -MONSTER:$monster[2],(37,10) -MONSTER:$monster[3],(27,11) -MONSTER:$monster[4],(30,11) -MONSTER:$monster[5],(33,11) -MONSTER:$monster[6],(36,11) -# MazeWalks -MAZEWALK:(00,10),west -MAZEWALK:(62,06),east -# Non diggable walls -NON_DIGGABLE:(00,00,62,16) -# Subrooms: -# Entire castle area -REGION:(00,00,62,16),unlit,"ordinary" -# Courtyards -REGION:(00,05,05,11),lit,"ordinary" -REGION:(57,05,62,11),lit,"ordinary" -# Throne room -REGION:(27,05,37,11),lit,"throne",unfilled -# Antechamber -REGION:(07,05,14,11),lit,"ordinary" -# Storerooms -REGION:(39,05,45,06),lit,"ordinary" -REGION:(39,10,45,11),lit,"ordinary" -REGION:(49,05,55,06),lit,"ordinary" -REGION:(49,10,55,11),lit,"ordinary" -# Corners -REGION:(02,02,06,03),lit,"ordinary" -REGION:(56,02,60,03),lit,"ordinary" -REGION:(02,13,06,14),lit,"ordinary" -REGION:(56,13,60,14),lit,"ordinary" -# Barracks -REGION:(16,05,25,06),lit,"barracks" -REGION:(16,10,25,11),lit,"barracks" -# Hallways -REGION:(08,03,54,03),unlit,"ordinary" -REGION:(08,13,54,13),unlit,"ordinary" -REGION:(16,08,25,08),unlit,"ordinary" -REGION:(39,08,55,08),unlit,"ordinary" -# Storeroom alcoves -REGION:(47,05,47,06),unlit,"ordinary" -REGION:(47,10,47,11),unlit,"ordinary" diff --git a/dat/castle.lua b/dat/castle.lua new file mode 100644 index 000000000..0a2b7f243 --- /dev/null +++ b/dat/castle.lua @@ -0,0 +1,257 @@ +-- NetHack castle castle.lua $NHDT-Date: 1652196024 2022/05/10 15:20:24 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.7 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- This is the stronghold level : +-- there are several ways to enter it : +-- - opening the drawbridge (wand of opening, knock spell, playing +-- the appropriate tune) +-- +-- - enter via the back entry (this suppose a ring of levitation, boots +-- of water walking, etc.) +-- +-- Note : If you don't play the right tune, you get indications like in the +-- MasterMind game... +-- +-- To motivate the player : there are 4 storerooms (armors, weapons, food and +-- gems) and a wand of wishing in one of the 4 towers... + +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel", "noteleport", "noflipy") + +des.map([[ +}}}}}}}}}.............................................}}}}}}}}} +}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} +}|.....|-----------------------------------------------|.....|} +}|.....+...............................................+.....|} +}-------------------------------+-----------------------------} +}}}}}}|........|..........+...........|.......S.S.......|}}}}}} +.....}|........|..........|...........|.......|.|.......|}..... +.....}|........------------...........---------S---------}..... +.....}|...{....+..........+.........\.S.................+...... +.....}|........------------...........---------S---------}..... +.....}|........|..........|...........|.......|.|.......|}..... +}}}}}}|........|..........+...........|.......S.S.......|}}}}}} +}-------------------------------+-----------------------------} +}|.....+...............................................+.....|} +}|.....|-----------------------------------------------|.....|} +}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} +}}}}}}}}}.............................................}}}}}}}}} +]]); + +-- Random registers initialisation +local object = { "[", ")", "*", "%" }; +shuffle(object) + +local place = selection.new(); +place:set(04,02); +place:set(58,02); +place:set(04,14); +place:set(58,14); + +local monster = { "L", "N", "E", "H", "M", "O", "R", "T", "X", "Z" } +shuffle(monster) + +des.teleport_region({ region = {01,00,10,20}, region_islev=1, exclude={1,1,61,15}, dir="down" }) +des.teleport_region({ region = {69,00,79,20}, region_islev=1, exclude={1,1,61,15}, dir="up" }) +des.levregion({ region = {01,00,10,20}, region_islev=1, exclude={0,0,62,16}, type="stair-up" }) +des.feature("fountain", 10,08) +-- Doors +des.door("closed",07,03) +des.door("closed",55,03) +des.door("locked",32,04) +des.door("locked",26,05) +des.door("locked",46,05) +des.door("locked",48,05) +des.door("locked",47,07) +des.door("closed",15,08) +des.door("closed",26,08) +des.door("locked",38,08) +des.door("locked",56,08) +des.door("locked",47,09) +des.door("locked",26,11) +des.door("locked",46,11) +des.door("locked",48,11) +des.door("locked",32,12) +des.door("closed",07,13) +des.door("closed",55,13) +-- The drawbridge +des.drawbridge({ dir="east", state="closed", x=05,y=08}) +-- Storeroom number 1 +des.object(object[1],39,05) +des.object(object[1],40,05) +des.object(object[1],41,05) +des.object(object[1],42,05) +des.object(object[1],43,05) +des.object(object[1],44,05) +des.object(object[1],45,05) +des.object(object[1],39,06) +des.object(object[1],40,06) +des.object(object[1],41,06) +des.object(object[1],42,06) +des.object(object[1],43,06) +des.object(object[1],44,06) +des.object(object[1],45,06) +-- Storeroom number 2 +des.object(object[2],49,05) +des.object(object[2],50,05) +des.object(object[2],51,05) +des.object(object[2],52,05) +des.object(object[2],53,05) +des.object(object[2],54,05) +des.object(object[2],55,05) +des.object(object[2],49,06) +des.object(object[2],50,06) +des.object(object[2],51,06) +des.object(object[2],52,06) +des.object(object[2],53,06) +des.object(object[2],54,06) +des.object(object[2],55,06) +-- Storeroom number 3 +des.object(object[3],39,10) +des.object(object[3],40,10) +des.object(object[3],41,10) +des.object(object[3],42,10) +des.object(object[3],43,10) +des.object(object[3],44,10) +des.object(object[3],45,10) +des.object(object[3],39,11) +des.object(object[3],40,11) +des.object(object[3],41,11) +des.object(object[3],42,11) +des.object(object[3],43,11) +des.object(object[3],44,11) +des.object(object[3],45,11) +-- Storeroom number 4 +des.object(object[4],49,10) +des.object(object[4],50,10) +des.object(object[4],51,10) +des.object(object[4],52,10) +des.object(object[4],53,10) +des.object(object[4],54,10) +des.object(object[4],55,10) +des.object(object[4],49,11) +des.object(object[4],50,11) +des.object(object[4],51,11) +des.object(object[4],52,11) +des.object(object[4],53,11) +des.object(object[4],54,11) +des.object(object[4],55,11) +-- THE WAND OF WISHING in 1 of the 4 towers +local loc = place:rndcoord(1); +des.object({ id = "chest", trapped = 0, locked = 1, coord = loc , + contents = function() + des.object("wishing"); + des.object("potion of gain level"); + end +}); +-- Prevent monsters from eating it. (@'s never eat objects) +des.engraving({ coord = loc, type="burn", text="Elbereth" }) +des.object({ id = "scroll of scare monster", coord = loc, buc="cursed" }) +-- The treasure of the lord +des.object("chest",37,08) +-- Traps +des.trap("trap door",40,08) +des.trap("trap door",44,08) +des.trap("trap door",48,08) +des.trap("trap door",52,08) +des.trap("trap door",55,08) +-- Soldiers guarding the entry hall +des.monster("soldier",08,06) +des.monster("soldier",09,05) +des.monster("soldier",11,05) +des.monster("soldier",12,06) +des.monster("soldier",08,10) +des.monster("soldier",09,11) +des.monster("soldier",11,11) +des.monster("soldier",12,10) +des.monster("lieutenant",09,08) +-- Soldiers guarding the towers +des.monster("soldier",03,02) +des.monster("soldier",05,02) +des.monster("soldier",57,02) +des.monster("soldier",59,02) +des.monster("soldier",03,14) +des.monster("soldier",05,14) +des.monster("soldier",57,14) +des.monster("soldier",59,14) +-- The four dragons that are guarding the storerooms +des.monster("D",47,05) +des.monster("D",47,06) +des.monster("D",47,10) +des.monster("D",47,11) +-- Sea monsters in the moat +des.monster("giant eel",05,07) +des.monster("giant eel",05,09) +des.monster("giant eel",57,07) +des.monster("giant eel",57,09) +des.monster("shark",05,00) +des.monster("shark",05,16) +des.monster("shark",57,00) +des.monster("shark",57,16) +-- The throne room and the court monsters +des.monster(monster[10],27,05) +des.monster(monster[1],30,05) +des.monster(monster[2],33,05) +des.monster(monster[3],36,05) +des.monster(monster[4],28,06) +des.monster(monster[5],31,06) +des.monster(monster[6],34,06) +des.monster(monster[7],37,06) +des.monster(monster[8],27,07) +des.monster(monster[9],30,07) +des.monster(monster[10],33,07) +des.monster(monster[1],36,07) +des.monster(monster[2],28,08) +des.monster(monster[3],31,08) +des.monster(monster[4],34,08) +des.monster(monster[5],27,09) +des.monster(monster[6],30,09) +des.monster(monster[7],33,09) +des.monster(monster[8],36,09) +des.monster(monster[9],28,10) +des.monster(monster[10],31,10) +des.monster(monster[1],34,10) +des.monster(monster[2],37,10) +des.monster(monster[3],27,11) +des.monster(monster[4],30,11) +des.monster(monster[5],33,11) +des.monster(monster[6],36,11) +-- MazeWalks +des.mazewalk(00,10,"west") +des.mazewalk(62,06,"east") +-- Non diggable walls +des.non_diggable(selection.area(00,00,62,16)) +-- Subrooms: +-- Entire castle area +des.region(selection.area(00,00,62,16),"unlit") +-- Courtyards +des.region(selection.area(00,05,05,11),"lit") +des.region(selection.area(57,05,62,11),"lit") +-- Throne room +des.region({ region={27,05, 37,11},lit=1,type="throne", filled=2 }) +-- Antechamber +des.region(selection.area(07,05,14,11),"lit") +-- Storerooms +des.region(selection.area(39,05,45,06),"lit") +des.region(selection.area(39,10,45,11),"lit") +des.region(selection.area(49,05,55,06),"lit") +des.region(selection.area(49,10,55,11),"lit") +-- Corners +des.region(selection.area(02,02,06,03),"lit") +des.region(selection.area(56,02,60,03),"lit") +des.region(selection.area(02,13,06,14),"lit") +des.region(selection.area(56,13,60,14),"lit") +-- Barracks +des.region({ region={16,05, 25,06},lit=1,type="barracks", filled=1 }) +des.region({ region={16,10, 25,11},lit=1,type="barracks", filled=1 }) +-- Hallways +des.region(selection.area(08,03,54,03),"unlit") +des.region(selection.area(08,13,54,13),"unlit") +des.region(selection.area(16,08,25,08),"unlit") +des.region(selection.area(39,08,55,08),"unlit") +-- Storeroom alcoves +des.region(selection.area(47,05,47,06),"unlit") +des.region(selection.area(47,10,47,11),"unlit") diff --git a/dat/cmdhelp b/dat/cmdhelp index cd0944d2d..134866d01 100644 --- a/dat/cmdhelp +++ b/dat/cmdhelp @@ -1,4 +1,4 @@ -&# cmdhelp +&# cmdhelp - became obsolete when 'BINDINGS=key:command' got added & Tell what command a keystroke invokes ^ Show the type of an adjacent trap ^[ Cancel command (same as ESCape key) @@ -145,6 +145,7 @@ _ Travel via a shortest-path algorithm to a point on the map * Show all equipment in use (combination of the ),[,=,",( commands) $ Count your gold + List known spells +Del Display map without monsters or objects obstructing the view. # Perform an extended command (use '#?' to list choices) &# number_pad: &# -1 = numpad off, swap y with z (including Y with Z, ^Y with ^Z, M-y &c) @@ -222,3 +223,4 @@ M-T Tip: empty a container M-u Untrap something (trap, door, or chest) M-v Print compile time options for this version of NetHack M-w Wipe off your face +M-X Switch from normal play to explore mode diff --git a/dat/data.base b/dat/data.base index 4046259a2..ec1e5306e 100644 --- a/dat/data.base +++ b/dat/data.base @@ -1,12 +1,15 @@ -# NetHack 3.6 data.base -# $NHDT-Date: 1545359287 2018/12/21 02:28:07 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.87 $ +# NetHack 5.0 data.base +# $NHDT-Date: 1737609388 2025/01/22 21:16:28 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.141 $ # Copyright (c) 1994, 1995, 1996 by the NetHack Development Team # Copyright (c) 1994 by Boudewijn Wayers # NetHack may be freely redistributed. See license for details. # # This is the source file for the "data" file generated by `makedefs -d'. # A line starting with a # is a comment and is ignored by makedefs. -# Any other line not starting with whitespace is a creature or an item. +# Any other line not starting with whitespace is a lookup key, usually +# a creature or an item. Key wildcard matching only supports '?' for +# single character, '*' for zero or more characters, and leading '~' as +# described below. # # Each entry should be comprised of: # the thing/person being described on a line by itself, in lowercase; @@ -17,6 +20,12 @@ # following keys for that entry. For instance, `~orc ??m*' preceding `orc*' # prevents "orc mummy" and "orc zombie" from matching. # +# A citation of "[]" indicates arbitrary text written by developers or +# contributors. Falling off the end of an entry without any citation +# implies "[]". +# +# Some entries include blank lines to separate paragraphs but many don't. +# abbot For it had been long apparent to Count Landulf that nothing could be done with his seventh son Thomas, except to make him @@ -28,12 +37,18 @@ abbot except to say suddenly to his schoolmaster in an explosive manner, "What is God?" The answer is not recorded but it is probable that the asker went on worrying out answers for himself. - [ The Runaway Abbot, by G. K. Chesterton ] + [ The Runaway Abbot, by G.K. Chesterton ] # takes "suit or piece of armor" when specifying '[' +# FIXME: "dragon scales, dragon scale mail" needs its own entry +# FIXME too: "ac, armor class" also merits its own distinct entry ac armor* armour* +*leather armor suit or piece of armor +~*dragon*scale* +~scroll of mail +*mail "The last spot on the school jousting team came down to another boy and me. He was poor, and his only armor was a blanket his mother had made him from her hair. I, on the other hand, had @@ -52,7 +67,7 @@ suit or piece of armor Lying there on the mud mortally wounded, I learned what true armor class was that day." - [ When Help Collides, by J. D. Berry ] + [ When Help Collides, by J.D. Berry ] aclys aklys thonged club @@ -71,6 +86,10 @@ agate* solution is slowly deposited into cavities and veins in older rock. [ The Columbia Encyclopedia, Sixth Edition ] +alchemy + By and large, the only skill the alchemists of Ankh-Morpork had + discovered so far was the ability to turn gold into less gold. + [ Moving Pictures, by Terry Pratchett ] aleax Said to be a doppelganger sent to inflict divine punishment for alignment violations. @@ -124,7 +143,7 @@ maud If ever I should forget, May God make me more wretched Than ever I have been yet! - [ Maud, And Other Poems by Alfred, Lord Tennyson ] + [ Maud, And Other Poems, by Alfred, Lord Tennyson ] ~amulet of yendor ~amulet of restful sleep *amulet @@ -217,7 +236,7 @@ apelike creature the apes have the forelimbs much better developed than the hind limbs. Tail entirely absent. Growth is slow and sexual maturity reached at quite an advanced age. - [ A Field Guide to the Larger Mammals of Africa by Dorst ] + [ A Field Guide to the Larger Mammals of Africa, by Dorst ] Aldo the gorilla had a plan. It was a good plan. It was right. He knew it. He smacked his lips in anticipation as @@ -308,17 +327,39 @@ asmodeus or unhappiness. [ Brewer's Concise Dictionary of Phrase and Fable ] athame - The consecrated ritual knife of a Wiccan initiate (one of - four basic tools, together with the wand, chalice and - pentacle). Traditionally, the athame is a double-edged, - black-handled, cross-hilted dagger of between six and - eighteen inches length. + The consecrated ritual knife of a Wiccan initiate (one of four + basic tools, together with the wand, chalice and pentacle). + Traditionally, the athame is a double-edged, black-handled, + cross-hilted dagger of between six and eighteen inches length. + [] + + A belt made from a twisted braid of silken threads of gold wound + around her waist, and a dark-handled knife rested on a slant at + her hip through a loop in the belt. + [...] + She arched her brows. "You should know better, dear godchild. + You know I cannot speak what is untrue. During our last + encounter I returned to Faerie with great power and upset vital + balances. Those balances had to be redressed, and your debt was + the mechanism that the Queen chose to employ." + I frowned at her for a minute. "Returned with great power." My + eyes fell to the knife at her waist. "That thing the vampires + gave you?" + She rested her fingers lightly on the knife's hilt. "Don't + cheapen it. This athame was no creation of theirs. And it was + less a gift than a trade." + "Amoracchius and that thing are in the same league?" Gulp. My + faerie godmother was dangerous enough without a big-time + artifact of magic. + [ Summer Knight, by Jim Butcher ] athen* Athene was the offspring of Zeus, and without a mother. She sprang forth from his head completely armed. Her favourite bird was the owl, and the plant sacred to her is the olive. - [ Bulfinch's Mythology, by Thomas Bulfinch ] + [ Bulfinch's Mythology, by Thomas Bulfinch ] axe +battle?axe +double?headed?axe "For ev'ry silver ringing blow, Cities and palaces shall grow!" @@ -362,7 +403,7 @@ b*lzebub gave us this pungent and suggestive name of the Devil, a devil whose name suggests that he is devoted to decay, destruction, demoralization, hysteria and panic... - [ Notes on _Lord of the Flies_, by E. L. Epstein ] + [ Notes on _Lord of the Flies_, by E.L. Epstein ] balrog ... It came to the edge of the fire and the light faded as if a cloud had bent over it. Then with a rush it leaped @@ -372,7 +413,7 @@ balrog was a blade like a stabbing tongue of fire; in its left it held a whip of many thongs. 'Ai, ai!' wailed Legolas. 'A Balrog! A Balrog is come!' - [ The Fellowship of the Ring, by J.R.R. Tolkien ] + [ The Fellowship of the Ring, by J.R.R. Tolkien ] baluchitherium titanothere Extinct rhinos include a variety of forms, the most @@ -437,7 +478,7 @@ bat or bird gifted of God's creatures. Show me a bat, says the old proverb, and I will show you something that ought to be in some kind of a home. - [ A Pelican at Blandings, by P. G. Wodehouse ] + [ A Pelican at Blandings, by P.G. Wodehouse ] bear*trap Probably most commonly associated with trapping, the leghold trap is a rather simple mechanical trap. It is made up of two @@ -486,6 +527,22 @@ bell of opening * Old Tom was the single cracked bronze bell in the University bell tower. [ Eric, by Terry Pratchett ] +*bell* + Hear the sledges with the bells -- + Silver bells! + What a world of merriment their melody foretells! + How they tinkle, tinkle, tinkle, + In the icy air of night! + While the stars that oversprinkle + All the heavens, seem to twinkle + With a crystalline delight; + Keeping time, time, time, + In a sort of Runic rhyme, + To the tintinabulation that so musically wells + From the bells, bells, bells, bells, + Bells, bells, bells -- + From the jingling and the tinkling of the bells. + [ The Bells, by Edgar Allan Poe ] blindfold The blindfolding was performed by binding a piece of the yellowish linen whereof those of the Amahagger who condescended @@ -531,6 +588,7 @@ ooze kind had swept so evilly free of all litter. [ At the Mountains of Madness, by H.P. Lovecraft ] blue jelly +ochre jelly spotted jelly I'd planned how to prevent the lock from sealing behind me; it required a temporary sacrifice, not cleverness. I used the door @@ -579,6 +637,7 @@ boomerang [ The Last Continent, by Terry Pratchett ] ~*jack*boot* *boot* +*shoes In Fantasyland these are remarkable in that they seldom or never wear out and are suitable for riding or walking in without the need of Socks. Boots never pinch, rub, or get @@ -656,7 +715,7 @@ brigit And clear understanding. Bring me my cross of gold, As a talisman. - [ "Broadsword" (refrain) by Ian Anderson ] + [ "Broadsword" (refrain), by Ian Anderson ] bugbear Bugbears are relatives of goblins, although they tend to be larger and more hairy. They are aggressive carnivores and @@ -754,6 +813,7 @@ kitten predatory felines (_Felis ochreata domestica_), with a thick, soft pelt; often kept as a pet. Various folklores have the cat associated with magic and the gods of ancient Egypt. + [] So Ulthar went to sleep in vain anger; and when the people awakened at dawn - behold! Every cat was back at his @@ -762,6 +822,7 @@ kitten the cats appear, and sonorous with purring content. [ The Cats of Ulthar, by H.P. Lovecraft ] # this one doesn't work very well for dwarven and gnomish cavemen +cave dweller cave*man human cave*man Now it was light enough to leave. Moon-Watcher picked up @@ -811,7 +872,11 @@ gnom* cave*man These strange creatures were said to live in the caves and clefts of the mountains, myths associating them especially with the hills of Thessaly and the range of Erymanthos. - [ Mythology of all races, Vol. 1, pp. 270-271 ] + [ Mythology of all races, Vol. 1, pp. 270-271 ] +# [ capitalization of the title seems to be all over the place, +# including all lower case and conventional mixed case; +# it appears that Volume 1 (of 13) was written by +# William Sherwood Fox and edited by Louis Herbert Gray ] centipede I observed here, what I had often seen before, that certain districts abound in centipedes. Here they have light @@ -972,8 +1037,8 @@ c*ckatrice But even a dead basilisk is dangerous, for it is said that merely touching its lifeless body can cause a person to sicken and die. - [ Mythical Beasts by Deirdre Headon (The Leprechaun Library) - and other sources ] + [ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) + and other sources ] *coin ~creeping coins *coins @@ -983,7 +1048,6 @@ zorkmid* Empire ]." On the other side, the coin depicts Egreth Castle, and says "In Frobs We Trust" in several languages. [ Zork Zero, by Infocom ] -# not "stethoscope" combat fight fracas @@ -999,6 +1063,12 @@ tiff Blind Pew: Oh. Must have been more of a tiff then. [ Yellowbeard, directed by Mel Damski, screenplay by Graham Chapman, Peter Cook, Bernard McKenna ] +conical hat + You couldn't escape the pointy hat, though. There was nothing magical + about a pointy hat except that it said that the woman underneath it + was a witch. People paid attention to a pointy hat. + [ Wintersmith, by Terry Pratchett ] +# not "*cope" because that would match "stethoscope" cope * cope The cope is a liturgical vestment which may be worn by any @@ -1006,6 +1076,8 @@ cope and are like a very long mantle or cloak, fastened at the breast by a clasp. [ Wikipedia, the free encyclopedia ] +# the word "cornuthaum" was coined by devteam member jwalz and adopted in +# 3.2.0, after searching for an actual name for pointy hat came up empty cornuthaum He was dressed in a flowing gown with fur tippets which had the signs of the zodiac embroidered over it, with various @@ -1016,16 +1088,16 @@ cornuthaum like the headgear worn by ladies of that time, except that the ladies were accustomed to have a bit of veil floating from the top of it. - [ The Once and Future King, by T.H. White ] + [ The Once and Future King, by T.H. White ] - "A wizard!" Dooley exclaimed, astounded. - "At your service, sirs," said the wizard. "How + "A wizard!" Dooley exclaimed, astounded. + "At your service, sirs," said the wizard. "How perceptive of you to notice. I suppose my hat rather gives me away. Something of a beacon, I don't doubt." His hat was pretty much that, tall and cone-shaped with stars and crescent moons all over it. All in all, it couldn't have been more wizardish. - [ The Elfin Ship, James P. Blaylock ] + [ The Elfin Ship, James P. Blaylock ] couatl A mythical feathered serpent. The couatl are very rare. coyote @@ -1039,13 +1111,28 @@ cram* exercise. It was made by the Lake-men for long journeys. [ The Hobbit, by J.R.R. Tolkien ] cream pie - Gregor stared at the pastry tray, and sighed. "I suppose + Gregor stared at the pastry tray, and sighed. "I suppose it would disturb the guards if I tried to shove a cream torte up your nose." - "Deeply. You should have done it when we were eight and + "Deeply. You should have done it when we were eight and twelve, you could have gotten away with it then. The cream pie of justice flies one way," Miles snickered. [ The Vor Game, by Lois McMaster Bujold ] +credit card +charge card + "We are not worried about the expiration date," repeated the + barman, satisfied that he now had Ford Prefect's full attention; + "we are worried about the entire piece of plastic." + "What?" said Ford. He seemed a little taken aback. + "This," said the barman, holding out the card as if it were a + small fish whose soul had three weeks earlier winged its way to + the Land Where Fish Are Eternally Blessed. "We don't accept it." + [...] + "But you don't understand," said Ford, his expression slowly + ripening from a little taken abackness into rank incredulity, + "this is the American Express card. It is the finest way of + settling bills known to man. Haven't you read their junk mail?" + [ So Long, and Thanks For All The Fish, by Douglas Adams ] *crocodile A big animal with the appearance of a lizard, constituting an order of the reptiles (_Loricata_ or _Crocodylia_), the @@ -1064,13 +1151,14 @@ cream pie And welcomes little fishes in, With gently smiling jaws! [ How Doth The Little Crocodile, by Lewis Carroll ] +# Creosote is the Discworld analogue of Croesus croesus kroisos creosote Croesus (in Greek: Kroisos), the wealthy last king of Lydia; - his empire was destroyed when he attacked Cyrus in 549, after - the Oracle of Delphi (q.v.) had told him: "if you attack the - Persians, you will destroy a mighty empire". Herodotus + his empire was destroyed when he attacked Cyrus in 549 BC, + after the Oracle of Delphi (q.v.) had told him: "if you attack + the Persians, you will destroy a mighty empire". Herodotus relates of his legendary conversation with Solon of Athens, who impressed upon him that being rich does not imply being happy and that no one should be considered fortunate before @@ -1083,8 +1171,7 @@ crom aura of evil magic in the air. Without thought, he readies his weapon, and mutters under his breath: "By Crom, there will be blood spilt today." - - [ Conan the Avenger by Robert E. Howard, Bjorn Nyberg, + [ Conan the Avenger, by Robert E. Howard, Bjorn Nyberg, and L. Sprague de Camp ] crossbow* "God save thee, ancient Mariner! @@ -1212,6 +1299,30 @@ major demon them difficult to deal with, even on the rare occasions when they are friendly. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] +# added by PR #1108 by NullCGT then replaced by PR #1109 by entrez +# (Demonbane has been changed from a sword to a mace so the new quote doesn't +# seem to be very appropriate) +demonbane +# Do not be deceived, Wormwood. Our cause is never more in danger +# than when a human, no longer desiring, but still intending, to do +# our Enemy's will, looks round upon a universe from which every +# trace of Him seems to have vanished, and asks why he has been +# forsaken, and still obeys. +# [ The Screwtape Letters, by C.S. Lewis ] +# + Think not that I am come to send peace on earth: I came not to + send peace, but a sword. + [ The Gospel According to Matthew, 10:34 ] +dented pot + Here was a sight to beat all: a man in the prime of life rambling + barefoot down the wilderness road, dressed in raggedy pantaloons + sewn out of two meal sacks, a shirt so tattered and scrappish + that its owner had a proud choice of holes to stick his arms + through, and -- the crowning glory -- a hat in the exact + likeness of a tin mush pot, somewhat dented, but snugly fitted, + with the handle turned to one side, as if it were the very + latest and smartest of fashions. + [ Johnny Appleseed, by James Howard Kunstler ] diamond The hardest known mineral (with a hardness of 10 on Mohs' scale). It is an allotropic form of pure carbon that has crystallized in @@ -1273,6 +1384,17 @@ dispater Wealth". It refers to the wealth of precious stone below the earth. [ Encyclopedia Mythica, ed. M.F. Lindemans ] +# 5.0; monster adapted from slash'em based on an AD&D Monster Manual entry; +# slash'em lacked a description so this entry has been created from scratch; +# the puma comparison is how the AD&D monster is described (except that +# that creature has six legs and two tentacles!) but the actual monster's +# behavior is substantially different +displacer beast + This strange creature appears to be mutant form of puma (aka + cougar or mountain lion) which lives in underground settings + rather than outdoor wilderness. It is capable of exchanging + positions with people or creatures in its path and is not + fooled by displaced images of others. djinn* The djinn are genies from the elemental plane of Air. There, among their kind, they have their own societies. They are @@ -1295,7 +1417,8 @@ pup* loyalty to man and gentleness with children, it is the world's most popular domestic animal. It can easily be trained to perform various tasks. -# typing "spellbook or a closed door" shouldn't yield this entry +# typing "spellbook or a closed door" (map description for "+" when using +# the default symbol set) shouldn't yield this entry ~trap*door ~*spellbook* *door @@ -1309,8 +1432,8 @@ doorway Before me things create were none, save things Eternal, and eternal I endure. All hope abandon ye who enter here. - [ The Inferno, from The Divine Comedy of Dante - Alighieri, translated by H.F. Cary ] + [ The Inferno, from The Divine Comedy of Dante Alighieri, + translated by H.F. Cary ] doppelganger "Then we can only give thanks that this is Antarctica, where there is not one, single, solitary, living thing for it to @@ -1349,7 +1472,7 @@ doppelganger not only with clouds of sulphurous fumes pouring from its fire breathing nostrils, but also with the thrashings of its tail, the most deadly part of its serpent-like body. - [ Mythical Beasts by Deirdre Headon (The Leprechaun Library) ] + [ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ] "One whom the dragons will speak with," he said, "that is a dragonlord, or at least that is the center of the matter. It's @@ -1369,6 +1492,14 @@ doppelganger make of steel. [ The Last Book of Swords: Shieldbreaker's Story, by Fred Saberhagen ] +dragonbane + And now the youth + was to enter the line of battle with his lord, + his first time to be tested as a fighter. + His spirit did not break and the ancestral blade + would keep its edge, as the dragon discovered + as soon as they came together in combat. + [ Beowulf, translated by Seamus Heaney ] *drum* Many travelers have seen the drums of the great apes, and some have heard the sounds of their beating and the noise of @@ -1405,6 +1536,7 @@ dungeon* As from the Center thrice to th' utmost Pole. [ Paradise Lost, by John Milton ] ~dwarf ??m* +~dwar* cloak #~dwar* cave*man dwarf* Dwarfs have faces like men (ugly men, with wrinkled, leathery @@ -1428,6 +1560,15 @@ dwarf* they like, and a dwarvish gift is likely to turn to gold in the hand. But on the whole they are a snappish lot. [ The Immortals, by Derek and Julia Parker ] +# accept "dwarfish" and "dwarvish" +dwar* cloak +hooded cloak + That's how they all came to start, jogging off from the inn one + fine morning just before May, on laden ponies; and Bilbo was + wearing a dark-green hood (a little weather-stained) and a + dark-green cloak borrowed from Dwalin. They were too large for + him, and he looked rather comic. + [ The Hobbit, by J.R.R. Tolkien ] earendil elwing In after days, when because of the triumph of Morgoth Elves and @@ -1501,10 +1642,13 @@ electric eel ~elf ??m* *elf* elvenking +elvenqueen +elven monarch The Elves sat round the fire upon the grass or upon the sawn rings of old trunks. Some went to and fro bearing cups and pouring drinks; others brought food on heaped plates and dishes. + "This is poor fare," they said to the hobbits; "for we are lodging in the greenwood far from our halls. If ever you are our guests at home, we will treat you better." @@ -1513,6 +1657,7 @@ elvenking his mind was filled with the light upon the elf-faces, and the sound of voices so various and so beautiful that he felt in a waking dream. [...] + Sam could never describe in words, nor picture clearly to himself, what he felt or thought that night, though it remained in his memory as one of the chief events of his life. The @@ -1585,8 +1730,23 @@ A.S* [ Wikipedia, the free encyclopedia ] erinys erinyes - These female-seeming devils named after the Furies of mythology - attack hand to hand and poison their unwary victims as well. +furies + Erinyes are the Furies of ancient myth. + (Erinys is the singular form.) + [] + + Holy and pure, from Zeus Khthonios born + and Persephone, whom lovely locks adorn: + Whose piercing sight, with vision unconfin'd, + surveys the deeds of all the impious kind: + On Fate attendant, punishing the race + (with wrath severe) of deeds unjust and base. + Dark-colour'd queens, whose glittering eyes are bright + with dreadful, radiant, life-destroying, light: + Eternal rulers, terrible and strong, + to whom revenge, and tortures dire belong. + [ LXIX. To the Furies, The Orphic Hymns, + translated by Thomas Taylor ] ettin The two-headed giant, or ettin, is a vicious and unpredictable hunter that stalks by night and eats any meat it can catch. @@ -1753,6 +1913,22 @@ fog* cloud Dorothy found them all to be delicious, and she ate every bit of luncheon in the box before she had finished. [ Ozma of Oz, by L. Frank Baum ] +fortune cookie + Nemesis cracked another cookie and wrinkled her nose. "_You will + have great fortune when you least expect it,_" she read. "That's + exactly the sort of nonsense I hate. Someone opens a cookie, and + suddenly they have a prophecy that they'll be rich! I blame that + tramp Tyche. Always dispensing good luck to people who don't + deserve it!" + Leo looked at the mound of broken cookies. "Uh ... you know those + aren't real prophecies, right? They're just stuffed into the + cookies at some factory--" + "Don't try to excuse it!" Nemesis snapped. "It's just like Tyche + to get people's hopes up. No, no. I _must_ counter her." Nemesis + flicked a finger over the slip of paper, and the letters changed + to red. "_You will die painfully when you most expect it._ + There! Much better." + [ The Mark of Athena, by Rick Riordan ] fountain Rest! This little Fountain runs Thus for aye: -- It never stays @@ -1781,6 +1957,9 @@ fox away with his nose in the air, saying: "I am sure they are sour." [ Aesop's Fables ] +fruit +fruitname + They say this is edible. Some adventurers have strange tastes. *fung* Fungi, division of simple plants that lack chlorophyll, true stems, roots, and leaves. Unlike algae, fungi cannot @@ -1869,6 +2048,24 @@ gem or rock same as for jewels: it is always the false ones that look the most real, the most brilliant. [ Salvador Dali ] +# 5.0; monster derived from slash'em which lacked a description so this +# entry has been created from scratch +genetic engineer + These very odd people have mastered the ability to insert gene + sequences from one organism into another, usually triggering + immediate mutations in the subject. Far from needing an + elaborate laboratory to accomplish such abominations, a mere + touch seems to be all that is necessary. + [] + + "I thought the whole point of genetic engineering was to avoid + the random waste of natural evolution, and replace it with + the efficiency of reason," Miles piped up. All three haut- + women turned to stare at him in astonishment, as if a potted + plant had suddenly offered a critique of its fertilization + routine. "Or ... so it seems to me," Miles trailed off in + a much smaller voice. + [ Cetaganda, Lois McMaster Bujold ] geryon Forthwith that image vile of fraud appear'd, His head and upper part expos'd on land, @@ -1892,8 +2089,8 @@ geryon With sting like scorpion's arm'd. Then thus my guide: "Now need our way must turn few steps apart, Far as to that ill beast, who couches there." - [ The Inferno, from The Divine Comedy of Dante - Alighieri, translated by H.F. Cary ] + [ The Inferno, from The Divine Comedy of Dante Alighieri, + translated by H.F. Cary ] *ghost valley of *dea* And now the souls of the dead who had gone below came swarming @@ -1931,6 +2128,11 @@ giant humanoid boulders as weapons, hurling them over large distances. All types of giants share a love for men - roasted, boiled, or fried. Their table manners are legendary. +*gloves +gauntlets* + And her old Uncle William used to say a lady is known by her + shoes and her gloves. + [ Mrs. Dalloway, by Virginia Woolf ] # note: "gnomish wizard" is a monster ~gnome ??m* #~gnom* cave*man @@ -1963,7 +2165,7 @@ gnomish wizard a potato. Ron held it at arm's length as it kicked out at him with its horny little feet; he grasped it around the ankles and turned it upside down. - [ Harry Potter and the Chamber of Secrets, by J. K. Rowling ] + [ Harry Potter and the Chamber of Secrets, by J.K. Rowling ] goblin Now goblins are cruel, wicked, and bad-hearted. They make no beautiful things, but they make many clever ones. They @@ -2095,6 +2297,17 @@ hachi every afternoon to wait for his master. When Hachi died a statue was erected on the station platform in his honor. It is said to bring you luck if you touch his statue. +hallucinat* +potion of hallucination + All at once, and without further warning, my reason forsook me + altogether, and I started from Fr. Moffitt's house to go to my + boarding place. The sidewalks were to me one mass of living, + moving, howling, and ferocious animals. Bears, lions, tigers, + wolves, jaguars, leopards, pumas -- all wild beasts of all climes + -- were frothing at the mouth around me and striving to get to me. + Recollect that while all this was hallucination, it was just as + real as if it had been an undeniable and awful reality. + [ Fifteen Years in Hell, by Luther Benson ] *harp A triangular stringed instrument, often Magic. Even when not Magic, a Harp is surprisingly portable and tough and can be @@ -2172,7 +2385,7 @@ heart of ahriman "Bring that thing back?" muttered the small dark man who stood on the right, with a short, sardonic laugh. "It is ready to crumble at a touch. We are fools ---" - [ Conan The Conqueror, by Robert E. Howard ] + [ Conan the Conqueror, by Robert E. Howard ] hell hound* But suddenly they started forward in a rigid, fixed stare, and his lips parted in amazement. At the same instant Lestrade @@ -2188,7 +2401,34 @@ hell hound* savage, more appalling, more hellish be conceived than that dark form and savage face which broke upon us out of the wall of fog. - [ The Hound of the Baskervilles, by Sir Arthur Conan Doyle. ] + [ The Hound of the Baskervilles, by Sir Arthur Conan Doyle ] +~helm of * +~crystal helmet +helm* +* helmet + A piece of armor designed to protect the head. + (What were you expecting?) +helm of telepathy + A helmet which allows the wearer to detect sentient creatures + within a modest radius, or within the whole level when blind. +helm of opposite alignment + A helmet which changes the wearer's alignment while worn. + Alignment will change back when the helmet is taken off. +helm of caution + A helmet which confers the "warning" property, sensing the + strength of threats posed by unseen hostile creatures. +# note: this quotation had "high of steel" but we're going to cheat--it is +# now deliberately mistranslated as "high of crystal" to match nethack 5.0's +# change to helm of brilliance and become more useful to players. +# PR #1109 wanted to change it to be for all helms but being covered with +# gems and gold is not appropriate for ordinary helmets (plus it states that +# it is unique, so is somewhat inappropriate for helm of brilliance too) +helm of brilliance +crystal helmet + A helm he set on his head, high of crystal; thereon was many + gemstone, all encompassed with gold; it was Uther's, the noble + king's; it was named Goswhit, each other unlike. + [ Layamon's Brut, translated by Sir Frederic Madden, K.H. ] hermes Messenger and herald of the Olympians. Being required to do a great deal of travelling and speaking in public, he became @@ -2207,7 +2447,8 @@ hermes numbers, the alphabet, weights and measures, and sacrificing. hezrou "Hezrou" is the common name for the type II demon. It is - among the weaker of demons, but still quite formidable. + among the weaker of demons, but still quite formidable, + mostly due to the stench. hippocrates Greek physician, recognized as the father of medicine. He is believed to have been born on the island of Cos, to have @@ -2380,6 +2621,8 @@ huan*ti opposed to the _dark_ heavens. He is an inventor, said to have given mankind among other things, the wheel, armour, and the compass. He is the god of fortune telling and war. +# citation used to be [ after the Encyclopedia of Gods... ] -- not sure what +# that was intended to mean hu*h*eto*l minion of huhetotl Huehuetotl, or Huhetotl, which means Old God, was the Aztec @@ -2387,7 +2630,7 @@ minion of huhetotl associated with paternalism and one of the group classed as the Xiuhtecuhtli complex. He is known to send his minions to wreak havoc upon ordinary humans. - [ after the Encyclopedia of Gods, by Michael Jordan ] + [ Encyclopedia of Gods, by Michael Jordan ] humanoid Humanoids are all approximately the size of a human, and may be mistaken for one at a distance. They are usually of a @@ -2422,6 +2665,43 @@ hunter Where is the haste that ye hurry by? Brother, I go to my lair to die. [ The Jungle Book, by Rudyard Kipling ] +# added in PR #1108 by NullCGT for ice box object but has been changed to +# ice terrain +# note: this might need to be reformatted; it's much wider than other entries +# but should be able to fit within a normal-width screen once nethack strips +# off the leading . +~ice box +ice +# thawing ice: "solid ice", "thin ice", &c +* ice +# hallucinating: "frozen " +frozen * + Ice, white ice, like a winding-sheet, sheathing each smoke-grimed wall; + Ice on the stove-pipe, ice on the bed, ice gleaming over all; + Sparkling ice on the dead man's chest, glittering ice in his hair, + Ice on his fingers, ice in his heart, ice in his glassy stare; + Hard as a log and trussed like a frog, with his arms and legs outspread. + I gazed at the coffin I'd brought for him, and I gazed at the gruesome dead, + And at last I spoke: "Bill liked his joke; but still, goldarn his eyes, + A man had ought to consider his mates in the way he goes and dies." + [ The Ballad of Blasphemous Bill, by Robert W. Service ] +# part of PR #1109 by entrez +ice box + I have eaten + the plums + that were in + the icebox + + and which + you were probably + saving + for breakfast + + Forgive me + they were delicious + so sweet + and so cold + [ This Is Just To Say, by William Carlos Williams ] ice devil Ice devils are large semi-insectoid creatures, who are equally at home in the fires of Hell and the cold of Limbo, @@ -2452,8 +2732,10 @@ imp or minor demon The fairies of tradition often hover uneasily between the ghostly and the diabolic state. [ A Dictionary of Fairies, by Katharine Briggs ] +# "amorous demon" is a placeholder until something better comes along incubus succubus +amorous demon The incubus and succubus are male and female versions of the same demon, one who lies with a human for its own purposes, usually to the detriment of the mortals who are unwise in @@ -2630,7 +2912,13 @@ jubilex he is a slime-like creature who swallows other creatures alive, spits acidic secretions, and causes disease in his victims which can be almost instantly fatal. +# historically (according to wikipedia...), C-ration was heavier but +# provided more nutrition, and required some form of tin opener; +# in nethack they weigh the same and K-ration provides more nutrition? k?ration +c?ration + The C ration was a predecessor of the K ration. + [] The K ration was the [ Quartermaster Subsistence Research and Development Laboratory's ] answer to the demand for an individual, easy-to-carry ration that could be used in @@ -2680,10 +2968,11 @@ kelp* specimens in their native setting. [ 20,000 Leagues Under the Sea, by Jules Verne ] ki-rin - The ki-rin is a strange-looking flying creature. It has - scales, a mane like a lion, a tail, hooves, and a horn. It - is brightly colored, and can usually be found flying in the - sky looking for good deeds to reward. + The ki-rin is a strange-looking wingless flying creature. + It has scales, a mane like a lion, a tail, four legs with + hooves, and a horn like a unicorn's. It is brightly colored, + and can usually be found flying in the sky looking for good + deeds to reward. king arthur *arthur Ector took both his sons to the church before which the @@ -2736,7 +3025,7 @@ knight And was a bugbear in men's eyes; But had the fortune in his age To live a fool and die a sage. - [ Don Quixote of La Mancha, by Miquel de Cervantes Saavedra ] + [ Don Quixote of La Mancha, by Miguel de Cervantes Saavedra ] ~kobold ??m* *kobold* The race of kobolds are reputed to be an artificial creation @@ -2745,6 +3034,7 @@ knight Elven race, and will go out of their way to cause trouble for Elves at any time. *kop* +rubber hose The Kops are a brilliant concept. To take a gaggle of inept policemen and display them over and over again in a series of riotously funny physical punishments plays equally well to the @@ -2791,7 +3081,9 @@ kraken for help. Twenty other arms came rippling out. The dark water boiled, and there was a hideous stench. [ The Fellowship of the Ring, by J.R.R. Tolkien ] -*lady +the lady +lady +lady luck offler Blind Io took up the dice-box, which was a skull whose various orifices had been stoppered with rubies, and with several of @@ -2852,7 +3144,7 @@ lance his lance into shivers, carrying him and his horse after it, and finally tumbled him a good way off from it on the field in evil plight. - [ Don Quixote of La Mancha, by Miquel de Cervantes Saavedra ] + [ Don Quixote of La Mancha, by Miguel de Cervantes Saavedra ] land mine Your heart is intact, your brain is not badly damaged, but the rest of your injuries are comparable to stepping on a land mine. You'd @@ -2864,6 +3156,7 @@ land mine battery powered. A discreet little switch is marked "on/off" in elaborate lettering. [ Adventure 770, by Mike Arnautov ] +# citation is a descriptive passage from the original text adventure game lava * lava You are on the edge of a breath-taking view. Far below you @@ -2888,7 +3181,7 @@ lava of its own, which lends an additional infernal splendor to the already hellish scene. A dark, forboding passage exits to the south. - [ Adventure, by Will Crowther and Don Woods. ] + [ Adventure, by Will Crowther and Don Woods ] leash They had splendid heads, fine shoulders, strong legs, and straight tails. The spots on their bodies were jet-black and @@ -3046,7 +3339,7 @@ lord carnarvon to Egypt in search of a mild climate and while there visited the excavation sites of several archaeological expeditions. ... In 1906 he began his own excavations. - [ Gods, Graves, and Scholars, by C. W. Ceram ] + [ Gods, Graves, and Scholars, by C.W. Ceram ] lord sato Lord Sato was the family head of the Taro Clan, and a mighty daimyo. He is a loyal servant of the Emperor, and will do @@ -3273,11 +3566,21 @@ huge chunk of meat But we hae meat, and we can eat, Sae let the Lord be thankit. [ Grace Before Meat, by Robert Burns ] +# nethack's Medusa doesn't match the myth very closely, particularly in +# how reflection is involved, but that's par for the course +# +# this used to begin "Medusa, one of the three Gorgons or Graeae" as +# if Graeae and Gorgons where the same thing, but Bulfinch's Mythology +# indicates that they are quite different; since the first paragraph is +# a made-up introduction to an excerpt from that work, the contradictory +# mention of Graeae has been removed medusa perseus - Medusa, one of the three Gorgons or Graeae, is the only one - of her sisters to have assumed mortal form and inhabited the - dungeon world. +shield of reflection + Medusa, one of the three Gorgons, is the only one of her + sisters to have assumed mortal form and inhabited the dungeon + world. + [] When Perseus was grown up Polydectes sent him to attempt the conquest of Medusa, a terrible monster who had laid waste the @@ -3489,6 +3792,7 @@ morning star the horseman's weapon typically had a shorter haft than the footman's, which might be up to six feet long. It came into use in the beginning of the 14th century. + The name "morning star" is often erroneously applied to the military flail (also known as the therscol), a similar weapon, but with the head attached by a short chain. @@ -3612,7 +3916,7 @@ ninja-to good condition by placing fresh earth around it daily. In her fury, Skuld often spoiled the work of her sisters by tearing the web to shreds. - [ The Encyclopedia of Myths and Legends of All Nations + [ The Encyclopaedia of Myths and Legends of All Nations, by Herbert Spencer Robinson and Knox Wilson ] nunchaku A nunchaku is two sections of wood (or metal in modern @@ -3900,7 +4204,7 @@ pelias "The scaled people see what escapes the mortal eye," answered Pelias cryptically. "You see my fleshy guise, he saw my naked soul." - [ Conan the Usurper, by Robert E. Howard and L. Sprague de Camp ] + [ Conan the Usurper, by Robert E. Howard and L. Sprague de Camp ] pick*ax* broad pick The mine is full of holes; @@ -3945,12 +4249,11 @@ pit fiend domains. platinum yendorian express card This is an ancient artifact made of an unknown material. It - is rectangular in shape, very thin, and inscribed with - unreadable ancient runes. When carried, it grants the one - who carries it ESP, and reduces all spell induced damage done to - the carrier by half. It also protects from magic missile - attacks. Finally, its power is such that when invoked, it - can charge other objects. + is rectangular in shape, very thin, and inscribed with archaic + runes of power. When carried, it grants the bearer ESP, reduces + incoming damage from spells by half, and protects from magic + missile attacks. Additionally, its power is such that when + invoked, it can charge other objects. # playing style, rather vague topic but these quotes are too apt to pass up player play* style @@ -3968,6 +4271,16 @@ user Might just kill you. [ It's a Jungle Out There, by Randy Newman ] # [ theme song from "Monk" ] +poison +poisoned +potion of sickness +*venom + Fate intervened. Some of us, that day, she led inexorably + through the gates of death. Some of us, innocent and unsuspecting, + took, unwillingly, that one last step to oblivion. Some of us took + very little sugar. + [ We Have Always Lived in the Castle, + by Shirley Jackson ] polearm * polearm partisan @@ -4033,17 +4346,19 @@ poseido*n waves he received by lot at the Council Meeting of the Gods, at which Zeus took the upper world for himself and gave dominion over the lower world to Hades. + Poseidon is associated in many ways with horses and thus is the god of horses. He taught men how to ride and manage the animal he invented and is looked upon as the originator and guardian deity of horse races. + His symbol is the familiar trident or three-pronged spear with which he can split rocks, cause or quell storms, and shake the earth, a power which makes him the god of earthquakes as well. Physically, he is shown as a strong and powerful ruler, every inch a king. - [ The Encyclopedia of Myths and Legends of All Nations, - by Herbert Robinson and Knox Wilson ] + [ The Encyclopaedia of Myths and Legends of All Nations, + by Herbert Spencer Robinson and Knox Wilson ] ~*sleeping ~*booze *potion* @@ -4071,7 +4386,7 @@ poseido*n one else can see, do things no one else can do. [ Big Trouble in Little China, directed by John Carpenter, written by Gary Goldman & - David Z. Weinstein, adaptation by W. D. Richter ] + David Z. Weinstein, adaptation by W.D. Richter ] pray* Whatever a man prays for, he prays for a miracle. Every prayer reduces itself to this: Great God, grant that twice @@ -4079,6 +4394,8 @@ pray* [ Fathers and Sons, by Ivan Turgenev ] priest* * priest* +cleric +* cleric acolyte [...] For the two priests were talking exactly like priests, piously, with learning and leisure, about the most aerial @@ -4217,7 +4534,7 @@ quetzalcoatl cotton to grow on cotton plants. But for some reason or other he had to leave his empire. ... But all the legends of Quetzalcoatl unanimously agree that he promised to come again. - [ Gods, Graves, and Scholars, by C. W. Ceram ] + [ Gods, Graves, and Scholars, by C.W. Ceram ] quit* Maltar: [...] I remembered a little saying I learned my first day at the academy. @@ -4322,6 +4639,7 @@ robe 3. As the garb of Desert Nomads. [...] [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] rock +large rock Bilbo saw that the moment had come when he must do something. He could not get up at the brutes and he had nothing to shoot with; but looking about he saw that in this place there were @@ -4377,7 +4695,7 @@ dwarven root "Wild Elves know them not; Grey-elves have not found them; the proud ones from over the Sea are too proud to delve," said Mim. - + "What is their name?" said Turin. Mim looked at him sidelong. "They have no name, save in the Dwarf-tongue, which we do not teach," he said. "And we not teach Men to find them, for Men @@ -4386,7 +4704,7 @@ dwarven root blundering in the wild. No more will you learn of me; but you may have enough of my bounty, as long as you speak fair and do not spy or steal." Then again he laughed in his throat. - + "They are of great worth." he said. "More than gold in the hungry winter, for they may be hoarded like the nuts of a squirrel, and already we were building our store from the @@ -4568,6 +4886,13 @@ scorpius on opposite sides of the sky so they would never fight again. As Scorpius rises in the east, Orion sets in the west. [ 365 Starry Nights, by Chet Raymo ] +scroll of punishment +punish* + It matters not how strait the gate, + How charged with punishments the scroll, + I am the master of my fate; + I am the captain of my soul. + [ Invictus, by William Ernest Henley ] *scroll scroll * And I was gazing on the surges prone, @@ -4604,10 +4929,27 @@ seth hippopotamus, and the pig. [ Encyclopedia Mythica, ed. M.F. Lindemans ] shad* - Shades are undead creatures. They differ from zombies in - that a zombie is an undead animation of a corpse, while a - shade is an undead creature magically created by the use - of black magic. + For the shades--figures of jet black streaking across the + white-knobbed ground--were upon her. Strength was meaningless + against shades. They had no real substance. Only two things + mattered: moving quickly and not letting yourself be + frightened. Shades were dangerous, but so long as you had silver, + you could fight. [...] + + Her knife passed through the shade with a slight tugging feeling, + creating a shower of bright white sparks that sprayed out of the + shade. The shade pulled back, its black tendrils writhing about + one another. + + Silence spun on the other. The pitch sky let her see only the + thing's eyes, a horrid green, as it reached for her. She lunged. + + Its spectral hands were upon her, the icy cold of its fingers + gripping her arm below the elbow. She could feel it. Shade + fingers had substance; they could grab you, hold you back. Only + silver warded them away. Only with silver could you fight. + [ Shadows for Silence in the Forests of Hell, + by Brandon Sanderson ] shaman karnov Making his quarters in the Caves of the Ancestors, Shaman Karnov unceasingly tries to shield his neanderthal people @@ -4634,6 +4976,24 @@ shark that no other creature in nature could make -- a bomb from the depths. [ Close to Shore, by Michael Capuzzo ] +~uruk* +~white* +*shield + In his hands he took his shield, all glittering: no one ever + broke it with a blow or crushed it. And a wonder it was to see; + for its whole orb shimmered with enamel and white ivory and + electrum, and it glowed with shining gold; and there were zones + of cyanus drawn upon it. In the center was Fear worked in adamant, + unspeakable, staring backwards with eyes that glowed with fire. + His mouth was full of teeth in a white row, fearful and daunting, + and upon his grim brow hovered frightful Strife who arrays the + throng of men: pitiless she, for she took away the mind and senses + of poor wretches who made war against the son of Zeus. Their souls + passed beneath the earth and went down into the house of Hades; + but their bones, when the skin is rotted about them, crumble away + on the dark earth under parching Sirius. + [ Hesiod, The Homeric Hymns and Homerica, + translation by Hugh G. Evelyn-White ] shito A Japanese stabbing knife. shopkeeper @@ -4879,6 +5239,7 @@ squeaky board additionally gives the wielder the power of regeneration. When invoked it performs healing magic. stair* +branch stair* Up he went -- very quickly at first -- then more slowly -- then in a little while even more slowly than that -- and finally, after many minutes of climbing up the endless stairway, one @@ -4899,6 +5260,32 @@ stair* Dr. Peter Venkman: They go up. [ Ghostbusters, directed by Ivan Reitman, written by Dan Ackroyd and Harold Ramis ] +*stalker + "You don't understand," he said, "who I am or what I am. I'll show + you. By Heaven! I'll show you." Then he put his open palm over + his face and withdrew it. The centre of his face became a black + cavity. "Here," he said. He stepped forward and handed Mrs. Hall + something which she, staring at his metamorphosed face, accepted + automatically. Then, when she saw what it was, she screamed + loudly, dropped it, and staggered back. The nose--it was the + stranger's nose! pink and shining--rolled on the floor. + + Then he removed his spectacles, and everyone in the bar gasped. He + took off his hat, and with a violent gesture tore at his whiskers + and bandages. For a moment they resisted him. A flash of horrible + anticipation passed through the bar. "Oh, my Gard!" said some one. + Then off they came. + + It was worse than anything. Mrs. Hall, standing open-mouthed and + horror-struck, shrieked at what she saw, and made for the door of + the house. Everyone began to move. They were prepared for scars, + disfigurements, tangible horrors, but nothing! The bandages and + false hair flew across the passage into the bar, making a + hobbledehoy jump to avoid them. Everyone tumbled on everyone else + down the steps. For the man who stood there shouting some + incoherent explanation, was a solid gesticulating figure up to the + coat-collar of him, and then--nothingness, no visible thing at all! + [ The Invisible Man, by H.G. Wells ] ~statue trap statue* Then at last he began to wonder why the lion was standing so @@ -4917,7 +5304,23 @@ statue* lion. And as soon as he had thought of that he noticed that the lion's back and the top of its head were covered with snow. Of course it must be only a statue! - [ The Lion, the Witch and the Wardrobe by C.S. Lewis ] + [ The Lion, the Witch and the Wardrobe, by C.S. Lewis ] +# the original stethoscope was a fixed tube open at both ends; subsequent +# early ones were adaptations of an 'earhorn' used by the hard of hearing, +# but players are unlikely to picture anything like that when they find one +stethoscope + Tool used to listen closely to adjacent sound, typically by + a medical practitioner to listen to a patient's heart, lungs, + or pulse. +# joke suggested by stethoscope; a zillion things could be added but these +# ought to suffice +microscope +telescope +telephone +television +#tricorder +#phaser + Not invented yet. sting There was the usual dim grey light of the forest-day about him when he came to his senses. The spider lay dead beside @@ -4928,6 +5331,7 @@ sting a different person, and much fiercer and bolder in spite of an empty stomach, as he wiped his sword on the grass and put it back into its sheath. + "I will give you a name," he said to it, "and I shall call you Sting." [ The Hobbit, by J.R.R. Tolkien ] @@ -4938,6 +5342,7 @@ stormbringer yet the ship followed them, as if drawn by them; they grew louder - pain and despair were there, but terror was predominant. + Elric had heard such sounds echoing from his cousin Yyrkoon's sardonically named 'Pleasure Chambers' in the days before he had fled the responsibilities of ruling all that remained of @@ -4949,6 +5354,8 @@ stormbringer great black battle-blade Stormbringer, drank their souls. [ The Lands Beyond the World, by Michael Moorcock ] *strange object +strange +glorkum* He walked for some time through a long narrow corridor without finding any one and was just going to call out, when suddenly in a dark corner between an old cupboard @@ -5327,6 +5734,15 @@ unicorn horn unreconnoitered Area of map which is beyond limited perception range when underwater or engulfed by a monster. +uruk*hai shield +white-handed shield + They were armed with short broad-bladed swords, not with the + curved scimitars usual with Orcs: and they had bows of yew, + in length and shape like the bows of Men. Upon their shields + they bore a strange device: a small white hand in the centre + of a black field; on the front of their iron helms was set an + S-rune, wrought of some white metal. + [ The Two Towers, by J.R.R. Tolkien ] valkyrie * valkyrie The Valkyries were the thirteen choosers of the slain, the @@ -5340,10 +5756,10 @@ valkyrie which they died and in which they had won their deathless fame. [ The Encyclopaedia of Myths and Legends of All Nations, - by Herbert Robinson and Knox Wilson ] + by Herbert Spencer Robinson and Knox Wilson ] vampire ~vampire bat -vampire lord +vampire l* He can transform himself to wolf, as we gather from the ship arrival in Whitby, when he tear open the dog; he can be as bat, as Madam Mina saw him on the window at Whitby, and as @@ -5397,7 +5813,7 @@ vrock The vrock is one of the weaker forms of demon. It resembles a cross between a human being and a vulture and does physical damage by biting and by using the claws on both its arms and - feet. + feet. It can also release a cloud of noxious gas to hide in. wakizashi A wakizashi was used as a samurai's weapon when the katana was unavailable. When entering a building, a samurai would @@ -5505,14 +5921,23 @@ water troll As Rincewind stared a small shoal of silver fish flashed across its chest. [ The Colour of Magic, by Terry Pratchett ] +# axe and morning star and the umpteen polearms have their own entries; +# exclusion keys for broadsword and sunsword aren't really necessarily +# because their entries precede this one weapon +club +flail +~*broadsword +~sunsword +*sword A weapon is a device for making your enemy change his mind. [ The Vor Game, by Lois McMaster Bujold ] web Oh what a tangled web we weave, When first we practise to deceive! [ Marmion, by Sir Walter Scott ] -whistle +# magic whistle deserves its own entry +*whistle There were legends both on the front and on the back of the whistle. The one read thus: @@ -5525,7 +5950,6 @@ whistle Well, the best way to find out is evidently to whistle for him.' - [Ghost Stories of an Antiquary, by Montague Rhodes James 'Oh, Whistle, and I'll Come to You My Lad'] # werecritter -- see "lycanthrope" @@ -5539,6 +5963,15 @@ whistle flat on his back upon a cold stone with his hands on his breast. [ The Fellowship of the Ring, by J.R.R. Tolkien ] +win +winner +winning + ... the rules of Brockian Ultra Cricket, as played in the higher + dimensions. A full set of rules is so massively complicated ... + A brief summary, however, follows: + ... + /Rule Six/: The winning team shall be the first team that wins. + [ Life, the Universe and Everything, by Douglas Adams ] # note: need to convert player character "gnomish wizard" into just "wizard" # in the lookup code to avoid conflict with the monster of that same name ~gnomish wizard @@ -5715,7 +6148,381 @@ yumi taken from the grave and endowed by sorcery with a mechanical semblance of life, -- it is a dead body which is made to walk and act and move as if it were alive. - [ W. B. Seabrook ] + [ W.B. Seabrook ] zruty The zruty are wild and gigantic beings, living in the wildernesses of the Tatra mountains. +## +# Rank titles for the various roles. Some of these keys won't reach here +# because they'll have matched entries above. The usual three letter role +# designation plus " ranks" should always find the set for that role. +# +arc* ranks +archeologist +digger +field worker +investigator +exhumer +excavator +spelunker +speleologist +collector +curator + Archeologist ranks + title level + Digger 1 to 2 + Field Worker 3 to 5 + Investigator 6 to 9 + Exhumer 10 to 13 + Excavator 14 to 17 + Spelunker 18 to 21 + Speleologist 22 to 25 + Collector 26 to 29 + Curator 30 +bar* ranks +barbarian +plunder?* +pillager +bandit +brigand +raider +reaver +slayer +chieftain* +conquer* + Barbarian ranks + title level + Plunderer, + Plunderess 1 to 2 + Pillager 3 to 5 + Bandit 6 to 9 + Brigand 10 to 13 + Raider 14 to 17 + Reaver 18 to 21 + Slayer 22 to 25 + Chieftain, + Chieftainess 26 to 29 + Conqueror, + Conqueress 30 +cav* ranks +caveman +cavewoman +cave dweller +troglodyte +aborigine +wanderer +vagrant +wayfarer +roamer +nomad +rover +pioneer + Caveman/Cavewoman/Cave Dweller ranks + title level + Troglodyte 1 to 2 + Aborigine 3 to 5 + Wanderer 6 to 9 + Vagrant 10 to 13 + Wayfarer 14 to 17 + Roamer 18 to 21 + Nomad 22 to 25 + Rover 26 to 29 + Pioneer 30 +hea* ranks +healer +rhizotomist +empiric +embalmer +dresser +medic* ossium +herbalist +magister +magistra +physician +chirurgeon + Healer ranks + title level + Rhizotomist 1 to 2 + Empiric 3 to 5 + Embalmer 6 to 9 + Dresser 10 to 13 + Medicus ossium, + Medica ossium 14 to 17 + Herbalist 18 to 21 + Magister, + Magistra 22 to 25 + Physician 26 to 29 + Chirurgeon 30 +kni* ranks +knight +gallant +esquire +bachelor +sergeant +knight +banneret +chevalier* +seignieur +dame +paladin + Knight ranks + title level + Gallant 1 to 2 + Esquire 3 to 5 + Bachelor 6 to 9 + Sergeant 10 to 13 + Knight 14 to 17 + Banneret 18 to 21 + Chevalier, + Chevaliere 22 to 25 + Seignieur, + Dame 26 to 29 + Paladin 30 +mon* ranks +monk +candidate +novice +initiate +student of stones +student of waters +student of metals +student of winds +student of fire +master + Monk ranks + title level + Candidate 1 to 2 + Novice 3 to 5 + Initiate 6 to 9 + Student + of Stones 10 to 13 + of Waters 14 to 17 + of Metals 18 to 21 + of Winds 22 to 25 + of Fire 26 to 29 + Master 30 +pri* ranks +priest* +aspirant +acolyte +adept +#priest* +curate +canon* +lama +?atriarch +high priest* + Priest/Priestess/Cleric ranks + title level + Aspirant 1 to 2 + Acolyte 3 to 5 + Adept 6 to 9 + Priest, + Priestess 10 to 13 + Curate 14 to 17 + Canon, + Canoness 18 to 21 + Lama 22 to 25 + Patriarch, + Matriarch 26 to 29 + High Priest, + High Priestess 30 +ran* ranks +ranger +tenderfoot +lookout +trailblazer +reconnoiter* +scout +arbalester +archer +sharpshooter +marks*man + Ranger ranks + title level + Tenderfoot 1 to 2 + Lookout 3 to 5 + Trailblazer 6 to 9 + Reconnoiterer, + Reconnoiteress 10 to 13 + Scout 14 to 17 + Arbalester 18 to 21 + Archer 22 to 25 + Sharpshooter 26 to 29 + Marksman, + Markswoman 30 +rog* ranks +rogue +footpad +cutpurse +rogue +pilferer +robber +burglar +filcher +mags*man +thief + Rogue ranks + title level + Footpad 1 to 2 + Cutpurse 3 to 5 + Rogue 6 to 9 + Pilferer 10 to 13 + Robber 14 to 17 + Burglar 18 to 21 + Filcher 22 to 25 + Magsman, + Magswoman 26 to 29 + Thief 30 +sam* ranks +samurai +hatamoto +ronin +ninja +kunoichi +joshu +ryoshu +kokushu +daimyo +kuge +shogun + Samurai ranks + title level + Hatamoto 1 to 2 + Ronin 3 to 5 + Ninja, + Kunoichi 6 to 9 + Joshu 10 to 13 + Ryoshu 14 to 17 + Kokushu 18 to 21 + Daimyo 22 to 25 + Kuge 26 to 29 + Shogun 30 +tou* ranks +tourist +rambler +sightseer +excursionist +peregrinat* +traveler +journeyer +voyager +explorer +adventurer + Tourist ranks + title level + Rambler 1 to 2 + Sightseer 3 to 5 + Excursionist 6 to 9 + Peregrinator, + Peregrinatrix 10 to 13 + Traveler 14 to 17 + Journeyer 18 to 21 + Voyager 22 to 25 + Explorer 26 to 29 + Adventurer 30 +val* ranks +valkyrie +stripling +skirmisher +fighter +*man-at-arms +warrior +swashbuckler +hero +heroine +champion +lord +lady + Valkyrie ranks + title level + Stripling 1 to 2 + Skirmisher 3 to 5 + Fighter 6 to 9 + Man-at-arms, + Woman-at-arms 10 to 13 + Warrior 14 to 17 + Swashbuckler 18 to 21 + Hero, + Heroine 22 to 25 + Champion 26 to 29 + Lord, + Lady 30 +wiz* ranks +wizard +evoker +conjurer +thaumaturge +magician +enchanter +enchantress +sorcerer +sorceress +necromancer +mage + Wizard ranks + title level + Evoker 1 to 2 + Conjurer 3 to 5 + Thaumaturge 6 to 9 + Magician 10 to 13 + Enchanter, + Enchantress 14 to 17 + Sorcerer, + Sorceress 18 to 21 + Necromancer 22 to 25 + Wizard 26 to 29 + Mage 30 +## +# list the titles for all the Discworld novels (3.6 tribute); +# the extra leading spaces are intentional--tty displays the whole list +# full screen flush-left (at least for 80 columns) and without them to +# give some indentation it doesn't look very good +# +novel +paperback book +discworld novel* + Discworld novel titles + by Sir Terry Pratchett + The Colour of Magic + The Light Fantastic + Equal Rites + Mort + Sourcery + Wyrd Sisters + Pyramids + Guards! Guards! + Eric + Moving Pictures + Reaper Man + Witches Abroad + Small Gods + Lords and Ladies + Men at Arms + Soul Music + Interesting Times + Maskerade + Feet of Clay + Hogfather + Jingo + The Last Continent + Carpe Jugulum + The Fifth Elephant + The Truth + Thief of Time + The Last Hero + The Amazing Maurice and His Educated Rodents + Night Watch + The Wee Free Men + Monstrous Regiment + A Hat Full of Sky + Going Postal + Thud! + Wintersmith + Making Money + Unseen Academicals + I Shall Wear Midnight + Snuff + Raising Steam + The Shepherd's Crown +# diff --git a/dat/dungeon.def b/dat/dungeon.def deleted file mode 100644 index d4d61fbaf..000000000 --- a/dat/dungeon.def +++ /dev/null @@ -1,143 +0,0 @@ -# NetHack 3.6 dungeon.def $NHDT-Date: 1462486876 2016/05/05 22:21:16 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.14 $ -# Copyright (c) 1990-95 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The dungeon description file for the "standard" 3.1 NetHack. -# -# Note: The order of the definition of dungeons in this file -# reflects in their order of creation in the real dungeon. -# The "Main" branch must *always* be first. -# Also note that the order of the dungeons in this file -# determines the order in which branch levels are assigned. -# If two dungeons have overlapping ranges for their entry -# points, then you should list the dungeon with the _least_ -# number of choices for its branch level _first_. -# - -DUNGEON: "The Dungeons of Doom" "D" (25, 5) -ALIGNMENT: unaligned -BRANCH: "The Gnomish Mines" @ (2, 3) -LEVEL: "rogue" "R" @ (15, 4) -LEVELDESC: roguelike -LEVEL: "oracle" "O" @ (5, 5) -LEVALIGN: neutral -CHAINBRANCH: "Sokoban" "oracle" + (1, 0) up -RNDLEVEL: "bigrm" "B" @ (10, 3) 40 10 -CHAINBRANCH: "The Quest" "oracle" + (6, 2) portal -BRANCH: "Fort Ludios" @ (18, 4) portal -RNDLEVEL: "medusa" "none" @ (-5, 4) 4 -LEVALIGN: chaotic -LEVEL: "castle" "none" @ (-1, 0) -CHAINBRANCH: "Gehennom" "castle" + (0, 0) no_down -BRANCH: "The Elemental Planes" @ (1, 0) no_down up - -# -# Gehennom -# -# Now re-worked for 3.1, hell is hopefully going to be a little -# less boring. Also, in 3.1, the tower is not considered as a -# part of hell, but is set up as a separate dungeon. -# -# Gehennom is no longer considered "hellish" as a complete dungeon. -# That is, fire resistance is no longer a condition for survival in -# it. However, Gehennom, and the special levels in it in particular, -# is abundant with fire traps. As a result, fire resistance is still -# a prudent survival strategy in Gehennom. -# -# Note: Gehennom *must* be the second dungeon defined so that -# monsters can properly migrate here under certain -# circumstances. -# -DUNGEON: "Gehennom" "G" (20, 5) -DESCRIPTION: mazelike -DESCRIPTION: hellish -ALIGNMENT: noalign -BRANCH: "Vlad's Tower" @ (9, 5) up -LEVEL: "valley" "V" @ (1, 0) -LEVEL: "sanctum" "none" @ (-1, 0) -LEVEL: "juiblex" "J" @ (4, 4) -LEVEL: "baalz" "B" @ (6, 4) -LEVEL: "asmodeus" "A" @ (2, 6) -LEVEL: "wizard1" "none" @ (11, 6) -CHAINLEVEL: "wizard2" "X" "wizard1" + (1, 0) -CHAINLEVEL: "wizard3" "Y" "wizard1" + (2, 0) -LEVEL: "orcus" "O" @ (10, 6) -LEVEL: "fakewiz1" "F" @ (-6,4) -LEVEL: "fakewiz2" "G" @ (-6,4) - -# -# The Mines of the Gnomes of Zurich. -# -DUNGEON: "The Gnomish Mines" "M" (8, 2) -ALIGNMENT: lawful -DESCRIPTION: mazelike -RNDLEVEL: "minetn" "T" @ (3, 2) 7 -LEVELDESC: town -RNDLEVEL: "minend" "E" @ (-1, 0) 3 - -# -# The Questdungeon -# -# This is a proto-dungeon. The level file names will be prepended with -# three letter role abbreviation during initialization, replacing "x". -# A special "x-fill" level must be defined in the levels description -# file. It will be used for all levels not defined explicitly below. -# -DUNGEON: "The Quest" "Q" (5, 2) -LEVEL: "x-strt" "none" @ (1, 1) -LEVEL: "x-loca" "L" @ (3, 1) -LEVEL: "x-goal" "none" @ (-1, 0) - -# -# Sokoban -# -DUNGEON: "Sokoban" "none" (4, 0) -DESCRIPTION: mazelike -ALIGNMENT: neutral -ENTRY: -1 -RNDLEVEL: "soko1" "none" @ (1, 0) 2 -RNDLEVEL: "soko2" "none" @ (2, 0) 2 -RNDLEVEL: "soko3" "none" @ (3, 0) 2 -RNDLEVEL: "soko4" "none" @ (4, 0) 2 - -# -# The Central Vault of Croesus. -# -DUNGEON: "Fort Ludios" "K" (1, 0) -DESCRIPTION: mazelike -ALIGNMENT: unaligned -LEVEL: "knox" "K" @ (-1, 0) -# -# Vlad's Tower -# -# It has been removed from Gehennom, and it is surrounded by stone. -# Must not allow bones files for its top level. -# -DUNGEON: "Vlad's Tower" "T" (3, 0) -PROTOFILE: "tower" -DESCRIPTION: mazelike -ALIGNMENT: chaotic -ENTRY: -1 -LEVEL: "tower1" "none" @ (1, 0) -# it isn't necessary to list these last two, but doing so makes them -# show up in ^O output and in the level teleport menu -LEVEL: "tower2" "none" @ (2, 0) -LEVEL: "tower3" "none" @ (3, 0) - -# -# The Endgame levels -# -# Enter on 2nd level from bottom; 1st (from bottom) is a -# placeholder for surface level, and should be unreachable. -# [Note: the name "dummy" is checked for in init_dungeons().] -# -DUNGEON: "The Elemental Planes" "E" (6, 0) -DESCRIPTION: mazelike -ALIGNMENT: unaligned -ENTRY: -2 -LEVEL: "astral" "none" @ (1, 0) -LEVEL: "water" "none" @ (2, 0) -LEVEL: "fire" "none" @ (3, 0) -LEVEL: "air" "none" @ (4, 0) -LEVEL: "earth" "none" @ (5, 0) -LEVEL: "dummy" "none" @ (6, 0) diff --git a/dat/dungeon.lua b/dat/dungeon.lua new file mode 100644 index 000000000..7550d1317 --- /dev/null +++ b/dat/dungeon.lua @@ -0,0 +1,333 @@ +-- NetHack 3.6 dungeon dungeon.lua $NHDT-Date: 1652196135 2022/05/10 15:22:15 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1990-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- The dungeon description file. +dungeon = { + { + name = "The Dungeons of Doom", + bonetag = "D", + base = 25, + range = 5, + alignment = "unaligned", + themerooms = "themerms.lua", + branches = { + { + name = "The Gnomish Mines", + base = 2, + range = 3 + }, + { + name = "Sokoban", + chainlevel = "oracle", + base = 1, + direction = "up" + }, + { + name = "The Quest", + chainlevel = "oracle", + base = 6, + range = 2, + branchtype = "portal" + }, + { + name = "Fort Ludios", + base = 18, + range = 4, + branchtype = "portal" + }, + { + name = "Gehennom", + chainlevel = "castle", + base = 0, + branchtype = "no_down" + }, + { + name = "The Elemental Planes", + base = 1, + branchtype = "no_down", + direction = "up" + } + }, + levels = { + { + name = "rogue", + bonetag = "R", + base = 15, + range = 4, + flags = "roguelike", + }, + { + name = "oracle", + bonetag = "O", + base = 5, + range = 5, + alignment = "neutral" + }, + { + name = "bigrm", + bonetag = "B", + base = 10, + range = 3, + chance = 40, + nlevels = 13 + }, + { + name = "medusa", + base = -5, + range = 4, + nlevels = 4, + alignment = "chaotic" + }, + { + name = "castle", + base = -1 + } + } + }, + { + name = "Gehennom", + bonetag = "G", + base = 20, + range = 5, + flags = { "mazelike", "hellish" }, + lvlfill = "hellfill", + alignment = "noalign", + branches = { + { + name = "Vlad's Tower", + base = 9, + range = 5, + direction = "up" + } + }, + levels = { + { + name = "valley", + bonetag = "V", + base = 1 + }, + { + name = "sanctum", + base = -1 + }, + { + name = "juiblex", + bonetag = "J", + base = 4, + range = 4 + }, + { + name = "baalz", + bonetag = "B", + base = 6, + range = 4 + }, + { + name = "asmodeus", + bonetag = "A", + base = 2, + range = 6 + }, + { + name = "wizard1", + base = 11, + range = 6 + }, + { + name = "wizard2", + bonetag = "X", + chainlevel = "wizard1", + base = 1 + }, + { + name = "wizard3", + bonetag = "Y", + chainlevel = "wizard1", + base = 2 + }, + { + name = "orcus", + bonetag = "O", + base = 10, + range = 6 + }, + { + name = "fakewiz1", + bonetag = "F", + base = -6, + range = 4 + }, + { + name = "fakewiz2", + bonetag = "G", + base = -6, + range = 4 + }, + } + }, + { + name = "The Gnomish Mines", + bonetag = "M", + base = 8, + range = 2, + alignment = "lawful", + flags = { "mazelike" }, + lvlfill = "minefill", + levels = { + { + name = "minetn", + bonetag = "T", + base = 3, + range = 2, + nlevels = 7, + flags = "town" + }, + { + name = "minend", +-- 5.0.0: minend changed to no-bones to simplify achievement tracking +-- bonetag = "E" + base = -1, + nlevels = 3 + }, + } + }, + { + name = "The Quest", + bonetag = "Q", + base = 5, + range = 2, + levels = { + { + name = "x-strt", + base = 1, + range = 1 + }, + { + name = "x-loca", + bonetag = "L", + base = 3, + range = 1 + }, + { + name = "x-goal", + base = -1 + }, + } + }, + { + name = "Sokoban", + base = 4, + alignment = "neutral", + flags = { "mazelike" }, + entry = -1, + levels = { + { + name = "soko1", + base = 1, + nlevels = 2 + }, + { + name = "soko2", + base = 2, + nlevels = 2 + }, + { + name = "soko3", + base = 3, + nlevels = 2 + }, + { + name = "soko4", + base = 4, + nlevels = 2 + }, + } + }, + { + name = "Fort Ludios", + base = 1, + bonetag = "K", + flags = { "mazelike" }, + alignment = "unaligned", + levels = { + { + name = "knox", + bonetag = "K", + base = -1 + } + } + }, + { + name = "Vlad's Tower", + base = 3, + bonetag = "T", + protofile = "tower", + alignment = "chaotic", + flags = { "mazelike" }, + entry = -1, + levels = { + { + name = "tower1", + base = 1 + }, + { + name = "tower2", + base = 2 + }, + { + name = "tower3", + base = 3 + }, + } + }, + { + name = "The Elemental Planes", + bonetag = "E", + base = 6, + alignment = "unaligned", + flags = { "mazelike" }, + entry = -2, + levels = { + { + name = "astral", + base = 1 + }, + { + name = "water", + base = 2 + }, + { + name = "fire", + base = 3 + }, + { + name = "air", + base = 4 + }, + { + name = "earth", + base = 5 + }, + { + name = "dummy", + base = 6 + }, + } + }, + { + name = "The Tutorial", + base = 2, + flags = { "mazelike", "unconnected" }, + levels = { + { + name = "tut-1", + base = 1, + }, + { + name = "tut-2", + base = 2, + }, + } + }, +} diff --git a/dat/earth.lua b/dat/earth.lua new file mode 100644 index 000000000..4d7527e07 --- /dev/null +++ b/dat/earth.lua @@ -0,0 +1,130 @@ +-- NetHack endgame earth.lua $NHDT-Date: 1652196025 2022/05/10 15:20:25 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, +-- and Timo Hakulinen +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- These are the ENDGAME levels: earth, air, fire, water, and astral. +-- The top-most level, the Astral Level, has 3 temples and shrines. +-- Players are supposed to sacrifice the Amulet of Yendor on the appropriate +-- shrine. + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "shortsighted") + +des.message("Well done, mortal!") +des.message("But now thou must face the final Test...") +des.message("Prove thyself worthy or perish!") + +-- The player lands, upon arrival, in the +-- lower-right cavern. The location of the +-- portal to the next level is randomly chosen. +-- This map has no visible outer boundary, and +-- is mostly diggable "rock". +des.map([[ + + ... + .... .. + ..... ... .. + .... .... ... + .... ... .... ... . + .. .. ....... . .. + .. ... . + . .. . ... + .. .. . .. . + .. ... . + ... ... + .. ... .. + .... .. + .. ... + .. ..... + ... ... + .... + .. + +]]); + +des.replace_terrain({ region={0,0, 75,19}, fromterrain=" ", toterrain=".", lit=0, chance=5 }) + +-- Since there are no stairs, this forces the hero's initial placement +des.teleport_region({region = {69,16,69,16} }) +des.levregion({ region = {0,0,75,19}, exclude = {65,13,75,19}, type="portal", name="air" }) +-- Some helpful monsters. Making sure a +-- pick axe and at least one wand of digging +-- are available. +des.monster("Elvenking", 67,16) +des.monster("minotaur", 67,14) +-- An assortment of earth-appropriate nasties +-- in each cavern. +des.monster({ id = "earth elemental", x = 52, y = 13, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 53, y = 13, peaceful = 0 }) +des.monster("rock troll", 53,12) +des.monster("stone giant", 54,12) +-- +des.monster("pit viper", 70,05) +des.monster("barbed devil", 69,06) +des.monster("stone giant", 69,08) +des.monster("stone golem", 71,08) +des.monster("pit fiend", 70,09) +des.monster({ id = "earth elemental", x = 70, y = 08, peaceful = 0 }) +-- +des.monster({ id = "earth elemental", x = 60, y = 03, peaceful = 0 }) +des.monster("stone giant", 61,04) +des.monster({ id = "earth elemental", x = 62, y = 04, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 61, y = 05, peaceful = 0 }) +des.monster("scorpion", 62,05) +des.monster("rock piercer", 63,05) +-- +des.monster("umber hulk", 40,05) +des.monster("dust vortex", 42,05) +des.monster("rock troll", 38,06) +des.monster({ id = "earth elemental", x = 39, y = 06, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 41, y = 06, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 38, y = 07, peaceful = 0 }) +des.monster("stone giant", 39,07) +des.monster({ id = "earth elemental", x = 43, y = 07, peaceful = 0 }) +des.monster("stone golem", 37,08) +des.monster("pit viper", 43,08) +des.monster("pit viper", 43,09) +des.monster("rock troll", 44,10) +-- +des.monster({ id = "earth elemental", x = 02, y = 01, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 03, y = 01, peaceful = 0 }) +des.monster("stone golem", 01,02) +des.monster({ id = "earth elemental", x = 02, y = 02, peaceful = 0 }) +des.monster("rock troll", 04,03) +des.monster("rock troll", 03,03) +des.monster("pit fiend", 03,04) +des.monster({ id = "earth elemental", x = 04, y = 05, peaceful = 0 }) +des.monster("pit viper", 05,06) +-- +des.monster({ id = "earth elemental", x = 21, y = 02, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 21, y = 03, peaceful = 0 }) +des.monster("minotaur", 21,04) +des.monster({ id = "earth elemental", x = 21, y = 05, peaceful = 0 }) +des.monster("rock troll", 22,05) +des.monster({ id = "earth elemental", x = 22, y = 06, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 23, y = 06, peaceful = 0 }) +-- +des.monster("pit viper", 14,08) +des.monster("barbed devil", 14,09) +des.monster({ id = "earth elemental", x = 13, y = 10, peaceful = 0 }) +des.monster("rock troll", 12,11) +des.monster({ id = "earth elemental", x = 14, y = 12, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 15, y = 13, peaceful = 0 }) +des.monster("stone giant", 17,13) +des.monster("stone golem", 18,13) +des.monster("pit fiend", 18,12) +des.monster({ id = "earth elemental", x = 18, y = 11, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 18, y = 10, peaceful = 0 }) +-- +des.monster("barbed devil", 02,16) +des.monster({ id = "earth elemental", x = 03, y = 16, peaceful = 0 }) +des.monster("rock troll", 02,17) +des.monster({ id = "earth elemental", x = 04, y = 17, peaceful = 0 }) +des.monster({ id = "earth elemental", x = 04, y = 18, peaceful = 0 }) + +des.object("boulder") + diff --git a/dat/endgame.des b/dat/endgame.des deleted file mode 100644 index ebd9049bd..000000000 --- a/dat/endgame.des +++ /dev/null @@ -1,655 +0,0 @@ -# NetHack 3.6 endgame.des $NHDT-Date: 1546303680 2019/01/01 00:48:00 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.14 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, -# and Timo Hakulinen -# NetHack may be freely redistributed. See license for details. -# -# These are the ENDGAME levels: earth, air, fire, water, and astral. -# The top-most level, the Astral Level, has 3 temples and shrines. -# Players are supposed to sacrifice the Amulet of Yendor on the appropriate -# shrine. - -MAZE:"earth",' ' -FLAGS: noteleport,hardfloor,shortsighted -MESSAGE: "Well done, mortal!" -MESSAGE: "But now thou must face the final Test..." -MESSAGE: "Prove thyself worthy or perish!" - -GEOMETRY:center,center -# The player lands, upon arrival, in the -# lower-right cavern. The location of the -# portal to the next level is randomly chosen. -# This map has no visible outer boundary, and -# is mostly diggable "rock". -MAP - - ... - .... .. - ..... ... .. - .... .... ... - .... ... .... ... . - .. .. ....... . .. - .. ... . - . .. . ... - .. .. . .. . - .. ... . - ... ... - .. ... .. - .... .. - .. ... - .. ..... - ... ... - .... - .. - -ENDMAP - -REPLACE_TERRAIN:(0,0,75,19), ' ', ('.', unlit), 5% - -# Since there are no stairs, this forces the hero's initial placement -TELEPORT_REGION:(69,16,69,16),(0,0,0,0) -PORTAL:(0,0,75,19),(65,13,75,19),"air" -# Some helpful monsters. Making sure a -# pick axe and at least one wand of digging -# are available. -MONSTER:('@',"Elvenking"),(67,16) -MONSTER:('H',"minotaur"),(67,14) -# An assortment of earth-appropriate nasties -# in each cavern. -MONSTER:('E',"earth elemental"),(52,13),hostile -MONSTER:('E',"earth elemental"),(53,13),hostile -MONSTER:('T',"rock troll"),(53,12) -MONSTER:('H',"stone giant"),(54,12) -# -MONSTER:('S',"pit viper"),(70,05) -MONSTER:('&',"barbed devil"),(69,06) -MONSTER:('H',"stone giant"),(69,08) -MONSTER:(''',"stone golem"),(71,08) -MONSTER:('&',"pit fiend"),(70,09) -MONSTER:('E',"earth elemental"),(70,08),hostile -# -MONSTER:('E',"earth elemental"),(60,03),hostile -MONSTER:('H',"stone giant"),(61,04) -MONSTER:('E',"earth elemental"),(62,04),hostile -MONSTER:('E',"earth elemental"),(61,05),hostile -MONSTER:('s',"scorpion"),(62,05) -MONSTER:('p',"rock piercer"),(63,05) -# -MONSTER:('U',"umber hulk"),(40,05) -MONSTER:('v',"dust vortex"),(42,05) -MONSTER:('T',"rock troll"),(38,06) -MONSTER:('E',"earth elemental"),(39,06),hostile -MONSTER:('E',"earth elemental"),(41,06),hostile -MONSTER:('E',"earth elemental"),(38,07),hostile -MONSTER:('H',"stone giant"),(39,07) -MONSTER:('E',"earth elemental"),(43,07),hostile -MONSTER:(''',"stone golem"),(37,08) -MONSTER:('S',"pit viper"),(43,08) -MONSTER:('S',"pit viper"),(43,09) -MONSTER:('T',"rock troll"),(44,10) -# -MONSTER:('E',"earth elemental"),(02,01),hostile -MONSTER:('E',"earth elemental"),(03,01),hostile -MONSTER:(''',"stone golem"),(01,02) -MONSTER:('E',"earth elemental"),(02,02),hostile -MONSTER:('T',"rock troll"),(04,03) -MONSTER:('T',"rock troll"),(03,03) -MONSTER:('&',"pit fiend"),(03,04) -MONSTER:('E',"earth elemental"),(04,05),hostile -MONSTER:('S',"pit viper"),(05,06) -# -MONSTER:('E',"earth elemental"),(21,02),hostile -MONSTER:('E',"earth elemental"),(21,03),hostile -MONSTER:('H',"minotaur"),(21,04) -MONSTER:('E',"earth elemental"),(21,05),hostile -MONSTER:('T',"rock troll"),(22,05) -MONSTER:('E',"earth elemental"),(22,06),hostile -MONSTER:('E',"earth elemental"),(23,06),hostile -# -MONSTER:('S',"pit viper"),(14,08) -MONSTER:('&',"barbed devil"),(14,09) -MONSTER:('E',"earth elemental"),(13,10),hostile -MONSTER:('T',"rock troll"),(12,11) -MONSTER:('E',"earth elemental"),(14,12),hostile -MONSTER:('E',"earth elemental"),(15,13),hostile -MONSTER:('H',"stone giant"),(17,13) -MONSTER:(''',"stone golem"),(18,13) -MONSTER:('&',"pit fiend"),(18,12) -MONSTER:('E',"earth elemental"),(18,11),hostile -MONSTER:('E',"earth elemental"),(18,10),hostile -# -MONSTER:('&',"barbed devil"),(02,16) -MONSTER:('E',"earth elemental"),(03,16),hostile -MONSTER:('T',"rock troll"),(02,17) -MONSTER:('E',"earth elemental"),(04,17),hostile -MONSTER:('E',"earth elemental"),(04,18),hostile - -OBJECT:('`',"boulder"),random - - -MAZE:"air",' ' -FLAGS: noteleport,hardfloor,shortsighted -# The following messages are somewhat obtuse, to make then -# equally meaningful if the player can see or not. -MESSAGE: "What a strange feeling!" -MESSAGE: "You notice that there is no gravity here." -GEOMETRY:center,center -# The player lands, upon arrival, in the -# lower-left area. The location of the -# portal to the next level is randomly chosen. -# This map has no visible outer boundary, and -# is all "air". -MAP -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -ENDMAP -# Use up and down regions to partition the level into three parts; -# teleportation can't cross from one part into another. -# The up region is where you'll arrive after activating the portal from -# the preceding level; the exit portal is placed inside the down region. -TELEPORT_REGION:levregion(01,00,24,20),levregion(25,00,79,20),up -TELEPORT_REGION:levregion(56,00,79,20),levregion(01,00,55,20),down -PORTAL:levregion(57,01,78,19),(0,0,0,0),"fire" -REGION:(00,00,75,19),lit,"ordinary" -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile -MONSTER:('E',"air elemental"),random,hostile - -MONSTER:('e',"floating eye"),random,hostile -MONSTER:('e',"floating eye"),random,hostile -MONSTER:('e',"floating eye"),random,hostile - -MONSTER:('y',"yellow light"),random,hostile -MONSTER:('y',"yellow light"),random,hostile -MONSTER:('y',"yellow light"),random,hostile - -MONSTER:('A',"couatl"),random - -MONSTER:'D',random -MONSTER:'D',random -MONSTER:'D',random -MONSTER:'D',random -MONSTER:'D',random - -MONSTER:'E',random -MONSTER:'E',random -MONSTER:'E',random -MONSTER:'J',random -MONSTER:'J',random - -MONSTER:('&',"djinni"),random,hostile -MONSTER:('&',"djinni"),random,hostile -MONSTER:('&',"djinni"),random,hostile - -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"fog cloud"),random,hostile -MONSTER:('v',"energy vortex"),random,hostile -MONSTER:('v',"energy vortex"),random,hostile -MONSTER:('v',"energy vortex"),random,hostile -MONSTER:('v',"energy vortex"),random,hostile -MONSTER:('v',"energy vortex"),random,hostile -MONSTER:('v',"steam vortex"),random,hostile -MONSTER:('v',"steam vortex"),random,hostile -MONSTER:('v',"steam vortex"),random,hostile -MONSTER:('v',"steam vortex"),random,hostile -MONSTER:('v',"steam vortex"),random,hostile - - -MAZE:"fire",' ' -FLAGS: noteleport,hardfloor,shortsighted -GEOMETRY:center,center -# The player lands, upon arrival, in the -# lower-right. The location of the -# portal to the next level is randomly chosen. -# This map has no visible outer boundary, and -# is mostly open area, with lava lakes and bunches of fire traps. -MAP -............................................................................ -....LLLLLLLL............L.......................LLL......................... -...LL...................L......................LLLL................LL....... -...L.............LLLL...LL....LL...............LLLLL.............LLL........ -.LLLL..............LL....L.....LLL..............LLLL..............LLLL...... -..........LLLL...LLLL...LLL....LLL......L........LLLL....LL........LLL...... -........LLLLLLL...LL.....L......L......LL.........LL......LL........LL...L.. -........LL..LLL..LL......LL......LLLL..L.........LL......LLL............LL.. -....L..LL....LLLLL.................LLLLLLL.......L......LL............LLLLLL -....L..L.....LL.LLLL.......L............L........LLLLL.LL......LL.........LL -....LL........L...LL......LL.............LLL.....L...LLL.......LLL.........L -.....LLLLLL........L.......LLL.............L....LL...L.LLL......LLLLLLL..... -..........LLLL............LL.L.............L....L...LL.........LLL..LLL..... -...........................LLLLL...........LL...L...L........LLLL..LLLLLL... -.....LLLL.............LL....LL.......LLL...LL.......L..LLL....LLLLLLL....... -.......LLL.........LLLLLLLLLLL......LLLLL...L...........LL...LL...LL........ -.........LL.......LL.........LL.......LLL....L..LLL....LL.........LL........ -..........LLLLLLLLL...........LL....LLL.......LLLLL.....LL........LL........ -.................L.............LLLLLL............LL...LLLL.........LL....... -.................................LL....................LL................... -ENDMAP -TELEPORT_REGION:(69,16,69,16),(0,0,0,0) -PORTAL:(0,0,75,19),(65,13,75,19),"water" - -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -TRAP:"fire",random -# An assortment of fire-appropriate nasties -MONSTER:('D',"red dragon"),random -MONSTER:('&',"balrog"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('v',"fire vortex"),random -MONSTER:('d',"hell hound"),random -# -MONSTER:('H',"fire giant"),random -MONSTER:('&',"barbed devil"),random -MONSTER:('d',"hell hound"),random -MONSTER:(''',"stone golem"),random -MONSTER:('&',"pit fiend"),random -MONSTER:('E',"fire elemental"),random,hostile -# -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('d',"hell hound"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('s',"scorpion"),random -MONSTER:('H',"fire giant"),random -# -MONSTER:('d',"hell hound"),random -MONSTER:('v',"dust vortex"),random -MONSTER:('v',"fire vortex"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('d',"hell hound"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:(''',"stone golem"),random -MONSTER:('S',"pit viper"),random -MONSTER:('S',"pit viper"),random -MONSTER:('v',"fire vortex"),random -# -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('H',"fire giant"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('v',"fire vortex"),random -MONSTER:('v',"fire vortex"),random -MONSTER:('&',"pit fiend"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('S',"pit viper"),random -# -MONSTER:(':',"salamander"),random,hostile -MONSTER:(':',"salamander"),random,hostile -MONSTER:('H',"minotaur"),random -MONSTER:(':',"salamander"),random,hostile -MONSTER:('v',"steam vortex"),random -MONSTER:(':',"salamander"),random,hostile -MONSTER:(':',"salamander"),random,hostile -# -MONSTER:('H',"fire giant"),random -MONSTER:('&',"barbed devil"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('v',"fire vortex"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('d',"hell hound"),random -MONSTER:('H',"fire giant"),random -MONSTER:('&',"pit fiend"),random -MONSTER:('E',"fire elemental"),random,hostile -MONSTER:('E',"fire elemental"),random,hostile -# -MONSTER:('&',"barbed devil"),random -MONSTER:(':',"salamander"),random,hostile -MONSTER:('v',"steam vortex"),random -MONSTER:(':',"salamander"),random,hostile -MONSTER:(':',"salamander"),random,hostile - -OBJECT:('`',"boulder"),random -OBJECT:('`',"boulder"),random -OBJECT:('`',"boulder"),random -OBJECT:('`',"boulder"),random -OBJECT:('`',"boulder"),random - - -MAZE:"water",' ' -FLAGS: noteleport,hardfloor,shortsighted -MESSAGE: "You find yourself suspended in an air bubble surrounded by water." -GEOMETRY:center,center -# The player lands upon arrival to an air bubble -# within the leftmost third of the level. The -# portal to the next level is randomly located in an air -# bubble within the rightmost third of the level. -# Bubbles are generated by special code in mkmaze.c for now. -MAP -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -ENDMAP -TELEPORT_REGION:(0,0,25,19),(0,0,0,0) -PORTAL:(51,0,75,19),(0,0,0,0),"astral" -# A fisherman's dream... -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"electric eel"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"kraken"),random -MONSTER:(';',"shark"),random -MONSTER:(';',"shark"),random -MONSTER:(';',"shark"),random -MONSTER:(';',"shark"),random -MONSTER:(';',"piranha"),random -MONSTER:(';',"piranha"),random -MONSTER:(';',"piranha"),random -MONSTER:(';',"piranha"),random -MONSTER:(';',"jellyfish"),random -MONSTER:(';',"jellyfish"),random -MONSTER:(';',"jellyfish"),random -MONSTER:(';',"jellyfish"),random -MONSTER:';',random -MONSTER:';',random -MONSTER:';',random -MONSTER:';',random -# These guys feel like home here -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile -MONSTER:('E',"water elemental"),random,hostile - - -MAZE:"astral",' ' -FLAGS: noteleport,hardfloor,nommap,shortsighted,solidify -MESSAGE: "You arrive on the Astral Plane!" -MESSAGE: "Here the High Temple of %d is located." -MESSAGE: "You sense alarm, hostility, and excitement in the air!" -GEOMETRY:center,center -MAP - --------------- - |.............| - |..---------..| - |..|.......|..| ---------------- |..|.......|..| --------------- -|.............| |..|.......|..| |.............| -|..---------..-| |-------| |..|.......|..| |-------| |-..---------..| -|..|.......|...-| |-.......-| |..|.......|..| |-.......-| |-...|.......|..| -|..|.......|....-|-.........-||..----+----..||-.........-|-....|.......|..| -|..|.......+.....+...........||.............||...........+.....+.......|..| -|..|.......|....-|-.........-|--|.........|--|-.........-|-....|.......|..| -|..|.......|...-| |-.......-| -|---+---|- |-.......-| |-...|.......|..| -|..---------..-| |---+---| |-.......-| |---+---| |-..---------..| -|.............| |...|-----|-.........-|-----|...| |.............| ---------------- |.........|...........|.........| --------------- - -------...|-.........-|...------- - |....|-.......-|....| - ---...|---+---|...--- - |...............| - ----------------- -ENDMAP - -# chance to alter above map and turn the wings of the bottom-center into -# a pair of big (5x15) rooms -$loopindx = 0 -LOOP [2] { - $loopindx = $loopindx + 1 -# 3.6.[01]: 75% chance that both sides opened up, 25% that neither did; -# 3.6.2: 60% twice == 36% chance that both sides open up, 24% left side -# only, 24% right side only, 16% that neither side opens up - IF [60%] { - IF [$loopindx == 1] { - TERRAIN:fillrect (17,14, 30,18),'.' - WALLIFY -# temporarily close off the area to be filled so that it doesn't cover -# the entire entry area - TERRAIN:(33,18), '|' - $hall = selection:floodfill(30,16) -# re-connect the opened wing with the rest of the map - TERRAIN:(33,18), '.' - } ELSE { - TERRAIN:fillrect (44,14, 57,18),'.' - WALLIFY - TERRAIN:(41,18), '|' - $hall = selection:floodfill(44,16) - TERRAIN:(41,18), '.' - } -# extra monsters; was [6 + 3d4] when both wings were opened up at once - LOOP [3 + 2d3] { - MONSTER:('A',"Angel"),rndcoord($hall),noalign,hostile - [50%]: MONSTER:random,rndcoord($hall),hostile - } - } -} - -# Rider locations -$place = { (23,9),(37,14),(51,9) } -SHUFFLE: $place - -# Where the player will land on arrival -TELEPORT_REGION:(29,15,45,15),(30,15,44,15) -# Lit courts -REGION:(01,05,16,14),lit,"ordinary",filled,irregular -REGION:(31,01,44,10),lit,"ordinary",filled,irregular -REGION:(61,05,74,14),lit,"ordinary",filled,irregular -# A Sanctum for each alignment -# The shrines' alignments are shuffled for -# each game -REGION:(04,07,10,11),lit,"temple" -REGION:(34,03,40,07),lit,"temple" -REGION:(64,07,70,11),lit,"temple" -ALTAR:(07,09),align[0],sanctum -ALTAR:(37,05),align[1],sanctum -ALTAR:(67,09),align[2],sanctum -# Doors -DOOR:closed,(11,09) -DOOR:closed,(17,09) -DOOR:locked,(23,12) -DOOR:locked,(37,08) -DOOR:closed,(37,11) -DOOR:closed,(37,17) -DOOR:locked,(51,12) -DOOR:locked,(57,09) -DOOR:closed,(63,09) -# Non diggable and phazeable everywhere -NON_DIGGABLE:(00,00,74,19) -NON_PASSWALL:(00,00,74,19) -# Moloch's horde -# West round room -MONSTER:('@',"aligned priest"),(18,09),noalign,hostile -MONSTER:('@',"aligned priest"),(19,08),noalign,hostile -MONSTER:('@',"aligned priest"),(19,09),noalign,hostile -MONSTER:('@',"aligned priest"),(19,10),noalign,hostile -MONSTER:('A',"Angel"),(20,09),noalign,hostile -MONSTER:('A',"Angel"),(20,10),noalign,hostile -MONSTER:('&',"Pestilence"),$place[0],hostile -# South-central round room -MONSTER:('@',"aligned priest"),(36,12),noalign,hostile -MONSTER:('@',"aligned priest"),(37,12),noalign,hostile -MONSTER:('@',"aligned priest"),(38,12),noalign,hostile -MONSTER:('@',"aligned priest"),(36,13),noalign,hostile -MONSTER:('A',"Angel"),(38,13),noalign,hostile -MONSTER:('A',"Angel"),(37,13),noalign,hostile -MONSTER:('&',"Death"),$place[1],hostile -# East round room -MONSTER:('@',"aligned priest"),(56,09),noalign,hostile -MONSTER:('@',"aligned priest"),(55,08),noalign,hostile -MONSTER:('@',"aligned priest"),(55,09),noalign,hostile -MONSTER:('@',"aligned priest"),(55,10),noalign,hostile -MONSTER:('A',"Angel"),(54,09),noalign,hostile -MONSTER:('A',"Angel"),(54,10),noalign,hostile -MONSTER:('&',"Famine"),$place[2],hostile -# -# The aligned horde -# -# We do not know in advance the alignment of the -# player. The mpeaceful bit will need resetting -# when the level is created. The setting here is -# but a place holder. -# -# West court -MONSTER:('@',"aligned priest"),(12,07),chaos,hostile -MONSTER:('@',"aligned priest"),(13,07),chaos,peaceful -MONSTER:('@',"aligned priest"),(14,07),law,hostile -MONSTER:('@',"aligned priest"),(12,11),law,peaceful -MONSTER:('@',"aligned priest"),(13,11),neutral,hostile -MONSTER:('@',"aligned priest"),(14,11),neutral,peaceful -MONSTER:('A',"Angel"),(11,05),chaos,hostile -MONSTER:('A',"Angel"),(12,05),chaos,peaceful -MONSTER:('A',"Angel"),(13,05),law,hostile -MONSTER:('A',"Angel"),(11,13),law,peaceful -MONSTER:('A',"Angel"),(12,13),neutral,hostile -MONSTER:('A',"Angel"),(13,13),neutral,peaceful -# Central court -MONSTER:('@',"aligned priest"),(32,09),chaos,hostile -MONSTER:('@',"aligned priest"),(33,09),chaos,peaceful -MONSTER:('@',"aligned priest"),(34,09),law,hostile -MONSTER:('@',"aligned priest"),(40,09),law,peaceful -MONSTER:('@',"aligned priest"),(41,09),neutral,hostile -MONSTER:('@',"aligned priest"),(42,09),neutral,peaceful -MONSTER:('A',"Angel"),(31,08),chaos,hostile -MONSTER:('A',"Angel"),(32,08),chaos,peaceful -MONSTER:('A',"Angel"),(31,09),law,hostile -MONSTER:('A',"Angel"),(42,08),law,peaceful -MONSTER:('A',"Angel"),(43,08),neutral,hostile -MONSTER:('A',"Angel"),(43,09),neutral,peaceful -# East court -MONSTER:('@',"aligned priest"),(60,07),chaos,hostile -MONSTER:('@',"aligned priest"),(61,07),chaos,peaceful -MONSTER:('@',"aligned priest"),(62,07),law,hostile -MONSTER:('@',"aligned priest"),(60,11),law,peaceful -MONSTER:('@',"aligned priest"),(61,11),neutral,hostile -MONSTER:('@',"aligned priest"),(62,11),neutral,peaceful -MONSTER:('A',"Angel"),(61,05),chaos,hostile -MONSTER:('A',"Angel"),(62,05),chaos,peaceful -MONSTER:('A',"Angel"),(63,05),law,hostile -MONSTER:('A',"Angel"),(61,13),law,peaceful -MONSTER:('A',"Angel"),(62,13),neutral,hostile -MONSTER:('A',"Angel"),(63,13),neutral,peaceful -# -# Assorted nasties -MONSTER:'L',random,hostile -MONSTER:'L',random,hostile -MONSTER:'L',random,hostile -MONSTER:'V',random,hostile -MONSTER:'V',random,hostile -MONSTER:'V',random,hostile -MONSTER:'D',random,hostile -MONSTER:'D',random,hostile -MONSTER:'D',random,hostile diff --git a/dat/engrave.txt b/dat/engrave.txt index 05650ce41..1d199a3e7 100644 --- a/dat/engrave.txt +++ b/dat/engrave.txt @@ -1,4 +1,4 @@ -# NetHack 3.6 engrave.txt $NHDT-Date: 1524689579 2018/04/25 20:52:59 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.2 $ +# NetHack 5.0 engrave.txt $NHDT-Date: 1596498240 2020/08/03 23:44:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ # Copyright (c) 2015 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. # Random engravings on the floor @@ -23,7 +23,8 @@ You won't get it up the steps Lasciate ogni speranza o voi ch'entrate. # Prisoner Well Come -# So Long... +# God's Final Message to His Creation (from "So Long, and Thanks for All +# the Fish" by Douglas Adams): We apologize for the inconvenience. # Thriller See you next Wednesday diff --git a/dat/epitaph.txt b/dat/epitaph.txt index d35ba5441..1c1a85f6a 100644 --- a/dat/epitaph.txt +++ b/dat/epitaph.txt @@ -1,4 +1,4 @@ -# NetHack 3.6 epitaph.txt $NHDT-Date: 1524689580 2018/04/25 20:53:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.3 $ +# NetHack 5.0 epitaph.txt $NHDT-Date: 1596498241 2020/08/03 23:44:01 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ # Copyright (c) 2015 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. # Epitaphs for random headstones @@ -279,6 +279,8 @@ I died laughing I disbelieved in reincarnation in my last life, too. I hacked myself to death I have all the time in the world +#"reached Mine's End": not necessarily true; sounds like "reached my end" +I have reached Mine's End I knew I'd find a use for this gravestone! I know my mind. And it's around here someplace. I lied! I'll never be alright! diff --git a/dat/fakewiz1.lua b/dat/fakewiz1.lua new file mode 100644 index 000000000..abee299d7 --- /dev/null +++ b/dat/fakewiz1.lua @@ -0,0 +1,44 @@ +-- NetHack yendor fakewiz1.lua $NHDT-Date: 1652196025 2022/05/10 15:20:25 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel"); + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +local fakewiz1 = des.map({ halign = "center", valign = "center", map = [[ +......... +.}}}}}}}. +.}}---}}. +.}--.--}. +.}|...|}. +.}--.--}. +.}}---}}. +.}}}}}}}. +......... +]], contents = function(rm) + des.levregion({ region={01,00,79,20}, region_islev=1, exclude={0,0,8,8}, type="stair-up" }) + des.levregion({ region={01,00,79,20}, region_islev=1, exclude={0,0,8,8}, type="stair-down" }) + des.levregion({ region={01,00,79,20}, region_islev=1, exclude={0,0,8,8}, type="branch" }); + des.teleport_region({ region={01,00,79,20}, region_islev=1,exclude={2,2,6,6} }) + des.levregion({ region={4,4,4,4}, type="portal", name="wizard3" }) + des.mazewalk(08,05,"east") + des.region({ region={04,03,06,06},lit=0,type="ordinary",irregular=1,arrival_room=true }) + des.monster("L",04,04) + des.monster("vampire lord",03,04) + des.monster("kraken",06,06) + -- And to make things a little harder. + des.trap("board",04,03) + des.trap("board",04,05) + des.trap("board",03,04) + des.trap("board",05,04) +end +}); + +local protected = bounds2:negate() | fakewiz1; +hell_tweaks(protected); diff --git a/dat/fakewiz2.lua b/dat/fakewiz2.lua new file mode 100644 index 000000000..4b81ae338 --- /dev/null +++ b/dat/fakewiz2.lua @@ -0,0 +1,44 @@ +-- NetHack yendor fakewiz2.lua $NHDT-Date: 1652196026 2022/05/10 15:20:26 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel"); + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +local fakewiz2 = des.map({ halign = "center", valign = "center", map = [[ +......... +.}}}}}}}. +.}}---}}. +.}--.--}. +.}|...|}. +.}--.--}. +.}}---}}. +.}}}}}}}. +......... +]], contents = function(rm) + des.levregion({ region={01,00,79,20}, region_islev=1, exclude={0,0,8,8}, type="stair-up" }) + des.levregion({ region={01,00,79,20}, region_islev=1, exclude={0,0,8,8}, type="stair-down" }) + des.levregion({ region={01,00,79,20}, region_islev=1, exclude={0,0,8,8}, type="branch" }); + des.teleport_region({ region={01,00,79,20}, region_islev=1,exclude={2,2,6,6} }) + des.mazewalk(08,05,"east") + des.monster("L",04,04) + des.monster("vampire lord",03,04) + des.monster("kraken",06,06) + -- And to make things a little harder. + des.trap("board",04,03) + des.trap("board",04,05) + des.trap("board",03,04) + des.trap("board",05,04) + -- treasures + des.object("\"",04,04) +end +}); + +local protected = bounds2:negate() | fakewiz2; +hell_tweaks(protected); diff --git a/dat/fire.lua b/dat/fire.lua new file mode 100644 index 000000000..1cd3db7a2 --- /dev/null +++ b/dat/fire.lua @@ -0,0 +1,158 @@ +-- NetHack endgame fire.lua $NHDT-Date: 1700398454 2023/11/19 12:54:14 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, +-- and Timo Hakulinen +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "shortsighted", "hot", "fumaroles") +-- The player lands, upon arrival, in the +-- lower-right. The location of the +-- portal to the next level is randomly chosen. +-- This map has no visible outer boundary, and +-- is mostly open area, with lava lakes and bunches of fire traps. +-- It fills the entire mappable area. +des.map([[ +LL.............LL..............L...LL.........LL.................LL...........L +LL....LLLLLLLL............L...L.............LL....LLL.......................LL. +L....LL...................L......................LLLL................LL........ +.....L.............LLLL...LL....LL...............LLLLL.............LLL......... +.L.LLLL..............LL....L.....LLL..............LLLL..............LLLL......L +LL..........LLLL...LLLL...LLL....LLL......L........LLLL....LL........LLL......L +LL........LLLLLLL...LL.....L......L......LL.........LL......LL........LL...L... +L.........LL..LLL..LL......LL......LLLL..L.........LL......LLL............LL... +......L..LL....LLLLL.................LLLLLLL.......L......LL............LLLLLL. +......L..L.....LL.LLLL.......L............L........LLLLL.LL......LL.........LL. +......LL........L...LL......LL.............LLL.....L...LLL.......LLL.........L. +.L.....LLLLLL........L.......LLL.............L....LL...L.LLL......LLLLLLL...... +LL..........LLLL............LL.L.............L....L...LL.........LLL..LLL...... +.L...........................LLLLL...........LL...L...L........LLLL..LLLLLL...L +.L.....LLLL.............LL....LL.......LLL...LL.......L..LLL....LLLLLLL.......L +.........LLL.........LLLLLLLLLLL......LLLLL...L...........LL...LL...LL......... +...........LL.......LL.........LL.......LLL....L..LLL....LL.........LL......... +............LLLLLLLLL...........LL....LLL.......LLLLL.....LL........LL......... +.LL...............L.............LLLLLL............LL...LLLL.........LL.......L. +LL.....L..........................LL....................LL..................LLL +L.....LLL......................LLLLL.........L.........LLLLLLLL..............LL +]]); +des.teleport_region({ region = {71,16,71,16} }) +des.levregion({ region = {0,0,78,19}, exclude = {67,13,78,19}, type="portal", name="water" }) + +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +des.trap("fire") +-- An assortment of fire-appropriate nasties +des.monster("red dragon") +des.monster("balrog") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("fire vortex") +des.monster("hell hound") +-- +des.monster("fire giant") +des.monster("barbed devil") +des.monster("hell hound") +des.monster("stone golem") +des.monster("pit fiend") +des.monster({ id = "fire elemental", peaceful = 0 }) +-- +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("hell hound") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("scorpion") +des.monster("fire giant") +-- +des.monster("hell hound") +des.monster("dust vortex") +des.monster("fire vortex") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("hell hound") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("stone golem") +des.monster("pit viper") +des.monster("pit viper") +des.monster("fire vortex") +-- +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("fire giant") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("fire vortex") +des.monster("fire vortex") +des.monster("pit fiend") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("pit viper") +-- +des.monster({ id = "salamander", peaceful = 0 }) +des.monster({ id = "salamander", peaceful = 0 }) +des.monster("minotaur") +des.monster({ id = "salamander", peaceful = 0 }) +des.monster("steam vortex") +des.monster({ id = "salamander", peaceful = 0 }) +des.monster({ id = "salamander", peaceful = 0 }) +-- +des.monster("fire giant") +des.monster("barbed devil") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("fire vortex") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster("hell hound") +des.monster("fire giant") +des.monster("pit fiend") +des.monster({ id = "fire elemental", peaceful = 0 }) +des.monster({ id = "fire elemental", peaceful = 0 }) +-- +des.monster("barbed devil") +des.monster({ id = "salamander", peaceful = 0 }) +des.monster("steam vortex") +des.monster({ id = "salamander", peaceful = 0 }) +des.monster({ id = "salamander", peaceful = 0 }) + +des.object("boulder") +des.object("boulder") +des.object("boulder") +des.object("boulder") +des.object("boulder") + diff --git a/dat/gehennom.des b/dat/gehennom.des deleted file mode 100644 index 65fab4e28..000000000 --- a/dat/gehennom.des +++ /dev/null @@ -1,713 +0,0 @@ -# NetHack 3.6 gehennom.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1992 by M. Stephenson and Izchak Miller -# NetHack may be freely redistributed. See license for details. -# - -MAZE: "valley", ' ' -FLAGS: noteleport,hardfloor,nommap -GEOMETRY:center,center -MAP ----------------------------------------------------------------------------- -|...S.|..|.....| |.....-| |................| |...............| |...| -|---|.|.--.---.| |......--- ----..........-----.-----....---........---.-.| -| |.|.|..| |.| --........| |.............| |.......---| |-...........--| -| |...S..| |.| |.......-----.......------| |--------..---......------- | -|----------- |.| |-......| |....|...-- |...-----................---- | -|.....S....---.| |.......| |....|...| |..............----------- | -|.....|.|......| |.....--- |......--- |....---.......| | -|.....|.|------| |....-- --....-- |-------- ----....--------------- | -|.....|--......---BBB-| |...-- |.......| |..................| | -|..........||........-| --...| |.......| |...||.............| | -|.....|...-||-........------....| |.......---- |...||.............-- | -|.....|--......---...........--------..........| |.......---------...-- | -|.....| |------| |--.......--| |..B......----- -----....| |.| |....--- | -|.....| |......--| ------..| |----..B......| |.--------.-- |-.....---| -|------ |........| |.|....| |.....----BBBB---------...........---.........| -| |........| |...|..| |.....| |-.............--------...........---| -| --.....-----------.| |....-----.....---------- |.........---- | -| |..|..B...........| |.|..........|.| |.|........| | ----------------------------------------------------------------------------- -ENDMAP - -# Make the path somewhat unpredictable -# If you get "lucky", you may have to go through all three graveyards. -IF [50%] { - TERRAIN:line (50,8),(53,8), '-' - TERRAIN:line (40,8),(43,8), 'B' -} -IF [50%] { - TERRAIN:(27,12),'|' - TERRAIN:line (27,3),(29,3), 'B' - TERRAIN:(28,2), '-' -} -IF [50%] { - TERRAIN:line (16,10),(16,11),'|' - TERRAIN:line (9,13),(14,13), 'B' -} - - -# Dungeon Description -# The shrine to Moloch. -REGION:(01,06,05,14),lit,"temple" -# The Morgues -REGION:(19,01,24,08),unlit,"morgue",filled,irregular -REGION:(09,14,16,18),unlit,"morgue",filled,irregular -REGION:(37,09,43,14),unlit,"morgue",filled,irregular -# Stairs -STAIR:(01,01),down -# Branch location -BRANCH:(66,17,66,17),(0,0,0,0) -TELEPORT_REGION:(58,09,72,18),(0,0,0,0),down - -# Secret Doors -DOOR:locked,(04,01) -DOOR:locked,(08,04) -DOOR:locked,(06,06) - -# The altar of Moloch. -ALTAR:(03,10),noalign,shrine - -# Non diggable walls - everywhere! -NON_DIGGABLE:(00,00,75,19) - -# Objects -# **LOTS** of dead bodies (all human). -# note: no priest(esse)s or monks - maybe Moloch has a *special* -# fate reserved for members of *those* classes. -# -OBJECT:('%',"corpse"),random,montype:"archeologist" -OBJECT:('%',"corpse"),random,montype:"archeologist" -OBJECT:('%',"corpse"),random,montype:"barbarian" -OBJECT:('%',"corpse"),random,montype:"barbarian" -OBJECT:('%',"corpse"),random,montype:"caveman" -OBJECT:('%',"corpse"),random,montype:"cavewoman" -OBJECT:('%',"corpse"),random,montype:"healer" -OBJECT:('%',"corpse"),random,montype:"healer" -OBJECT:('%',"corpse"),random,montype:"knight" -OBJECT:('%',"corpse"),random,montype:"knight" -OBJECT:('%',"corpse"),random,montype:"ranger" -OBJECT:('%',"corpse"),random,montype:"ranger" -OBJECT:('%',"corpse"),random,montype:"rogue" -OBJECT:('%',"corpse"),random,montype:"rogue" -OBJECT:('%',"corpse"),random,montype:"samurai" -OBJECT:('%',"corpse"),random,montype:"samurai" -OBJECT:('%',"corpse"),random,montype:"tourist" -OBJECT:('%',"corpse"),random,montype:"tourist" -OBJECT:('%',"corpse"),random,montype:"valkyrie" -OBJECT:('%',"corpse"),random,montype:"valkyrie" -OBJECT:('%',"corpse"),random,montype:"wizard" -OBJECT:('%',"corpse"),random,montype:"wizard" -# -# Some random weapons and armor. -# -OBJECT:'[',random -OBJECT:'[',random -OBJECT:'[',random -OBJECT:'[',random -OBJECT:')',random -OBJECT:')',random -OBJECT:')',random -OBJECT:')',random -# -# Some random loot. -# -OBJECT:('*',"ruby"),random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'/',random -OBJECT:'/',random -OBJECT:'=',random -OBJECT:'=',random -OBJECT:'+',random -OBJECT:'+',random -OBJECT:'(',random -OBJECT:'(',random -OBJECT:'(',random - -# (Not so) Random traps. -TRAP:"spiked pit", (05,02) -TRAP:"spiked pit", (14,05) -TRAP:"sleep gas", (03,01) -TRAP:"board", (21,12) -TRAP:"board", random -TRAP:"dart", (60,01) -TRAP:"dart", (26,17) -TRAP:"anti magic", random -TRAP:"anti magic", random -TRAP:"magic", random -TRAP:"magic", random - -# Random monsters. -# The ghosts. -MONSTER:(' ',"ghost"),random -MONSTER:(' ',"ghost"),random -MONSTER:(' ',"ghost"),random -MONSTER:(' ',"ghost"),random -MONSTER:(' ',"ghost"),random -MONSTER:(' ',"ghost"),random -# Add a few bats for atmosphere. -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -MONSTER:('B',"vampire bat"),random -# And a lich for good measure. -MONSTER:'L',random -# Some undead nasties for good measure -MONSTER:'V',random -MONSTER:'V',random -MONSTER:'V',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'M',random -MONSTER:'M',random -MONSTER:'M',random -MONSTER:'M',random -# -# The Juiblex level -# -MAZE:"juiblex",' ' -FLAGS:noteleport,shortsighted -INIT_MAP:mines,'.','}',true,true,unlit,false -# guarantee at least one open spot to ensure successful stair placement -GEOMETRY:left,bottom -MAP -xxxxxxxx -xx...xxx -xxx...xx -xxxx.xxx -xxxxxxxx -ENDMAP -OBJECT:('`',"boulder"),random -GEOMETRY:right,top -MAP -xxxxxxxx -xxxx.xxx -xxx...xx -xx...xxx -xxxxxxxx -ENDMAP -OBJECT:('`',"boulder"),random -# lair -GEOMETRY:center,center -MAP -xx}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}xx -x}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}x -}}}...}}..}}.}.}}.}}.}}}...}}}.}}}..}}}..}}}}...}}} -x}}}.}}.}}}.}}.}}.}}...}}.}}.....}}.....}....}.}}}x -xx}}}..}}}.}}.}}.}}..}}.....}}.}}}.}}.}}}}}}}}}}}xx -x}}}..}}}}}.}}.}}.}}...}}}}}.....}}.}}}}}}.....}}}x -}}}..}}...}}..}}.}}}.}}}...}}}.}}}.}.}}}}..P.P..}}} -}}.}}}}...}}}}}.}...}}}..P..}}}.}.}}}.}}}}.....}}}} -}.}}}}.}}.}..}.}}}}}}}..P.P..}}}.}}}.}}..}}...}}}}x -x}}}}.}}}}....}}}}}.}}}..P..}}}.}}}}.}}..}}...}}}.} -}}}}..}}.}}..}}}}...}}}}...}}}.}}}}}.}}}}.}}}}}}.}} -}}}...}}...}}}..}}}}}}}}}}}}.....}}}}.}}...}..}.}}} -x}}}..}}.}}}}....}}..}}}..}}.....}}}}.}}}.}....}}}x -xx}}}.}}}}..}}..}}..}}..}}..}}.}}}..}.}..}}}..}}}xx -x}}}.}}}}....}}}}..}}....}}}}}}}...}}}....}}}}.}}}x -}}}...}}}....}}}..}}}....}}}..}}...}}}....}}}...}}} -x}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}x -xx}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}xx -ENDMAP -# Random registers -$monster = monster: { 'j','b','P','F' } -SHUFFLE: $monster - -$place = { (04,02),(46,02),(04,15),(46,15) } -SHUFFLE: $place - -# Dungeon description -REGION:(00,00,50,17),unlit,"swamp" -MAZEWALK:(00,09),west -MAZEWALK:(50,08),east -STAIR:levregion(01,00,11,20),(0,0,50,17),down -STAIR:levregion(69,00,79,20),(0,0,50,17),up -BRANCH:levregion(01,00,11,20),(0,0,50,17) -TELEPORT_REGION:levregion(01,00,11,20),(0,0,50,17),up -TELEPORT_REGION:levregion(69,00,79,20),(0,0,50,17),down -FOUNTAIN:$place[0] -MONSTER:('m',"giant mimic"),$place[1],m_feature "fountain" -MONSTER:('m',"giant mimic"),$place[2],m_feature "fountain" -MONSTER:('m',"giant mimic"),$place[3],m_feature "fountain" -# The demon of the swamp -MONSTER:('&',"Juiblex"),(25,08) -# And a couple demons -MONSTER:('i',"lemure"),(43,08) -MONSTER:('i',"lemure"),(44,08) -MONSTER:('i',"lemure"),(45,08) -# Some liquids and gems -OBJECT:'*',(43,06) -OBJECT:'*',(45,06) -OBJECT:'!',(43,09) -OBJECT:'!',(44,09) -OBJECT:'!',(45,09) -# And lots of blobby monsters -MONSTER:$monster[0],(25,06) -MONSTER:$monster[1],(24,07) -MONSTER:$monster[2],(26,07) -MONSTER:$monster[3],(23,08) -MONSTER:$monster[3],(27,08) -MONSTER:$monster[2],(24,09) -MONSTER:$monster[1],(26,09) -MONSTER:$monster[0],(25,10) -MONSTER:'j',random -MONSTER:'j',random -MONSTER:'j',random -MONSTER:'j',random -MONSTER:'P',random -MONSTER:'P',random -MONSTER:'P',random -MONSTER:'P',random -MONSTER:'b',random -MONSTER:'b',random -MONSTER:'b',random -MONSTER:'F',random -MONSTER:'F',random -MONSTER:'F',random -MONSTER:'m',random -MONSTER:'m',random -MONSTER:(';',"jellyfish"),random -MONSTER:(';',"jellyfish"),random -# Some random objects -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:('`',"boulder"),random -# Some traps -TRAP:"sleep gas",random -TRAP:"sleep gas",random -TRAP:"anti magic",random -TRAP:"anti magic",random -TRAP:"magic",random -TRAP:"magic",random -# -# The Orcus Level -# -MAZE:"orcus",random -FLAGS: noteleport,shortsighted -GEOMETRY:right,center -# A ghost town -MAP -.|....|....|....|..............|....|........ -.|....|....|....|..............|....|........ -.|....|....|....|--...-+-------|............. -.|....|....|....|..............+............. -.|.........|....|..............|....|........ -.--+-...-+----+--....-------...--------.-+--- -.....................|.....|................. -.....................|.....|................. -.--+----....-+---....|.....|...----------+--- -.|....|....|....|....---+---...|......|...... -.|.........|....|..............|......|...... -.----...---------.....-----....+......|...... -.|........................|....|......|...... -.----------+-...--+--|....|....----------+--- -.|....|..............|....+....|............. -.|....+.......|......|....|....|............. -.|....|.......|......|....|....|............. -ENDMAP -MAZEWALK:(00,06),west -# Entire main area -REGION:(01,00,44,16),unlit,"ordinary" -STAIR:(33,15),down -STAIR:levregion(01,00,12,20),levregion(20,01,70,20),up -BRANCH:levregion(01,00,12,20),levregion(20,01,70,20) -TELEPORT_REGION:levregion(01,00,12,20),levregion(20,01,70,20) -# Wall "ruins" -OBJECT:('`',"boulder"),(19,02) -OBJECT:('`',"boulder"),(20,02) -OBJECT:('`',"boulder"),(21,02) -OBJECT:('`',"boulder"),(36,02) -OBJECT:('`',"boulder"),(36,03) -OBJECT:('`',"boulder"),(06,04) -OBJECT:('`',"boulder"),(05,05) -OBJECT:('`',"boulder"),(06,05) -OBJECT:('`',"boulder"),(07,05) -OBJECT:('`',"boulder"),(39,05) -OBJECT:('`',"boulder"),(08,08) -OBJECT:('`',"boulder"),(09,08) -OBJECT:('`',"boulder"),(10,08) -OBJECT:('`',"boulder"),(11,08) -OBJECT:('`',"boulder"),(06,10) -OBJECT:('`',"boulder"),(05,11) -OBJECT:('`',"boulder"),(06,11) -OBJECT:('`',"boulder"),(07,11) -OBJECT:('`',"boulder"),(21,11) -OBJECT:('`',"boulder"),(21,12) -OBJECT:('`',"boulder"),(13,13) -OBJECT:('`',"boulder"),(14,13) -OBJECT:('`',"boulder"),(15,13) -OBJECT:('`',"boulder"),(14,14) -# Doors -DOOR:closed,(23,02) -DOOR:open,(31,03) -DOOR:nodoor,(03,05) -DOOR:closed,(09,05) -DOOR:closed,(14,05) -DOOR:closed,(41,05) -DOOR:open,(03,08) -DOOR:nodoor,(13,08) -DOOR:open,(41,08) -DOOR:closed,(24,09) -DOOR:closed,(31,11) -DOOR:open,(11,13) -DOOR:closed,(18,13) -DOOR:closed,(41,13) -DOOR:open,(26,14) -DOOR:closed,(06,15) -# Special rooms -ALTAR:(24,07),noalign,sanctum -REGION:(22,12,25,16),unlit,"morgue" -REGION:(32,09,37,12),lit,"shop" -REGION:(12,00,15,04),lit,"shop" -# Some traps. -TRAP:"spiked pit", random -TRAP:"sleep gas", random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"fire", random -TRAP:"magic", random -TRAP:"magic", random -# Some random objects -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# The resident nasty -MONSTER:('&',"Orcus"),(33,15) -# And its preferred companions -MONSTER:('Z',"human zombie"),(32,15) -MONSTER:(' ',"shade"),(32,14) -MONSTER:(' ',"shade"),(32,16) -MONSTER:('V',"vampire"),(35,16) -MONSTER:('V',"vampire"),(35,14) -MONSTER:('V',"vampire lord"),(36,14) -MONSTER:('V',"vampire lord"),(36,15) -# Randomly placed companions -MONSTER:('Z',"skeleton"),random -MONSTER:('Z',"skeleton"),random -MONSTER:('Z',"skeleton"),random -MONSTER:('Z',"skeleton"),random -MONSTER:('Z',"skeleton"),random -MONSTER:(' ',"shade"),random -MONSTER:(' ',"shade"),random -MONSTER:(' ',"shade"),random -MONSTER:(' ',"shade"),random -MONSTER:('Z',"giant zombie"),random -MONSTER:('Z',"giant zombie"),random -MONSTER:('Z',"giant zombie"),random -MONSTER:('Z',"ettin zombie"),random -MONSTER:('Z',"ettin zombie"),random -MONSTER:('Z',"ettin zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('Z',"human zombie"),random -MONSTER:('V',"vampire"),random -MONSTER:('V',"vampire"),random -MONSTER:('V',"vampire"),random -MONSTER:('V',"vampire lord"),random -MONSTER:('V',"vampire lord"),random -# A few more for the party -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -# -# The Asmodeus Level -# -MAZE:"asmodeus",random -FLAGS: noteleport -# First part -GEOMETRY:half-left,center -MAP ---------------------- -|.............|.....| -|.............S.....| -|---+------------...| -|.....|.........|-+-- -|..---|.........|.... -|..|..S.........|.... -|..|..|.........|.... -|..|..|.........|-+-- -|..|..-----------...| -|..S..........|.....| ---------------------- -ENDMAP -STAIR:levregion(01,00,6,20),levregion(6,1,70,16),up -BRANCH:levregion(01,00,6,20),levregion(6,1,70,16) -TELEPORT_REGION:levregion(01,00,6,20),levregion(6,1,70,16) - -# Doors -DOOR:closed,(04,03) -DOOR:locked,(18,04) -DOOR:closed,(18,08) -# -STAIR:(13,07),down -# Non diggable walls -NON_DIGGABLE:(00,00,20,11) -# Entire main area -REGION:(01,01,20,10),unlit,"ordinary" -# The fellow in residence -MONSTER:('&',"Asmodeus"),(12,07) -# Some random weapons and armor. -OBJECT:'[',random -OBJECT:'[',random -OBJECT:')',random -OBJECT:')',random -OBJECT:'*',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -# Some traps. -TRAP:"spiked pit", (05,02) -TRAP:"fire", (08,06) -TRAP:"sleep gas", random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random -TRAP:"magic", random -# Random monsters. -MONSTER:(' ',"ghost"),(11,07) -MONSTER:('&',"horned devil"),(10,05) -MONSTER:'L',random -# Some Vampires for good measure -MONSTER:'V',random -MONSTER:'V',random -MONSTER:'V',random -# Second part -GEOMETRY:half-right,center -MAP ---------------------------------- -................................| -................................+ -................................| ---------------------------------- -ENDMAP -MAZEWALK:(32,02),east -# Non diggable walls -NON_DIGGABLE:(00,00,32,04) -DOOR:closed,(32,02) -MONSTER:'&',random -MONSTER:'&',random -MONSTER:'&',random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random - -# -# The Baalzebub level -# -MAZE:"baalz",' ' -FLAGS: noteleport,corrmaze -GEOMETRY:right,center -# the two pools are fakes used to mark spots which need special wall fixups -# the two iron bars are eyes and spots to their left will be made diggable -MAP -------------------------------------------------- -| ---- ---- -| ---- | ----------- | -| ------ | ---------|.........|--P -| F....| -------|...........-------------- ----....|--|..................S............|---- -+...--....S..----------------|............S...| ----....|--|..................|............|---- -| F....| -------|...........-----S-------- -| ------ | ---------|.........|--P -| ---- | ----------- | -| ---- ---- -------------------------------------------------- -ENDMAP -STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up -BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) -TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) -# this actually leaves the farthest right column diggable -NON_DIGGABLE:(00,00,47,12) -MAZEWALK:(00,06),west -STAIR:(44,06),down -DOOR:locked,(00,06) -IF [50%] { - TERRAIN:(34,08),'-' - TERRAIN:(34,04),'S' - TERRAIN:(29,05),'|' - TERRAIN:(29,07),'S' -} -# The fellow in residence -MONSTER:('&',"Baalzebub"),(35,06) -# Some random weapons and armor. -OBJECT:'[',random -OBJECT:'[',random -OBJECT:')',random -OBJECT:')',random -OBJECT:'*',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -# Some traps. -TRAP:"spiked pit", random -TRAP:"fire", random -TRAP:"sleep gas", random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random -TRAP:"magic", random -# Random monsters. -MONSTER:(' ',"ghost"),(37,07) -MONSTER:('&',"horned devil"),(32,05) -MONSTER:('&',"barbed devil"),(38,07) -MONSTER:'L',random -# Some Vampires for good measure -MONSTER:'V',random -MONSTER:'V',random -MONSTER:'V',random -# -# The Sanctum Level -# -MAZE:"sanctum", ' ' -FLAGS: noteleport,hardfloor,nommap -# This is outside the main map, below, so we must do it before adding -# that map and anchoring coordinates to it. This extends the invisible -# barrier up to the top row, which falls outside the drawn map. -NON_PASSWALL:(39,00,41,00) -GEOMETRY:center,center -MAP ----------------------------------------------------------------------------- -| -------------- | -| |............| ------- | -| -------............----- |.....| | -| |......................| --.....| --------- | -| ----......................---------|......---- |.......| | -| |........---------..........|......+.........| ------+---..| | -| ---........|.......|..........--S----|.........| |........|..| | -| |..........|.......|.............| |.........-------..---------- | -| |..........|.......|..........---- |..........|....|..|......| | -| |..........|.......|..........| --.......----+---S---S--..| | -| |..........---------..........| |.......|.............|..| | -| ---...........................| -----+-------S---------S--- | -| |...........................| |...| |......| |....|-- | -| ----.....................---- |...---....--- ---......| | -| |.....................| |..........| |.....---- | -| -------...........----- --...------- |.....| | -| |...........| |...| |.....| | -| ------------- ----- ------- | ----------------------------------------------------------------------------- -ENDMAP -REGION:(15,07,21,10),lit,"temple" -ALTAR:(18,08),noalign,sanctum -REGION:(41,06,48,11),unlit,"morgue",filled,irregular -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Invisible barrier separating the left & right halves of the level -NON_PASSWALL:(37,00,39,19) -# Doors -DOOR:closed,(40,06) -DOOR:locked,(62,06) -DOOR:closed,(46,12) -DOOR:closed,(53,10) -# Surround the temple with fire -TRAP:"fire",(13,05) -TRAP:"fire",(14,05) -TRAP:"fire",(15,05) -TRAP:"fire",(16,05) -TRAP:"fire",(17,05) -TRAP:"fire",(18,05) -TRAP:"fire",(19,05) -TRAP:"fire",(20,05) -TRAP:"fire",(21,05) -TRAP:"fire",(22,05) -TRAP:"fire",(23,05) -TRAP:"fire",(13,12) -TRAP:"fire",(14,12) -TRAP:"fire",(15,12) -TRAP:"fire",(16,12) -TRAP:"fire",(17,12) -TRAP:"fire",(18,12) -TRAP:"fire",(19,12) -TRAP:"fire",(20,12) -TRAP:"fire",(21,12) -TRAP:"fire",(22,12) -TRAP:"fire",(23,12) -TRAP:"fire",(13,06) -TRAP:"fire",(13,07) -TRAP:"fire",(13,08) -TRAP:"fire",(13,09) -TRAP:"fire",(13,10) -TRAP:"fire",(13,11) -TRAP:"fire",(23,06) -TRAP:"fire",(23,07) -TRAP:"fire",(23,08) -TRAP:"fire",(23,09) -TRAP:"fire",(23,10) -TRAP:"fire",(23,11) -# Some traps. -TRAP:"spiked pit", random -TRAP:"fire", random -TRAP:"sleep gas", random -TRAP:"anti magic", random -TRAP:"fire", random -TRAP:"magic", random -# Some random objects -OBJECT:'[',random -OBJECT:'[',random -OBJECT:'[',random -OBJECT:'[',random -OBJECT:')',random -OBJECT:')',random -OBJECT:'*',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -# Some monsters. -MONSTER:('&',"horned devil"),(14,12),hostile -MONSTER:('&',"barbed devil"),(18,08),hostile -MONSTER:('&',"erinys"),(10,04),hostile -MONSTER:('&',"marilith"),(07,09),hostile -MONSTER:('&',"nalfeshnee"),(27,08),hostile -# Moloch's horde -MONSTER:('@',"aligned priest"),(20,03),noalign,hostile -MONSTER:('@',"aligned priest"),(15,04),noalign,hostile -MONSTER:('@',"aligned priest"),(11,05),noalign,hostile -MONSTER:('@',"aligned priest"),(11,07),noalign,hostile -MONSTER:('@',"aligned priest"),(11,09),noalign,hostile -MONSTER:('@',"aligned priest"),(11,12),noalign,hostile -MONSTER:('@',"aligned priest"),(15,13),noalign,hostile -MONSTER:('@',"aligned priest"),(17,13),noalign,hostile -MONSTER:('@',"aligned priest"),(21,13),noalign,hostile -# A few nasties -MONSTER:'L',random -MONSTER:'L',random -MONSTER:'V',random -MONSTER:'V',random -MONSTER:'V',random -STAIR:(63,15),up -# Teleporting to this level is allowed after the invocation creates its -# entrance. Force arrival in that case to be on rightmost third of level. -TELEPORT_REGION:levregion(54,1,79,18),(0,0,0,0),down diff --git a/dat/hellfill.lua b/dat/hellfill.lua new file mode 100644 index 000000000..9808837fc --- /dev/null +++ b/dat/hellfill.lua @@ -0,0 +1,443 @@ +-- NetHack 5.0 hellfill.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.25 $ +-- Copyright (c) 2022 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- +-- + +-- The "fill" level for gehennom. +-- +-- This level is used to fill out any levels not occupied by +-- specific levels. +-- + +function hellobjects() + local objclass = { "(", "/", "=", "+", ")", "[", "?", "*", "%" }; + shuffle(objclass); + + des.object(objclass[1]); + des.object(objclass[1]); + des.object(objclass[2]); + des.object(objclass[3]); + des.object(objclass[4]); + des.object(objclass[5]); + des.object() + des.object() +end + +-- + +function hellmonsters() + local monclass = { "V", "D", " ", "&", "Z" }; + shuffle(monclass); + + des.monster({ class = monclass[1], peaceful = 0 }); + des.monster({ class = monclass[1], peaceful = 0 }); + des.monster({ class = monclass[2], peaceful = 0 }); + des.monster({ class = monclass[2], peaceful = 0 }); + des.monster({ class = monclass[3], peaceful = 0 }); + des.monster({ class = monclass[4], peaceful = 0 }); + des.monster({ peaceful = 0 }); + des.monster({ class = "H", peaceful = 0 }); +end + +-- + +function helltraps() + for i = 1, 12 do + des.trap() + end +end + +-- + +function populatemaze() + for i = 1, math.random(8) + 11 do + if (percent(50)) then + des.object("*"); + else + des.object(); + end + end + + for i = 1, math.random(10) + 2 do + des.object("`"); + end + + for i = 1, math.random(3) do + des.monster({ id = "minotaur", peaceful = 0 }); + end + + for i = 1, math.random(5) + 7 do + des.monster({ peaceful = 0 }); + end + + for i = 1, math.random(6) + 7 do + des.gold(); + end + + for i = 1, math.random(6) + 7 do + des.trap(); + end +end + +-- + +function rnd_halign() + local aligns = { "half-left", "center", "half-right" }; + return aligns[math.random(1, #aligns)]; +end + +function rnd_valign() + local aligns = { "top", "center", "bottom" }; + return aligns[math.random(1, #aligns)]; +end + +-- the prefab maps must have contents-function, or populatemaze() +-- puts the stuff only inside the prefab map. +-- contains either a function, or an object with "repeatable" and "contents". +-- function alone implies not repeatable. +local hell_prefabs = { + { + repeatable = true, + contents = function () + des.map({ halign = rnd_halign(), valign = "center", map = [[ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +......]], contents = function() end }); + end + }, + { + repeatable = true, + contents = function () + des.map({ halign = rnd_halign(), valign = "center", map = [[ +xxxxxx.....xxxxxx +xxxx.........xxxx +xx.............xx +xx.............xx +x...............x +x...............x +................. +................. +................. +................. +................. +x...............x +x...............x +xx.............xx +xx.............xx +xxxx.........xxxx +xxxxxx.....xxxxxx +]], contents = function() end }); + end + }, + function (coldhell) + des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ +xxxxxx.xxxxxx +xLLLLLLLLLLLx +xL---------Lx +xL|.......|Lx +xL|.......|Lx +.L|.......|L. +xL|.......|Lx +xL|.......|Lx +xL---------Lx +xLLLLLLLLLLLx +xxxxxx.xxxxxx +]], contents = function() + des.non_diggable(selection.area(2,2, 10,8)); + des.region(selection.area(4,4, 8,6), "lit"); + des.exclusion({ type = "teleport", region = { 2,2, 10,8 } }); + if (coldhell) then + des.replace_terrain({ region = {1,1, 11,9}, fromterrain="L", toterrain="P" }); + end + local dblocs = { + { x = 1, y = 5, dir="east", state="closed" }, + { x = 11, y = 5, dir="west", state="closed" }, + { x = 6, y = 1, dir="south", state="closed" }, + { x = 6, y = 9, dir="north", state="closed" } + } + shuffle(dblocs); + for i = 1, math.random(1, #dblocs) do + des.drawbridge(dblocs[i]); + end + local mons = { "H", "T", "@" }; + shuffle(mons); + for i = 1, 3 + math.random(1, 5) do + des.monster(mons[1], 6, 5); + end + end }); + end, + { + repeatable = true, + contents = function () + des.map({ halign = "center", valign = "center", map = [[ +.............................................................. +.............................................................. +.............................................................. +.............................................................. +..............................................................]], contents = function() end }); + end + }, + { + repeatable = true, + contents = function () + des.map({ halign = rnd_halign(), valign = rnd_valign(), lit = true, map = [[ +x.....x +....... +....... +....... +....... +....... +x.....x]], contents = function() end }); + end + }, + function () + des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ +BBBBBBB +B.....B +B.....B +B.....B +B.....B +B.....B +BBBBBBB]], contents = function() + des.region({ region={2,2, 2,2}, type="temple", filled=1, irregular=1 }); + des.altar({ x=3, y=3, align="noalign", type=percent(75) and "altar" or "shrine" }); + end }); + end, + function () + des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ +.......... +.......... +.......... +...FFFF... +...F..F... +...F..F... +...FFFF... +.......... +.......... +..........]], contents = function() + des.exclusion({ type = "teleport", region = { 4,4, 5,5 } }); + local mons = { "Angel", "D", "H", "L" }; + des.monster(mons[math.random(1, #mons)], 4,4); + end }); + end, + + function () + des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ +......... +.}}}}}}}. +.}}---}}. +.}--.--}. +.}|...|}. +.}--.--}. +.}}---}}. +.}}}}}}}. +......... +]], contents = function(rm) + des.exclusion({ type = "teleport", region = { 3,3, 5,5 } }); + des.monster("L",04,04) + end }) + end, + function () + local mapstr = percent(30) and [[ +..... +.LLL. +.LZL. +.LLL. +.....]] or [[ +..... +.PPP. +.PWP. +.PPP. +.....]]; + for dx = 1, 5 do + des.map({ x = dx*14 - 4, y = math.random(3, 15), + map = mapstr, contents = function() end }) + end + end, + { + repeatable = true, + contents = function () + local mapstr = [[ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +...]]; + for dx = 1, 3 do + des.map({ x = math.random(3, 75), y = 3, + map = mapstr, contents = function() end }) + end + end + }, +}; + +function rnd_hell_prefab(coldhell) + local dorepeat = true; + local nloops = 0; + repeat + nloops = nloops + 1; + local pf = math.random(1, #hell_prefabs); + local fab = hell_prefabs[pf]; + local fabtype = type(fab); + + if (fabtype == "function") then + fab(coldhell); + dorepeat = false; + elseif (fabtype == "table") then + fab.contents(coldhell); + dorepeat = not (fab.repeatable and math.random(0, nloops * 2) == 0); + end + until ((not dorepeat) or (nloops > 5)); +end + +hells = { + -- 1: "mines" style with lava + function () + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip"); + des.level_init({ style="mines", fg=".", smoothed=true ,joined=true, lit=0, walled=true }); + des.replace_terrain({ fromterrain = " ", toterrain = "L" }); + des.replace_terrain({ fromterrain = ".", toterrain = "L", chance = 5 }); + des.replace_terrain({ mapfragment = [[w]], toterrain = "L", chance = 20 }); + des.replace_terrain({ mapfragment = [[w]], toterrain = ".", chance = 15 }); + end, + + -- 2: mazes like original, with some hell_tweaks + function () + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip"); + des.level_init({ style = "mazegrid", bg = "-" }); + des.mazewalk({ coord = {01,10}, dir = "east", stocked = false}); + local tmpbounds = selection.match("-"); + local bnds = tmpbounds:bounds(); + local protected_area = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + hell_tweaks(protected_area:negate()); + if (percent(25)) then + rnd_hell_prefab(false); + end + end, + + -- 3: mazes, style 1: wall thick = 1, random wid corr + function () + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip"); + des.level_init({ style = "maze", wallthick = 1 }); + end, + + -- 4: mazes, style 2: replace wall with iron bars or lava + function () + local cwid = math.random(4); + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip"); + des.level_init({ style = "maze", wallthick = 1, corrwid = cwid }); + local outside_walls = selection.match(" "); + local wallterrain = { "F", "L" }; + shuffle(wallterrain); + des.replace_terrain({ mapfragment = "w", toterrain = wallterrain[1] }); + if (cwid == 1) then + if (wallterrain[1] == "F" and percent(80)) then + -- replace some horizontal iron bars walls with floor + des.replace_terrain({ mapfragment = ".\nF\n.", toterrain = ".", chance = 25 * math.random(4) }); + elseif (percent(25)) then + rnd_hell_prefab(false); + end + end + des.terrain(outside_walls, " "); -- return the outside back to solid wall + end, + + -- 5: mazes, thick walls, occasionally lava instead of walls + function () + local wwid = 1 + math.random(2); + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip"); + des.level_init({ style = "maze", wallthick = wwid, corrwid = math.random(2) }); + if (percent(50)) then + local outside_walls = selection.match(" "); + des.replace_terrain({ mapfragment = "w", toterrain = "L" }); + des.terrain(outside_walls, " "); -- return the outside back to solid wall + if (wwid == 3 and percent(40)) then + local sel = selection.match("LLL\nLLL\nLLL"); + des.terrain(sel:percentage(30 * math.random(4)), "Z"); + end + end + end, + + -- 6: cold maze, with ice and water + function () + local cwid = math.random(4); + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip", "cold"); + des.level_init({ style = "maze", wallthick = 1, corrwid = cwid }); + local outside_walls = selection.match(" "); + local icey = selection.negate():percentage(10):grow():filter_mapchar("."); + des.terrain(icey, "I"); + if (cwid > 1) then + -- turn some ice into wall of water + des.terrain(icey:percentage(1), "W"); + end + des.terrain(icey:percentage(5), "P"); + if (percent(25)) then + des.terrain(selection.match("w"), "W"); -- walls of water + end + if (cwid == 1 and percent(25)) then + rnd_hell_prefab(true); + end + des.terrain(outside_walls, " "); -- return the outside back to solid wall + end, + + -- 7: open cavern, "mines" with more space + function () + -- walls are either stone or lava + local wter = percent(50) and " " or "L"; + des.level_init({ style = "solidfill", fg = " ", lit = 0 }); + des.level_flags("mazelevel", "noflip"); + des.level_init({ style="mines", fg=".", bg = wter, smoothed=true ,joined=true, lit=0 }); + local sel = selection.match("."):grow(); + des.terrain({ selection = sel, typ = ".", lit = 0 }); + + local border = selection.rect(0,0, 78, 20); + des.terrain({ selection = border, typ = wter, lit = 0 }); + des.wallify(); + end, + +}; + +local hellno = math.random(1, #hells); +hells[hellno](); + +-- + +des.stair("up") +if (u.invocation_level) then + des.trap("vibrating square"); +else + des.stair("down") +end + +populatemaze(); diff --git a/dat/hh b/dat/hh index cd6386dff..847ca02b7 100644 --- a/dat/hh +++ b/dat/hh @@ -33,8 +33,9 @@ S save save the game (to be continued later) and exit O options set options / what-is tell what a map symbol represents \ known display list of what's been discovered -v version display version number -V history display game history +| perminv interact with persistent inventory window instead of hero+map +v chronicle display a list of important events +V version display version number ^A again redo the previous command ^R redraw redraw the screen ^P prevmsg repeat previous message (consecutive ^P's repeat earlier ones) @@ -45,7 +46,7 @@ Control characters are depicted as '^' followed by a letter. Depress Ctrl or Control like a shift key then type the letter. Control characters are case-insensitive; ^D is the same as ^d, Ctrl+d is same as Ctrl+Shift+d. There are a few non-letter control characters; nethack uses ^[ as a synonym -for Escape (or vice versa) but none of the others. +for Escape (or vice versa) and ^_ for #retravel but none of the others. Game commands: ^D kick kick (a door, or something else) @@ -99,6 +100,7 @@ $ gold count your gold + spells list the spells you know; also rearrange them if desired ` classkn display known items for one class of objects _ travel move via a shortest-path algorithm to a point on the map +^_ retravel resume travelling toward previously specified destination . rest wait a moment , pickup pick up all you can carry @ toggle "pickup" (auto pickup) option on and off @@ -122,6 +124,7 @@ M-C conduct view optional challenges M-d dip dip an object into something M-e enhance show weapon and spell skills, can improve them if eligible M-f force force a lock +M-g genocided list genocided and extinct monster types, if any M-i invoke invoke an object's special powers M-j jump jump to another location M-l loot loot a box on the floor @@ -138,6 +141,7 @@ M-s sit sit down M-t turn turn undead if role allows that M-T tip upend a container to dump out its contents M-u untrap untrap something +M-V vanquished list number and type of vanquished monsters M-v version print compile time options for this version M-w wipe wipe off your face M-X explore switch from regular play to non-scoring explore mode diff --git a/dat/history b/dat/history index 2d318f619..fba67b7c6 100644 --- a/dat/history +++ b/dat/history @@ -1,13 +1,18 @@ -NetHack History file for release 3.6 +NetHack History file for release 5.0 Behold, mortal, the origins of NetHack... -Jay Fenlason wrote the original Hack with help from Kenny Woodland, +Jay Fenlason wrote the original Hack, with help from Kenny Woodland, Mike Thome, and Jon Payne. -Andries Brouwer did a major re-write, transforming Hack into a very different -game, and published (at least) three versions (1.0.1, 1.0.2, and 1.0.3) for -UNIX(tm) machines to the Usenet. +Andries Brouwer did a major re-write while at Stichting Mathematisch Centrum +(now Centrum Wiskunde & Informatica), transforming Hack into a very different +game. He published the Hack source code for use on UNIX(tm) systems by +posting that to Usenet newsgroup net.sources (later renamed comp.sources) +releasing version 1.0 in December of 1984, then versions 1.0.1, 1.0.2, and +finally 1.0.3 in July of 1985. Usenet newsgroup net.games.hack (later +renamed rec.games.hack, eventually replaced by rec.games.roguelike.nethack) +was created for discussing it. Don G. Kneller ported Hack 1.0.3 to Microsoft(tm) C and MS-DOS(tm), producing PC HACK 1.01e, added support for DEC Rainbow graphics in version 1.03g, and @@ -20,13 +25,14 @@ producing ST Hack 1.03. Mike Stephenson merged these various versions back together, incorporating many of the added features, and produced NetHack version 1.4 in 1987. He then coordinated a cast of thousands in enhancing and debugging NetHack 1.4 -and released NetHack versions 2.2 and 2.3. +and released NetHack versions 2.2 and 2.3. Like Hack, they were released by +posting their source code to Usenet where they remained available in various +archives accessible via ftp and uucp after expiring from the newsgroup. -Later, Mike coordinated a major rewrite of the game, heading a team which +Later, Mike coordinated a major re-write of the game, heading a team which included Ken Arromdee, Jean-Christophe Collet, Steve Creps, Eric Hendrickson, Izchak Miller, Eric S. Raymond, John Rupley, Mike Threepoint, and Janet Walz, -to produce NetHack 3.0c. The same group subsequently released ten patch- -level revisions and updates of 3.0. +to produce NetHack 3.0c. NetHack 3.0 was ported to the Atari by Eric R. Smith, to OS/2 by Timo Hakulinen, and to VMS by David Gentzel. The three of them and Kevin Darcy @@ -39,6 +45,13 @@ Johnny Lee ported NetHack 3.0 to the Macintosh. Along with various other Dungeoneers, they continued to enhance the PC, Macintosh, and Amiga ports through the later revisions of 3.0. +Version 3.0 went through ten relatively rapidly released "patch-level" +revisions. Versions at the time were known as 3.0 for the base release +and variously as "3.0a" through "3.0j", "3.0 patchlevel 1" through +"3.0 patchlevel 10", or "3.0pl1" through "3.0pl10" rather than 3.0.0 and +3.0.1 through 3.0.10; the three component numbering scheme began to be used +with 3.1.0. + Headed by Mike Stephenson and coordinated by Izchak Miller and Janet Walz, the NetHack Development Team which now included Ken Arromdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, Matt Day, Timo Hakulinen, Steve Linhart, @@ -46,7 +59,7 @@ Dean Luick, Pat Rankin, Eric Raymond, and Eric Smith undertook a radical revision of 3.0. They re-structured the game's design, and re-wrote major parts of the code. They added multiple dungeons, a new display, special individual character quests, a new endgame and many other new features, and -produced NetHack 3.1. +produced NetHack 3.1. Version 3.1.0 was released in January of 1993. Ken Lorber, Gregg Wonderly and Greg Olson, with help from Richard Addison, Mike Passaretti, and Olaf Seibert, developed NetHack 3.1 for the Amiga. @@ -56,31 +69,42 @@ Spackman, Steve VanDevender, and Paul Winner, ported NetHack 3.1 to the PC. Jon W{tte and Hao-yang Wang, with help from Ross Brown, Mike Engber, David Hairston, Michael Hamel, Jonathan Handler, Johnny Lee, Tim Lennan, Rob Menke, -and Andy Swanson developed NetHack 3.1 for the Macintosh, porting it for +and Andy Swanson, developed NetHack 3.1 for the Macintosh, porting it for MPW. Building on their development, Bart House added a Think C port. Timo Hakulinen ported NetHack 3.1 to OS/2. Eric Smith ported NetHack 3.1 -to the Atari. Pat Rankin, with help from Joshua Delahunty, is responsible +to the Atari. Pat Rankin, with help from Joshua Delahunty, was responsible for the VMS version of NetHack 3.1. Michael Allison ported NetHack 3.1 to Windows NT. Dean Luick, with help from David Cohrs, developed NetHack 3.1 for X11. -Warwick Allison wrote a tiled version of NetHack for the Atari; -he later contributed the tiles to the NetHack Development Team and tile -support was then added to other platforms. - -The 3.2 NetHack Development Team, comprised of Michael Allison, Ken Arromdee, +It drew the map as text rather than graphically but included nh10.bdf, an +optionally used custom X11 font which has tiny images in place of letters and +punctuation, a precursor of tiles. Those images don't extend to individual +monster and object types, just replacements for monster and object classes +(so one custom image for all "a" insects and another for all "[" armor and +so forth, not separate images for beetles and ants or for cloaks and boots). + +Warwick Allison wrote a graphically displayed version of NetHack for the +Atari where the tiny pictures were described as "icons" and were distinct +for specific types of monsters and objects rather than just their classes. +He contributed them to the NetHack Development Team which rechristened them +"tiles", original usage which has subsequently been picked up by various +other games. NetHack's tiles support was then implemented on other platforms +(initially MS-DOS but eventually Windows, Qt, and X11 too). + +The 3.2 NetHack Development Team, comprised of Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric Smith, Mike Stephenson, Janet Walz, -and Paul Winner, released version 3.2 in April of 1996. +and Paul Winner, released version 3.2.0 in April of 1996. Version 3.2 marked the tenth anniversary of the formation of the development team. In a testament to their dedication to the game, all thirteen members -of the original NetHack Development Team remained on the team at the start of -work on that release. During the interval between the release of 3.1.3 and -3.2, one of the founding members of the NetHack Development Team, -Dr. Izchak Miller, passed away. That release of the game was dedicated to -him by the development and porting teams. +of the original NetHack Development Team remained on the team at the start +of work on that release. During the interval between the release of 3.1.3 +and 3.2.0, one of the founding members of the NetHack Development Team, +Dr. Izchak Miller, was diagnosed with cancer and passed away. That release +of the game was dedicated to him by the development and porting teams. Version 3.2 proved to be more stable than previous versions. Many bugs were fixed, abuses eliminated, and game features tuned for better game @@ -91,19 +115,31 @@ added their own modifications to the game and made these "variants" publicly available: Tom Proudfoot and Yuval Oren created NetHack++, which was quickly renamed -NetHack--. Working independently, Stephen White wrote NetHack Plus. -Tom Proudfoot later merged NetHack Plus and his own NetHack-- to produce -SLASH. Larry Stewart-Zerba and Warwick Allison improved the spellcasting -system with the Wizard Patch. Warwick Allison also ported NetHack to use -the Qt interface. - -Warren Cheung combined SLASH with the Wizard Patch to produce Slash'em, and +NetHack-- when some people incorrectly assumed that it was a conversion +of the C source code to C++. Working independently, Stephen White wrote +NetHack Plus. Tom Proudfoot later merged NetHack Plus and his own NetHack-- +to produce SLASH. Larry Stewart-Zerba and Warwick Allison improved the +spell casting system with the Wizard Patch. Warwick Allison also ported +NetHack to use the Qt interface. + +Warren Cheung combined SLASH with the Wizard Patch to produce Slash'EM, and with the help of Kevin Hugo, added more features. Kevin later joined the -NetHack Development Team and incorporated the best of these ideas in +NetHack Development Team and incorporated the best of these ideas into NetHack 3.3. The final update to 3.2 was the bug fix release 3.2.3, which was released simultaneously with 3.3.0 in December 1999 just in time for the Year 2000. +Because of the newer version, 3.2.3 was released as a source code patch only, +without any ready-to-play distribution for systems that usually had such. + +(To anyone considering resurrecting an old version: all versions before +3.2.3 had a Y2K bug. The high scores file and the log file contained dates +which were formatted using a two-digit year, and 1999's year 99 was followed +by 2000's year 100. That got written out successfully but it unintentionally +introduced an extra column in the file layout which prevented score entries +from being read back in correctly, interfering with insertion of new high +scores and with retrieval of old character names to use for random ghost and +statue names in the current game.) The 3.3 NetHack Development Team, consisting of Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, Timo Hakulinen, @@ -122,7 +158,7 @@ publicly available web-site listing all the bugs that had been discovered. Despite that constantly growing bug list, 3.3 proved stable enough to last for more than a year and a half. -The 3.4 NetHack Development Team initially consisted of Michael Allison, +The 3.4 NetHack Development Team initially consisted of Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Kevin Hugo, Ken Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and Paul Winner, with Warwick Allison joining just before the release of NetHack 3.4.0 in March 2002. @@ -143,33 +179,36 @@ maintained and enhanced 3.4 for the Microsoft Windows platform. Alex Kompel contributed a new graphical interface for the Windows port. Alex Kompel also contributed a Windows CE port for 3.4.1. -Ron Van Iwaarden maintained 3.4 for OS/2. +Ron Van Iwaarden was the sole maintainer of NetHack for OS/2 the past several +releases. Unfortunately Ron's last OS/2 machine stopped working in early +2006. A great many thanks to Ron for keeping NetHack alive on OS/2 all these +years. Janne Salmijarvi and Teemu Suikki maintained and enhanced the Amiga port of 3.4 after Janne Salmijarvi resurrected it for 3.3.1. -Christian `Marvin' Bressler maintained 3.4 for the Atari after he +Christian "Marvin" Bressler maintained 3.4 for the Atari after he resurrected it for 3.3.1. The release of NetHack 3.4.3 in December 2003 marked the beginning of a long release hiatus. 3.4.3 proved to be a remarkably stable version that provided continued enjoyment by the community for more than a decade. The -NetHack Development Team slowly and quietly continued to work on the game behind the scenes -during the tenure of 3.4.3. It was during that same period that several -new variants emerged within the NetHack community. Notably sporkhack by -Derek S. Ray, unnethack by Patric Mueller, nitrohack and its successors -originally by Daniel Thaler and then by Alex Smith, and +NetHack Development Team slowly and quietly continued to work on the game +behind the scenes during the tenure of 3.4.3. It was during that same +period that several new variants emerged within the NetHack community. +Notably sporkhack by Derek S. Ray, unnethack by Patric Mueller, nitrohack +and its successors originally by Daniel Thaler and then by Alex Smith, and Dynahack by Tung Nguyen. Some of those variants continue to be developed, maintained, and enjoyed by the community to this day. In September 2014, an interim snapshot of the code under development was released publicly by other parties. Since that code was a work-in-progress -and had not gone through a period of debugging, it was decided that the -version numbers present on that code snapshot would be retired and never -used in an official NetHack release. An announcement was posted on the -NetHack Development Team's official nethack.org website to that effect, -stating that there would never be a 3.4.4, 3.5, or 3.5.0 official release -version. +and had not gone through the process of debugging it as a suitable release, +it was decided that the version numbers present on that code snapshot would +be retired and never used in an official NetHack release. An announcement +was posted on the NetHack Development Team's official nethack.org website +to that effect, stating that there would never be a 3.4.4, 3.5, or 3.5.0 +official release version. In January 2015, preparation began for the release of NetHack 3.6. @@ -177,7 +216,7 @@ At the beginning of development for what would eventually get released as 3.6.0, the NetHack Development Team consisted of Warwick Allison, Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Ken Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and Paul Winner. -Leading up to the release of 3.6.0 in early 2015, new members Sean Hunt, +In early 2015, ahead of the release of 3.6.0, new members Sean Hunt, Pasi Kallinen, and Derek S. Ray joined the NetHack Development Team. Near the end of the development of 3.6.0, one of the significant inspirations @@ -188,12 +227,12 @@ Terry Pratchett, passed away. NetHack 3.6.0 introduced a tribute to him. team since the release of 3.4.3 with some of the beloved community patches. Many bugs were fixed and some code was restructured. -The NetHack Development Team, as well as Steve VanDevender and -Kevin Smolkowski ensured that NetHack 3.6 continued to operate on various -Unix flavors as well as maintaining the X11 interface. +The NetHack Development Team, as well as Steve VanDevender and +Kevin Smolkowski, ensured that NetHack 3.6 continued to operate on various +UNIX flavors and maintained the X11 interface. Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick maintained the port -of NetHack 3.6.1 for Mac OSX. +of NetHack 3.6 for MacOS. Michael Allison, David Cohrs, Bart House, Pasi Kallinen, Alex Kompel, Dion Nicolaas, Derek S. Ray and Yitzhak Sapir maintained the port of @@ -204,7 +243,7 @@ hindered by limited access. Kevin Smolkowski has updated and tested it for the most recent version of OpenVMS (V8.4 as of this writing) on Alpha and Integrity (aka Itanium aka IA64) but not VAX. -Ray Chason resurrected the msdos port for 3.6 and contributed the +Ray Chason resurrected the MS-DOS port for 3.6 and contributed the necessary updates to the community at large. In late April 2018, several hundred bug fixes for 3.6.0 and some new @@ -212,12 +251,12 @@ features were assembled and released as NetHack 3.6.1. The NetHack Development Team at the time of release of 3.6.1 consisted of Warwick Allison, Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Pasi Kallinen, Ken Lorber, Dean Luick, Patric Mueller, Pat Rankin, -Derek S. Ray, Alex Smith, Mike Stephenson, Janet Walz and Paul Winner. +Derek S. Ray, Alex Smith, Mike Stephenson, Janet Walz, and Paul Winner. -In early May 2019, another 320 bug fixes along with some enhancements and +In early May 2019, another 320 bug fixes along with some enhancements and the adopted curses window port, were released as 3.6.2. -Bart House, who had contributed to the game as a porting team participant +Bart House, who had contributed to the game as a porting team participant for decades, joined the NetHack Development Team in late May 2019. NetHack 3.6.3 was released on December 5, 2019 containing over 190 bug @@ -229,21 +268,86 @@ fix and a few bug fixes. NetHack 3.6.5 was released on January 27, 2020 containing some security fixes and a small number of bug fixes. -NetHack 3.6.6 was released on March 8, 2020 containing a security fix and +NetHack 3.6.6 was released on March 8, 2020 containing a security fix and some bug fixes. -NetHack 3.6.7 was released in February 2023 containing a security fix and +NetHack 3.6.7 was released on February 16, 2023 containing a security fix and some bug fixes. +Development work for the major release to follow NetHack 3.6 began in 2015 +around the same time as NetHack 3.6.0 was being released. That development +work continued in parallel to each of the NetHack 3.6 releases from 2015 +through 2023, and continued until the end of April 2026. For the first time, +that development was shared publicly on GitHub and SourceForge as it occurred. +It was done under the label NetHack-3.7 work-in-progress (WIP), although the +version number for the next release had not yet been solidified. + +Exposure of the development to the public brought many good things, and some +challenges. People were able to observe and criticize changes and new features +almost immediately, and they often did. The GitHub pull request system made +it straightforward for people to contribute directly to development. +Contributions resolved many, many bugs in the game and we thank all the +contributors. + +In early 2026, with the game development getting stable enough to consider +initiating an official release, the devteam reviewed the nature and number of +changes in the game. It was clear that there was sufficient depth and +breadth to warrant a major release and version 5.0 was decided on. +That's a new major release over 3.x, without opening up any ambiguity +or confusion with existing variants that there might have been had it +been released as version 4.0. + +NetHack 5.0.0 was released on May 2, 2026. + +The source code for NetHack 5.0.0 was modified and modernized to be compliant +with the C99 standard. The 5.0.0 release contained over 3100 fixes,changes, +and updated features. + +NetHack 5.0 was the first version to replace the lex and yacc level +and dungeon compilers of past versions, with a new Lua interpreter-based +approach to provide those elements. Lua is also used for the quest texts +in NetHack 5.0.0. The entire development team acknowledges the work +done by Pasi Kallinen to make that happen. + +At the time of the NetHack 5.0 release, the core development team, +active and erstwhile, included Warwick Allison, Michael Allison, +Ken Arromdee, David Cohrs, Jessie Collet, Bart House, Kevin Hugo, +Pasi Kallinen, Ken Lorber, Dean Luick, Pat Rankin, Derek S. Ray, +Alex Smith, Patric Mueller, Mike Stephenson, Janet Walz, Paul Winner. + +Ken Lorber, Pat Rankin, Patrick Mueller and Michael Allison helped ensure +that NetHack 5.0 would run on macOS. + +Ingo Paschke somehow managed to revive a NetHack 5.0 port for the Amiga, +using a cross-compiler on a modern platform to do so. His work was shared +so others can straightforwardly produce NetHack 5.0 for the Amiga thanks +to his efforts. + +Ray Chason contributed the majority of maintenance work for the NetHack 5.0 +MS-DOS port, including porting the curses interface to it. +Michael Allison ensured that NetHack 5.0 core changes continued to work +with the msdos port and keep it alive. Cross-compiling the MS-DOS port +has helped make that possible and mostly painless. + +People that contributed to the Windows port of NetHack 5.0 since the +development of NetHack 5.0 begain over eleven years ago, included +Michael Allison, David Cohrs, Bart House, Pasi Kallinen, Alex Kompel, +Dion Nicolaas, Derek S. Ray and Yitzhak Sapir. + +With sadness, the devteam would like to acknowledge and remember the past +contributions from the late Ron Van Iwaarden, who was the sole maintainer +of NetHack for OS/2 for several past NetHack releases. Ron will be missed. + The official NetHack web site is maintained by Ken Lorber at -http://www.nethack.org/. +https://www.nethack.org/. On behalf of the NetHack community, thank you very much once again to M. Drew Streib and Pasi Kallinen for providing a public NetHack server at nethack.alt.org. Thanks to Keith Simpson and Andy Thomson for hardfought.org. Thanks to all those unnamed dungeoneers who invest their -time and effort into annual NetHack tournaments such as Junethack -and in days past, devnull.net (gone for now, but not forgotten). +time and effort into annual NetHack tournaments such as Junethack, +The November NetHack Tournament, and in days past, devnull.net (gone for +now, but not forgotten). - - - - - - - - - - @@ -252,45 +356,46 @@ particularly intriguing modification to help out with the game. The NetHack Development Team sometimes makes note of the names of the worst of these miscreants in this, the list of Dungeoneers: - Adam Aronow J. Ali Harlow Mikko Juola - Alex Kompel Janet Walz Nathan Eady - Alex Smith Janne Salmijarvi Norm Meluch - Andreas Dorn Jean-Christophe Collet Olaf Seibert - Andy Church Jeff Bailey Pasi Kallinen - Andy Swanson Jochen Erwied Pat Rankin - Andy Thomson John Kallen Patric Mueller - Ari Huttunen John Rupley Paul Winner - Bart House John S. Bien Pierre Martineau - Benson I. Margulies Johnny Lee Ralf Brown - Bill Dyer Jon W{tte Ray Chason - Boudewijn Waijers Jonathan Handler Richard Addison - Bruce Cox Joshua Delahunty Richard Beigel - Bruce Holloway Karl Garrison Richard P. Hughey - Bruce Mewborne Keizo Yamamoto Rob Menke - Carl Schelin Keith Simpson Robin Bandy - Chris Russo Ken Arnold Robin Johnson - David Cohrs Ken Arromdee Roderick Schertler - David Damerell Ken Lorber Roland McGrath - David Gentzel Ken Washikita Ron Van Iwaarden - David Hairston Kevin Darcy Ronnen Miller - Dean Luick Kevin Hugo Ross Brown - Del Lamb Kevin Sitze Sascha Wostmann - Derek S. Ray Kevin Smolkowski Scott Bigham - Deron Meranda Kevin Sweet Scott R. Turner - Dion Nicolaas Lars Huttar Sean Hunt - Dylan O'Donnell Leon Arnott Stephen Spackman - Eric Backus M. Drew Streib Stefan Thielscher - Eric Hendrickson Malcolm Ryan Stephen White - Eric R. Smith Mark Gooderum Steve Creps - Eric S. Raymond Mark Modrall Steve Linhart - Erik Andersen Marvin Bressler Steve VanDevender - Fredrik Ljungdahl Matthew Day Teemu Suikki - Frederick Roeber Merlyn LeRoy Tim Lennan - Gil Neiger Michael Allison Timo Hakulinen - Greg Laskin Michael Feir Tom Almy - Greg Olson Michael Hamel Tom West - Gregg Wonderly Michael Sokolov Warren Cheung - Hao-yang Wang Mike Engber Warwick Allison - Helge Hafting Mike Gallop Yitzhak Sapir - Irina Rempt-Drijfhout Mike Passaretti - Izchak Miller Mike Stephenson + Adam Aronow Irina Rempt-Drijfhout Mike Gallop + Alex Kompel Izchak Miller Mike Passaretti + Alex Smith J. Ali Harlow Mike Stephenson + Andreas Dorn Janet Walz Mikko Juola + Andy Church Janne Salmijarvi Nathan Eady + Andy Swanson Jean-Christophe Collet Norm Meluch + Andy Thomson Jeff Bailey Olaf Seibert + Ari Huttunen Jochen Erwied Pasi Kallinen + Bart House John Kallen Pat Rankin + Benson I. Margulies John Rupley Patric Mueller + Bill Dyer John S. Bien Paul Winner + Boudewijn Waijers Johnny Lee Pierre Martineau + Bruce Cox Jon W{tte Ralf Brown + Bruce Holloway Jonathan Handler Ray Chason + Bruce Mewborne Joshua Delahunty Richard Addison + Cameron Root Karl Garrison Richard Beigel + Carl Schelin Keizo Yamamoto Richard P. Hughey + Chris Russo Keith Simpson Rob Menke + David Cohrs Ken Arnold Robin Bandy + David Damerell Ken Arromdee Robin Johnson + David Gentzel Ken Lorber Roderick Schertler + David Hairston Ken Washikita Roland McGrath + Dean Luick Kestrel Gregorich-Trevor Ron Van Iwaarden + Del Lamb Kevin Darcy Ronnen Miller + Derek S. Ray Kevin Hugo Ross Brown + Deron Meranda Kevin Sitze Sascha Wostmann + Dion Nicolaas Kevin Smolkowski Scott Bigham + Dylan O'Donnell Kevin Sweet Scott R. Turner + Eric Backus Lars Huttar Sean Hunt + Eric Hendrickson Leon Arnott Stephen Spackman + Eric R. Smith M. Drew Streib Stefan Thielscher + Eric S. Raymond Malcolm Ryan Stephen White + Erik Andersen Mark Gooderum Steve Creps + Fredrik Ljungdahl Mark Modrall Steve Linhart + Frederick Roeber Marvin Bressler Steve VanDevender + G. Branden Robinson Matthew Day Teemu Suikki + Gil Neiger Merlyn LeRoy Tim Lennan + Greg Laskin Michael Allison Timo Hakulinen + Greg Olson Michael Feir Tom Almy + Gregg Wonderly Michael Hamel Tom West + Hao-yang Wang Michael Meyer Warren Cheung + Helge Hafting Michael Sokolov Warwick Allison + Ingo Paschke Mike Engber Yitzhak Sapir diff --git a/dat/juiblex.lua b/dat/juiblex.lua new file mode 100644 index 000000000..56c02f9a5 --- /dev/null +++ b/dat/juiblex.lua @@ -0,0 +1,122 @@ +-- NetHack gehennom juiblex.lua $NHDT-Date: 1652196026 2022/05/10 15:20:26 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- + +des.level_flags("mazelevel", "shortsighted", "noflip", "temperate") +-- des.level_init(mines,'.','}',true,true,unlit,false) +des.level_init({ style = "swamp", lit = 0 }); +-- guarantee at least one open spot to ensure successful stair placement +des.map({ halign = "left", valign = "bottom", map = [[ +xxxxxxxx +xx...xxx +xxx...xx +xxxx.xxx +xxxxxxxx +]] }); +des.object("boulder") +des.map({ halign = "right", valign = "top", map = [[ +xxxxxxxx +xxxx.xxx +xxx...xx +xx...xxx +xxxxxxxx +]] }); +des.object("boulder") +-- lair +des.map([[ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxx +xxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxx +xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxx +xxxxxxxxxxxxxxxxxxxxxxxx}}}xxxxxxxxxxxxxxx}}}}}xxxx +xxxxxxxxxxxxxxxxxxxxxxx}}}}}xxxxxxxxxxxxx}.....}xxx +xxxxxxxxxxxxxxxxxxxxxx}}...}}xxxxxxxxxxx}..P.P..}xx +xxxxxxxxxxxxxxxxxxxxx}}..P..}}xxxxxxxxxxx}.....}xxx +xxxxxxxxxxxxxxxxxxxxx}}.P.P.}}xxxxxxxxxxxx}...}xxxx +xxxxxxxxxxxxxxxxxxxxx}}..P..}}xxxxxxxxxxxx}...}xxxx +xxxxxxxxxxxxxxxxxxxxxx}}...}}xxxxxxxxxxxxxx}}}xxxxx +xxxxxxxxxxxxxxxxxxxxxxx}}}}}xxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxxxxxx}}}xxxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxx +xxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxx +xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +]]); +-- Random registers +local monster = { "j","b","P","F" } +shuffle(monster) + +local place = selection.new(); +place:set(04,02); +place:set(46,02); +place:set(04,15); +place:set(46,15); + +-- Dungeon description +des.region({ region={00,00,50,17}, lit=0, type="swamp", filled=2 }) +des.levregion({ region = {01,00,11,20}, region_islev=1, exclude={0,0,50,17}, type="stair-down" }); +des.levregion({ region = {69,00,79,20}, region_islev=1, exclude={0,0,50,17}, type="stair-up" }); +des.levregion({ region = {01,00,11,20}, region_islev=1, exclude={0,0,50,17}, type="branch" }); +des.teleport_region({ region = {01,00,11,20}, region_islev=1, exclude={0,0,50,17},dir="up" }) +des.teleport_region({ region = {69,00,79,20}, region_islev=1, exclude={0,0,50,17},dir="down" }) +des.feature("fountain", place:rndcoord(1)) +des.monster({ id = "giant mimic", coord = place:rndcoord(1), appear_as = "ter:fountain" }) +des.monster({ id = "giant mimic", coord = place:rndcoord(1), appear_as = "ter:fountain" }) +des.monster({ id = "giant mimic", coord = place:rndcoord(1), appear_as = "ter:fountain" }) +-- The demon of the swamp +des.monster("Juiblex",25,08) +-- And a couple demons +des.monster("lemure",43,08) +des.monster("lemure",44,08) +des.monster("lemure",45,08) +-- Some liquids and gems +des.object("*",43,06) +des.object("*",45,06) +des.object("!",43,09) +des.object("!",44,09) +des.object("!",45,09) +-- And lots of blobby monsters +des.monster(monster[4],25,06) +des.monster(monster[1],24,07) +des.monster(monster[2],26,07) +des.monster(monster[3],23,08) +des.monster(monster[3],27,08) +des.monster(monster[2],24,09) +des.monster(monster[1],26,09) +des.monster(monster[4],25,10) +des.monster("j") +des.monster("j") +des.monster("j") +des.monster("j") +des.monster("P") +des.monster("P") +des.monster("P") +des.monster("P") +des.monster("b") +des.monster("b") +des.monster("b") +des.monster("F") +des.monster("F") +des.monster("F") +des.monster("m") +des.monster("m") +des.monster("jellyfish") +des.monster("jellyfish") +-- Some random objects +des.object("!") +des.object("!") +des.object("!") +des.object("%") +des.object("%") +des.object("%") +des.object("boulder") +-- Some traps +des.trap("sleep gas") +des.trap("sleep gas") +des.trap("anti magic") +des.trap("anti magic") +des.trap("magic") +des.trap("magic") diff --git a/dat/knox.des b/dat/knox.des deleted file mode 100644 index 13a56035b..000000000 --- a/dat/knox.des +++ /dev/null @@ -1,153 +0,0 @@ -# NetHack 3.6 knox.des $NHDT-Date: 1547343821 2019/01/13 01:43:41 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.13 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1992 by Izchak Miller -# NetHack may be freely redistributed. See license for details. -# -MAZE:"knox",' ' -FLAGS: noteleport -GEOMETRY:center,center -# Fort's entry is via a secret door rather than a drawbridge; -# the moat must be manually circumvented. -MAP ----------------------------------------------------------------------------- -| |........|...............................................................| -| |........|.................................................------------..| -| --S----S--.................................................|..........|..| -| # |........}}}}}}}....................}}}}}}}..........|..........|..| -| # |........}-----}....................}-----}..........--+--+--...|..| -| # ---........}|...|}}}}}}}}}}}}}}}}}}}}}}|...|}.................|...|..| -| # |..........}---S------------------------S---}.................|...|..| -| # |..........}}}|...............|..........|}}}.................+...|..| -| --S----..........}|...............S..........|}...................|...|..| -| |.....|..........}|...............|......\...S}...................|...|..| -| |.....+........}}}|...............|..........|}}}.................+...|..| -| |.....|........}---S------------------------S---}.................|...|..| -| |.....|........}|...|}}}}}}}}}}}}}}}}}}}}}}|...|}.................|...|..| -| |..-S----......}-----}....................}-----}..........--+--+--...|..| -| |..|....|......}}}}}}}....................}}}}}}}..........|..........|..| -| |..|....|..................................................|..........|..| -| -----------................................................------------..| -| |..............................................................| ----------------------------------------------------------------------------- -ENDMAP -# Non diggable walls -NON_DIGGABLE:(00,00,75,19) -# Portal arrival point -BRANCH:(08,16,08,16),(0,0,0,0) -# accessible via ^V in wizard mode; arrive near the portal -TELEPORT_REGION:(06,15,09,16),(0,0,0,0),up -TELEPORT_REGION:(06,15,09,16),(0,0,0,0),down -# Throne room, with Croesus on the throne -REGION:(37,08,46,11),lit,"throne" -# 50% chance each to move throne and/or fort's entry secret door up one row -IF [50%] { - MONSTER:('@',"Croesus"),(43,10),hostile -} ELSE { - MONSTER:('@',"Croesus"),(43,09),hostile - TERRAIN:(43,09), '\' - TERRAIN:(43,10), '.' -} -IF [50%] { - TERRAIN:(47,09), 'S' - TERRAIN:(47,10), '|' -} -# The Vault -# Using unfilled morgue for -# identification in mkmaze.c -REGION:(21,08,35,11),lit,"morgue",unfilled -# Vault entrance also varies -IF [50%] { - TERRAIN:(36,09), '|' - TERRAIN:(36,10), 'S' -} -# Corner towers -REGION:(19,06,21,06),lit,"ordinary" -REGION:(46,06,48,06),lit,"ordinary" -REGION:(19,13,21,13),lit,"ordinary" -REGION:(46,13,48,13),lit,"ordinary" -# A welcoming committee -REGION:(03,10,07,13),lit,"zoo",filled,irregular -# arrival chamber; needs to be a real room to control migrating monsters, -# and `unfilled' is a kludge to force an ordinary room to remain a room -REGION:(06,15,09,16),unlit,"ordinary",unfilled - -# 3.6.2: Entering level carrying a lit candle would show the whole entry -# chamber except for its top right corner even though some of the revealed -# spots are farther away than that is. This is because the lit treasure zoo -# is forcing the walls around it to be lit too (see light_region(sp_lev.c)), -# and lit walls show up when light reaches the spot next to them. The unlit -# corner is beyond candle range and isn't flagged as lit so it doesn't show -# up until light reaches it rather than when light gets next to it. -# -# Force left and top walls of the arrival chamber to be unlit in order to -# hide this lighting quirk. -REGION:(05,14,05,17),unlit,"ordinary" -REGION:(05,14,09,14),unlit,"ordinary" -# (Entering the treasure zoo while blind and then regaining sight might -# expose the new oddity of these walls not appearing when on the lit side -# but that's even less likely to occur than the rare instance of entering -# the level with a candle. They'll almost always be mapped from the arrival -# side before entering the treasure zoo. -# -# A prior workaround lit the top right corner wall and then jumped through -# hoops to suppress the extra light in the 3x3 lit area that produced. -# This is simpler and makes the short range candle light behave more like -# it is expected to work.) - -# Barracks -REGION:(62,03,71,04),lit,"barracks",filled,irregular -# Doors -DOOR:closed,(06,14) -DOOR:closed,(09,03) -DOOR:open,(63,05) -DOOR:open,(66,05) -DOOR:open,(68,08) -DOOR:locked,(08,11) -DOOR:open,(68,11) -DOOR:closed,(63,14) -DOOR:closed,(66,14) -DOOR:closed,(04,03) -DOOR:closed,(04,09) -# Soldiers guarding the fort -MONSTER:('@',"soldier"),(12,14) -MONSTER:('@',"soldier"),(12,13) -MONSTER:('@',"soldier"),(11,10) -MONSTER:('@',"soldier"),(13,02) -MONSTER:('@',"soldier"),(14,03) -MONSTER:('@',"soldier"),(20,02) -MONSTER:('@',"soldier"),(30,02) -MONSTER:('@',"soldier"),(40,02) -MONSTER:('@',"soldier"),(30,16) -MONSTER:('@',"soldier"),(32,16) -MONSTER:('@',"soldier"),(40,16) -MONSTER:('@',"soldier"),(54,16) -MONSTER:('@',"soldier"),(54,14) -MONSTER:('@',"soldier"),(54,13) -MONSTER:('@',"soldier"),(57,10) -MONSTER:('@',"soldier"),(57,09) -MONSTER:('@',"lieutenant"),(15,08) -# Possible source of a boulder -MONSTER:('H',"stone giant"),(03,01) -# Four dragons guarding each side -MONSTER:'D',(18,09) -MONSTER:'D',(49,10) -MONSTER:'D',(33,05) -MONSTER:'D',(33,14) -# Eels in the moat -MONSTER:(';',"giant eel"),(17,08) -MONSTER:(';',"giant eel"),(17,11) -MONSTER:(';',"giant eel"),(48,08) -MONSTER:(';',"giant eel"),(48,11) -# The corner rooms treasures -OBJECT:('*',"diamond"),(19,06) -OBJECT:('*',"diamond"),(20,06) -OBJECT:('*',"diamond"),(21,06) -OBJECT:('*',"emerald"),(19,13) -OBJECT:('*',"emerald"),(20,13) -OBJECT:('*',"emerald"),(21,13) -OBJECT:('*',"ruby"),(46,06) -OBJECT:('*',"ruby"),(47,06) -OBJECT:('*',"ruby"),(48,06) -OBJECT:('*',"amethyst"),(46,13) -OBJECT:('*',"amethyst"),(47,13) -OBJECT:('*',"amethyst"),(48,13) diff --git a/dat/knox.lua b/dat/knox.lua new file mode 100644 index 000000000..2b58f2ae4 --- /dev/null +++ b/dat/knox.lua @@ -0,0 +1,167 @@ +-- NetHack knox knox.lua $NHDT-Date: 1652196027 2022/05/10 15:20:27 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport") +-- Fort's entry is via a secret door rather than a drawbridge; +-- the moat must be manually circumvented. +des.map([[ +---------------------------------------------------------------------------- +| |........|...............................................................| +| |........|.................................................------------..| +| --S----S--.................................................|..........|..| +| # |........}}}}}}}....................}}}}}}}..........|..........|..| +| # |........}-----}....................}-----}..........--+--+--...|..| +| # ---........}|...|}}}}}}}}}}}}}}}}}}}}}}|...|}.................|...|..| +| # |..........}---S------------------------S---}.................|...|..| +| # |..........}}}|...............|..........|}}}.................+...|..| +| --S----..........}|...............S..........|}...................|...|..| +| |.....|..........}|...............|......\...S}...................|...|..| +| |.....+........}}}|...............|..........|}}}.................+...|..| +| |.....|........}---S------------------------S---}.................|...|..| +| |.....|........}|...|}}}}}}}}}}}}}}}}}}}}}}|...|}.................|...|..| +| |..-S----......}-----}....................}-----}..........--+--+--...|..| +| |..|....|......}}}}}}}....................}}}}}}}..........|..........|..| +| |..|....|..................................................|..........|..| +| -----------................................................------------..| +| |..............................................................| +---------------------------------------------------------------------------- +]]); +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Portal arrival point +des.levregion({ region = {08,16,08,16}, type="branch" }); +-- accessible via ^V in wizard mode; arrive near the portal +des.teleport_region({ region = {06,15,09,16}, dir="up" }) +des.teleport_region({ region = {06,15,09,16}, dir="down" }) +-- Throne room, with Croesus on the throne +des.region({ x1=37,y1=08,x2=46,y2=11, lit=1, type="throne", filled=1 }) +-- 50% chance each to move throne and/or fort's entry secret door up one row +if percent(50) then + des.monster({ id = "Croesus", x=43, y=10, peaceful = 0 }) +else + des.monster({ id = "Croesus", x=43, y=09, peaceful = 0 }) + des.terrain(43,09, "\\") + des.terrain(43,10, ".") +end +if percent(50) then + des.terrain(47,09, "S") + des.terrain(47,10, "|") +end + +-- The Vault +function treasure_spot(x,y) + des.gold({ x = x, y = y, amount = 600 + math.random(0, 300) }); + if (math.random(0,2) == 0) then + if (math.random(0,2) == 0) then + des.trap("spiked pit", x,y); + else + des.trap("land mine", x,y); + end + end +end + +des.region({ region={21,08,35,11}, lit=1, type="ordinary" }) +local treasury = selection.area(21,08,35,11); +treasury:iterate(treasure_spot); + +-- Vault entrance also varies +if percent(50) then + des.terrain(36,09, "|") + des.terrain(36,10, "S") +end +-- Corner towers +des.region(selection.area(19,06,21,06),"lit") +des.region(selection.area(46,06,48,06),"lit") +des.region(selection.area(19,13,21,13),"lit") +des.region(selection.area(46,13,48,13),"lit") +-- A welcoming committee +des.region({ region={03,10,07,13},lit=1,type="zoo",filled=1,irregular=1 }) +-- arrival chamber; needs to be a real room to control migrating monsters, +-- and `unfilled' is a kludge to force an ordinary room to remain a room +des.region({ region={06,15,09,16},lit=0,type="ordinary",arrival_room=true }) + +-- 3.6.2: Entering level carrying a lit candle would show the whole entry +-- chamber except for its top right corner even though some of the revealed +-- spots are farther away than that is. This is because the lit treasure zoo +-- is forcing the walls around it to be lit too (see light_region(sp_lev.c)), +-- and lit walls show up when light reaches the spot next to them. The unlit +-- corner is beyond candle range and isn't flagged as lit so it doesn't show +-- up until light reaches it rather than when light gets next to it. +-- +-- Force left and top walls of the arrival chamber to be unlit in order to +-- hide this lighting quirk. +des.region(selection.area(05,14,05,17),"unlit") +des.region(selection.area(05,14,09,14),"unlit") +-- (Entering the treasure zoo while blind and then regaining sight might +-- expose the new oddity of these walls not appearing when on the lit side +-- but that's even less likely to occur than the rare instance of entering +-- the level with a candle. They'll almost always be mapped from the arrival +-- side before entering the treasure zoo. +-- +-- A prior workaround lit the top right corner wall and then jumped through +-- hoops to suppress the extra light in the 3x3 lit area that produced. +-- This is simpler and makes the short range candle light behave more like +-- it is expected to work.) + +-- Barracks +des.region({ region={62,03,71,04},lit=1,type="barracks",filled=1,irregular=1 }) +-- Doors +des.door("closed",06,14) +des.door("closed",09,03) +des.door("open",63,05) +des.door("open",66,05) +des.door("open",68,08) +des.door("locked",08,11) +des.door("open",68,11) +des.door("closed",63,14) +des.door("closed",66,14) +des.door("closed",04,03) +des.door("closed",04,09) +-- Soldiers guarding the fort +des.monster("soldier",12,14) +des.monster("soldier",12,13) +des.monster("soldier",11,10) +des.monster("soldier",13,02) +des.monster("soldier",14,03) +des.monster("soldier",20,02) +des.monster("soldier",30,02) +des.monster("soldier",40,02) +des.monster("soldier",30,16) +des.monster("soldier",32,16) +des.monster("soldier",40,16) +des.monster("soldier",54,16) +des.monster("soldier",54,14) +des.monster("soldier",54,13) +des.monster("soldier",57,10) +des.monster("soldier",57,09) +des.monster("lieutenant",15,08) +-- Possible source of a boulder +des.monster("stone giant",03,01) +-- Four dragons guarding each side +des.monster("D",18,09) +des.monster("D",49,10) +des.monster("D",33,05) +des.monster("D",33,14) +-- Eels in the moat +des.monster("giant eel",17,08) +des.monster("giant eel",17,11) +des.monster("giant eel",48,08) +des.monster("giant eel",48,11) +-- The corner rooms treasures +des.object("diamond",19,06) +des.object("diamond",20,06) +des.object("diamond",21,06) +des.object("emerald",19,13) +des.object("emerald",20,13) +des.object("emerald",21,13) +des.object("ruby",46,06) +des.object("ruby",47,06) +des.object("ruby",48,06) +des.object("amethyst",46,13) +des.object("amethyst",47,13) +des.object("amethyst",48,13) diff --git a/dat/luahelper b/dat/luahelper new file mode 100644 index 000000000..f06c9c367 --- /dev/null +++ b/dat/luahelper @@ -0,0 +1,102 @@ +# NetHack 5.0 luahelper $NHDT-Date: $ $NHDT-Branch: NetHack-3.7 $ +# +# Makefile to assist developers in adding lines to various build +# Makefiles, or project files, as lua files are added or removed. +# NetHack may be freely redistributed. See license for details. +# +# Must be run while your current directory is the top of the +# NetHack source tree. +# +# make -f dat/luahelper [target] +# +# Target examples: +# +# Visual Studio nmake : make -f dat/luahelper devhelp-nmake >file.txt +# +# Visual Studio project: make -f dat/luahelper devhelp-vstudio >file.txt +# +# MSYS2 GNUmakefile : make -f dat/luahelper devhelp-msys2 >file.txt +# +# Xcode project.pbxproj: make -f dat/luahelper devhelp-xcode >file.txt +# +# + +MAKEFLAGS += --no-print-directory +AWK=awk + + +luanames = asmodeus baalz bigrm-* castle fakewiz? juiblex knox medusa-? \ + minend-? minefill minetn-? oracle orcus sanctum soko?-? tower? \ + valley wizard? nhcore nhlib themerms astral air earth fire water \ + hellfill tut-? ???-goal ???-fil? ???-loca ???-strt \ + dungeon quest + +alllua = $(wildcard $(addsuffix .lua,$(addprefix dat/, $(luanames)))) + +# +# generates lines to insert into +# sys/windows/Makefile.nmake +# +devhelp-nmake: + @echo "$(notdir $(alllua))" | \ + $(AWK) '{for (i=1; i<=NF; ++i)printf "%s%s%s%s", \ + i == 1? "LUA_FILES = " : "", \ + "$$(DAT)", \ + $$i, \ + i % 3? " ": ((i == NF)? "\n" : " \\\n\t")} \ + i % 3{print ""}' + @echo "" + +# +# generates lines to insert into +# sys/windows/GNUmakefile +# +devhelp-msys2: + @echo "$(basename $(notdir $(alllua)))" | \ + $(AWK) '{for (i=1; i<=NF; ++i)printf "%s%s%s", \ + i == 1? "LUALIST = " : "", \ + $$i, \ + i % 5? " ": ((i == NF)? "\n" : " \\\n\t")} \ + i % 5{print ""}' + @echo "" + +xcodeextra = bogusmon cmdhelp data engrave epitaph help hh \ + history keyhelp opthelp optmenu options oracles \ + rumors tribute wizhelp +# +# generates lines to insert into +# sys/unix/NetHack.xcodeproj/project.pbxproj +# +devhelp-xcode: + @echo "\t\t\tinputPaths = (" + @echo "$(xcodeextra) $(notdir $(alllua))" | \ + $(AWK) '{for (i=1; i<=NF; ++i)printf "%s%s%s%s%s", \ + i == 1? "\t" : "", \ + "\t\t\t\042$$(NH_DAT_DIR)/", \ + $$i, \ + "\042", \ + i % 1? " ": ((i == NF)? "\n" : ",\n\t")} \ + i % 1{print ""}' + @echo "\t\t\t);" +# +# generates lines to insert into +# sys/windows/vs/files.props +# +devhelp-vstudio: + @echo " " + @echo "$(notdir $(alllua))" | \ + $(AWK) '{for (i=1; i<=NF; ++i)printf "%s%s%s%s%s", \ + i == 1? " " : "", \ + "", \ + i % 1? " ": ((i == NF)? "\n" : "\n ")} \ + i % 1{print ""}' + @echo " " + +all: + make -f dat/luahelper devhelp-nmake >./luahelp-nmake.txt + make -f dat/luahelper devhelp-msys2 >./luahelp-msys2.txt + make -f dat/luahelper devhelp-xcode >./luahelp-xcode.txt + make -f dat/luahelper devhelp-vstudio >./luahelp-vstudio.txt +# end diff --git a/dat/medusa-1.lua b/dat/medusa-1.lua new file mode 100644 index 000000000..3c5e50c66 --- /dev/null +++ b/dat/medusa-1.lua @@ -0,0 +1,123 @@ +-- NetHack medusa medusa-1.lua $NHDT-Date: 1652196027 2022/05/10 15:20:27 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990, 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- These are the Medusa's levels : +-- + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport") + +des.map([[ +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}.}}}}}..}}}}}......}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....}}}...}}}}} +}...}}.....}}}}}....}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}...............} +}....}}}}}}}}}}....}}}..}}}}}}}}}}}.......}}}}}}}}}}}}}}}}..}}.....}}}...}} +}....}}}}}}}}.....}}}}..}}}}}}.................}}}}}}}}}}}.}}}}.....}}...}} +}....}}}}}}}}}}}}.}}}}.}}}}}}.-----------------.}}}}}}}}}}}}}}}}}.........} +}....}}}}}}}}}}}}}}}}}}.}}}...|...............S...}}}}}}}}}}}}}}}}}}}....}} +}.....}.}}....}}}}}}}}}.}}....--------+--------....}}}}}}..}}}}}}}}}}}...}} +}......}}}}..}}}}}}}}}}}}}........|.......|........}}}}}....}}}}}}}}}}}}}}} +}.....}}}}}}}}}}}}}}}}}}}}........|.......|........}}}}}...}}}}}}}}}.}}}}}} +}.....}}}}}}}}}}}}}}}}}}}}....--------+--------....}}}}}}.}.}}}}}}}}}}}}}}} +}......}}}}}}}}}}}}}}}}}}}}...S...............|...}}}}}}}}}}}}}}}}}.}}}}}}} +}.......}}}}}}}..}}}}}}}}}}}}.-----------------.}}}}}}}}}}}}}}}}}....}}}}}} +}........}}.}}....}}}}}}}}}}}}.................}}}}}..}}}}}}}}}.......}}}}} +}.......}}}}}}}......}}}}}}}}}}}}}}.......}}}}}}}}}.....}}}}}}...}}..}}}}}} +}.....}}}}}}}}}}}.....}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}..}}}}}}}}}}....}}}}}}} +}}..}}}}}}}}}}}}}....}}}}}}}}}}}}}}}}}}}}}}...}}..}}}}}}}.}}.}}}}..}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +]]); +-- Dungeon Description +des.region(selection.area(00,00,74,19),"lit") +des.region(selection.area(31,07,45,07),"unlit") +-- make the downstairs room a real room to control arriving monsters, +-- and also as a fixup_special hack; the first room defined on Medusa's level +-- receives some statues +des.region({ region={35,09, 41,10}, lit = 0, type="ordinary", arrival_room=true }) +des.region(selection.area(31,12,45,12),"unlit") +-- Teleport: down to up stairs island, up to Medusa's island +des.teleport_region({ region = {01,01,05,17}, dir="down" }) +des.teleport_region({ region = {26,04,50,15}, dir="up" }) +-- Stairs +des.stair("up", 05,14) +des.stair("down", 36,10) +-- Doors +des.door("closed",46,07) +des.door("locked",38,08) +des.door("locked",38,11) +des.door("closed",30,12) +-- Branch, not allowed inside Medusa's building. +des.levregion({ region = {01,00,79,20}, exclude = {30,06,46,13}, type = "branch" }) +-- Non diggable walls +des.non_diggable(selection.area(30,06,46,13)) +-- Objects +des.object({ id = "statue", x=36,y=10, buc="uncursed", + montype="knight", historic=1, male = 1, name="Perseus", + contents = function() + if percent(75) then + des.object({ id = "shield of reflection", buc="cursed", spe=0 }) + end + if percent(25) then + des.object({ id = "levitation boots", spe=0 }) + end + if percent(50) then + des.object({ id = "scimitar", buc="blessed", spe=2 }) + end + if percent(50) then + des.object("sack") + end + end +}); + +-- Specifying explicit contents forces them to be empty. +des.object({ id = "statue", contents = 0 }) +des.object({ id = "statue", contents = 0 }) +des.object({ id = "statue", contents = 0 }) +des.object({ id = "statue", contents = 0 }) +des.object({ id = "statue", contents = 0 }) +des.object({ id = "statue", contents = 0 }) +des.object({ id = "statue", contents = 0 }) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap("board",38,07) +des.trap("board",38,12) +-- Random monsters +des.monster({ id = "Medusa", x=36,y=10, asleep=1 }) +des.monster("giant eel",11,06) +des.monster("giant eel",23,13) +des.monster("giant eel",29,02) +des.monster("jellyfish",02,02) +des.monster("jellyfish",00,08) +des.monster("jellyfish",04,18) +des.monster("water troll",51,03) +des.monster("water troll",64,11) +des.monster({ class = 'S', x=38, y=07 }) +des.monster({ class = 'S', x=38, y=12 }) +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() diff --git a/dat/medusa-2.lua b/dat/medusa-2.lua new file mode 100644 index 000000000..d270616ae --- /dev/null +++ b/dat/medusa-2.lua @@ -0,0 +1,129 @@ +-- NetHack medusa medusa-2.lua $NHDT-Date: 1652196027 2022/05/10 15:20:27 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990, 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport") + +des.map([[ +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}}}}}}}}--------------} +}|....|}}}}}}}}}..}.}}..}}}}}}}}}}}}}..}}}}}}-.....--}}}}}}}|............|} +}|....|.}}}}}}}}}}}.}...}}..}}}}}}}}}}}}}}}}}---......}}}}}.|............|} +}S....|.}}}}}}---}}}}}}}}}}}}}}}}}}}}}}}}}}---...|..-}}}}}}.S..----------|} +}|....|.}}}}}}-...}}}}}}}}}.}}...}.}}}}.}}}......----}}}}}}.|............|} +}|....|.}}}}}}-....--}}}}}}}}}}}}}}}}}}}}}}----...--}}}}}}}.|..--------+-|} +}|....|.}}}}}}}......}}}}...}}}}}}.}}}}}}}}}}}---..---}}}}}.|..|..S...|..|} +}|....|.}}}}}}-....-}}}}}}}------}}}}}}}}}}}}}}-...|.-}}}}}.|..|..|...|..|} +}|....|.}}}}}}}}}---}}}}}}}........}}}}}}}}}}---.|....}}}}}.|..|..|...|..|} +}|....|.}}}}}}}}}}}}}}}}}}-....|...-}}}}}}}}--...----.}}}}}.|..|..|...|..|} +}|....|.}}}}}}..}}}}}}}}}}---..--------}}}}}-..---}}}}}}}}}.|..|..-------|} +}|...}|...}}}.}}}}}}...}}}}}--..........}}}}..--}}}}}}}}}}}.|..|.........|} +}|...}S...}}.}}}}}}}}}}}}}}}-..--------}}}}}}}}}}}}}}...}}}.|..--------..S} +}|...}|...}}}}}}}..}}}}}}----..|....-}}}}}}}}}}}}}}}}}..}}}.|............|} +}|....|}}}}}....}}}}..}}.-.......----}}......}}}}}}.......}}|............|} +}------}}}}}}}}}}}}}}}}}}---------}}}}}}}}}}}}}}}}}}}}}}}}}}--------------} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +]]); +-- Dungeon Description +des.region(selection.area(00,00,74,19),"lit") +des.region(selection.area(02,03,05,16),"unlit") +-- fixup_special hack: the first room defined on a Medusa level gets some +-- leaderboard statues; setting the region as irregular makes it a room +des.region({ region={61,03, 72,16}, lit=0, type="ordinary",irregular = 1 }) +des.region(selection.area(71,08,72,11),"unlit") +-- make the downstairs area a real room to control arriving monsters +des.region({ region={67,08,69,11}, lit=1, type="ordinary", arrival_room=true }) +-- Teleport: down to up stairs island, up to Medusa's island +des.teleport_region({ region = {02,03,05,16}, dir="down" }) +des.teleport_region({ region = {61,03,72,16}, dir="up" }) +-- Stairs +des.stair("up", 04,09) +des.stair("down", 68,10) +-- Doors +des.door("locked", 71,07) +-- Branch, not allowed on Medusa's island. +des.levregion({ type="branch", region = {01,00,79,20}, exclude = {59,01,73,17} }) +-- Non diggable walls +des.non_diggable(selection.area(01,02,06,17)) +des.non_diggable(selection.area(60,02,73,17)) +-- Objects +des.object({ id = "statue", x=68,y=10,buc="uncursed", + montype="knight", historic=1, male=1,name="Perseus", + contents = function() + if percent(25) then + des.object({ id = "shield of reflection", buc="cursed", spe=0 }) + end + if percent(75) then + des.object({ id = "levitation boots", spe=0 }) + end + if percent(50) then + des.object({ id = "scimitar", buc="blessed", spe=2 }) + end + if percent(50) then + des.object("sack") + end + end +}); +des.object({ id = "statue", x=64, y=08, contents=0 }) +des.object({ id = "statue", x=65, y=08, contents=0 }) +des.object({ id = "statue", x=64, y=09, contents=0 }) +des.object({ id = "statue", x=65, y=09, contents=0 }) +des.object({ id = "statue", x=64, y=10, contents=0 }) +des.object({ id = "statue", x=65, y=10, contents=0 }) +des.object({ id = "statue", x=64, y=11, contents=0 }) +des.object({ id = "statue", x=65, y=11, contents=0 }) +des.object("boulder",04,04) +des.object("/",52,09) +des.object("boulder",52,09) +des.object() +des.object() +des.object() +des.object() +des.object() +des.object() +-- Traps +des.trap("magic",03,12) +des.trap() +des.trap() +des.trap() +des.trap() +-- Monsters. +des.monster({ id="Medusa",x=68,y=10,asleep=1 }) +des.monster("gremlin",02,14) +des.monster("titan",02,05) +des.monster("electric eel",10,13) +des.monster("electric eel",11,13) +des.monster("electric eel",10,14) +des.monster("electric eel",11,14) +des.monster("electric eel",10,15) +des.monster("electric eel",11,15) +des.monster("jellyfish",01,01) +des.monster("jellyfish",00,08) +des.monster("jellyfish",04,19) +des.monster({ id = "stone golem",x=64,y=08,asleep=1 }) +des.monster({ id = "stone golem",x=65,y=08,asleep=1 }) +des.monster({ id = "stone golem",x=64,y=09,asleep=1 }) +des.monster({ id = "stone golem",x=65,y=09,asleep=1 }) +des.monster({ id = "cobra",x=64,y=10,asleep=1 }) +des.monster({ id = "cobra",x=65,y=10,asleep=1 }) +des.monster("A",72,08) +des.monster({ id = "yellow light",x=72,y=11,asleep=1 }) +des.monster({ x = 17, y = 07 }) +des.monster({ x = 28, y = 11 }) +des.monster({ x = 32, y = 13 }) +des.monster({ x = 49, y = 09 }) +des.monster({ x = 48, y = 07 }) +des.monster({ x = 65, y = 03 }) +des.monster({ x = 70, y = 04 }) +des.monster({ x = 70, y = 15 }) +des.monster({ x = 65, y = 16 }) +des.monster() +des.monster() +des.monster() +des.monster() + diff --git a/dat/medusa-3.lua b/dat/medusa-3.lua new file mode 100644 index 000000000..282d3668b --- /dev/null +++ b/dat/medusa-3.lua @@ -0,0 +1,138 @@ +-- NetHack medusa medusa-3.lua $NHDT-Date: 1716152250 2024/05/19 20:57:30 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.8 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990, 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("noteleport", "mazelevel", "shortsighted") +-- +-- Here you disturb ravens nesting in the trees. +-- +des.map([[ +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}T..T.}}}}}}}}}}}}}}}}}}}}..}}}}}}}}.}}}...}}}}}}}.}}}}}......}}}}}}} +}}}}}}.......T.}}}}}}}}}}}..}}}}..T.}}}}}}...T...T..}}...T..}}..-----..}}}}} +}}}...-----....}}}}}}}}}}.T..}}}}}...}}}}}.....T..}}}}}......T..|...|.T..}}} +}}}.T.|...|...T.}}}}}}}.T......}}}}..T..}}.}}}.}}...}}}}}.T.....+...|...}}}} +}}}}..|...|.}}.}}}}}.....}}}T.}}}}.....}}}}}}.T}}}}}}}}}}}}}..T.|...|.}}}}}} +}}}}}.|...|.}}}}}}..T..}}}}}}}}}}}}}T.}}}}}}}}..}}}}}}}}}}}.....-----.}}}}}} +}}}}}.--+--..}}}}}}...}}}}}}}}}}}}}}}}}}}T.}}}}}}}}}}}}}}}}.T.}........}}}}} +}}}}}.......}}}}}}..}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}.}}.T.}}}}}} +}}.T...T...}}}}T}}}}}}}}}}}....}}}}}}}}}}T}}}}}.T}}...}}}}}}}}}}}}}}...}}}}} +}}}...T}}}}}}}..}}}}}}}}}}}.T...}}}}}}}}.T.}.T.....T....}}}}}}}}}}}}}.}}}}}} +}}}}}}}}}}}}}}}....}}}}}}}...}}.}}}}}}}}}}............T..}}}}}.T.}}}}}}}}}}} +}}}}}}}}}}}}}}}}..T..}}}}}}}}}}}}}}..}}}}}..------+--...T.}}}....}}}}}}}}}}} +}}}}.}..}}}}}}}.T.....}}}}}}}}}}}..T.}}}}.T.|...|...|....}}}}}.}}}}}...}}}}} +}}}.T.}...}..}}}}T.T.}}}}}}.}}}}}}}....}}...|...+...|.}}}}}}}}}}}}}..T...}}} +}}}}..}}}.....}}...}}}}}}}...}}}}}}}}}}}}}T.|...|...|}}}}}}}}}}}....T..}}}}} +}}}}}..}}}.T..}}}.}}}}}}}}.T..}}}}}}}}}}}}}}---S-----}}}}}}}}}}}}}....}}}}}} +}}}}}}}}}}}..}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}T..T}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +]]); + +local place = selection.new(); +-- each of these spots are inside a distinct room +place:set(08,06); +place:set(66,05); +place:set(46,15); + +-- location of Medusa and downstairs and Perseus's statue +local medloc = place:rndcoord(1,1); +-- specific location for some other statue in a different downstairs-eligible +-- room, to prevent object detection from becoming a trivial way to pinpoint +-- Medusa's location +-- [usefulness depends on future STATUE->dknown changes in nethack's core] +local altloc = place:rndcoord(1,1); +-- location of a fountain, in the remaining of three downstairs-eligible rooms +local othloc = place:rndcoord(1,1); +-- once here, all three points set in 'place' have been used up + +des.region(selection.area(00,00,74,19),"lit") +-- fixup_special hack: the first room defined on a Medusa level gets some +-- leaderboard statues, use arrival_room to force it to be a room even though +-- monsters won't arrive within it +des.region({ region={49,14, 51,16}, lit=-1, type="ordinary", arrival_room=true }); +des.region(selection.area(07,05,09,07),"unlit") +des.region(selection.area(65,04,67,06),"unlit") +des.region(selection.area(45,14,47,16),"unlit") +-- Non diggable walls +-- 4th room has diggable walls as Medusa is never placed there +des.non_diggable(selection.area(06,04,10,08)) +des.non_diggable(selection.area(64,03,68,07)) +des.non_diggable(selection.area(44,13,48,17)) +-- All places are accessible also with jumping, so don't bother +-- restricting the placement when teleporting from levels below this. +des.teleport_region({ region = {33,02,38,07}, dir="down" }) +des.levregion({ region = {32,01,39,07}, type="stair-up" }); + +-- place the downstairs at the same spot where Medusa will be placed +des.stair("down", medloc); +-- +des.door("locked",08,08) +des.door("locked",64,05) +des.door("random",50,13) +des.door("locked",48,15) +-- +-- in one of the three designated rooms, but not the one with Medusa plus +-- downstairs and also not 'altloc' where a random statue will be placed +des.feature("fountain", othloc); +-- +-- same spot as Medusa plus downstairs +des.object({ id="statue", coord=medloc, buc="uncursed", + montype="knight", historic=1, male=1,name="Perseus", + contents = function() + if percent(75) then + des.object({ id = "shield of reflection", buc="cursed", spe=0 }) + end + if percent(25) then + des.object({ id = "levitation boots", spe=0 }) + end + if percent(50) then + des.object({ id = "scimitar", buc="blessed", spe=2 }) + end + if percent(50) then + des.object("sack") + end + end +}); +-- +-- first random statue is in one of the three designated rooms but not the +-- one with Medusa plus downstairs or the one with the fountain +des.object({ id = "statue", coord=altloc, contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) + +for i=1,8 do + des.object() +end +des.object("scroll of blank paper",48,18) +des.object("scroll of blank paper",48,18) +-- +des.trap("rust") +des.trap("rust") +des.trap("board") +des.trap("board") +des.trap() +-- +-- place Medusa before placing other monsters so that they won't be able to +-- unintentionally steal her spot on the downstairs +des.monster({ id = "Medusa", coord=medloc, asleep=1 }) +des.monster("giant eel") +des.monster("giant eel") +des.monster("jellyfish") +des.monster("jellyfish") +des.monster("wood nymph") +des.monster("wood nymph") +des.monster("water nymph") +des.monster("water nymph") + +for i=1,30 do + des.monster({ id = "raven", peaceful = 0 }) +end + +--#medusa-3.lua diff --git a/dat/medusa-4.lua b/dat/medusa-4.lua new file mode 100644 index 000000000..acf6c6d3f --- /dev/null +++ b/dat/medusa-4.lua @@ -0,0 +1,152 @@ +-- NetHack medusa medusa-4.lua $NHDT-Date: 1716152274 2024/05/19 20:57:54 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.8 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1990, 1991 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("noteleport", "mazelevel") +-- +-- Here the Medusa rules some slithery monsters from her 'palace', with +-- a yellow dragon nesting in the backyard. +-- +des.map([[ +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +}}}}}}}}}}}}}}........}}}}}}}}}}}}}}}}}}}}}}}..}}}.....}}}}}}}}}}}----|}}}}} +}}}}}}..----------F-.....}}}}}}}}}}}}}}}}..---...}}}}....T.}}}}}}}....|}}}}} +}}}.....|...F......S}}}}....}}}}}}}...}}.....|}}.}}}}}}}......}}}}|......}}} +}}}.....+...|..{...|}}}}}}}}}}}}.....}}}}|...|}}}}}}}}}}}.}}}}}}}}----.}}}}} +}}......|...|......|}}}}}}}}}......}}}}}}|.......}}}}}}}}}}}}}..}}}}}...}}}} +}}|-+--F|-+--....|F|-|}}}}}....}}}....}}}-----}}.....}}}}}}}......}}}}.}}}}} +}}|...}}|...|....|}}}|}}}}}}}..}}}}}}}}}}}}}}}}}}}}....}}}}}}}}....T.}}}}}}} +}}|...}}F...+....F}}}}}}}..}}}}}}}}}}}}}}...}}}}}}}}}}}}}}}}}}}}}}....}}..}} +}}|...}}|...|....|}}}|}....}}}}}}....}}}...}}}}}...}}}}}}}}}}}}}}}}}.....}}} +}}--+--F|-+--....-F|-|....}}}}}}}}}}.T...}}}}....---}}}}}}}}}}}}}}}}}}}}}}}} +}}......|...|......|}}}}}.}}}}}}}}}....}}}}}}}.....|}}}}}}}}}.}}}}}}}}}}}}}} +}}}}....+...|..{...|.}}}}}}}}}}}}}}}}}}}}}}}}}}.|..|}}}}}}}......}}}}...}}}} +}}}}}}..|...F......|...}}}}}}}}}}..---}}}}}}}}}}--.-}}}}}....}}}}}}....}}}}} +}}}}}}}}-----S----F|....}}}}}}}}}|...|}}}}}}}}}}}}...}}}}}}...}}}}}}..}}}}}} +}}}}}}}}}..............T...}}}}}.|.......}}}}}}}}}}}}}}..}...}.}}}}....}}}}} +}}}}}}}}}}....}}}}...}...}}}}}.......|.}}}}}}}}}}}}}}.......}}}}}}}}}...}}}} +}}}}}}}}}}..}}}}}}}}}}.}}}}}}}}}}-..--.}}}}}}}}..}}}}}}..T...}}}..}}}}}}}}}} +}}}}}}}}}...}}}}}}}}}}}}}}}}}}}}}}}...}}}}}}}....}}}}}}}.}}}..}}}...}}}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}....}}}}}}}}}}}}}}}}}}}...}}}}}} +}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} +]]); + +-- +-- place handling is similar to medusa-3.lua except that there are 4 +-- downstairs-eligible rooms rather than 3, and only 2 of them are used +local place = selection.new(); +-- each of these spots are inside a distinct room +place:set(04,08); +place:set(10,04); +place:set(10,08); +place:set(10,12); + +-- location of Medusa and downstairs and Perseus's statue +local medloc = place:rndcoord(1,1); +-- specific location for some other statue in a different downstairs-eligible +-- room, to prevent object detection from becoming a trivial way to pinpoint +-- Medusa's location +-- [usefulness depends on future STATUE->dknown changes in nethack's core] +local altloc = place:rndcoord(1,1); + +-- +des.region(selection.area(00,00,74,19),"lit") +-- fixup_special hack: The first "room" region in Medusa levels gets filled +-- with some leaderboard statues, so this needs to be a room; setting +-- irregular=1 will force this +des.region({ region={13,03, 18,13}, lit=1, type="ordinary", irregular=1 }) +-- +des.teleport_region({ region = {64,01,74,17}, dir="down" }); +des.teleport_region({ region = {02,02,18,13}, dir="up" }); +-- +des.levregion({ region = {67,01,74,20}, type="stair-up" }); + +-- place the downstairs at the same spot where Medusa will be placed +des.stair("down", medloc) +-- +des.door("locked",04,06) +des.door("locked",04,10) +des.door("locked",08,04) +des.door("locked",08,12) +des.door("locked",10,06) +des.door("locked",10,10) +des.door("locked",12,08) +-- +des.levregion({ region = {27,00,79,20}, type="branch" }); +-- +des.non_diggable(selection.area(01,01,22,14)); +-- +des.object("crystal ball", 07,08) +-- +-- same spot as Medusa plus downstairs +des.object({ id="statue", coord=medloc, buc="uncursed", + montype="knight", historic=1, male=1,name="Perseus", + contents = function() + if percent(75) then + des.object({ id = "shield of reflection", buc="cursed", spe=0 }) + end + if percent(25) then + des.object({ id = "levitation boots", spe=0 }) + end + if percent(50) then + des.object({ id = "scimitar", buc="blessed", spe=2 }) + end + if percent(50) then + des.object("sack") + end + end +}); +-- +-- first random statue is in one of the designated stair rooms but not the +-- one with Medusa plus downstairs +des.object({ id = "statue", coord=altloc, contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +des.object({ id = "statue", contents=0 }) +for i=1,8 do + des.object() +end +-- +for i=1,7 do + des.trap() +end +-- +-- place Medusa before placing other monsters so that they won't be able to +-- unintentionally steal her spot on the downstairs +des.monster({ id = "Medusa", coord=medloc, asleep=1 }) +des.monster("kraken", 07,07) +-- +-- the nesting dragon +des.monster({ id = "yellow dragon", x=05, y=04, asleep=1 }) +if percent(50) then + des.monster({ id = "baby yellow dragon", x=04,y=04, asleep=1 }) +end +if percent(25) then + des.monster({ id = "baby yellow dragon", x=04, y=05, asleep=1 }) +end +des.object({ id = "egg", x=05, y=04, montype="yellow dragon" }); +if percent(50) then + des.object({ id = "egg", x=05, y=04, montype="yellow dragon" }); +end +if percent(25) then + des.object({ id = "egg", x=05, y=04, montype="yellow dragon" }); +end +-- +des.monster("giant eel") +des.monster("giant eel") +des.monster("jellyfish") +des.monster("jellyfish") +for i=1,14 do + des.monster("S") +end +for i=1,4 do + des.monster("black naga hatchling") + des.monster("black naga") +end + +--#medusa-4.lua diff --git a/dat/medusa.des b/dat/medusa.des deleted file mode 100644 index b449a29e2..000000000 --- a/dat/medusa.des +++ /dev/null @@ -1,416 +0,0 @@ -# NetHack 3.6 medusa.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1990, 1991 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# These are the Medusa's levels : -# - -MAZE:"medusa-1",' ' -FLAGS: noteleport -GEOMETRY:center,center -MAP -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}.}}}}}..}}}}}......}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....}}}...}}}}} -}...}}.....}}}}}....}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}...............} -}....}}}}}}}}}}....}}}..}}}}}}}}}}}.......}}}}}}}}}}}}}}}}..}}.....}}}...}} -}....}}}}}}}}.....}}}}..}}}}}}.................}}}}}}}}}}}.}}}}.....}}...}} -}....}}}}}}}}}}}}.}}}}.}}}}}}.-----------------.}}}}}}}}}}}}}}}}}.........} -}....}}}}}}}}}}}}}}}}}}.}}}...|...............S...}}}}}}}}}}}}}}}}}}}....}} -}.....}.}}....}}}}}}}}}.}}....--------+--------....}}}}}}..}}}}}}}}}}}...}} -}......}}}}..}}}}}}}}}}}}}........|.......|........}}}}}....}}}}}}}}}}}}}}} -}.....}}}}}}}}}}}}}}}}}}}}........|.......|........}}}}}...}}}}}}}}}.}}}}}} -}.....}}}}}}}}}}}}}}}}}}}}....--------+--------....}}}}}}.}.}}}}}}}}}}}}}}} -}......}}}}}}}}}}}}}}}}}}}}...S...............|...}}}}}}}}}}}}}}}}}.}}}}}}} -}.......}}}}}}}..}}}}}}}}}}}}.-----------------.}}}}}}}}}}}}}}}}}....}}}}}} -}........}}.}}....}}}}}}}}}}}}.................}}}}}..}}}}}}}}}.......}}}}} -}.......}}}}}}}......}}}}}}}}}}}}}}.......}}}}}}}}}.....}}}}}}...}}..}}}}}} -}.....}}}}}}}}}}}.....}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}..}}}}}}}}}}....}}}}}}} -}}..}}}}}}}}}}}}}....}}}}}}}}}}}}}}}}}}}}}}...}}..}}}}}}}.}}.}}}}..}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -ENDMAP -# Dungeon Description -# (must maintain one room definition; `unfilled' forces its room to be kept) -REGION:(00,00,74,19),lit,"ordinary" -REGION:(31,07,45,07),unlit,"ordinary" -REGION:(35,09,41,10),unlit,"ordinary",unfilled -REGION:(31,12,45,12),unlit,"ordinary" -# Teleport: down to up stairs island, up to Medusa's island -TELEPORT_REGION:(01,01,05,17),(0,0,0,0),down -TELEPORT_REGION:(26,04,50,15),(0,0,0,0),up -# Stairs -STAIR:(05,14),up -STAIR:(36,10),down -# Doors -DOOR:closed,(46,07) -DOOR:locked,(38,08) -DOOR:locked,(38,11) -DOOR:closed,(30,12) -# Branch, not allowed inside Medusa's building. -BRANCH:levregion(01,00,79,20),(30,06,46,13) -# Non diggable walls -NON_DIGGABLE:(30,06,46,13) -# Objects -CONTAINER:('`',"statue"),(36,10),uncursed,montype:"knight",3,name:"Perseus" { - [75%]: OBJECT:('[',"shield of reflection"),cursed,+0 - [25%]: OBJECT:('[',"levitation boots"),+0 - [50%]: OBJECT:(')',"scimitar"),blessed,+2 - [50%]: OBJECT:('(',"sack") -} -# These aren't really containers, but specifying CONTAINER forces them to be -# empty, since CONTAINERs contain only what is explicitly specified. -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:"board",(38,07) -TRAP:"board",(38,12) -# Random monsters -MONSTER:('@',"Medusa"),(36,10),asleep -MONSTER:(';',"giant eel"),(11,06) -MONSTER:(';',"giant eel"),(23,13) -MONSTER:(';',"giant eel"),(29,02) -MONSTER:(';',"jellyfish"),(02,02) -MONSTER:(';',"jellyfish"),(00,08) -MONSTER:(';',"jellyfish"),(04,18) -MONSTER:('T',"water troll"),(51,03) -MONSTER:('T',"water troll"),(64,11) -MONSTER:'S',(38,07) -MONSTER:'S',(38,12) -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random - -MAZE:"medusa-2",' ' -FLAGS: noteleport -GEOMETRY:center,center -MAP -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}}}}}}}}--------------} -}|....|}}}}}}}}}..}.}}..}}}}}}}}}}}}}..}}}}}}-.....--}}}}}}}|............|} -}|....|.}}}}}}}}}}}.}...}}..}}}}}}}}}}}}}}}}}---......}}}}}.|............|} -}S....|.}}}}}}---}}}}}}}}}}}}}}}}}}}}}}}}}}---...|..-}}}}}}.S..----------|} -}|....|.}}}}}}-...}}}}}}}}}.}}...}.}}}}.}}}......----}}}}}}.|............|} -}|....|.}}}}}}-....--}}}}}}}}}}}}}}}}}}}}}}----...--}}}}}}}.|..--------+-|} -}|....|.}}}}}}}......}}}}...}}}}}}.}}}}}}}}}}}---..---}}}}}.|..|..S...|..|} -}|....|.}}}}}}-....-}}}}}}}------}}}}}}}}}}}}}}-...|.-}}}}}.|..|..|...|..|} -}|....|.}}}}}}}}}---}}}}}}}........}}}}}}}}}}---.|....}}}}}.|..|..|...|..|} -}|....|.}}}}}}}}}}}}}}}}}}-....|...-}}}}}}}}--...----.}}}}}.|..|..|...|..|} -}|....|.}}}}}}..}}}}}}}}}}---..--------}}}}}-..---}}}}}}}}}.|..|..-------|} -}|...}|...}}}.}}}}}}...}}}}}--..........}}}}..--}}}}}}}}}}}.|..|.........|} -}|...}S...}}.}}}}}}}}}}}}}}}-..--------}}}}}}}}}}}}}}...}}}.|..--------..S} -}|...}|...}}}}}}}..}}}}}}----..|....-}}}}}}}}}}}}}}}}}..}}}.|............|} -}|....|}}}}}....}}}}..}}.-.......----}}......}}}}}}.......}}|............|} -}------}}}}}}}}}}}}}}}}}}---------}}}}}}}}}}}}}}}}}}}}}}}}}}--------------} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -ENDMAP -# Dungeon Description -REGION:(00,00,74,19),lit,"ordinary" -REGION:(02,03,05,16),unlit,"ordinary" -REGION:(61,03,72,16),unlit,"ordinary",unfilled,irregular -REGION:(71,08,72,11),unlit,"ordinary" -REGION:(67,08,69,11),lit,"ordinary" -# Teleport: down to up stairs island, up to Medusa's island -TELEPORT_REGION:(02,03,05,16),(0,0,0,0),down -TELEPORT_REGION:(61,03,72,16),(0,0,0,0),up -# Stairs -STAIR:(04,09),up -STAIR:(68,10),down -# Doors -DOOR:locked,(71,07) -# Branch, not allowed on Medusa's island. -BRANCH:levregion(01,00,79,20),(59,01,73,17) -# Non diggable walls -NON_DIGGABLE:(01,02,06,17) -NON_DIGGABLE:(60,02,73,17) -# Objects -CONTAINER:('`',"statue"),(68,10),uncursed,montype:"knight",3,name:"Perseus" { - [25%]: OBJECT:('[',"shield of reflection"),cursed,+0 - [75%]: OBJECT:('[',"levitation boots"),+0 - [50%]: OBJECT:(')',"scimitar"),blessed,+2 - [50%]: OBJECT:('(',"sack") -} -CONTAINER:('`',"statue"),(64,08) { } -CONTAINER:('`',"statue"),(65,08) { } -CONTAINER:('`',"statue"),(64,09) { } -CONTAINER:('`',"statue"),(65,09) { } -CONTAINER:('`',"statue"),(64,10) { } -CONTAINER:('`',"statue"),(65,10) { } -CONTAINER:('`',"statue"),(64,11) { } -CONTAINER:('`',"statue"),(65,11) { } -OBJECT:('`',"boulder"),(04,04) -OBJECT:'/',(52,09) -OBJECT:('`',"boulder"),(52,09) -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Traps -TRAP:"magic",(03,12) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters. -MONSTER:('@',"Medusa"),(68,10),asleep -MONSTER:('g',"gremlin"),(02,14) -MONSTER:('H',"titan"),(02,05) -MONSTER:(';',"electric eel"),(10,13) -MONSTER:(';',"electric eel"),(11,13) -MONSTER:(';',"electric eel"),(10,14) -MONSTER:(';',"electric eel"),(11,14) -MONSTER:(';',"electric eel"),(10,15) -MONSTER:(';',"electric eel"),(11,15) -MONSTER:(';',"jellyfish"),(01,01) -MONSTER:(';',"jellyfish"),(00,08) -MONSTER:(';',"jellyfish"),(04,19) -MONSTER:(''',"stone golem"),(64,08),asleep -MONSTER:(''',"stone golem"),(65,08),asleep -MONSTER:(''',"stone golem"),(64,09),asleep -MONSTER:(''',"stone golem"),(65,09),asleep -MONSTER:('S',"cobra"),(64,10),asleep -MONSTER:('S',"cobra"),(65,10),asleep -MONSTER:'A',(72,08) -MONSTER:('y',"yellow light"),(72,11),asleep -MONSTER:random,(17,07) -MONSTER:random,(28,11) -MONSTER:random,(32,13) -MONSTER:random,(49,09) -MONSTER:random,(48,07) -MONSTER:random,(65,03) -MONSTER:random,(70,04) -MONSTER:random,(70,15) -MONSTER:random,(65,16) -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random - - -LEVEL:"medusa-3" -FLAGS: noteleport,mazelevel,shortsighted -INIT_MAP:solidfill,' ' -GEOMETRY:center,center -# -# Here you disturb ravens nesting in the trees. -# -MAP -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}T..T.}}}}}}}}}}}}}}}}}}}}..}}}}}}}}.}}}...}}}}}}}.}}}}}......}}}}}}} -}}}}}}.......T.}}}}}}}}}}}..}}}}..T.}}}}}}...T...T..}}...T..}}..-----..}}}}} -}}}...-----....}}}}}}}}}}.T..}}}}}...}}}}}.....T..}}}}}......T..|...|.T..}}} -}}}.T.|...|...T.}}}}}}}.T......}}}}..T..}}.}}}.}}...}}}}}.T.....+...|...}}}} -}}}}..|...|.}}.}}}}}.....}}}T.}}}}.....}}}}}}.T}}}}}}}}}}}}}..T.|...|.}}}}}} -}}}}}.|...|.}}}}}}..T..}}}}}}}}}}}}}T.}}}}}}}}..}}}}}}}}}}}.....-----.}}}}}} -}}}}}.--+--..}}}}}}...}}}}}}}}}}}}}}}}}}}T.}}}}}}}}}}}}}}}}.T.}........}}}}} -}}}}}.......}}}}}}..}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}.}}.T.}}}}}} -}}.T...T...}}}}T}}}}}}}}}}}....}}}}}}}}}}T}}}}}.T}}...}}}}}}}}}}}}}}...}}}}} -}}}...T}}}}}}}..}}}}}}}}}}}.T...}}}}}}}}.T.}.T.....T....}}}}}}}}}}}}}.}}}}}} -}}}}}}}}}}}}}}}....}}}}}}}...}}.}}}}}}}}}}............T..}}}}}.T.}}}}}}}}}}} -}}}}}}}}}}}}}}}}..T..}}}}}}}}}}}}}}..}}}}}..------+--...T.}}}....}}}}}}}}}}} -}}}}.}..}}}}}}}.T.....}}}}}}}}}}}..T.}}}}.T.|...|...|....}}}}}.}}}}}...}}}}} -}}}.T.}...}..}}}}T.T.}}}}}}.}}}}}}}....}}...|...+...|.}}}}}}}}}}}}}..T...}}} -}}}}..}}}.....}}...}}}}}}}...}}}}}}}}}}}}}T.|...|...|}}}}}}}}}}}....T..}}}}} -}}}}}..}}}.T..}}}.}}}}}}}}.T..}}}}}}}}}}}}}}---S-----}}}}}}}}}}}}}....}}}}}} -}}}}}}}}}}}..}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}T..T}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -ENDMAP -$place = { (08,06),(66,05),(46,15) } -SHUFFLE: $place -REGION:(00,00,74,19),lit,"ordinary" -REGION:(49,14,51,16),random,"ordinary",unfilled -REGION:(07,05,09,07),unlit,"ordinary" -REGION:(65,04,67,06),unlit,"ordinary" -REGION:(45,14,47,16),unlit,"ordinary" -# Non diggable walls -# 4th room has diggable walls as Medusa is never placed there -NON_DIGGABLE:(06,04,10,08) -NON_DIGGABLE:(64,03,68,07) -NON_DIGGABLE:(44,13,48,17) -# All places are accessible also with jumping, so don't bother -# restricting the placement when teleporting from levels below this. -TELEPORT_REGION:(33,02,38,07),(0,0,0,0),down -STAIR:(32,01,39,07),(0,0,0,0),up -STAIR:$place[0],down -DOOR:locked,(08,08) -DOOR:locked,(64,05) -DOOR:random,(50,13) -DOOR:locked,(48,15) -# -FOUNTAIN:$place[1] -# -CONTAINER:('`',"statue"),$place[2],uncursed,montype:"knight",3,name:"Perseus" { - [75%]: OBJECT: ('[',"shield of reflection"),cursed,+0 - [25%]: OBJECT: ('[',"levitation boots"),+0 - [50%]: OBJECT: (')',"scimitar"),blessed,+2 - [50%]: OBJECT: ('(',"sack") -} -# -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } - -LOOP [8] { - OBJECT:random,random -} -OBJECT:('?',"blank paper"),(48,18) -OBJECT:('?',"blank paper"),(48,18) -# -TRAP:"rust",random -TRAP:"rust",random -TRAP:"board",random -TRAP:"board",random -TRAP:random,random -# -MONSTER:('@',"Medusa"),$place[0] -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"jellyfish"),random -MONSTER:(';',"jellyfish"),random -MONSTER:('n',"wood nymph"),random -MONSTER:('n',"wood nymph"),random -MONSTER:('n',"water nymph"),random -MONSTER:('n',"water nymph"),random - -LOOP [30] { - MONSTER:('B',"raven"),random,hostile -} - - -LEVEL:"medusa-4" -FLAGS: noteleport,mazelevel -INIT_MAP:solidfill,' ' -GEOMETRY:center,center -# -# Here the Medusa rules some slithery monsters from her 'palace', with -# a yellow dragon nesting in the backyard. -# -MAP -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -}}}}}}}}}}}}}}........}}}}}}}}}}}}}}}}}}}}}}}..}}}.....}}}}}}}}}}}----|}}}}} -}}}}}}..----------F-.....}}}}}}}}}}}}}}}}..---...}}}}....T.}}}}}}}....|}}}}} -}}}.....|...F......S}}}}....}}}}}}}...}}.....|}}.}}}}}}}......}}}}|......}}} -}}}.....+...|..{...|}}}}}}}}}}}}.....}}}}|...|}}}}}}}}}}}.}}}}}}}}----.}}}}} -}}......|...|......|}}}}}}}}}......}}}}}}|.......}}}}}}}}}}}}}..}}}}}...}}}} -}}|-+--F|-+--....|F|-|}}}}}....}}}....}}}-----}}.....}}}}}}}......}}}}.}}}}} -}}|...}}|...|....|}}}|}}}}}}}..}}}}}}}}}}}}}}}}}}}}....}}}}}}}}....T.}}}}}}} -}}|...}}F...+....F}}}}}}}..}}}}}}}}}}}}}}...}}}}}}}}}}}}}}}}}}}}}}....}}..}} -}}|...}}|...|....|}}}|}....}}}}}}....}}}...}}}}}...}}}}}}}}}}}}}}}}}.....}}} -}}--+--F|-+--....-F|-|....}}}}}}}}}}.T...}}}}....---}}}}}}}}}}}}}}}}}}}}}}}} -}}......|...|......|}}}}}.}}}}}}}}}....}}}}}}}.....|}}}}}}}}}.}}}}}}}}}}}}}} -}}}}....+...|..{...|.}}}}}}}}}}}}}}}}}}}}}}}}}}.|..|}}}}}}}......}}}}...}}}} -}}}}}}..|...F......|...}}}}}}}}}}..---}}}}}}}}}}--.-}}}}}....}}}}}}....}}}}} -}}}}}}}}-----S----F|....}}}}}}}}}|...|}}}}}}}}}}}}...}}}}}}...}}}}}}..}}}}}} -}}}}}}}}}..............T...}}}}}.|.......}}}}}}}}}}}}}}..}...}.}}}}....}}}}} -}}}}}}}}}}....}}}}...}...}}}}}.......|.}}}}}}}}}}}}}}.......}}}}}}}}}...}}}} -}}}}}}}}}}..}}}}}}}}}}.}}}}}}}}}}-..--.}}}}}}}}..}}}}}}..T...}}}..}}}}}}}}}} -}}}}}}}}}...}}}}}}}}}}}}}}}}}}}}}}}...}}}}}}}....}}}}}}}.}}}..}}}...}}}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}....}}}}}}}}}}}}}}}}}}}...}}}}}} -}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} -ENDMAP -# -$place = { (04,08),(10,04),(10,08),(10,12) } -SHUFFLE: $place -# -REGION:(00,00,74,19),lit,"ordinary" -REGION:(13,03,18,13),lit,"ordinary",unfilled -# -TELEPORT_REGION:(64,01,74,17),(0,0,0,0),down -TELEPORT_REGION:(02,02,18,13),(0,0,0,0),up -# -STAIR:(67,01,74,20),(0,0,0,0),up -STAIR:$place[0],down -# -DOOR:locked,(04,06) -DOOR:locked,(04,10) -DOOR:locked,(08,04) -DOOR:locked,(08,12) -DOOR:locked,(10,06) -DOOR:locked,(10,10) -DOOR:locked,(12,08) -# -BRANCH:levregion(27,00,79,20),(0,0,0,0) -# -NON_DIGGABLE:(01,01,22,14) -# -OBJECT:('(',"crystal ball"),(07,08) -# -CONTAINER:('`',"statue"),$place[1],uncursed,montype:"knight",3,name:"Perseus" { - [75%]: OBJECT: ('[',"shield of reflection"),cursed,+0 - [25%]: OBJECT: ('[',"levitation boots"),+0 - [50%]: OBJECT: (')',"scimitar"),blessed,+2 - [50%]: OBJECT: ('(',"sack") -} -# -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -CONTAINER:('`',"statue"),random { } -LOOP [8] { - OBJECT:random,random -} -# -LOOP [7] { - TRAP:random,random -} -# -MONSTER:('@',"Medusa"),$place[0] -MONSTER:(';',"kraken"),(07,07) -# -# the nesting dragon -MONSTER:('D',"yellow dragon"), (05,04), asleep -[50%]: MONSTER: ('D',"baby yellow dragon"), (04,04), asleep -[25%]: MONSTER: ('D',"baby yellow dragon"), (04,05), asleep -OBJECT:('%',"egg"), (05,04), montype:"yellow dragon" -[50%]: OBJECT: ('%',"egg"), (05,04), montype:"yellow dragon" -[25%]: OBJECT: ('%',"egg"), (05,04), montype:"yellow dragon" -# -MONSTER:(';',"giant eel"),random -MONSTER:(';',"giant eel"),random -MONSTER:(';',"jellyfish"),random -MONSTER:(';',"jellyfish"),random -LOOP [14] { - MONSTER:'S',random -} -LOOP [4] { - MONSTER:('N',"black naga hatchling"), random - MONSTER:('N',"black naga"), random -} diff --git a/dat/minefill.lua b/dat/minefill.lua new file mode 100644 index 000000000..2992690e6 --- /dev/null +++ b/dat/minefill.lua @@ -0,0 +1,51 @@ +-- NetHack mines minefill.lua $NHDT-Date: 1652196028 2022/05/10 15:20:28 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- + +-- The "fill" level for the mines. +-- +-- This level is used to fill out any levels not occupied by +-- specific levels. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noflip"); + +des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true }) + +-- +des.stair("up") +des.stair("down") +-- +for i = 1,math.random(2, 5) do + des.object("*") +end +des.object("(") +for i = 1,math.random(2, 4) do + des.object() +end +if percent(75) then + for i = 1,math.random(1, 2) do + des.object("boulder") + end +end +-- +for i = 1,math.random(6, 8) do + des.monster("gnome") +end +des.monster("gnome lord") +des.monster("dwarf") +des.monster("dwarf") +des.monster("G") +des.monster("G") +des.monster(percent(50) and "h" or "G") +-- +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() diff --git a/dat/minend-1.lua b/dat/minend-1.lua new file mode 100644 index 000000000..5d690c32c --- /dev/null +++ b/dat/minend-1.lua @@ -0,0 +1,119 @@ +-- NetHack mines minend-1.lua $NHDT-Date: 1652196029 2022/05/10 15:20:29 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- Mine end level variant 1 +-- "Mimic of the Mines" + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ +------------------------------------------------------------------ ------ +| |.......| |.......-...| |.....|. | +| --------- ----.......-------...........| ---...-S- | +| |.......| |..........................-S- --.......| | +| |......------- ---........................|. |.......-- | +| |..--........-----..........................|. -.-..---- | +| --..--.-----........-.....................--- --..-- | +| --..--..| -----------..................---.----------..-- | +| |...--.| |..S...S..............---................-- | +| ----..----- ------------........--- ------------...--- | +| |.........-- ---------- ---...-- ----- | +| --.....---..-- -------- --...---...-- | +| ----..-..-- --..--------------------- --......-- ---........| | +|--....----- --..-..................--- |........| |.......-- | +|.......| --......................S.. --......-- ---..---- | +|--.--.-- ----.................--- ------..------...-- | +| |....S.. |...............-..| ..S...........| | +-------- -------------------- ------------------------ +]]); + +-- Dungeon Description +local place = { {08,16},{13,07},{21,08},{41,14},{50,04},{50,16},{66,01} } +shuffle(place) + +-- make the entry chamber a real room; it affects monster arrival +des.region({ region={26,01,32,01}, lit=0, type="ordinary", irregular=1, arrival_room=true }) +des.region(selection.area(20,08,21,08),"unlit") +des.region(selection.area(23,08,25,08),"unlit"); +-- Secret doors +des.door("locked",07,16) +des.door("locked",22,08) +des.door("locked",26,08) +des.door("locked",40,14) +des.door("locked",50,03) +des.door("locked",51,16) +des.door("locked",66,02) +-- Stairs +des.stair("up", 36,04) +-- Non diggable walls +des.non_diggable(selection.area(00,00,74,17)) +-- Niches +-- Note: place[6] empty +des.object("diamond",place[7]) +des.object("emerald",place[7]) +des.object("worthless piece of violet glass",place[7]) +des.monster({ class="m", coord=place[7], appear_as="obj:luckstone" }) +des.object("worthless piece of white glass",place[1]) +des.object("emerald",place[1]) +des.object("amethyst",place[1]) +des.monster({ class="m", coord=place[1], appear_as="obj:loadstone" }) +des.object("diamond",place[2]) +des.object("worthless piece of green glass",place[2]) +des.object("amethyst",place[2]) +des.monster({ class="m", coord=place[2], appear_as="obj:flint" }) +des.object("worthless piece of white glass",place[3]) +des.object("emerald",place[3]) +des.object("worthless piece of violet glass",place[3]) +des.monster({ class="m", coord=place[3], appear_as="obj:touchstone" }) +des.object("worthless piece of red glass",place[4]) +des.object("ruby",place[4]) +des.object("loadstone",place[4]) +des.object("ruby",place[5]) +des.object("worthless piece of red glass",place[5]) +des.object({ id="luckstone", coord=place[5], buc="not-cursed", achievement=1 }) +-- Random objects +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("(") +des.object("(") +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters +des.monster("gnome king") +des.monster("gnome lord") +des.monster("gnome lord") +des.monster("gnome lord") +des.monster("gnomish wizard") +des.monster("gnomish wizard") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("hobbit") +des.monster("hobbit") +des.monster("dwarf") +des.monster("dwarf") +des.monster("dwarf") +des.monster("h") diff --git a/dat/minend-2.lua b/dat/minend-2.lua new file mode 100644 index 000000000..e85e45870 --- /dev/null +++ b/dat/minend-2.lua @@ -0,0 +1,159 @@ +-- NetHack mines minend-2.lua $NHDT-Date: 1652196029 2022/05/10 15:20:29 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- Mine end level variant 2 +-- "Gnome King's Wine Cellar" + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ +--------------------------------------------------------------------------- +|...................................................| | +|.|---------S--.--|...|--------------------------|..| | +|.||---| |.||-| |...|..........................|..| | +|.||...| |-|.|.|---...|.............................| .. | +|.||...|-|.....|....|-|..........................|..|. .. | +|.||.....|-S|..|....|............................|..|.. | +|.||--|..|..|..|-|..|----------------------------|..|-. | +|.| |..|..|....|..................................|... | +|.| |..|..|----|..-----------------------------|..|.... | +|.|---|..|--|.......|----------------------------|..|..... | +|...........|----.--|......................| |..|....... | +|-----------|...|.| |------------------|.|.|-----|..|.....|.. | +|-----------|.{.|.|--------------------|.|..........|.....|.... | +|...............|.S......................|-------------..-----... | +|.--------------|.|--------------------|.|......................... | +|.................| |.....................|........ | +--------------------------------------------------------------------------- +]]); + +if percent(50) then + des.terrain({55,14},"-") + des.terrain({56,14},"-") + des.terrain({61,15},"|") + des.terrain({52,5}, "S") + des.door("locked", 52,5) +end +if percent(50) then + des.terrain({18,1}, "|") + des.terrain(selection.area(7,12, 8,13), ".") +end +if percent(50) then + des.terrain({49,4}, "|") + des.terrain({21,5}, ".") +end +if percent(50) then + if percent(50) then + des.terrain({22,1}, "|") + else + des.terrain({50,7}, "-") + des.terrain({51,7}, "-") + end +end + +-- uncontrolled arrival (via trap door, level teleport) will be in the central +-- portion of level to prevent ending up stuck in the treasure area, whether +-- arriving from above or below (despite this being bottom of Mines branch, +-- hero might arrive from below by invoking Wiz role's Eye of the Aethiopica) +des.teleport_region({ region={23,03,48,16}, region_islev=1 }) + +-- Dungeon Description +des.feature("fountain", {14,13}) +des.region(selection.area(23,03,48,06),"lit") +des.region(selection.area(21,06,22,06),"lit") +des.region(selection.area(14,04,14,04),"unlit") +des.region(selection.area(10,05,14,08),"unlit") +des.region(selection.area(10,09,11,09),"unlit") +des.region(selection.area(15,08,16,08),"unlit") +-- Secret doors +des.door("locked",12,02) +des.door("locked",11,06) +-- Stairs +des.stair("up", 36,04) +-- Non diggable walls +des.non_diggable(selection.area(00,00,52,17)) +des.non_diggable(selection.area(53,00,74,00)) +des.non_diggable(selection.area(53,17,74,17)) +des.non_diggable(selection.area(74,01,74,16)) +des.non_diggable(selection.area(53,07,55,07)) +des.non_diggable(selection.area(53,14,61,14)) +-- The Gnome King's wine cellar. +-- the Trespassers sign is a long-running joke +des.engraving({12,03}, "engrave", + "You are now entering the Gnome King's wine cellar.") +des.engraving({12,04}, "engrave", "Trespassers will be persecuted!") +des.object("potion of booze", 10, 07) +des.object("potion of booze", 10, 07) +des.object("!", 10, 07) +des.object("potion of booze", 10, 08) +des.object("potion of booze", 10, 08) +des.object("!", 10, 08) +des.object("potion of booze", 10, 09) +des.object("potion of booze", 10, 09) +des.object("potion of object detection", 10, 09) +-- Objects +-- The Treasure chamber... +des.object("diamond", 69, 04) +des.object("*", 69, 04) +des.object("diamond", 69, 04) +des.object("*", 69, 04) +des.object("emerald", 70, 04) +des.object("*", 70, 04) +des.object("emerald", 70, 04) +des.object("*", 70, 04) +des.object("emerald", 69, 05) +des.object("*", 69, 05) +des.object("ruby", 69, 05) +des.object("*", 69, 05) +des.object("ruby", 70, 05) +des.object("amethyst", 70, 05) +des.object("*", 70, 05) +des.object("amethyst", 70, 05) +des.object({ id="luckstone", x=70, y=05, + buc="not-cursed", achievement=1 }); +-- Scattered gems... +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("*") +des.object("(") +des.object("(") +des.object() +des.object() +des.object() +-- Random traps +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- Random monsters. +des.monster("gnome king") +des.monster("gnome lord") +des.monster("gnome lord") +des.monster("gnome lord") +des.monster("gnomish wizard") +des.monster("gnomish wizard") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("hobbit") +des.monster("hobbit") +des.monster("dwarf") +des.monster("dwarf") +des.monster("dwarf") +des.monster("h") diff --git a/dat/minend-3.lua b/dat/minend-3.lua new file mode 100644 index 000000000..411e1ac67 --- /dev/null +++ b/dat/minend-3.lua @@ -0,0 +1,107 @@ +-- NetHack mines minend-3.lua $NHDT-Date: 1652196029 2022/05/10 15:20:29 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- "Catacombs" by Kelly Bailey +-- Relies on some very specific behavior of MAZEWALK. + +des.level_init({ style = "solidfill", fg = "-" }); + +des.level_flags("mazelevel", "nommap") + +des.map({ halign = "center", valign = "bottom", map = [[ + - - - - - - - - - - -- -- - - . - - - - - - - - - -- - - -- - - - - . - - | +------...---------.-----------...-----.-------.------- ----------------| + - - - - - - - - - - - . - - - . - - - - - - - - - - -- - -- - . - - - - - | +------------.---------...-------------------------.--- ------------------| + - - - - - - - - - - . . - - --- - . - - - - - - - - -- -- - - - - |.....| | +--.---------------.......------------------------------- ----------|.....S-| + - - - - |.. ..| - ....... . - - - - |.........| - - - --- - - - - |.....| | +----.----|.....|------.......--------|.........|--------------.------------| + - - - - |..{..| - - -.... . --- - -.S.........S - - - - - - - - - - - - - | +---------|.....|--.---...------------|.........|---------------------------| + - - - - |.. ..| - - - . - - - - - - |.........| - --- . - - - - - - - - - | +----------------------...-------.---------------------...------------------| +---..| - - - - - - - - . --- - - - - - - - - - - - - - . - - --- - - --- - | +-.S..|----.-------.------- ---------.-----------------...----- -----.------- +---..| - - - - - - - -- - - -- . - - - - - . - - - . - . - - -- -- - - - -- +-.S..|--------.---.--- -...---------------...{.--------- --------- +--|. - - - - - - - -- - - - -- . - - - --- - - - . . - - - - -- - - - - - - +]] }); + +local place = { {1,15},{68,6},{1,13} } +shuffle(place) + +des.non_diggable(selection.area(67,3,73,7)) +des.non_diggable(selection.area(0,12,2,16)) +des.feature("fountain", {12,08}) +des.feature("fountain", {51,15}) +des.region(selection.area(0,0,75,16),"unlit") +des.region(selection.area(38,6,46,10),"lit") +des.door("closed",37,8) +des.door("closed",47,8) +des.door("closed",73,5) +des.door("closed",2,15) +des.mazewalk({ x=36, y=8, dir="west", stocked=false }) +des.stair("up", 42,8) +des.wallify() + +-- Objects +des.object("diamond") +des.object("*") +des.object("diamond") +des.object("*") +des.object("emerald") +des.object("*") +des.object("emerald") +des.object("*") +des.object("emerald") +des.object("*") +des.object("ruby") +des.object("*") +des.object("ruby") +des.object("amethyst") +des.object("*") +des.object("amethyst") +des.object({ id="luckstone", coord=place[2], buc="not-cursed", achievement=1 }) +des.object("flint",place[1]) +des.object("?") +des.object("?") +des.object("?") +des.object("?") +des.object("?") +des.object("+") +des.object("+") +des.object("+") +des.object("+") +des.object() +des.object() +des.object() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +des.trap() +-- One-time annoyance factor +des.trap("level teleport",place[2]) +des.trap("level teleport",place[1]) +des.monster("M") +des.monster("M") +des.monster("M") +des.monster("M") +des.monster("M") +des.monster("ettin mummy") +des.monster("V") +des.monster("Z") +des.monster("Z") +des.monster("Z") +des.monster("Z") +des.monster("Z") +des.monster("V") +des.monster("e") +des.monster("e") +des.monster("e") +des.monster("e") diff --git a/dat/mines.des b/dat/mines.des deleted file mode 100644 index 1ef2031f5..000000000 --- a/dat/mines.des +++ /dev/null @@ -1,1209 +0,0 @@ -# NetHack 3.6 mines.des $NHDT-Date: 1548631704 2019/01/27 23:28:24 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.30 $ -# Copyright (c) 1989-95 by Jean-Christophe Collet -# Copyright (c) 1991-95 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# - -# The "fill" level for the mines. -# -# This level is used to fill out any levels not occupied by -# specific levels as defined below. -# -MAZE: "minefill" , ' ' -INIT_MAP: mines, '.' , ' ' , true , true , random , true -NOMAP -# -STAIR: random, up -STAIR: random, down -# -OBJECT: '*', random -OBJECT: '*', random -OBJECT: '*', random -OBJECT: '(', random -OBJECT: random, random -OBJECT: random, random -OBJECT: random, random -# -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome lord"), random -MONSTER: ('h', "dwarf"), random -MONSTER: ('h', "dwarf"), random -MONSTER: 'G', random -MONSTER: 'G', random -MONSTER: 'h', random -# -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random - - -# A tragic accident has occurred in Frontier Town.... -# -# Minetown variant 1 -# Orcish Town - a variant of Frontier Town that has been -# overrun by orcs. Note the barricades (iron bars). -# -LEVEL: "minetn-1" -FLAGS:mazelevel -INIT_MAP:mines,'.',' ',true,true,random,true -GEOMETRY:center,center -MAP -..................................... -.----------------F------------------. -.|.................................|. -.|.-------------......------------.|. -.|.|...|...|...|......|..|...|...|.|. -.F.|...|...|...|......|..|...|...|.|. -.|.|...|...|...|......|..|...|...|.F. -.|.|...|...|----......------------.|. -.|.---------.......................|. -.|.................................|. -.|.---------.....--...--...........|. -.|.|...|...|----.|.....|.---------.|. -.|.|...|...|...|.|.....|.|..|....|.|. -.|.|...|...|...|.|.....|.|..|....|.|. -.|.|...|...|...|.|.....|.|..|....|.|. -.|.-------------.-------.---------.|. -.|.................................F. -.-----------F------------F----------. -..................................... -ENDMAP - -# Don't let the player fall into his likely death -TELEPORT_REGION:levregion(01,01,20,19),levregion(20,00,70,19) -REGION:(00,00,36,16),lit,"ordinary" -STAIR:levregion(01,03,20,19),(00,00,36,15),up -STAIR:levregion(61,03,75,19),(00,00,36,15),down - -# shame we can't make polluted fountains -FOUNTAIN:(16,09) -FOUNTAIN:(25,09) - -# the altar's defiled; useful for BUC but never coaligned -ALTAR:(20,13),noalign,shrine - -# set up the shop doors; could be broken down -DOOR:random,(5,8) -DOOR:random,(9,8) -DOOR:random,(13,7) -DOOR:random,(22,5) -DOOR:random,(27,7) -DOOR:random,(31,7) -DOOR:random,(5,10) -DOOR:random,(9,10) -DOOR:random,(15,13) -DOOR:random,(25,13) -DOOR:random,(31,11) - -# knock a few holes in the shop interior walls -REPLACE_TERRAIN:(07,04,11,06),'|','.',18% -REPLACE_TERRAIN:(25,04,29,06),'|','.',18% -REPLACE_TERRAIN:(07,12,11,14),'|','.',18% -REPLACE_TERRAIN:(28,12,28,14),'|','.',33% - -# One spot each in most shops... -$place = { (05,04),(09,05),(13,04),(26,04),(31,05),(30,14),(05,14),(10,13),(26,14),(27,13) } -SHUFFLE:$place - -# scatter some bodies -OBJECT:('%',"corpse"),(20,12),montype:"aligned priest" -OBJECT:('%',"corpse"),$place[0],montype:"shopkeeper" -OBJECT:('%',"corpse"),$place[1],montype:"shopkeeper" -OBJECT:('%',"corpse"),$place[2],montype:"shopkeeper" -OBJECT:('%',"corpse"),$place[3],montype:"shopkeeper" -OBJECT:('%',"corpse"),$place[4],montype:"shopkeeper" -OBJECT:('%',"corpse"),random,montype:"watchman" -OBJECT:('%',"corpse"),random,montype:"watchman" -OBJECT:('%',"corpse"),random,montype:"watchman" -OBJECT:('%',"corpse"),random,montype:"watchman" -OBJECT:('%',"corpse"),random,montype:"watch captain" - -# Rubble! -LOOP [9 + 2d5] { - [90%]: OBJECT:('`',"boulder"),random - OBJECT:('*',"rock"),random -} - -# Guarantee 7 candles since we won't have Izchak available -OBJECT:('(',"wax candle"),$place[0],quantity:1d2 -OBJECT:('(',"wax candle"),$place[1],quantity:2d2 -OBJECT:('(',"wax candle"),$place[2],quantity:1d2 -OBJECT:('(',"tallow candle"),$place[3],quantity:1d3 -OBJECT:('(',"tallow candle"),$place[2],quantity:1d2 -OBJECT:('(',"tallow candle"),$place[0],quantity:1d2 - -# go ahead and leave a lamp next to one corpse to be suggestive -# and some empty wands... -OBJECT:('(',"oil lamp"),$place[2] -OBJECT:('/',"striking"),$place[1],uncursed,0 -OBJECT:('/',"striking"),$place[3],uncursed,0 -OBJECT:('/',"striking"),$place[4],uncursed,0 -OBJECT:('/',"magic missile"),$place[4],uncursed,0 -OBJECT:('/',"magic missile"),$place[0],uncursed,0 - -# the Orcish Army - -$inside = selection: floodfill(18,8) -$near_temple = selection: filter(fillrect(17,8, 23,14), $inside) - -LOOP [5 + 1d10] { - IF [50%] { - MONSTER: ('o', "orc-captain"), rndcoord($inside), hostile - } ELSE { - IF [80%] { - MONSTER: ('o', "Uruk-hai"), rndcoord($inside), hostile - } ELSE { - MONSTER: ('o', "Mordor orc"), rndcoord($inside), hostile - } - } -} -# shamans can be hanging out in/near the temple -LOOP [2d3] { - MONSTER: ('o', "orc shaman"), rndcoord($near_temple), hostile -} -# these are not such a big deal -# to run into outside the bars -LOOP [9 + 2d5] { - IF [90%] { - MONSTER: ('o', "hill orc"), random, hostile - } ELSE { - MONSTER: ('o', "goblin"), random, hostile - } -} - -# Hack to force full-level wallification -NOMAP -WALLIFY - - -# Minetown variant 2 -# "Town Square" -# -LEVEL: "minetn-2" -ROOM: "ordinary" , lit, (3,3), (center,center), (31,15) { -FOUNTAIN: (17, 5) -FOUNTAIN: (13, 8) - -[75%]: SUBROOM: "ordinary", random, (2,0), (2,2) { - ROOMDOOR: false, closed, west, random -} - -[75%]: SUBROOM: "ordinary", unlit, (5,0), (2,2) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", random, (8,0), (2,2) { - ROOMDOOR: false, closed, east, random -} - -[75%]: SUBROOM: "ordinary", lit, (16,0), (2,2) { - ROOMDOOR: false, closed, west, random -} - -[75%]: SUBROOM: "ordinary", unlit, (19,0), (2,2) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", random, (22,0), (2,2) { - ROOMDOOR: false, locked, south, random - MONSTER: ('G', "gnome"), random -} - -[75%]: SUBROOM: "ordinary", unlit, (25,0), (2,2) { - ROOMDOOR: false, closed, east, random -} - -[75%]: SUBROOM: "ordinary", lit, (2,5), (2,2) { - ROOMDOOR: false, closed, north, random -} - -[75%]: SUBROOM: "ordinary", lit, (5,5), (2,2) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", random, (8,5), (2,2) { - ROOMDOOR: false, locked, north, random - MONSTER: ('G', "gnome"), random -} - -SUBROOM: "shop" [90%] , lit, (2,10), (4,3) { - ROOMDOOR: false, closed, west, random -} - -SUBROOM: "tool shop" [90%], lit, (23,10), (4,3) { - ROOMDOOR: false, closed, east, random -} - -SUBROOM: "food shop" [90%], lit, (24,5), (3,4) { - ROOMDOOR: false, closed, north, random -} - -SUBROOM: "candle shop", lit, (11,10), (4,3) { - ROOMDOOR: false, closed, east, random -} - -[75%]: SUBROOM: "ordinary", unlit, (7,10), (3,3) { - ROOMDOOR: false, locked, north, random - MONSTER: ('G', "gnome"), random -} - -SUBROOM: "temple", lit, (19,5), (4,4) { - ROOMDOOR: false, closed, north, random - ALTAR:(02,02),align[0],shrine - MONSTER: ('G', "gnomish wizard"), random - MONSTER: ('G', "gnomish wizard"), random -} - -[75%]: SUBROOM: "ordinary", lit, (18,10), (4,3) { - ROOMDOOR: false, locked, west, random - MONSTER: ('G', "gnome lord"), random -} - -# The Town Watch -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful - -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - TRAP: random, random - MONSTER: ('G', "gnome"), random - MONSTER: ('G', "gnome"), random -} - -ROOM: "ordinary" , random, random, random, random { - MONSTER: ('h', "dwarf"), random -} - -ROOM: "ordinary" , random, random, random, random { - TRAP: random, random - MONSTER: ('G', "gnome"), random -} - -RANDOM_CORRIDORS - - -# Minetown variant 3 by Kelly Bailey -# "Alley Town" -# -LEVEL: "minetn-3" -ROOM: "ordinary",lit,(3,3),(center,center),(31,15) { -FOUNTAIN:(01,06) -FOUNTAIN:(29,13) - -SUBROOM:"ordinary",random,(2,2),(2,2) { - ROOMDOOR: false,closed,south,random -} - -SUBROOM:"tool shop" [30%], lit,(5,3),(2,3) { - ROOMDOOR: false,closed,south,random -} - -SUBROOM:"ordinary",random,(2,10),(2,3) { - ROOMDOOR: false, locked, north, random - MONSTER: 'G',random -} - -SUBROOM:"ordinary",random,(5,9),(2,2) { - ROOMDOOR: false,closed,north,random -} - -SUBROOM:"temple",lit,(10,2),(3,4) { - ROOMDOOR: false,closed,east,random - ALTAR:(1,1),align[0],shrine - MONSTER: ('G', "gnomish wizard"), random - MONSTER: ('G', "gnomish wizard"), random -} - -SUBROOM:"ordinary",random,(11,7),(2,2) { - ROOMDOOR: false,closed,west,random -} - -SUBROOM:"shop",lit,(10,10),(3,3) { - ROOMDOOR:false,closed,west,random -} - -SUBROOM:"ordinary",random,(14,8),(2,2) { - ROOMDOOR:false,locked,north,random - MONSTER: 'G',random -} - -SUBROOM:"ordinary",random,(14,11),(2,2) { - ROOMDOOR:false,closed,south,random -} - -SUBROOM:"tool shop" [40%],lit,(17,10),(3,3) { - ROOMDOOR:false,closed,north,random -} - -SUBROOM:"ordinary",random,(21,11),(2,2) { - ROOMDOOR:false,locked,east,random - MONSTER:'G',random -} - -SUBROOM:"food shop" [90%],lit,(26,8),(3,2) { - ROOMDOOR:false,closed,west,random -} - -SUBROOM:"ordinary",random,(16,2),(2,2) { - ROOMDOOR:false,closed,west,random -} - -SUBROOM:"ordinary",random,(19,2),(2,2) { - ROOMDOOR:false,closed,north,random -} - -SUBROOM:"wand shop" [30%],lit,(19,5),(3,2) { - ROOMDOOR:false,closed,west,random -} - -SUBROOM: "candle shop",lit,(25,2),(3,3) { - ROOMDOOR:false,closed,south,random -} - -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful - -} - -ROOM: "ordinary", random, random, random, random { - STAIR: random, up -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - TRAP: random, random - MONSTER: ('G', "gnome"), random - MONSTER: ('G', "gnome"), random -} - -ROOM: "ordinary" , random, random, random, random { - MONSTER: ('h', "dwarf"), random -} - -ROOM: "ordinary" , random, random, random, random { - TRAP: random, random - MONSTER: ('G', "gnome"), random -} - -RANDOM_CORRIDORS - - -# Minetown variant 4 by Kelly Bailey -# "College Town" -# -LEVEL: "minetn-4" -ROOM: "ordinary",lit,(3,3),(center,center),(30,15) { -FOUNTAIN:(08,07) -FOUNTAIN:(18,07) - -SUBROOM:"book shop",lit,(4,2),(3,3) { - ROOMDOOR: false,closed,south,random -} - -SUBROOM:"ordinary",random,(8,2),(2,2) { - ROOMDOOR: false,closed,south,random -} - -SUBROOM:"temple",lit,(11,3),(5,4) { - ROOMDOOR: false,closed,south,random - ALTAR:(2,1),align[0],shrine - MONSTER: ('G', "gnomish wizard"), random - MONSTER: ('G', "gnomish wizard"), random -} - -SUBROOM:"ordinary",random,(19,2),(2,2) { - ROOMDOOR: false,closed,south,random - MONSTER: 'G', random -} - -SUBROOM:"candle shop",lit,(22,2),(3,3) { - ROOMDOOR:false,closed,south,random -} - -SUBROOM:"ordinary",random,(26,2),(2,2) { - ROOMDOOR:false,locked,east,random - MONSTER: 'G',random -} - -SUBROOM:"tool shop" [90%],lit,(4,10),(3,3) { - ROOMDOOR:false,closed,north,random -} - -SUBROOM:"ordinary",random,(8,11),(2,2) { - ROOMDOOR:false,locked,south,random - MONSTER: ('k',"kobold shaman"),random - MONSTER: ('k',"kobold shaman"),random - MONSTER: ('f',"kitten"),random - MONSTER: 'f',random -} - -SUBROOM:"food shop" [90%],lit,(11,11),(3,2) { - ROOMDOOR:false,closed,east,random -} - -SUBROOM:"ordinary",random,(17,11),(2,2) { - ROOMDOOR:false,closed,west,random -} - -SUBROOM:"ordinary",random,(20,10),(2,2) { - ROOMDOOR:false,locked,north,random - MONSTER:'G',random -} - -SUBROOM:"shop" [90%],lit,(23,10),(3,3) { - ROOMDOOR:false,closed,north,random -} - -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful - -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - TRAP: random, random - MONSTER: ('G', "gnome"), random - MONSTER: ('G', "gnome"), random -} - -ROOM: "ordinary" , random, random, random, random { - MONSTER: ('h', "dwarf"), random -} - -ROOM: "ordinary" , random, random, random, random { - TRAP: random, random - MONSTER: ('G', "gnome"), random -} - -RANDOM_CORRIDORS - - -# "Grotto Town" by Kelly Bailey -# -MAZE: "minetn-5",' ' -GEOMETRY:center,center -MAP ------ --------- -|...--- ------.......-- ------- --------------- -|.....----.........--..| |.....| ------- |.............| ---..-....-.----------..| |.....| |.....| --+---+--.----+- - --.--.....---- ---- |.....| ------ --....---- |..-...--.-.+..| - ---.........---- ----- ---+--- |..+.| ---..-..----..---+-..---..| - ----.-....|..----...-- |.| |..|.| ---+-.....-+--........--+- - -----..|....-.....---- |.| |..|.------......--................| - ------ |..|.............---.-- ----.+..|-.......--..--------+--..-- - |....| --......---...........----- |.|..|-...{....---|.........|..-- - |....| |........-...-...........----.|..|--.......| |.........|...| - ---+--------....-------...---......--.-------....---- -----------...| - ------.---...--...--..-..--...-..---...|.--..-...-....------- |.......-- - |..|-.........-..---..-..---.....--....|........---...-|....| |.------- - |..+...............-+---+-----..--..........--....--...+....| |.|...S. ------.....{....----...............-...........--...-...-|....| |.|...| -|..............-- --+--.---------.........--..-........------- |.--+------- --+-----.........| |...|.|....| --.......------...|....---------.....|....| -|...| --..------- |...|.+....| ---...--- --..|...--......-...{..+..-+| -|...| ---- ------|....| ----- -----.....----........|..|.| ------ ------ ------- --------------- -ENDMAP - -IF [75%] { - IF [50%] { - TERRAIN:line (25,8),(25,9), '|' - } ELSE { - TERRAIN:line (16,13),(17,13), '-' - } -} -IF [75%] { - IF [50%] { - TERRAIN:line (36,10),(36,11), '|' - } ELSE { - TERRAIN:line (32,15),(33,15), '-' - } -} -IF [50%] { - TERRAIN:fillrect (21,4,22,5), '.' - TERRAIN:line (14,9),(14,10), '|' -} -IF [50%] { - TERRAIN:(46,13), '|' - TERRAIN:line (43,5),(47,5), '-' - TERRAIN:line (42,6),(46,6), '.' - TERRAIN:line (46,7),(47,7), '.' -} -[50%]: TERRAIN:fillrect (69,11,71,11), '-' - -STAIR:(01,01),up -STAIR:(46,03),down -FOUNTAIN:(50,09) -FOUNTAIN:(10,15) -FOUNTAIN:(66,18) - -REGION:(00,00,74,20),unlit,"ordinary" -REGION:(09,13,11,17),lit,"ordinary" -REGION:(08,14,12,16),lit,"ordinary" -REGION:(49,07,51,11),lit,"ordinary" -REGION:(48,08,52,10),lit,"ordinary" -REGION:(64,17,68,19),lit,"ordinary" -REGION:(37,13,39,17),lit,"ordinary" -REGION:(36,14,40,17),lit,"ordinary" -REGION:(59,02,72,10),lit,"ordinary" - -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome lord"), random -MONSTER: ('G', "gnome lord"), random -MONSTER: ('h', "dwarf"), random -MONSTER: ('h', "dwarf"), random -MONSTER: ('h', "dwarf"), random - -# The shops -REGION:(25,17,28,19),lit,"candle shop" -DOOR:closed,(24,18) -REGION:(59,9,67,10),lit,"shop" -DOOR:closed,(66,08) -REGION:(57,13,60,15),lit,"tool shop" -DOOR:closed,(56,14) -REGION:(05,09,08,10),lit,"food shop" -DOOR:closed,(07,11) -# Gnome homes -DOOR:closed,(04,14) -DOOR:locked,(01,17) -MONSTER: ('G', "gnomish wizard"), (02,19) -DOOR:locked,(20,16) -MONSTER: 'G', (20,18) -DOOR:random,(21,14) -DOOR:random,(25,14) -DOOR:random,(42,08) -DOOR:locked,(40,05) -MONSTER: 'G', (38,07) -DOOR:random,(59,03) -DOOR:random,(58,06) -DOOR:random,(63,03) -DOOR:random,(63,05) -DOOR:locked,(71,03) -DOOR:locked,(71,06) -DOOR:closed,(69,04) -DOOR:closed,(67,16) -MONSTER: ('G', "gnomish wizard"), (67,14) -OBJECT: '=', (70,14) -DOOR:locked,(69,18) -MONSTER: ('G', "gnome lord"), (71,19) -DOOR:locked,(73,18) -OBJECT: ('(', "chest"), (73,19) -DOOR:locked,(50,06) -OBJECT: '(', (50,03) -OBJECT: ('`', "statue"), (38,15), montype:"gnome king", 1 -# Temple -REGION:(29,02,33,04),lit,"temple" -DOOR:closed,(31,05) -ALTAR:(31,03),align[0],shrine - - -# "Bustling Town" by Kelly Bailey -# -MAZE: "minetn-6",' ' -FLAGS: inaccessibles -INIT_MAP:mines,'.','-',true,true,lit,true -GEOMETRY:center,top -MAP -.-----................----------------.- -.|...|................|...|..|...|...|.. -.|...+..--+--.........|...|..|...|...|.. -.|...|..|...|..-----..|...|..|-+---+--.. -.-----..|...|--|...|..--+---+-.........| -........|...|..|...+.............-----.. -........-----..|...|......--+-...|...|.. -.----...|...|+------..{...|..|...+...|.. -.|..+...|...|.............|..|...|...|.. -.|..|...|...|-+-.....---+-------------.| -.----...--+--..|..-+-|.................. -...|........|..|..|..|----....---------. -...|..T.....----..|..|...+....|......|-. -...|-....{........|..|...|....+......|-. -...--..-....T.....--------....|......|-. -.......--.....................---------- -ENDMAP - -REGION:(00,00,38,15),lit,"ordinary" -STAIR:levregion(01,03,20,19),(0,0,39,15),up -STAIR:levregion(61,03,75,19),(0,0,39,15),down -FOUNTAIN:(22,07) -FOUNTAIN:(09,13) -REGION:(13,5,14,6),unlit,"ordinary" -REGION:(9,7,11,9),lit,"candle shop" -REGION:(16,4,18,6),lit,"tool shop" -REGION:(23,1,25,3),lit,"shop" -REGION:(22,12,24,13),lit,"food shop" -REGION:(31,12,36,14),lit,"temple" -ALTAR:(35,13),align[0],shrine - -DOOR:closed,(5,2) -DOOR:locked,(4,8) -DOOR:closed,(10,2) -DOOR:closed,(10,10) -DOOR:locked,(13,7) -DOOR:locked,(14,9) -DOOR:closed,(19,5) -DOOR:closed,(19,10) -DOOR:closed,(24,4) -DOOR:closed,(24,9) -DOOR:closed,(25,12) -DOOR:closed,(28,4) -DOOR:locked,(28,6) -DOOR:closed,(30,13) -DOOR:closed,(31,3) -DOOR:closed,(35,3) -DOOR:closed,(33,7) - -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), random -MONSTER: ('G', "gnome"), (14,6) -MONSTER: ('G', "gnome lord"), (14,5) -MONSTER: ('G', "gnome"), (27,8) -MONSTER: ('G', "gnome lord"), random -MONSTER: ('G', "gnome lord"), random -MONSTER: ('h', "dwarf"), random -MONSTER: ('h', "dwarf"), random -MONSTER: ('h', "dwarf"), random -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful - - -# "Bazaar Town" by Kelly Bailey -# -LEVEL: "minetn-7" -ROOM: "ordinary" , lit, (3,3), (center,center), (30,15) { -FOUNTAIN: (12, 07) -FOUNTAIN: (11, 13) - -[75%]: SUBROOM: "ordinary", random, (2,2), (4,2) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", random, (7,2), (2,2) { - ROOMDOOR: false, closed, north, random -} - -[75%]: SUBROOM: "ordinary", random, (7,5), (2,2) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", lit, (10,2), (3,4) { - MONSTER:('G',"gnome"),random - MONSTER:('Y',"monkey"),random - MONSTER:('Y',"monkey"),random - MONSTER:('Y',"monkey"),random - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", random, (14,2), (4,2) { - ROOMDOOR: false, closed, south, 0 - MONSTER: 'n', random -} - -[75%]: SUBROOM: "ordinary", random, (16,5), (2,2) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", unlit, (19,2), (2,2) { - ROOMDOOR: false, locked, east, random - MONSTER: ('G',"gnome king"),random -} - -SUBROOM: "food shop" [50%], lit, (19,5), (2,3) { - ROOMDOOR: false, closed, south, random -} - -[75%]: SUBROOM: "ordinary", random, (2,7), (2,2) { - ROOMDOOR: false, closed, east, random -} - -SUBROOM: "tool shop" [50%], lit, (2,10), (2,3) { - ROOMDOOR: false, closed, south, random -} - -SUBROOM: "candle shop", lit, (5,10),(3,3) { - ROOMDOOR: false, closed, north, random -} - -[75%]: SUBROOM: "ordinary", random, (11,10), (2,2) { - ROOMDOOR: false, locked, west, random - MONSTER: 'G',random -} - -SUBROOM: "shop" [60%], lit, (14,10), (2,3) { - ROOMDOOR: false, closed, north, random -} - -[75%]: SUBROOM: "ordinary", random, (17,11), (4,2) { - ROOMDOOR: false, closed, north, random -} - -[75%]: SUBROOM: "ordinary", random, (22,11), (2,2) { - ROOMDOOR: false, closed, south, random - SINK: (00,00) -} - -SUBROOM: "food shop" [50%], lit, (25,11), (3,2) { - ROOMDOOR: false, closed, east, random -} - -SUBROOM: "tool shop" [30%], lit, (25,2), (3,3) { - ROOMDOOR: false, closed, west, random -} - -SUBROOM: "temple", lit, (24,6), (4,4) { - ROOMDOOR: false, closed, west, random - ALTAR:(02,01),align[0],shrine - MONSTER: ('G', "gnomish wizard"), random - MONSTER: ('G', "gnomish wizard"), random -} - -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watchman"), random, peaceful -MONSTER: ('@', "watch captain"), random, peaceful -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('Y',"monkey"),random -MONSTER:('Y',"monkey"),random - -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - TRAP: random, random - MONSTER: ('G', "gnome"), random - MONSTER: ('G', "gnome"), random -} - -ROOM: "ordinary" , random, random, random, random { - MONSTER: ('h', "dwarf"), random -} - -ROOM: "ordinary" , random, random, random, random { - TRAP: random, random - MONSTER: ('G', "gnome"), random -} - -RANDOM_CORRIDORS - - -# Mine end level variant 1 -# "Mimic of the Mines" -# -MAZE: "minend-1", ' ' -GEOMETRY:center,center -#1234567890123456789012345678901234567890123456789012345678901234567890 -MAP ------------------------------------------------------------------- ------ -| |.......| |.......-...| |.....|. | -| --------- ----.......-------...........| ---...-S- | -| |.......| |..........................-S- --.......| | -| |......------- ---........................|. |.......-- | -| |..--........-----..........................|. -.-..---- | -| --..--.-----........-.....................--- --..-- | -| --..--..| -----------..................---.----------..-- | -| |...--.| |..S...S..............---................-- | -| ----..----- ------------........--- ------------...--- | -| |.........-- ---------- ---...-- ----- | -| --.....---..-- -------- --...---...-- | -| ----..-..-- --..--------------------- --......-- ---........| | -|--....----- --..-..................--- |........| |.......-- | -|.......| --......................S.. --......-- ---..---- | -|--.--.-- ----.................--- ------..------...-- | -| |....S.. |...............-..| ..S...........| | --------- -------------------- ------------------------ -ENDMAP - -# Dungeon Description -$place = { (08,16),(13,07),(21,08),(41,14),(50,04),(50,16),(66,01) } -SHUFFLE: $place - -REGION:(26,01,32,01),unlit,"ordinary",filled,irregular -REGION:(20,08,21,08),unlit,"ordinary" -REGION:(23,08,25,08),unlit,"ordinary" -# Secret doors -DOOR:locked,(07,16) -DOOR:locked,(22,08) -DOOR:locked,(26,08) -DOOR:locked,(40,14) -DOOR:locked,(50,03) -DOOR:locked,(51,16) -DOOR:locked,(66,02) -# Stairs -STAIR:(36,04),up -# Non diggable walls -NON_DIGGABLE:(00,00,74,17) -# Niches -# Note: $place[6] empty -OBJECT:('*',"diamond"),$place[0] -OBJECT:('*',"emerald"),$place[0] -OBJECT:('*',"worthless piece of violet glass"),$place[0] -MONSTER:'m',$place[0], m_object "luckstone" -OBJECT:('*',"worthless piece of white glass"),$place[1] -OBJECT:('*',"emerald"),$place[1] -OBJECT:('*',"amethyst"),$place[1] -MONSTER:'m',$place[1], m_object "loadstone" -OBJECT:('*',"diamond"),$place[2] -OBJECT:('*',"worthless piece of green glass"),$place[2] -OBJECT:('*',"amethyst"),$place[2] -MONSTER:'m',$place[2], m_object "flint" -OBJECT:('*',"worthless piece of white glass"),$place[3] -OBJECT:('*',"emerald"),$place[3] -OBJECT:('*',"worthless piece of violet glass"),$place[3] -MONSTER:'m',$place[3], m_object "touchstone" -OBJECT:('*',"worthless piece of red glass"),$place[4] -OBJECT:('*',"ruby"),$place[4] -OBJECT:('*',"loadstone"),$place[4] -OBJECT:('*',"ruby"),$place[5] -OBJECT:('*',"worthless piece of red glass"),$place[5] -OBJECT:('*',"luckstone"),$place[5] -# Random objects -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'(',random -OBJECT:'(',random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters -MONSTER:('G',"gnome king"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('G',"gnomish wizard"),random -MONSTER:('G',"gnomish wizard"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('h',"hobbit"),random -MONSTER:('h',"hobbit"),random -MONSTER:('h',"dwarf"),random -MONSTER:('h',"dwarf"),random -MONSTER:('h',"dwarf"),random -MONSTER:'h',random - - -# Mine end level variant 2 -# "Gnome King's Wine Cellar" -# -MAZE: "minend-2", ' ' -GEOMETRY:center,center -MAP ---------------------------------------------------------------------------- -|...................................................| | -|.|---------S--.--|...|--------------------------|..| | -|.||---| |.||-| |...|..........................|..| | -|.||...| |-|.|.|---...|.............................| .. | -|.||...|-|.....|....|-|..........................|..|. .. | -|.||.....|-S|..|....|............................|..|.. | -|.||--|..|..|..|-|..|----------------------------|..|-. | -|.| |..|..|....|..................................|... | -|.| |..|..|----|..-----------------------------|..|.... | -|.|---|..|--|.......|----------------------------|..|..... | -|...........|----.--|......................| |..|....... | -|-----------|...|.| |------------------|.|.|-----|..|.....|.. | -|-----------|.{.|.|--------------------|.|..........|.....|.... | -|...............|.S......................|-------------..-----... | -|.--------------|.|--------------------|.|......................... | -|.................| |.....................|........ | ---------------------------------------------------------------------------- -ENDMAP - -IF [50%] { - TERRAIN:(55,14),'-' - TERRAIN:(56,14),'-' - TERRAIN:(61,15),'|' - TERRAIN:(52,5), 'S' - DOOR:locked, (52,5) -} -IF [50%] { - TERRAIN:(18,1), '|' - TERRAIN:rect (7,12, 8,13), '.' -} -IF [50%] { - TERRAIN:(49,4), '|' - TERRAIN:(21,5), '.' -} -IF [50%] { - IF [50%] { - TERRAIN:(22,1), '|' - } ELSE { - TERRAIN:(50,7), '-' - TERRAIN:(51,7), '-' - } -} - - -# Dungeon Description -FOUNTAIN:(14,13) -REGION:(23,03,48,06),lit,"ordinary" -REGION:(21,06,22,06),lit,"ordinary" -REGION:(14,04,14,04),unlit,"ordinary" -REGION:(10,05,14,08),unlit,"ordinary" -REGION:(10,09,11,09),unlit,"ordinary" -REGION:(15,08,16,08),unlit,"ordinary" -# Secret doors -DOOR:locked,(12,02) -DOOR:locked,(11,06) -# Stairs -STAIR:(36,04),up -# Non diggable walls -NON_DIGGABLE:(00,00,52,17) -NON_DIGGABLE:(53,00,74,00) -NON_DIGGABLE:(53,17,74,17) -NON_DIGGABLE:(74,01,74,16) -NON_DIGGABLE:(53,07,53,07) -NON_DIGGABLE:(58,12,58,13) -NON_DIGGABLE:(53,14,61,14) -NON_DIGGABLE:(61,15,61,16) -# The Gnome King's wine cellar. -# the Trespassers sign is a long-running joke -ENGRAVING:(12,03),engrave,"You are now entering the Gnome King's wine cellar." -ENGRAVING:(12,04),engrave,"Trespassers will be persecuted!" -OBJECT:('!',"booze"),(10,07) -OBJECT:('!',"booze"),(10,07) -OBJECT:'!',(10,07) -OBJECT:('!',"booze"),(10,08) -OBJECT:('!',"booze"),(10,08) -OBJECT:'!',(10,08) -OBJECT:('!',"booze"),(10,09) -OBJECT:('!',"booze"),(10,09) -OBJECT:('!',"object detection"),(10,09) -# Objects -# The Treasure chamber... -OBJECT:('*',"luckstone"),(70,05) -OBJECT:('*',"diamond"),(69,04) -OBJECT:'*',(69,04) -OBJECT:('*',"diamond"),(69,04) -OBJECT:'*',(69,04) -OBJECT:('*',"emerald"),(70,04) -OBJECT:'*',(70,04) -OBJECT:('*',"emerald"),(70,04) -OBJECT:'*',(70,04) -OBJECT:('*',"emerald"),(69,05) -OBJECT:'*',(69,05) -OBJECT:('*',"ruby"),(69,05) -OBJECT:'*',(69,05) -OBJECT:('*',"ruby"),(70,05) -OBJECT:('*',"amethyst"),(70,05) -OBJECT:'*',(70,05) -OBJECT:('*',"amethyst"),(70,05) -# Scattered gems... -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'*',random -OBJECT:'(',random -OBJECT:'(',random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -# Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:('G',"gnome king"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('G',"gnome lord"),random -MONSTER:('G',"gnomish wizard"),random -MONSTER:('G',"gnomish wizard"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('G',"gnome"),random -MONSTER:('h',"hobbit"),random -MONSTER:('h',"hobbit"),random -MONSTER:('h',"dwarf"),random -MONSTER:('h',"dwarf"),random -MONSTER:('h',"dwarf"),random -MONSTER:'h',random - - -# "Catacombs" by Kelly Bailey -# Relies on some very specific behavior of MAZEWALK. -# -MAZE:"minend-3",'-' -FLAGS:nommap -GEOMETRY:center,bottom -MAP - - - - - - - - - - - -- -- - - . - - - - - - - - - -- - - -- - - - - . - - | -------...---------.-----------...-----.-------.------- ----------------| - - - - - - - - - - - - . - - - . - - - - - - - - - - -- - -- - . - - - - - | -------------.---------...-------------------------.--- ------------------| - - - - - - - - - - - . . - - --- - . - - - - - - - - -- -- - - - - |.....| | ---.---------------.......------------------------------- ----------|.....S-| - - - - - |.. ..| - ....... . - - - - |.........| - - - --- - - - - |.....| | -----.----|.....|------.......--------|.........|--------------.------------| - - - - - |..{..| - - -.... . --- - -.S.........S - - - - - - - - - - - - - | ----------|.....|--.---...------------|.........|---------------------------| - - - - - |.. ..| - - - . - - - - - - |.........| - --- . - - - - - - - - - | -----------------------...-------.---------------------...------------------| ----..| - - - - - - - - . --- - - - - - - - - - - - - - . - - --- - - --- - | --.S..|----.-------.------- ---------.-----------------...----- -----.------- ----..| - - - - - - - -- - - -- . - - - - - . - - - . - . - - -- -- - - - -- --.S..|--------.---.--- -...---------------...{.--------- --------- ---|. - - - - - - - -- - - - -- . - - - --- - - - . . - - - - -- - - - - - - -ENDMAP - -$place = { (1,15),(68,6),(1,13) } -SHUFFLE: $place - -NON_DIGGABLE:(67,3,73,7) -NON_DIGGABLE:(0,12,2,16) -FOUNTAIN:(12,08) -FOUNTAIN:(51,15) -REGION:(0,0,75,16),unlit,"ordinary" -REGION:(38,6,46,10),lit,"ordinary" -DOOR:closed,(37,8) -DOOR:closed,(47,8) -DOOR:closed,(73,5) -DOOR:closed,(2,15) -MAZEWALK:(36,8),west,false -STAIR:(42,8),up -WALLIFY - -# Objects -OBJECT:('*',"luckstone"),$place[0] -OBJECT:('*',"flint"),$place[1] -OBJECT:('*',"diamond"),random -OBJECT:'*',random -OBJECT:('*',"diamond"),random -OBJECT:'*',random -OBJECT:('*',"emerald"),random -OBJECT:'*',random -OBJECT:('*',"emerald"),random -OBJECT:'*',random -OBJECT:('*',"emerald"),random -OBJECT:'*',random -OBJECT:('*',"ruby"),random -OBJECT:'*',random -OBJECT:('*',"ruby"),random -OBJECT:('*',"amethyst"),random -OBJECT:'*',random -OBJECT:('*',"amethyst"),random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'+',random -OBJECT:'+',random -OBJECT:'+',random -OBJECT:'+',random -OBJECT:random,random -OBJECT:random,random -OBJECT:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# One-time annoyance factor -TRAP:"level teleport",$place[0] -TRAP:"level teleport",$place[1] -MONSTER:'M',random -MONSTER:'M',random -MONSTER:'M',random -MONSTER:'M',random -MONSTER:'M',random -MONSTER:('M',"ettin mummy"),random -MONSTER:'V',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'Z',random -MONSTER:'V',random -MONSTER:'e',random -MONSTER:'e',random -MONSTER:'e',random -MONSTER:'e',random - - -# end mines.des diff --git a/dat/minetn-1.lua b/dat/minetn-1.lua new file mode 100644 index 000000000..87544b1c9 --- /dev/null +++ b/dat/minetn-1.lua @@ -0,0 +1,150 @@ +-- NetHack 5.0 mines minetn-1.lua $NHDT-Date: 1652196030 2022/05/10 15:20:30 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.8 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- A tragic accident has occurred in Frontier Town.... +-- +-- Minetown variant 1 +-- Orcish Town - a variant of Frontier Town that has been +-- overrun by orcs. Note the barricades (iron bars). + +des.level_flags("mazelevel") + +des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true }) + +des.map([[ +..................................... +.----------------F------------------. +.|.................................|. +.|.-------------......------------.|. +.|.|...|...|...|......|..|...|...|.|. +.F.|...|...|...|......|..|...|...|.|. +.|.|...|...|...|......|..|...|...|.F. +.|.|...|...|----......------------.|. +.|.---------.......................|. +.|.................................|. +.|.---------.....--...--...........|. +.|.|...|...|----.|.....|.---------.|. +.|.|...|...|...|.|.....|.|..|....|.|. +.|.|...|...|...|.|.....|.|..|....|.|. +.|.|...|...|...|.|.....|.|..|....|.|. +.|.-------------.-------.---------.|. +.|.................................F. +.-----------F------------F----------. +..................................... +]]); + +-- Don't let the player fall into his likely death; used to explicitly exclude +-- the town, but that meant that you couldn't teleport out as well as not in. +des.teleport_region({ region={01,01,75,19}, exclude={01,00,35,21}, region_islev=1 }) +des.region(selection.area(01,01,35,17), "lit") +des.levregion({ type="stair-up", region={01,03,21,19}, region_islev=1, + exclude={00,01,36,17} }); +des.levregion({ type="stair-down", region={57,03,75,19}, region_islev=1, + exclude={00,01,36,17} }) + +-- shame we can't make polluted fountains +des.feature("fountain",16,09) +des.feature("fountain",25,09) + +-- the altar's defiled; useful for BUC but never coaligned +des.altar({ x=20,y=13,align="noalign", type="shrine" }) + +-- set up the shop doors; could be broken down +des.door("random",5,8) +des.door("random",9,8) +des.door("random",13,7) +des.door("random",22,5) +des.door("random",27,7) +des.door("random",31,7) +des.door("random",5,10) +des.door("random",9,10) +des.door("random",15,13) +des.door("random",25,13) +des.door("random",31,11) + +-- knock a few holes in the shop interior walls +des.replace_terrain({ region={07,04,11,06}, fromterrain="|", toterrain=".", chance=18 }) +des.replace_terrain({ region={25,04,29,06}, fromterrain="|", toterrain=".", chance=18 }) +des.replace_terrain({ region={07,12,11,14}, fromterrain="|", toterrain=".", chance=18 }) +des.replace_terrain({ region={28,12,28,14}, fromterrain="|", toterrain=".", chance=33 }) + +-- One spot each in most shops... +local place = { {05,04},{09,05},{13,04},{26,04},{31,05},{30,14},{05,14},{10,13},{26,14},{27,13} } +shuffle(place); + +-- scatter some bodies +des.object({ id = "corpse", x=20,y=12, montype="aligned cleric" }) +des.object({ id = "corpse", coord = place[1], montype="shopkeeper" }) +des.object({ id = "corpse", coord = place[2], montype="shopkeeper" }) +des.object({ id = "corpse", coord = place[3], montype="shopkeeper" }) +des.object({ id = "corpse", coord = place[4], montype="shopkeeper" }) +des.object({ id = "corpse", coord = place[5], montype="shopkeeper" }) +des.object({ id = "corpse", montype="watchman" }) +des.object({ id = "corpse", montype="watchman" }) +des.object({ id = "corpse", montype="watchman" }) +des.object({ id = "corpse", montype="watchman" }) +des.object({ id = "corpse", montype="watch captain" }) + +-- Rubble! +for i = 1, math.random(10,19) do + if percent(90) then + des.object("boulder") + end + des.object("rock") +end + +-- Guarantee 7 candles since we won't have Izchak available +des.object({ id = "wax candle", coord = place[4], quantity = math.random(1,2) }) + +des.object({ id = "wax candle", coord = place[1], quantity = math.random(2,4) }) +des.object({ id = "wax candle", coord = place[2], quantity = math.random(1,2) }) +des.object({ id = "tallow candle", coord = place[3], quantity = math.random(1,3) }) +des.object({ id = "tallow candle", coord = place[2], quantity = math.random(1,2) }) +des.object({ id = "tallow candle", coord = place[4], quantity = math.random(1,2) }) + +-- go ahead and leave a lamp next to one corpse to be suggestive +-- and some empty wands... +des.object("oil lamp",place[2]) +des.object({ id = "wand of striking", coord = place[1], buc="uncursed", spe=0 }) +des.object({ id = "wand of striking", coord = place[3], buc="uncursed", spe=0 }) +des.object({ id = "wand of striking", coord = place[4], buc="uncursed", spe=0 }) +des.object({ id = "wand of magic missile", coord = place[4], buc="uncursed", spe=0 }) +des.object({ id = "wand of magic missile", coord = place[5], buc="uncursed", spe=0 }) + +-- the Orcish Army + +local inside = selection.floodfill(18,8) +local near_temple = selection.area(17,8, 23,14) & inside + +for i = 1, math.random(5,15) do + if percent(50) then + des.monster({ id = "orc-captain", coord = inside:rndcoord(1), peaceful=0 }); + else + if percent(80) then + des.monster({ id = "Uruk-hai", coord = inside:rndcoord(1), peaceful=0 }) + else + des.monster({ id = "Mordor orc", coord = inside:rndcoord(1), peaceful=0 }) + end + end +end +-- shamans can be hanging out in/near the temple +-- one of the shamans is higher level +for i = 1, math.random(1,6) do + des.monster({ id = "orc shaman", coord = near_temple:rndcoord(0), peaceful=0, + m_lev_adj = (i == 1) and 3 or 0 }); +end +-- these are not such a big deal +-- to run into outside the bars +for i = 1, math.random(10,19) do + if percent(90) then + des.monster({ id = "hill orc", peaceful = 0 }) + else + des.monster({ id = "goblin", peaceful = 0 }) + end +end + +-- Hack to force full-level wallification + +des.wallify() diff --git a/dat/minetn-2.lua b/dat/minetn-2.lua new file mode 100644 index 000000000..133285f93 --- /dev/null +++ b/dat/minetn-2.lua @@ -0,0 +1,182 @@ +-- NetHack mines minetn-2.lua $NHDT-Date: 1652196030 2022/05/10 15:20:30 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- Minetown variant 2 +-- "Town Square" + +des.room({ type = "ordinary", lit=1, x=3, y=3, + xalign="center", yalign="center", w=31, h=15, + contents = function() + des.feature("fountain", 17, 5) + des.feature("fountain", 13, 8) + + if percent(75) then + des.room({ type = "ordinary", x=2,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", lit=0, x=5,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", x=8,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="east" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", lit=1, x=16,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", lit=0, x=19,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", x=22,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="south" }) + des.monster("gnome") + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", lit=0, x=25,y=0, w=2,h=2, + contents = function() + des.door({ state="closed", wall="east" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", lit=1, x=2,y=5, w=2,h=2, + contents = function() + des.door({ state="closed", wall="north" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", lit=1, x=5,y=5, w=2,h=2, + contents = function() + des.door({ state="closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type = "ordinary", x=8,y=5, w=2,h=2, + contents = function() + des.door({ state="locked", wall="north" }) + des.monster("gnome") + end + }) + end + + des.room({ type="shop", chance=90, lit=1, x=2,y=10, w=4,h=3, + contents = function() + des.door({ state="closed", wall="west" }) + end + }); + + des.room({ type = "tool shop", chance=90, lit=1, x=23,y=10, w=4,h=3, + contents = function() + des.door({ state="closed", wall="east" }) + end + }); + + des.room({ type = monkfoodshop(), chance=90, lit=1, x=24,y=5, w=3,h=4, + contents = function() + des.door({ state="closed", wall="north" }) + end + }); + + des.room({ type = "candle shop", lit=1, x=11,y=10, w=4,h=3, + contents = function() + des.door({ state="closed", wall="east" }) + end + }); + + if percent(75) then + des.room({ type = "ordinary", lit=0, x=7,y=10, w=3,h=3, + contents = function() + des.door({ state="locked", wall="north" }) + des.monster("gnome") + end + }); + end + + des.room({ type = "temple", lit=1, x=19,y=5, w=4,h=4, + contents = function() + des.door({ state="closed", wall="north" }) + des.altar({ x=02, y=02, align=align[1],type="shrine" }) + des.monster("gnomish wizard") + des.monster("gnomish wizard") + end + }); + + if percent(75) then + des.room({ type = "ordinary", lit=1, x=18,y=10, w=4,h=3, + contents = function() + des.door({ state="locked", wall="west" }) + des.monster("gnome lord") + end + }); + end + + -- The Town Watch + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watch captain", peaceful = 1 }) + end +}); + +des.room({ contents = function() + des.stair("up") + end +}); + +des.room({ contents = function() + des.stair("down") + des.trap() + des.monster("gnome") + des.monster("gnome") + end +}); + +des.room({ contents = function() + des.monster("dwarf") + end +}); + +des.room({ contents = function() + des.trap() + des.monster("gnome") + end +}); + +des.random_corridors() + diff --git a/dat/minetn-3.lua b/dat/minetn-3.lua new file mode 100644 index 000000000..910293868 --- /dev/null +++ b/dat/minetn-3.lua @@ -0,0 +1,150 @@ +-- NetHack mines minetn-3.lua $NHDT-Date: 1652196030 2022/05/10 15:20:30 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- Minetown variant 3 by Kelly Bailey +-- "Alley Town" + +des.room({ type = "ordinary",lit=1,x=3,y=3, + xalign="center",yalign="center",w=31,h=15, + contents = function() + des.feature("fountain", 01,06) + des.feature("fountain", 29,13) + + des.room({ type = "ordinary",x=2,y=2,w=2,h=2, + contents = function() + des.door({ state="closed", wall="south" }) + end + }); + + des.room({ type = "tool shop", chance=30, lit=1,x=5,y=3,w=2,h=3, + contents = function() + des.door({ state="closed", wall="south" }) + end + }) + + des.room({ type = "ordinary",x=2,y=10,w=2,h=3, + contents = function() + des.door({ state ="locked", wall="north" }) + des.monster("G") + end + }) + + des.room({ type = "ordinary", x=5,y=9,w=2,h=2, + contents = function() + des.door({ state="closed", wall="north" }) + end + }) + + des.room({ type = "temple",lit=1,x=10,y=2,w=3,h=4, + contents = function() + des.door({ state="closed", wall="east" }) + des.altar({ x=1, y=1, align = align[1], type="shrine" }) + des.monster("gnomish wizard") + des.monster("gnomish wizard") + end + }) + + des.room({ type = "ordinary",x=11,y=7,w=2,h=2, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + + des.room({ type = "shop",lit=1,x=10,y=10,w=3,h=3, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + + des.room({ type = "ordinary",random,x=14,y=8,w=2,h=2, + contents = function() + des.door({ state="locked", wall="north" }) + des.monster("G") + end + }) + + des.room({ type = "ordinary",random,x=14,y=11,w=2,h=2, + contents = function() + des.door({ state="closed", wall="south" }) + end + }) + + des.room({ type = "tool shop", chance=40,lit=1,x=17,y=10,w=3,h=3, + contents = function() + des.door({ state="closed", wall="north" }) + end + }) + + des.room({ type = "ordinary",x=21,y=11,w=2,h=2, + contents = function() + des.door({ state="locked", wall="east" }) + des.monster("G") + end + }) + + des.room({ type = monkfoodshop(), chance=90,lit=1,x=26,y=8,w=3,h=2, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + + des.room({ type = "ordinary",random,x=16,y=2,w=2,h=2, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + + des.room({ type = "ordinary",random,x=19,y=2,w=2,h=2, + contents = function() + des.door({ state="closed", wall="north" }) + end + }) + + des.room({ type = "wand shop", chance=30,lit=1,x=19,y=5,w=3,h=2, + contents = function() + des.door({ state="closed", wall="west" }) + end + }) + + des.room({ type = "candle shop",lit=1,x=25,y=2,w=3,h=3, + contents = function() + des.door({ state="closed", wall="south" }) + end + }) + + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watch captain", peaceful = 1 }) + + end +}) + +des.room({ type = "ordinary", contents = function() + des.stair("up") + end +}) + +des.room({ type = "ordinary", contents = function() + des.stair("down") + des.trap() + des.monster("gnome") + des.monster("gnome") + end +}) + +des.room({ type = "ordinary", contents = function() + des.monster("dwarf") + end +}) + +des.room({ type = "ordinary", contents = function() + des.trap() + des.monster("gnome") + end +}) + +des.random_corridors() diff --git a/dat/minetn-4.lua b/dat/minetn-4.lua new file mode 100644 index 000000000..6d5804133 --- /dev/null +++ b/dat/minetn-4.lua @@ -0,0 +1,133 @@ +-- NetHack mines minetn-4.lua $NHDT-Date: 1652196031 2022/05/10 15:20:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- Minetown variant 4 by Kelly Bailey +-- "College Town" + +des.room({ type = "ordinary", lit=1, x=3,y=3, + xalign="center", yalign="center", w=30, h=15, + contents = function() + des.feature("fountain", 08,07) + des.feature("fountain", 18,07) + + des.room({ type = "book shop", lit=1, x=4, y=2, w=3, h=3, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + + des.room({ type = "ordinary", x=8, y=2, w=2, h=2, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + + des.room({ type = "temple", lit=1, x=11, y=3, w=5, h=4, + contents = function() + des.door({ state = "closed", wall="south" }) + des.altar({ x=2,y=1,align=align[1], type="shrine" }) + des.monster("gnomish wizard") + des.monster("gnomish wizard") + end + }) + + des.room({ type = "ordinary", x=19, y=2, w=2, h=2, + contents = function() + des.door({ state = "closed", wall="south" }) + des.monster("G") + end + }) + + des.room({ type = "candle shop", lit=1, x=22, y=2, w=3, h=3, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + + des.room({ type = "ordinary", x=26, y=2, w=2, h=2, + contents = function() + des.door({ state = "locked", wall="east" }) + des.monster("G") + end + }) + + des.room({ type = "tool shop", chance=90, lit=1, x=4,y=10, w=3,h=3, + contents = function() + des.door({ state = "closed", wall="north" }) + end + }) + + des.room({ type = "ordinary", x=8, y=11, w=2, h=2, + contents = function() + des.door({ state = "locked", wall="south" }) + des.monster("kobold shaman") + des.monster("kobold shaman") + des.monster("kitten") + des.monster("f") + end + }) + + des.room({ type = monkfoodshop(), chance=90, lit=1, x=11, y=11, w=3, h=2, + contents = function() + des.door({ state = "closed", wall="east" }) + end + }) + + des.room({ type = "ordinary", x=17, y=11, w=2, h=2, + contents = function() + des.door({ state = "closed", wall="west" }) + end + }) + + des.room({ type = "ordinary", x=20, y=10, w=2, h=2, + contents = function() + des.door({ state = "locked", wall="north" }) + des.monster("G") + end + }) + + des.room({ type = "shop", chance=90, lit=1, x=23, y=10, w=3, h=3, + contents = function() + des.door({ state = "closed", wall="north" }) + end + }) + + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watch captain", peaceful = 1 }) + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("up") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.stair("down") + des.trap() + des.monster("gnome") + des.monster("gnome") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.monster("dwarf") + end +}) + +des.room({ type = "ordinary", + contents = function() + des.trap() + des.monster("gnome") + end +}) + +des.random_corridors() diff --git a/dat/minetn-5.lua b/dat/minetn-5.lua new file mode 100644 index 000000000..a0d16ea0a --- /dev/null +++ b/dat/minetn-5.lua @@ -0,0 +1,137 @@ +-- NetHack mines minetn-5.lua $NHDT-Date: 1652196031 2022/05/10 15:20:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- "Grotto Town" by Kelly Bailey + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel"); + +des.map([[ +----- --------- +|...--- ------.......-- ------- --------------- +|.....----.........--..| |.....| ------- |.............| +--..-....-.----------..| |.....| |.....| --+---+--.----+- + --.--.....---- ---- |.....| ------ --....---- |..-...--.-.+..| + ---.........---- ----- ---+--- |..+.| ---..-..----..---+-..---..| + ----.-....|..----...-- |.| |..|.| ---+-.....-+--........--+- + -----..|....-.....---- |.| |..|.------......--................| + ------ |..|.............---.-- ----.+..|-.......--..--------+--..-- + |....| --......---...........----- |.|..|-...{....---|.........|..-- + |....| |........-...-...........----.|..|--.......| |.........|...| + ---+--------....-------...---......--.-------....---- -----------...| + ------.---...--...--..-..--...-..---...|.--..-...-....------- |.......-- + |..|-.........-..---..-..---.....--....|........---...-|....| |.------- + |..+...............-+---+-----..--..........--....--...+....| |.|...S. +-----.....{....----...............-...........--...-...-|....| |.|...| +|..............-- --+--.---------.........--..-........------- |.--+------- +-+-----.........| |...|.|....| --.......------...|....---------.....|....| +|...| --..------- |...|.+....| ---...--- --..|...--......-...{..+..-+| +|...| ---- ------|....| ----- -----.....----........|..|.| +----- ------ ------- --------------- +]]); + +if percent(75) then + if percent(50) then + des.terrain(selection.line(25,8, 25,9), "|") + else + des.terrain(selection.line(16,13, 17,13), "-") + end +end +if percent(75) then + if percent(50) then + des.terrain(selection.line(36,10, 36,11), "|") + else + des.terrain(selection.line(32,15, 33,15), "-") + end +end +if percent(50) then + des.terrain(selection.area(21,4, 22,5), ".") + des.terrain(selection.line(14,9, 14,10), "|") +end +if percent(50) then + des.terrain({46,13}, "|") + des.terrain(selection.line(43,5, 47,5), "-") + des.terrain(selection.line(42,6, 46,6), ".") + des.terrain(selection.line(46,7, 47,7), ".") +end +if percent(50) then + des.terrain(selection.area(69,11, 71,11), "-") +end + +des.stair("up", 01,01) +des.stair("down", 46,03) +des.feature("fountain", 50,09) +des.feature("fountain", 10,15) +des.feature("fountain", 66,18) + +des.region(selection.area(00,00,74,20),"unlit") +des.region(selection.area(09,13,11,17),"lit") +des.region(selection.area(08,14,12,16),"lit") +des.region(selection.area(49,07,51,11),"lit") +des.region(selection.area(48,08,52,10),"lit") +des.region(selection.area(64,17,68,19),"lit") +des.region(selection.area(37,13,39,17),"lit") +des.region(selection.area(36,14,40,17),"lit") +des.region(selection.area(59,02,72,10),"lit") + +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watch captain", peaceful = 1 }) +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome lord") +des.monster("gnome lord") +des.monster("dwarf") +des.monster("dwarf") +des.monster("dwarf") + +-- The shops +des.region({ region={25,17, 28,19}, lit=1, type="candle shop", filled=1 }) +des.door("closed",24,18) +des.region({ region={59, 9, 67,10}, lit=1, type="shop", filled=1 }) +des.door("closed",66,08) +des.region({ region={57,13, 60,15}, lit=1, type="tool shop", filled=1 }) +des.door("closed",56,14) +des.region({ region={05,09, 08,10}, lit=1, type=monkfoodshop(), filled=1 }) +des.door("closed",07,11) +-- Gnome homes +des.door("closed",04,14) +des.door("locked",01,17) +des.monster("gnomish wizard", 02, 19) +des.door("locked",20,16) +des.monster("G", 20, 18) +des.door("random",21,14) +des.door("random",25,14) +des.door("random",42,08) +des.door("locked",40,05) +des.monster("G", 38, 07) +des.door("random",59,03) +des.door("random",58,06) +des.door("random",63,03) +des.door("random",63,05) +des.door("locked",71,03) +des.door("locked",71,06) +des.door("closed",69,04) +des.door("closed",67,16) +des.monster("gnomish wizard", 67, 14) +des.object("=", 70, 14) +des.door("locked",69,18) +des.monster("gnome lord", 71, 19) +des.door("locked",73,18) +des.object("chest", 73, 19) +des.door("locked",50,06) +des.object("(", 50, 03) +des.object({ id = "statue", x=38, y=15, montype="gnome king", historic=1 }) +-- Temple +des.region({ region={29,02, 33,04}, lit=1, type="temple", filled=1 }) +des.door("closed",31,05) +des.altar({ x=31,y=03, align=align[1], type="shrine" }) diff --git a/dat/minetn-6.lua b/dat/minetn-6.lua new file mode 100644 index 000000000..2827d1947 --- /dev/null +++ b/dat/minetn-6.lua @@ -0,0 +1,102 @@ +-- NetHack mines minetn-6.lua $NHDT-Date: 1652196031 2022/05/10 15:20:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- "Bustling Town" by Kelly Bailey + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "inaccessibles") + +des.level_init({ style="mines", fg=".", bg="-", smoothed=true, joined=true,lit=1,walled=true }) + +-- Map extends the full height of the playable area in order to prevent any of +-- the cavern fill from getting cut off by walls of the town buildings and +-- creating inaccessible spaces. The inaccessibles flag does compensate for +-- this, but it does so by doing things like creating backdoors into adjacent +-- shops which we don't want. +des.map({ halign = "center", valign = "top", map = [[ +x--------xxxxxxxxxxx-------------------x +x------xxxxxxxxxxxxxx-----------------xx +.-----................----------------.x +.|...|................|...|..|...|...|.. +.|...+..--+--.........|...|..|...|...|.. +.|...|..|...|..-----..|...|..|-+---+--.. +.-----..|...|--|...|..--+---+-.........x +........|...|..|...+.............-----.x +........-----..|...|......--+-...|...|.. +x----...|...|+------..{...|..|...+...|.. +x|..+...|...|.............|..|...|...|.. +.|..|...|...|-+-.....---+-------------.x +.----...--+--..|..-+-|.................. +...|........|..|..|..|----....--------.x +...|..T.....----..|..|...+....|......|.. +...|-....{........|..|...|....+......|x. +...--..-....T.....--------....|......|x. +.......--.....................---------- +.xxxx-----xxxxxxxxxxxxxxxxxx------------ +xxxx-------xxxxxxxxxxxxxxx-------------- +]] }); + +des.region(selection.area(00,00,39,19),"lit") + +-- stairs can generate 1 column left or right inside the map, +-- in case the randomly generated mines layout doesn't extend outside the map +des.levregion({ type="stair-up", region={01,03,21,19}, region_islev=1, exclude={1,0,39,18} }) +des.levregion({ type="stair-down", region={60,03,75,19}, region_islev=1, exclude={0,0,38,18} }) + +des.region(selection.area(13,7,14,8),"unlit") +des.region({ region={09,09, 11,11}, lit=1, type="candle shop", filled=1 }) +des.region({ region={16,06, 18,08}, lit=1, type="tool shop", filled=1 }) +des.region({ region={23,03, 25,05}, lit=1, type="shop", filled=1 }) +des.region({ region={22,14, 24,15}, lit=1, type=monkfoodshop(), filled=1 }) +des.region({ region={31,14, 36,16}, lit=1, type="temple", filled=1 }) +des.altar({ x=35,y=15,align=align[1],type="shrine"}) + +des.door("closed",5,4) +des.door("locked",4,10) +des.door("closed",10,4) +des.door("closed",10,12) +des.door("locked",13,9) +des.door("locked",14,11) +des.door("closed",19,7) +des.door("closed",19,12) +des.door("closed",24,6) +des.door("closed",24,11) +des.door("closed",25,14) +des.door("closed",28,6) +des.door("locked",28,8) +des.door("closed",30,15) +des.door("closed",31,5) +des.door("closed",35,5) +des.door("closed",33,9) + +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome") +des.monster("gnome", 14, 8) +des.monster("gnome lord", 14, 7) +des.monster("gnome", 27, 10) +des.monster("gnome lord") +des.monster("gnome lord") +des.monster("dwarf") +des.monster("dwarf") +des.monster("dwarf") +des.monster({ id = "dwarf", peaceful = 1 }) +des.monster({ id = "dwarf", peaceful = 1 }) +des.monster({ id = "gnome", peaceful = 1 }) +des.monster({ id = "gnome", peaceful = 1 }) +des.monster({ id = "hobbit", peaceful = 1 }) +des.monster({ id = "goblin", peaceful = 1 }) +des.monster({ id = "kobold", peaceful = 1 }) +des.monster({ id = "dog", peaceful = 1 }) +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watchman", peaceful = 1 }) +des.monster({ id = "watch captain", peaceful = 1 }) +des.monster({ id = "watch captain", peaceful = 1 }) + diff --git a/dat/minetn-7.lua b/dat/minetn-7.lua new file mode 100644 index 000000000..31a1d3d80 --- /dev/null +++ b/dat/minetn-7.lua @@ -0,0 +1,198 @@ +-- NetHack mines minetn-7.lua $NHDT-Date: 1652196032 2022/05/10 15:20:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989-95 by Jean-Christophe Collet +-- Copyright (c) 1991-95 by M. Stephenson +-- NetHack may be freely redistributed. See license for details. +-- +-- "Bazaar Town" by Kelly Bailey + +des.room({ type="ordinary", lit=1, x=3,y=3, + xalign="center",yalign="center", w=30,h=15, + contents = function() + des.feature("fountain", 12, 07) + des.feature("fountain", 11, 13) + + if percent(75) then + des.room({ type="ordinary", x=2,y=2, w=4,h=2, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type="ordinary", x=7,y=2, w=2,h=2, + contents = function() + des.door({ state = "closed", wall="north" }) + end + }) + end + + if percent(75) then + des.room({ type="ordinary", x=7,y=5, w=2,h=2, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type="ordinary", lit=1, x=10,y=2, w=3,h=4, + contents = function() + des.monster("gnome") + des.monster("monkey") + des.monster("monkey") + des.monster("monkey") + des.door({ state = "closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type="ordinary", x=14,y=2, w=4,h=2, + contents = function() + des.door({ state = "closed", wall="south", pos=0 }) + des.monster("n") + end + }) + end + + if percent(75) then + des.room({ type="ordinary", x=16,y=5, w=2,h=2, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + end + + if percent(75) then + des.room({ type="ordinary", lit=0, x=19,y=2, w=2,h=2, + contents = function() + des.door({ state = "locked", wall="east" }) + des.monster("gnome king") + end + }) + end + + des.room({ type=monkfoodshop(), chance=50, lit=1, x=19,y=5, w=2,h=3, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + + if percent(75) then + des.room({ type="ordinary", x=2,y=7, w=2,h=2, + contents = function() + des.door({ state = "closed", wall="east" }) + end + }) + end + + des.room({ type="tool shop", chance=50, lit=1, x=2,y=10, w=2,h=3, + contents = function() + des.door({ state = "closed", wall="south" }) + end + }) + + des.room({ type="candle shop", lit=1, x=5,y=10, w=3,h=3, + contents = function() + des.door({ state = "closed", wall="north" }) + end + }) + + if percent(75) then + des.room({ type="ordinary", x=11,y=10, w=2,h=2, + contents = function() + des.door({ state = "locked", wall="west" }) + des.monster("G") + end + }) + end + + des.room({ type="shop", chance=60, lit=1, x=14,y=10, w=2,h=3, + contents = function() + des.door({ state = "closed", wall="north" }) + end + }) + + if percent(75) then + des.room({ type="ordinary", x=17,y=11, w=4,h=2, + contents = function() + des.door({ state = "closed", wall="north" }) + end + }) + end + + if percent(75) then + des.room({ type="ordinary", x=22,y=11, w=2,h=2, + contents = function() + des.door({ state = "closed", wall="south" }) + des.feature("sink", 00,00) + end + }) + end + + des.room({ type=monkfoodshop(), chance=50, lit=1, x=25,y=11, w=3,h=2, + contents = function() + des.door({ state = "closed", wall="east" }) + end + }) + + des.room({ type="tool shop", chance=30, lit=1, x=25,y=2, w=3,h=3, + contents = function() + des.door({ state = "closed", wall="west" }) + end + }) + + des.room({ type="temple", lit=1, x=24,y=6, w=4,h=4, + contents = function() + des.door({ state = "closed", wall = "west" }) + des.altar({ x=02, y=01, align=align[1], type="shrine" }) + des.monster("gnomish wizard") + des.monster("gnomish wizard") + end + }) + + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watchman", peaceful = 1 }) + des.monster({ id = "watch captain", peaceful = 1 }) + des.monster("gnome") + des.monster("gnome") + des.monster("gnome") + des.monster("gnome lord") + des.monster("monkey") + des.monster("monkey") + + end +}) + +des.room({ type="ordinary", + contents = function() + des.stair("up") + end +}) + +des.room({ type="ordinary", + contents = function() + des.stair("down") + des.trap() + des.monster("gnome") + des.monster("gnome") + end +}) + +des.room({ type="ordinary", + contents = function() + des.monster("dwarf") + end +}) + +des.room({ type="ordinary", + contents = function() + des.trap() + des.monster("gnome") + end +}) + +des.random_corridors() diff --git a/dat/nhcore.lua b/dat/nhcore.lua new file mode 100644 index 000000000..0fc778f6c --- /dev/null +++ b/dat/nhcore.lua @@ -0,0 +1,144 @@ +-- NetHack core nhcore.lua $NHDT-Date: 1652196284 2022/05/10 15:24:44 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.0 $ +-- Copyright (c) 2021 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- This file contains lua code used by NetHack core. +-- Is it loaded once, at game start, and kept in memory until game exit. + +-- Data in nh_lua_variables table can be set and queried with nh.variable() +-- This table is saved and restored along with the game. +nh_lua_variables = { +}; + +-- wrapper to simplify calling from nethack core +function get_variables_string() + return "nh_lua_variables=" .. table_stringify(nh_lua_variables) .. ";"; +end + +function nh_callback_set(cb, fn) + local cbname = "_CB_" .. cb; + + -- pline("callback_set(%s,%s)", cb, fn); + + if (type(nh_lua_variables[cbname]) ~= "table") then + nh_lua_variables[cbname] = {}; + end + nh_lua_variables[cbname][fn] = true; +end + +function nh_callback_rm(cb, fn) + local cbname = "_CB_" .. cb; + + -- pline("callback_RM(%s,%s)", cb, fn); + + if (type(nh_lua_variables[cbname]) ~= "table") then + nh_lua_variables[cbname] = {}; + end + nh_lua_variables[cbname][fn] = nil; +end + +function nh_callback_run(cb, ...) + local cbname = "_CB_" .. cb; + + -- pline("callback_run(%s)", cb); + -- pline("TYPE:%s", type(nh_lua_variables[cbname])); + + if (type(nh_lua_variables[cbname]) ~= "table") then + nh_lua_variables[cbname] = {}; + end + for k, v in pairs(nh_lua_variables[cbname]) do + if (not _G[k](table.unpack{...})) then + return false; + end + end + return true; +end + +-- This is an example of generating an external file during gameplay, +-- which is updated periodically. +-- Intended for public servers using dgamelaunch as their login manager. +local prev_dgl_extrainfo = 0; +function mk_dgl_extrainfo() + if ((prev_dgl_extrainfo == 0) or (prev_dgl_extrainfo + 50 < u.moves)) then + local filename = nh.dump_fmtstr("/tmp/nethack.%n.%d.log"); + local extrai, err = io.open(filename, "w"); + if extrai then + local sortval = 0; + local dname = nh.dnum_name(u.dnum); + local dstr = ""; + local astr = " "; + if u.uhave_amulet == 1 then + sortval = sortval + 1024; + astr = "A"; + end + if dname == "Fort Ludios" then + dstr = "Knx"; + sortval = sortval + 245; + elseif dname == "The Quest" then + dstr = "Q" .. u.dlevel; + sortval = sortval + 250 + u.dlevel; + elseif dname == "The Elemental Planes" then + dstr = "End"; + sortval = sortval + 256; + elseif dname == "Vlad's Tower" then + dstr = "T" .. u.dlevel; + sortval = sortval + 235 + u.depth; + elseif dname == "Sokoban" then + dstr = "S" .. u.dlevel; + sortval = sortval + 225 + u.depth; + elseif dname == "The Gnomish Mines" then + dstr = "M" .. u.dlevel; + sortval = sortval + 215 + u.dlevel; + else + dstr = "D" .. u.depth; + sortval = sortval + u.depth; + end + local str = sortval .. "|" .. astr .. " " .. dstr; + + extrai:write(str); + extrai:close(); + else + -- failed to open the file. + nh.pline("Failed to open dgl extrainfo file: " .. err); + end + prev_dgl_extrainfo = u.moves; + end +end + +-- Show a helpful tip when player first uses getpos() +function show_getpos_tip() + nh.text([[ +Tip: Farlooking or selecting a map location + +You are now in a "farlook" mode - the movement keys move the cursor, +not your character. Game time does not advance. This mode is used +to look around the map, or to select a location on it. + +When in this mode, you can press ESC to return to normal game mode, +and pressing ? will show the key help. +]]); +end + +-- Callback functions +nhcore = { + -- start_new_game called once, when starting a new game + -- after "Welcome to NetHack" message has been given. + -- start_new_game = function() nh.pline("NEW GAME!"); end, + + -- restore_old_game called once, when restoring a saved game + -- after "Welcome back to NetHack" message has been given. + -- restore_old_game = function() nh.pline("RESTORED OLD GAME!"); end, + + -- moveloop_turn is called once per turn. + -- moveloop_turn = mk_dgl_extrainfo, + + -- game_exit is called when the game exits (quit, saved, ...) + -- game_exit = function() end, + + -- getpos_tip is called the first time the code enters getpos() + getpos_tip = show_getpos_tip, + + -- enter_tutorial and leave_tutorial + enter_tutorial = tutorial_enter, + leave_tutorial = tutorial_leave, +}; + diff --git a/dat/nhlib.lua b/dat/nhlib.lua new file mode 100644 index 000000000..f4fab68fb --- /dev/null +++ b/dat/nhlib.lua @@ -0,0 +1,242 @@ +-- NetHack nhlib.lua $NHDT-Date: 1652196140 2022/05/10 15:22:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 2021 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- compatibility shim +math.random = function(...) + local arg = {...}; + if (#arg == 1) then + return 1 + nh.rn2(arg[1]); + elseif (#arg == 2) then + return nh.random(arg[1], arg[2] + 1 - arg[1]); + else + -- we don't support reals + error("NetHack math.random requires at least one parameter"); + end +end + +function shuffle(list) + for i = #list, 2, -1 do + local j = math.random(i) + list[i], list[j] = list[j], list[i] + end +end + +align = { "law", "neutral", "chaos" }; +shuffle(align); + +-- d(2,6) = 2d6 +-- d(20) = 1d20 (single argument = implicit 1 die) +function d(dice, faces) + if (faces == nil) then + -- 1-arg form: argument "dice" is actually the number of faces + return math.random(1, dice) + else + local sum = 0 + for i=1,dice do + sum = sum + math.random(1, faces) + end + return sum + end +end + +-- percent(20) returns true 20% of the time +function percent(threshold) + return math.random(0, 99) < threshold +end + +function monkfoodshop() + if (u.role == "Monk") then + return "health food shop"; + end + return "food shop"; +end + +-- tweaks to gehennom levels; might add random lava pools or +-- a lava river. +-- protected_area is a selection where no changes will be done. +function hell_tweaks(protected_area) + local liquid = "L"; + local ground = "."; + local n_prot = protected_area:numpoints(); + local prot = protected_area:negate(); + + -- random pools + if (percent(20 + u.depth)) then + local pools = selection.new(); + local maxpools = 5 + math.random(u.depth); + for i = 1, maxpools do + pools:set(); + end + pools = pools | selection.grow(selection.set(selection.new()), "west") + pools = pools | selection.grow(selection.set(selection.new()), "north") + pools = pools | selection.grow(selection.set(selection.new()), "random") + + pools = pools & prot; + + if (percent(80)) then + local poolground = pools:clone():grow("all") & prot; + local pval = math.random(1, 8) * 10; + des.terrain(poolground:percentage(pval), ground) + end + des.terrain(pools, liquid) + end + + -- river + if (percent(50)) then + local allrivers = selection.new(); + local reqpts = ((nhc.COLNO * nhc.ROWNO) - n_prot) / 12; -- # of lava pools required + local rpts = 0; + local rivertries = 0; + + repeat + local floor = selection.match(ground); + local a = selection.rndcoord(floor); + local b = selection.rndcoord(floor); + local lavariver = selection.randline(selection.new(), a.x, a.y, b.x, b.y, 10); + + if (percent(50)) then + lavariver = selection.grow(lavariver, "north"); + end + if (percent(50)) then + lavariver = selection.grow(lavariver, "west"); + end + allrivers = allrivers | lavariver; + allrivers = allrivers & prot; + + rpts = allrivers:numpoints(); + rivertries = rivertries + 1; + until ((rpts > reqpts) or (rivertries > 7)); + + if (percent(60)) then + local prc = 10 * math.random(1, 6); + local riverbanks = selection.grow(allrivers); + riverbanks = riverbanks & prot; + des.terrain(selection.percentage(riverbanks, prc), ground); + end + + des.terrain(allrivers, liquid); + end + + -- replacing some walls with boulders + if (percent(20)) then + local amount = 3 * math.random(1, 8); + local bwalls = selection.match([[.w.]]):percentage(amount) | selection.match(".\nw\n."):percentage(amount); + bwalls = bwalls & prot; + bwalls:iterate(function (x,y) + des.terrain(x, y, "."); + des.object("boulder", x, y); + end); + end + + -- replacing some walls with iron bars + if (percent(20)) then + local amount = 3 * math.random(1, 8); + local fwalls = selection.match([[.w.]]):percentage(amount) | selection.match(".\nw\n."):percentage(amount); + fwalls = fwalls:grow() & selection.match("w") & prot; + des.terrain(fwalls, "F"); + end + +end + +-- pline with variable number of arguments +function pline(fmt, ...) + nh.pline(string.format(fmt, table.unpack({...}))); +end + +-- wrapper to make calling from nethack core easier +function nh_set_variables_string(key, tbl) + return "nh_lua_variables[\"" .. key .. "\"]=" .. table_stringify(tbl) .. ";"; +end + +-- wrapper to make calling from nethack core easier +function nh_get_variables_string(tbl) + return "return " .. table_stringify(tbl) .. ";"; +end + +-- return the (simple) table tbl converted into a string +function table_stringify(tbl) + local str = ""; + for key, value in pairs(tbl) do + local typ = type(value); + if (typ == "table") then + str = str .. "[\"" .. key .. "\"]=" .. table_stringify(value); + elseif (typ == "string") then + str = str .. "[\"" .. key .. "\"]=[[" .. value .. "]]"; + elseif (typ == "boolean") then + str = str .. "[\"" .. key .. "\"]=" .. tostring(value); + elseif (typ == "number") then + str = str .. "[\"" .. key .. "\"]=" .. value; + elseif (typ == "nil") then + str = str .. "[\"" .. key .. "\"]=nil"; + end + str = str .. ","; + end + -- pline("table_stringify:(%s)", str); + return "{" .. str .. "}"; +end + +-- +-- TUTORIAL +-- + +-- extended commands NOT available in tutorial +local tutorial_blacklist_commands = { + ["save"] = true, +}; + +function tutorial_cmd_before(cmd) + -- nh.pline("TUT:cmd_before:" .. cmd); + + if (tutorial_blacklist_commands[cmd]) then + return false; + end + return true; +end + +function tutorial_enter() + -- nh.pline("TUT:enter"); + + -- add the tutorial branch callbacks + nh.callback("cmd_before", "tutorial_cmd_before"); + nh.callback("end_turn", "tutorial_turn"); + + -- save state for later restore + nh.gamestate(); +end + +function tutorial_leave() + -- nh.pline("TUT:leave"); + + -- remove the tutorial branch callbacks + nh.callback("cmd_before", "tutorial_cmd_before", true); + nh.callback("end_turn", "tutorial_turn", true); + + -- restore state for regular play + nh.gamestate(true); +end + +local tutorial_events = { + { + func = function() + if (u.uhunger < 148) then + local o = obj.new("blessed food ration"); + o:placeobj(u.ux, u.uy); + nh.pline("Looks like you're getting hungry. You'll starve to death, unless you eat something.", true); + nh.pline("Comestibles are eaten with '" .. nh.eckey("eat") .. "'", true); + return true; + end + end + }, +}; + +function tutorial_turn() + for k, v in pairs(tutorial_events) do + if ((v.ucoord and u.ux == v.ucoord[1] + 3 and u.uy == v.ucoord[2] + 3) + or (v.ucoord == nil)) then + if (v.func() or v.remove) then + tutorial_events[k] = nil; + end + end + end + -- nh.pline("TUT:turn"); +end diff --git a/dat/opthelp b/dat/opthelp index 0bcc8547e..2decd609c 100644 --- a/dat/opthelp +++ b/dat/opthelp @@ -2,119 +2,176 @@ Boolean options not under specific compile flags (with default values in []): (You can learn which options exist in your version by checking your current option setting, which is reached via the 'O' command.) -acoustics can your character hear anything [TRUE] -autodescribe describe the terrain under cursor [FALSE] -autodig dig if moving and wielding digging tool [FALSE] -autoopen walking into a door attempts to open it [TRUE] -autopickup automatically pick up objects you move over [TRUE] -autoquiver when firing with an empty quiver, select some [FALSE] +acoustics can your character hear anything [True] +armorstatus show extra status field summarizing worn armor [False] +autodescribe describe the terrain under cursor [False] +autodig dig if moving and wielding digging tool [False] +autoopen walking into a door attempts to open it [True] +autopickup automatically pick up objects you move over [True] +autoquiver when firing with an empty quiver, select some [False] suitable inventory weapon to fill the quiver -BIOS allow the use of IBM ROM BIOS calls [FALSE] -blind your character is permanently blind [FALSE] -bones allow loading bones files [TRUE] -clicklook look at map by clicking right mouse button [FALSE] -cmdassist give help for errors on direction & other commands [TRUE] -confirm ask before hitting tame or peaceful monsters [TRUE] -dark_room show floor not in sight in different color [TRUE] -eight_bit_tty send 8-bit characters straight to terminal [FALSE] -extmenu tty, curses: use menu for # (extended commands) [FALSE] +BIOS allow the use of IBM ROM BIOS calls [False] +blind your character is permanently blind [False] +bones allow loading bones files [True] +clicklook look at map by clicking right mouse button [False] +cmdassist give help for errors on direction & other commands [True] +color use different colors for objects on screen [True for micros] +confirm ask before hitting tame or peaceful monsters [True] +dark_room show floor not in sight in different color [True] +dropped_nopick exclude dropped objects from autopickup [True] +eight_bit_tty send 8-bit characters straight to terminal [False] +extmenu tty, curses: use menu for # (extended commands) [False] X11: menu has all commands (T) or traditional subset (F) -fixinv try to retain the same letter for the same object [TRUE] -force_invmenu commands asking for inventory item show a menu [FALSE] -goldX when filtering objects by bless/curse state, [FALSE] +female deprecated; use compound option gender:female [False] +fixinv try to retain the same letter for the same object [True] +force_invmenu commands asking for inventory item show a menu [False] +goldX when filtering objects by bless/curse state, [False] whether to classify gold as X (unknown) or U (uncursed) -help print all available info when using the / command [TRUE] +help print all available info when using the / command [True] herecmd_menu show menu of some possible commands when clicking - on yourself or next to you with mouse [FALSE] -ignintr ignore interrupt signal, including breaks [FALSE] -implicit_uncursed omit "uncursed" from inventory, if possible [TRUE] -legacy print introductory message [TRUE] -lit_corridor show a dark corridor as lit if in sight [FALSE] -lootabc use a/b/c rather than o/i/b when looting [FALSE] -mail enable the mail daemon [TRUE] -mention_walls give feedback when walking against a wall [FALSE] -menu_objsyms show object symbols in menus if it is selectable [FALSE] -menu_overlay overlay menus on the screen and align to right [TRUE] -nudist start your character without armor [FALSE] -null allow nulls to be sent to your terminal [TRUE] + on yourself or next to you with mouse [False] +hilite_pet display pets in a highlighted manner [False] +hilite_pile display item piles in a highlighted manner [False] +ignintr ignore interrupt signal, including breaks [False] +implicit_uncursed omit "uncursed" from inventory, if possible [True] +legacy print introductory message [True] +lit_corridor show a dark corridor as lit if in sight [False] +lootabc use a/b/c rather than o/i/b when looting [False] +mail enable the mail daemon [True] +mention_decor give feedback when walking across stairs, altars, [False] + fountains, and such even when not obscured by objects +mention_walls give feedback when walking against a wall [False] +menu_overlay overlay menus on the screen and align to right [True] +menucolors enable MENUCOLOR pattern matching to highlight [False] + lines in object menus like inventory; might highlight with + bold, inverse, &c even when color is unavailable or toggled off +nudist start your character without armor [False] +null allow nulls to be sent to your terminal [True] try turning this option off (forcing NetHack to use its own delay code) if moving objects seem to teleport across rooms -perm_invent keep inventory in a permanent window [FALSE] -pickup_thrown override pickup_types for thrown objects [TRUE] -pushweapon when wielding a new weapon, put your previously [FALSE] +pauper start your character with no possessions [False] +perm_invent keep inventory in a permanent window [False] +pickup_stolen override pickup_types for stolen objects [True] +pickup_thrown override pickup_types for thrown objects [True] +price_quotes show remembered price quotes for unIDed items [False] +pushweapon when wielding a new weapon, put your previously [False] wielded weapon into the secondary weapon slot -rawio allow the use of raw I/O [FALSE] -rest_on_space count the space bar as a rest character [FALSE] -safe_pet prevent you from (knowingly) attacking your pet(s) [TRUE] -sanity_check perform data sanity checks [FALSE] -showexp display your accumulated experience points [FALSE] -showrace show yourself by your race rather than by role [FALSE] -silent don't use your terminal's bell sound [TRUE] -sortpack group similar kinds of objects in inventory [TRUE] -sparkle display sparkly effect for resisted magical [TRUE] +quick_farsight usually skip the chance to browse the map when [False] + randomly triggered clairvoyance takes place +rawio allow the use of raw I/O [False] +reroll allow rerolling of starting inventory [False] +rest_on_space count the space bar as a rest character [False] +safe_pet prevent you from (knowingly) attacking your pet(s) [True] +safe_wait require use of 'm' prefix before '.' or 's' to [True] + wait or search when adjacent to a hostile monster +sanity_check perform data sanity checks [False] +showexp display your accumulated experience points [False] +showrace show yourself by your race rather than by role [False] +showvers show version number on status lines [False] +silent don't use your terminal's bell sound [True] +sortpack group similar kinds of objects in inventory [True] +sparkle display sparkly effect for resisted magical [True] attacks (e.g. fire attack on fire-resistant monster) -standout use standout mode for --More-- on messages [FALSE] -status_updates update the status lines [TRUE] -time display elapsed game time, in moves [FALSE] -tombstone print tombstone when you die [TRUE] -toptenwin print topten in a window rather than stdout [FALSE] -travel enable the command to travel to a map location via [TRUE] - a shortest-path algorithm, usually invoked by '_'. -use_darkgray use bold black instead of blue for black glyphs. [TRUE] -use_inverse display detected monsters in highlighted manner [FALSE] -verbose print more commentary during the game [TRUE] -whatis_menu show menu when getting a map location [FALSE] -whatis_moveskip skip same glyphs when getting a map location [FALSE] +standout use standout mode for --More-- on messages [False] +status_updates update the status lines [True] +terrainstatus show extra status field describing current location [False] +time display elapsed game time, in moves [False] +tips show some helpful tips during gameplay [True] +tombstone print tombstone when you die [True] +toptenwin print topten in a window rather than stdout [False] +travel enables travelling via mouse click if supported; [True] + can be toggled off to prevent mouse clicks on the map from + attempting to move the hero; does not affect travel via '_' +use_darkgray use bold black instead of blue for black glyphs. [True] +use_inverse display detected monsters in highlighted manner [False] +verbose print more commentary during the game [True] +weaponstatus show extra status field listing wielded weapon(s) [False] +whatis_menu show menu when getting a map location [False] +whatis_moveskip skip same glyphs when getting a map location [False] There are further boolean options controlled by compilation flags. Boolean option if INSURANCE was set at compile time: -checkpoint save game state after each level change, for [TRUE] +checkpoint save game state after each level change, for [True] possible recovery after program crash Boolean option if NEWS was set at compile time: -news print any news from game administrator on startup [TRUE] - -Boolean option if MFLOPPY was set at compile time: -checkspace check free disk space before writing files to disk [TRUE] +news print any news from game administrator on startup [True] Boolean option if SCORE_ON_BOTL was set at compile time: -showscore display your approximate accumulated score [FALSE] - -Boolean options if TEXTCOLOR was set at compile time: -color use different colors for objects on screen [TRUE for micros] -hilite_pet display pets in a highlighted manner [FALSE] -hilite_pile display item piles in a highlighted manner [FALSE] +showscore display your approximate accumulated score [False] -Boolean option if TIMED_DELAY was set at compile time (tty interface only): -timed_delay on unix and VMS, use a timer instead of sending [TRUE] +Boolean option if TIMED_DELAY was set at compile time (tty or curses only): +timed_delay on unix and VMS, use a timer instead of sending [True] extra screen output when attempting to pause for display effect. on MSDOS without the termcap lib, whether or not to pause for visual effect. -Boolean option for Amiga, or for others if ALTMETA was set at compile time: -altmeta For Amiga, treat Alt+key as Meta+key. [TRUE] +Boolean option if ALTMETA was set at compile time: altmeta For unix and VMS, treat two character sequence - "ESC c" as M-c (Meta+c, 8th bit set) when nethack [FALSE] + "ESC c" as M-c (Meta+c, 8th bit set) when nethack [False] obtains a command from player's keyboard. -Boolean option if USE_TILES was set at compile time (MSDOS protected mode): -preload_tiles control whether tiles get pre-loaded into RAM at [TRUE] +Boolean option if TILES_IN_GLYPHMAP set at compile time (MSDOS): +preload_tiles control whether tiles get pre-loaded into RAM at [True] the start of the game. Doing so enhances performance of the tile graphics, but uses more memory. Boolean option if TTY_TILES_ESCCODES was set at compile time (tty only): -vt_tiledata insert extra data escape code markers into output [FALSE] +vt_tiledata insert extra data escape code markers into output [False] + +Boolean option if TTY_SOUND_ESCCODES was set at compile time (tty only): +vt_sounddata insert sound data escape code markers into output [False] + +Boolean options which may be available depending upon which interfaces +the program has been built to support. If it supports multiple such, +some of these may show as available for setting but not do anything if +you happen to be using a different interface than the one(s) they're for: +ascii_map show map as text, forces tiles_map Off; Qt, X11 +guicolor curses +hitpointbar curses, tty, Windows GUI if statushilites enabled; + Qt without statushilites; X11 if 'fancy_status' disabled + (via X application defaults) and statushilities enabled +popup_dialog curses, Qt, Windows GUI +selectsaved tty (Qt and Windows GUI do this unconditionally) +splash_screen curses, Qt, Windows GUI +tiled_map show map as tiles, forces ascii_map Off; Qt, X11 -Any Boolean option can be negated by prefixing it with a '!' or 'no'. +Boolean options available when running in debug mode (aka wizard mode): +menu_tab_sep menu formatting--do not touch +monpolycontrol have player choose shape-changing monsters' new shapes +montelecontrol let player choose destination for teleported monsters +travel_debug show state of travel pathfinding algorithm on the map +wizweight include item weights in inventory display +Any Boolean option can be set to True by including it among options being +set, or negated (set to False) by prefixing its name with a '!' or 'no'. +Alternatively, the compound option syntax can be used: 'optname:true' and +'optname:false'. + + - - - - - Compound options are written as option_name:option_value. Compound options which can be set during the game are: +autounlock when attempting to open a locked door or loot [Apply-Key] + a locked container, specifies an action to take: can be + None, or one or more of Untrap + Apply-Key + Kick + Force; + if Untrap is included, it will be handled first; the + others apply if you answer "no" to "check for traps?"; + for "yes", it won't necessary find anything even when a + trap happens to be present and will use up the rest of + the current move regardless of whether it finds anything; + Kick is only useful for doors and Force is only useful for + containers; either will only be attempted if Untrap is + omitted or skipped and Apply-Key is omitted or you aren't + carrying an unlocking tool or you decline to use one boulder override the default boulder symbol [`] +crash_email email address to use when filling in crash reports [] +crash_name name to use when filling in crash reports [] +crash_urlmax length of longest url we can generate for a crash report [] disclose the types of information you want [ni na nv ng nc no] offered at the end of the game (space separated list of two-character values; @@ -122,10 +179,12 @@ disclose the types of information you want [ni na nv ng nc no] 'n' prompt with default "no", 'y' prompt with default "yes", 'a' prompt to select sorting order (for suffix 'v' only); suffix: 'i' inventory, 'a' attributes, 'v' vanquished - monsters, 'g' genocided and extinct monsters, 'c' conduct, - 'o' dungeon overview) + monsters, 'g' genocided and extinct monsters, 'c' conduct + and achievements, 'o' dungeon overview) fruit the name of a fruit you enjoy eating [slime mold] (basically a whimsy which NetHack uses from time to time). +hilite_status specifies a rule for highlighting a status field [] + (multiple instances are allowed) menustyle user interface for selection of multiple objects: [Full] Traditional -- prompt for classes of interest, then prompt item-by-item for those classes; @@ -136,13 +195,34 @@ menustyle user interface for selection of multiple objects: [Full] only the first letter ('T','C','F','P') matters (With Traditional, many actions allow pseudo-class 'm' to request a menu for choosing items: one-shot Combination.) +menu_objsyms whether to include object class symbols in menus: [4] + 0 - none -- don't add object symbols to menus; + 1 - headers -- append object class symbol to menu header lines; + 2 - entries -- show object glyphs (same as class symbol + for ASCII interfaces) on each menu entry line; + 3 - both -- 1 and 2 combined; + 4 - conditional -- as 2 but only if no headers are present; + 5 - one-or-other -- 1 and 4 combined; + choices 0 and 1 should work with any interface; 2 through 5 + are supported by tty and curses +msg_window behavior of ^P message recall for tty interface: [s] + single -- one message at a time + full -- full window with all saved top line messages + reverse -- full with messages printed most-recent-first + combination -- first two of consecutive ^P commands show + single messages, third yields full set +msg_window behavior of ^P message recall for curses interface: [r] + reverse -- full window, most recent first + full -- full with messages printed least recent first, + initially positioned on last page to start + with most recent messages in view number_pad alphabetic versus numeric control over movement: [0] 0 -- traditional hjkl + yubn movement (default); 1 -- digits control movement, for use with numeric keypad; 2 -- same as 1, but '5' works as 'g' prefix rather than 'G'; 3 -- numeric for phone keypad (1,2,3 above, 7,8,9 below); 4 -- phone keypad (3) combined with '5' preference (2); - -1 -- alphabetic movement but 'z' swapped with 'y'. + -1 -- "qwertz"; alphabetic movement but 'z' swapped with 'y'. Setting number_pad (to a positive value) affects how all digit keys are handled, not just those on numeric keypad. packorder a list of default symbols for kinds of [")[%?+!=/(*`0_] @@ -150,9 +230,10 @@ packorder a list of default symbols for kinds of [")[%?+!=/(*`0_] some other things) gets shown if the 'sortpack' option is on (If you specify only some kinds of items, the others from the default order will be appended to the end.) -paranoid_confirmation space separated list [paranoid_confirmation:pray] +paranoid_confirmation space separated list [paranoid_confirm:pray swim] of situations where alternate prompting is desired - Confirm -- when requiring "yes", also require "no" to reject + Confirm -- when requiring "yes", also require "no" to reject; + also requires yes rather than y for pray, trap, Autoall quit -- yes vs y to confirm quitting or to enter explore mode die -- yes vs y to confirm dying (for explore or debug mode) bones -- yes vs y to confirm saving bones data in debug mode @@ -162,8 +243,22 @@ paranoid_confirmation space separated list [paranoid_confirmation:pray] Were-change -- yes vs y to confirm changing form due to lycanthropy when hero has polymorph control; pray -- y to confirm an attempt to pray; on by default + trap -- y to enter a known trap unless it is harmless; + swim -- require m prefix to move into water or lava when + hero has seen it and isn't impaired; on by default; + AutoAll -- y to confirm if using menustyle:Full and choice 'A' + in the object class filtering menu is selected; Remove -- always pick from inventory for 'R' and 'T' even when wearing just one applicable item to remove or take off +perminv_mode if the interface supports a persistent inventory window [a] + and the perm_invent option is true, this controls what + will be shown: + none/off -- behave as if perm_invent is false + all/on -- show inventory except for gold (default) + full -- show inventory including gold + in-use -- only show worn and wielded items + (the tty interface's optional perm_invent support includes + a couple of additional choices that vary all and full) pickup_burden when you pick up an item that exceeds this encumbrance [S] level (Unencumbered, Burdened, streSsed, straiNed, overTaxed, or overLoaded), you will be asked if you want to continue. @@ -183,11 +278,35 @@ scores the parts of the score list you wish [!own/3 top/2 around] to see when the game ends. You choose a combination of top scores, scores around the top scores, and all of your own scores. +sortdiscoveries preferred order when viewing list of discovered objects [o] + o -- in order of discovery within each class + s -- sortloot's "loot" order + c -- alphabetized within each class + a -- alphabetized across all classes +sortloot preferred order when examining a set of objects [n] + none -- no sorting + loot -- sort piles of objects on floor and in containers + full -- 'loot' plus objects in inventory +sortvanquished preferred order when viewing vanquished monsters list [t] + t -- traditional, order by monster level + d -- order by monster difficulty rating + a -- alphabetical, first any unique monsters then others + c -- order by class, low to high level within each class + n -- order by count, high to low + z -- order by count, low to high +statushilites whether to display status highlights (when non-zero) and [0] + also how many turns to display temporary highlights (for + 'up', 'down', and 'changed' hilite_status rules) +statuslines whether to use expanded (3) or condensed (2) status [2] + (for tty and curses; 2 is traditional, 3 is recommended; + also for Qt, where 3 is traditional and 2 is recommended) suppress_alert disable various version-specific warnings about changes [] in game play or the user interface, such as notification given for the 'Q' command that quitting is now done via #quit (e.g., use suppress_alert:3.3.1 to stop that and any other notifications added in that version or earlier) +versinfo selects what information is displayed when showvers [1 or 4] + is true (default depends on program development status) whatis_coord controls whether to include map coordinates when [n] autodescribe is active for the '/' and ';' commands. Value is the first letter of one of @@ -208,8 +327,8 @@ Compound options which may be set only on startup are: align Your starting alignment (lawful, neutral, chaotic, [random] or random). Many roles restrict the choice to a subset. You may specify just the first letter. -catname the name of your first cat [none] -dogname the name of your first dog [none] +catname name of your starting pet if it is a kitten [none] +dogname name of your starting pet if it is a little dog [none] Several roles who start with a dog have one whose name is pre-set (for example, "Hachi" for Samurai), but that name will be overridden if you specify dogname. @@ -217,22 +336,25 @@ gender Your starting gender (male, female, or random). [random] You may specify just the first letter. Although you can still denote your gender using the old "male" and "female" boolean options, the "gender" option will take precedence. -horsename the name of your first horse [none] +horsename name of your starting pet if it is a pony [none] menu_* specify single character accelerators for menu commands. Here is a list of all commands with their default keystroke followed by a list of window-ports that implement them: - 'x' is X11, 't' is tty, 'g' is Gem, 'a' is Amiga. - menu_deselect_all deselect all items in a menu [-](xtga) - menu_deselect_page deselect all items on this menu page [\](tga) - menu_first_page jump to the first page in a menu [^](tga) - menu_invert_all invert all items in a menu [@](xtga) - menu_invert_page invert all items on this menu page [~](tga) - menu_last_page jump to the last page in a menu [|](tga) - menu_next_page goto the next menu page [>](tga) - menu_previous_page goto the previous menu page [<](tga) - menu_search search for a menu item [:](xtga) - menu_select_all select all items in a menu [.](xtga) - menu_select_page select all items on this menu page [,](tga) + (t is tty, c is curses, w is Windows GUI, x is X11, q is Qt) + menu_first_page jump to the first page in a menu [^](tcwxq) + menu_last_page jump to the last page in a menu [|](tcwxq) + menu_next_page advance to the next menu page [>](tcwxq) + menu_previous_page back up to the previous menu page [<](tcwxq) + menu_shift_left pan view to left (perm_invent only) [{](cx) + menu_shift_right pan view to right (perm_invent only) [}](cx) + menu_select_all select all items in a menu [.](tcwxq) + menu_select_page select all items on this menu page [,](tcwq) + menu_deselect_all deselect all items in a menu [-](tcwxq) + menu_deselect_page deselect all items on this menu page [\](tcwq) + menu_invert_all invert all items in a menu [@](tcwxq) + menu_invert_page invert all items on this menu page [~](tcwq) + menu_search prompt for target text and invert [:](tcwxq) + items which match that msghistory number of top line messages to save [20] name the name of your character [defaults to username on multi- user systems, asks "who are you?" on single-user systems or if @@ -259,21 +381,13 @@ role Your starting role (e.g., role:Barbarian, role:Valk). [random] the "role" option will take precedence. windowtype windowing system to be used [depends on operating system and compile-time setup] if more than one choice is available. - Most instances of the program support only one window-type; + Some instances of the program support only one window-type; when that is the case, you don't need to specify anything. The list of supported window-types in your program can be seen while the program is running by using the #version command or from outside the program by examining the text file named 'options' which is generated when building it. -Compound option if TTY_GRAPHICS was set at compile time: -msg_window the type of message window to use: [single] - single -- One message at a time - full -- Full window with all saved top line messages - reverse -- Same as full, but messages printed most-recent-first - combination -- Two single messages, then as full - - Some sample options lists are: !autopickup,!tombstone,name:Gandalf,scores:own/3 top/2 around female,nonews,dogname:Rover,rest_on_space,!verbose,menustyle:traditional diff --git a/dat/optmenu b/dat/optmenu new file mode 100644 index 000000000..f08df0f2e --- /dev/null +++ b/dat/optmenu @@ -0,0 +1,43 @@ + How dynamically setting options works: + + The simple options menu shows a relatively small subset of options + and operates on each choice you make immediately, then is put back + up to allow further changes. + + The full options menu shows the current value for all options and + lets you pick ones that you'd like to change. Picking them doesn't + make any changes though. That will take place once you close the + menu. For most of NetHack's interfaces, closing the menu is done + by pressing the key or key; others might require + clicking on [ok]. Pressing the key or clicking on [cancel] + will close the menu and discard any pending changes. + + The options menu is too long to fit on one screen. Some interfaces + paginate menus; use the '>' key to advance a page or '<' to back + up. They typically re-use selection letters (a-z) on each page. + Others use one long page and you need to use a scrollbar; once past + a-z and A-Z they'll have entries without selection letters. Those + can be selected by clicking on them. + + For toggling boolean (True/False or On/Off) options, selecting them + is all that is needed. For compound options (which take a number, + a choice of several particular values, or something more complex, + and are listed in a second section after the boolean ones), you will + be prompted to supply a new value. + + At the start of each of the two sections are the values of some + unselectable options which can only be set before the game starts. + After the compound section are some "other" options which take a set + of multiple values and tend to be more complicated to deal with. + + Some changes will only last until you save (or quit) the current + game. Usually those are for things that might not be appropriate + if you were to restore the saved game on another computer with + different capabilities. Other options will be included in this + game's save file and retain their settings after restore. None set + in the options menu will affect other games, either already saved or + new ones. For that, you need to update your run-time configuration + file and specify the desired options settings there. Even then, + restoring existing games that contain saved option values will use + those saved ones. + diff --git a/dat/oracle.des b/dat/oracle.des deleted file mode 100644 index 64603a935..000000000 --- a/dat/oracle.des +++ /dev/null @@ -1,65 +0,0 @@ -# NetHack 3.6 oracle.des $NHDT-Date: 1524689580 2018/04/25 20:53:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.10 $ -# Copyright (c) 2015 by Pasi Kallinen -# NetHack may be freely redistributed. See license for details. -# -# Oracle level -# - -LEVEL: "oracle" - -ROOM: "ordinary" , lit, (3,3), (center,center), (11,9) { - OBJECT:('`',"statue"),(0,0),montype:'C',1 - OBJECT:('`',"statue"),(0,8),montype:'C',1 - OBJECT:('`',"statue"),(10,0),montype:'C',1 - OBJECT:('`',"statue"),(10,8),montype:'C',1 - OBJECT:('`',"statue"),(5,1),montype:'C',1 - OBJECT:('`',"statue"),(5,7),montype:'C',1 - OBJECT:('`',"statue"),(2,4),montype:'C',1 - OBJECT:('`',"statue"),(8,4),montype:'C',1 - - SUBROOM: "delphi" , lit , (4,3) , (3,3) { - FOUNTAIN: (0, 1) - FOUNTAIN: (1, 0) - FOUNTAIN: (1, 2) - FOUNTAIN: (2, 1) - MONSTER: ('@', "Oracle"), (1,1) - ROOMDOOR: false , nodoor , random, random - } - - MONSTER: random, random - MONSTER: random, random - -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, up - OBJECT: random,random -} - -ROOM: "ordinary" , random, random, random, random { - STAIR: random, down - OBJECT: random, random - TRAP: random, random - MONSTER: random, random - MONSTER: random, random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - OBJECT: random, random - MONSTER: random, random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: random, random -} - -ROOM: "ordinary" , random, random, random, random { - OBJECT: random, random - TRAP: random, random - MONSTER: random, random -} - -RANDOM_CORRIDORS diff --git a/dat/oracle.lua b/dat/oracle.lua new file mode 100644 index 000000000..16ee2ff4e --- /dev/null +++ b/dat/oracle.lua @@ -0,0 +1,69 @@ +-- NetHack oracle oracle.lua $NHDT-Date: 1652196033 2022/05/10 15:20:33 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 2015 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- +-- Oracle level +des.level_flags("noflip"); + +des.room({ type = "ordinary", lit=1, x=3,y=3, xalign="center",yalign="center", w=11,h=9, contents = function() + des.object({ id = "statue", x = 0, y = 0, montype = "C", historic = true }); + des.object({ id = "statue", x = 0, y = 8, montype = "C", historic = true }); + des.object({ id = "statue", x =10, y = 0, montype = "C", historic = true }); + des.object({ id = "statue", x =10, y = 8, montype = "C", historic = true }); + des.object({ id = "statue", x = 5, y = 1, montype = "C", historic = true }); + des.object({ id = "statue", x = 5, y = 7, montype = "C", historic = true }); + des.object({ id = "statue", x = 2, y = 4, montype = "C", historic = true }); + des.object({ id = "statue", x = 8, y = 4, montype = "C", historic = true }); + + des.room({ type = "delphi", lit = 1, x=4,y=3, w=3,h=3, contents = function() + des.feature("fountain", 0, 1); + des.feature("fountain", 1, 0); + des.feature("fountain", 1, 2); + des.feature("fountain", 2, 1); + des.monster("Oracle", 1, 1); + des.door({ state="nodoor", wall="all" }); + end + }); + + des.monster(); + des.monster(); + end +}); + +des.room({ contents = function() + des.stair("up"); + des.object(); + end +}); + +des.room({ contents = function() + des.stair("down"); + des.object(); + des.trap(); + des.monster(); + des.monster(); + end +}); + +des.room({ contents = function() + des.object(); + des.object(); + des.monster(); + end +}); + +des.room({ contents = function() + des.object(); + des.trap(); + des.monster(); + end +}); + +des.room({ contents = function() + des.object(); + des.trap(); + des.monster(); + end +}); + +des.random_corridors(); diff --git a/dat/oracles.txt b/dat/oracles.txt index d4d5ae250..cbaeb5d3b 100644 --- a/dat/oracles.txt +++ b/dat/oracles.txt @@ -100,5 +100,6 @@ be old and miserly. The name of Elbereth may strike fear into the hearts of thine enemies, if thou dost write it upon the ground at thy feet. If thou maintainest the utmost calm, thy safety will be aided greatly, but beware lest thy clumsy -feet scuff the inscription, cancelling its potence. +feet scuff the inscription, cancelling its potence, or thy wayward +sword-arm break the truce. ----- diff --git a/dat/orcus.lua b/dat/orcus.lua new file mode 100644 index 000000000..67406d8e2 --- /dev/null +++ b/dat/orcus.lua @@ -0,0 +1,159 @@ +-- NetHack gehennom orcus.lua $NHDT-Date: 1652196033 2022/05/10 15:20:33 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel", "shortsighted") + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +-- A ghost town +local orcus1 = des.map({ halign = "right", valign = "center", map = [[ +.|....|....|....|..............|....|........ +.|....|....|....|..............|....|........ +.|....|....|....|--...-+-------|............. +.|....|....|....|..............+............. +.|.........|....|..............|....|........ +.--+-...-+----+--....-------...--------.-+--- +.....................|.....|................. +.....................|.....|................. +.--+----....-+---....|.....|...----------+--- +.|....|....|....|....---+---...|......|...... +.|.........|....|..............|......|...... +.----...---------.....-----....+......|...... +.|........................|....|......|...... +.----------+-...--+--|....|....----------+--- +.|....|..............|....+....|............. +.|....+.......|......|....|....|............. +.|....|.......|......|....|....|............. +]], contents = function(rm) + des.mazewalk(00,06,"west") + -- Entire main area + des.region(selection.area(01,00,44,16),"unlit") + des.stair("down", 33,15) + -- Wall "ruins" + des.object("boulder",19,02) + des.object("boulder",20,02) + des.object("boulder",21,02) + des.object("boulder",36,02) + des.object("boulder",36,03) + des.object("boulder",06,04) + des.object("boulder",05,05) + des.object("boulder",06,05) + des.object("boulder",07,05) + des.object("boulder",39,05) + des.object("boulder",08,08) + des.object("boulder",09,08) + des.object("boulder",10,08) + des.object("boulder",11,08) + des.object("boulder",06,10) + des.object("boulder",05,11) + des.object("boulder",06,11) + des.object("boulder",07,11) + des.object("boulder",21,11) + des.object("boulder",21,12) + des.object("boulder",13,13) + des.object("boulder",14,13) + des.object("boulder",15,13) + des.object("boulder",14,14) + -- Doors + des.door("closed",23,02) + des.door("open",31,03) + des.door("nodoor",03,05) + des.door("closed",09,05) + des.door("closed",14,05) + des.door("closed",41,05) + des.door("open",03,08) + des.door("nodoor",13,08) + des.door("open",41,08) + des.door("closed",24,09) + des.door("closed",31,11) + des.door("open",11,13) + des.door("closed",18,13) + des.door("closed",41,13) + des.door("open",26,14) + des.door("closed",06,15) + -- Special rooms + des.altar({ x=24,y=07,align="noalign",type="sanctum" }) + des.region({ region={22,12,25,16},lit=0,type="morgue",filled=1 }) + des.region({ region={32,09,37,12},lit=1,type="shop",filled=1 }) + des.region({ region={12,00,15,04},lit=1,type="shop",filled=1 }) + -- Some traps. + des.trap("spiked pit") + des.trap("sleep gas") + des.trap("anti magic") + des.trap("fire") + des.trap("fire") + des.trap("fire") + des.trap("magic") + des.trap("magic") + -- Some random objects + des.object() + des.object() + des.object() + des.object() + des.object() + des.object() + des.object() + des.object() + des.object() + des.object() + -- An object that's worth most of a wish + -- (this is part of the compensation for the reduced wishes at the Castle) + if math.random(0, 1) == 1 then + des.object("magic marker") + else + des.object("magic lamp") + end + -- The resident nasty + des.monster("Orcus",33,15) + -- And its preferred companions + des.monster("human zombie",32,15) + des.monster("shade",32,14) + des.monster("shade",32,16) + des.monster("vampire",35,16) + des.monster("vampire",35,14) + des.monster("vampire lord",36,14) + des.monster("vampire lord",36,15) + -- Randomly placed companions + des.monster("skeleton") + des.monster("skeleton") + des.monster("skeleton") + des.monster("skeleton") + des.monster("skeleton") + des.monster("shade") + des.monster("shade") + des.monster("shade") + des.monster("shade") + des.monster("giant zombie") + des.monster("giant zombie") + des.monster("giant zombie") + des.monster("ettin zombie") + des.monster("ettin zombie") + des.monster("ettin zombie") + des.monster("human zombie") + des.monster("human zombie") + des.monster("human zombie") + des.monster("vampire") + des.monster("vampire") + des.monster("vampire") + des.monster("vampire lord") + des.monster("vampire lord") + -- A few more for the party + des.monster() + des.monster() + des.monster() + des.monster() + des.monster() +end }); + +des.levregion({ region={01,00,12,20}, region_islev=1, exclude={20,01,70,20}, exclude_islev=1, type="stair-up" }); +des.levregion({ region={01,00,12,20}, region_islev=1, exclude={20,01,70,20}, exclude_islev=1, type="branch" }); +des.teleport_region({ region={01,00,12,20}, region_islev=1, exclude={20,01,70,20}, exclude_islev=1 }); + +local protected = bounds2:negate() | orcus1; +hell_tweaks(protected); diff --git a/dat/quest.lua b/dat/quest.lua new file mode 100644 index 000000000..c3bad692d --- /dev/null +++ b/dat/quest.lua @@ -0,0 +1,3087 @@ +-- NetHack quest.lua $NHDT-Date: 1726894904 2024/09/21 05:01:44 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.10 $ +-- Copyright (c) 2021 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- TODO: +-- - output = "verbalize" +-- - export the quest string replacements to lua, instead of %H etc +-- - allow checking if hero is carrying item (see comments for %Cp Arc 00042) +-- - fold quest_portal, quest_portal_again, quest_portal_demand into one +-- - write tests to check questtext validity? +-- - qt_pager hack(?): if (qt_msg->delivery == 'p' && strcmp(windowprocs.name, "X11")) + + + + +-- text = "something" +-- Text is shown to the user. + +-- synopsis = "something" +-- Synopsis is inserted into the message history. +-- +-- output = "pline" | "menu" | "text" +-- The output can be manually set by using output = "menu" +-- Valid values for output are "pline", "text", and "menu, defaulting to +-- pline, unless the text contains newlines, or is too long to fit a message buffer, +-- then will be shown as a text window instead. + + + +questtext = { + -- If a role doesn't have a specific message, try a fallback + msg_fallbacks = { + goal_alt = "goal_next" + }, + common = { + TEST_PATTERN = { + output = "text", + text = [[%p: return(plname); + %c: return(pl_character); + %r: return((char *)rank_of(u.ulevel)); + %R: return((char *)rank_of(MIN_QUEST_LEVEL)); + %s: return((flags.female) ? "sister" : "brother" ); + %S: return((flags.female) ? "daughter" : "son" ); + %l: return((char *)ldrname()); + %i: return(intermed()); + %o: return(artiname()); + %O: return(shortened(artiname())); + %n: return((char *)neminame()); + %g: return((char *)guardname()); + %G: return((char *)align_gtitle(u.ualignbase[1])); + %H: return((char *)homebase()); + %a: return(Alignnam(u.ualignbase[1])); + %A: return(Alignnam(u.ualign.type)); + %d: return((char *)align_gname(u.ualignbase[1])); + %D: return((char *)align_gname(A_LAWFUL)); + %C: return("chaotic"); + %N: return("neutral"); + %L: return("lawful"); + %x: return((Blind) ? "sense" : "see"); + %Z: return("The Dungeons of Doom"); + %%: return(percent_sign); + a suffix: return an(root); + A suffix: return An(root); + C suffix: return capitalized(root); + h suffix: return pronoun(he_or_she, mon_of(root)); /* for %l,%n,%d,%o */ + H suffix: return capitalized(pronoun(he_or_she, mon_of(root))); + i suffix: return pronoun(him_or_her, mon_of(root)); + I suffix: return capitalized(pronoun(him_or_her, mon_of(root))); + j suffix: return pronoun(his_or_her, mon_of(root)); + J suffix: return capitalized(pronoun(his_or_her, mon_of(root))); + p suffix: return makeplural(root); + P suffix: return makeplural(capitalized(root)); + s suffix: return s_suffix(root); + S suffix: return s_suffix(capitalized(root)); + t suffix: return strip_the_prefix(root);]], + }, + angel_cuss = { + "\"Repent, and thou shalt be saved!\"", + "\"Thou shalt pay for thine insolence!\"", + "\"Very soon, my child, thou shalt meet thy maker.\"", + "\"The great %D has sent me to make you pay for your sins!\"", + "\"The wrath of %D is now upon you!\"", + "\"Thy life belongs to %D now!\"", + "\"Dost thou wish to receive thy final blessing?\"", + "\"Thou art but a godless void.\"", + "\"Thou art not worthy to seek the Amulet.\"", + "\"No one expects the Spanish Inquisition!\"", + "\"Judgment hath been passed upon thee, %p.\"", + "\"Thy reckoning is at hand, %p.\"", + "\"Thou shalt be brought before %D for thy crimes!\"", + "\"With %D as my witness, I shall strike thee down.\"", + }, + banished = { + synopsis = "[You are banished from %H for betraying your allegiance to %d.]", + output = "text", + text = [["You have betrayed all those who hold allegiance to %d, as you once did. +My allegiance to %d holds fast and I cannot condone or accept what you +have done. + +Leave this place. You shall never set foot at %H again. +That which you seek is now lost forever, for without the Bell of Opening, +you will never be able to enter the place where he who has the Amulet +resides. + +Go now! You are banished from this place.]], + }, + demon_cuss = { + "\"I first mistook thee for a statue, when I regarded thy head of stone.\"", + "\"Come here often?\"", + "\"Doth pain excite thee? Wouldst thou prefer the whip?\"", + "\"Thinkest thou it shall tickle as I rip out thy lungs?\"", + "\"Eat slime and die!\"", + "\"Go ahead, fetch thy mama! I shall wait.\"", + "\"Go play leapfrog with a herd of unicorns!\"", + "\"Hast thou been drinking, or art thou always so clumsy?\"", + "\"This time I shall let thee off with a spanking, but let it not happen again.\"", + "\"I've met smarter (and prettier) acid blobs.\"", + "\"Look! Thy bootlace is undone!\"", + "\"Mercy! Dost thou wish me to die of laughter?\"", + "\"Run away! Live to flee another day!\"", + "\"Thou hadst best fight better than thou canst dress!\"", + "\"Twixt thy cousin and thee, Medusa is the prettier.\"", + "\"Methinks thou wert unnaturally stirred by yon corpse back there, eh, varlet?\"", + "\"Up thy nose with a rubber hose!\"", + "\"Verily, thy corpse could not smell worse!\"", + "\"Wait! I shall polymorph into a grid bug to give thee a fighting chance!\"", + "\"Why search for the Amulet? Thou wouldst but lose it, cretin.\"", + "\"Thou ought to be a comedian, thy skills are so laughable!\"", + "\"Thy gaze is so vacant, I thought thee a floating eye!\"", + "\"Thy head is unfit for a mind flayer to munch upon!\"", + "\"Only thy reflection could love thee!\"", + "\"Hast thou considered masking thine odour?\"", + "\"Hold! Thy face is a most exquisite torture!\"", + "\"I should fart in thy direction, but it might improve thy smell!\"", + }, + legacy = { + synopsis = "[%dC has chosen you to recover the Amulet of Yendor for %dI.]", + output = "menu", + text = [[It is written in the Book of %d: + + After the Creation, the cruel god Moloch rebelled + against the authority of Marduk the Creator. + Moloch stole from Marduk the most powerful of all + the artifacts of the gods, the Amulet of Yendor, + and he hid it in the dark cavities of Gehennom, the + Under World, where he now lurks, and bides his time. + +Your %G %d seeks to possess the Amulet, and with it +to gain deserved ascendance over the other gods. + +You, a newly trained %r, have been heralded +from birth as the instrument of %d. You are destined +to recover the Amulet for your deity, or die in the +attempt. Your hour of destiny has come. For the sake +of us all: Go bravely with %d!]], + }, +-- starting with 'pauper' option set, last paragraph differs from normal legacy + pauper_legacy = { + synopsis = "[%dC has chosen you to recover the Amulet of Yendor for %dI.]", + output = "menu", + text = [[It is written in the Book of %d: + + After the Creation, the cruel god Moloch rebelled + against the authority of Marduk the Creator. + Moloch stole from Marduk the most powerful of all + the artifacts of the gods, the Amulet of Yendor, + and he hid it in the dark cavities of Gehennom, the + Under World, where he now lurks, and bides his time. + +Your %G %d seeks to possess the Amulet, and with it +to gain deserved ascendance over the other gods. + +You, an untrained %r, have been unable to adequately +prepare to be the instrument of %d. Nevertheless, you +are destined to recover the Amulet for your deity, or die +in the attempt. Your hour of destiny has come. For the +sake of us all: Go bravely with %d!]], + }, + quest_complete_no_bell = { + text = [["The silver bell which was hoarded by %n will be +essential in locating the Amulet of Yendor."]], + }, + quest_portal = { + output = "pline", + text = [[You receive a faint telepathic message from %l: +Your help is urgently needed at %H! +Look for a ...ic transporter. +You couldn't quite make out that last message.]], + }, + quest_portal_again = { + text = "You again sense %l pleading for help.", + }, + quest_portal_demand = { + text = "You again sense %l demanding your attendance.", + }, + }, + Arc = { + assignquest = { + synopsis = "[%nC has stolen %o. Locate %i, defeat %ni, and return %O.]", + output = "text", + text = [["Grave times have befallen the college, for %na has +stolen %o. Without it, the board of directors of +the university will soon have no choice but to revoke our research grants. + +"You must locate the entrance to %i. Within it, +you will find %n. + +"You must then defeat %n and return %o +to me. + +"Only in this way will we be able to prevent the budget cuts that could +close this college. + +"May the wisdom of %d be your guide."]], + }, + badalign = { + synopsis = "[\"%pC, you have strayed from the %a path. Purify yourself!\"]", + output = "text", + text = [["%pC! I've heard that you've been using sloppy techniques. Your +results lately can hardly be called suitable for %ra! + +"How could you have strayed from the %a path? Go from here, and come +back only when you have purified yourself."]], + }, + badlevel = { + synopsis = "[%pC, a mere %r is too inexperienced.]", + output = "text", + text = [["%p, you are yet too inexperienced to undertake such a demanding +quest. A mere %r could not possibly face the rigors demanded and +survive. Go forth, and come here again when your adventures have further +taught you."]], + }, + discourage = { + "\"Try your best, %p. You cannot defeat me.\"", + "\"I shall rend the flesh from your body whilst you still breathe!\"", + "\"First you, %p, then I shall destroy your mentor, %l.\"", + "\"Tiring yet, %p? I draw my power from my master and cannot falter!\"", + "\"I shall rend thy soul from thy body and consume it!\"", + "\"You are far too %a -- it weakens you. You shall die in this place.\"", + "\"%d has forsaken you! You are lost now!\"", + "\"A mere %r cannot hope to defeat me!\"", + "\"If you are the best %l can send, I have nothing to fear.\"", + "\"Die %c! I shall exhibit your carcass as a trophy.\"", + }, + encourage = { + "\"Beware, for %n is powerful and cunning.\"", + "\"To locate the entrance to %i, you must pass many traps.\"", + "\"A %nt may be vulnerable to attacks by magical cold.\"", + "\"Call upon %d when you encounter %n.\"", + "\"You must destroy %n. It will pursue you otherwise.\"", + "\"%oC is a mighty talisman. With it you can destroy %n.\"", + "\"Go forth with the blessings of %d.\"", + "\"I will have my %gP watch for your return.\"", + "\"Remember not to stray from the true %a path.\"", + "\"You may be able to sense %o when you are near.\"", + }, + firsttime = { + synopsis = "[You arrive at %H, but all is not well.]", + output = "text", + text = [[You are suddenly in familiar surroundings. The buildings in the distance +seem to be those of your old alma mater, but something is wrong. It feels +as if there has been a riot recently, or %H has +been under siege. + +All of the windows are boarded up, and there are objects scattered around +the entrance. + +Strange forbidding shapes seem to be moving in the distance.]], + }, + goal_alt = { + text = "You have returned to %ns lair.", + }, + goal_first = { + synopsis = "[This strange feeling must be the presence of %o.]", + output = "text", + text = [[A strange feeling washes over you, and you think back to things you +learned during the many lectures of %l. + +You realize the feeling must be the presence of %o.]], + }, + goal_next = { + text = "The familiar presence of %o is in the ether.", + }, + gotit = { + synopsis = "[The power of %o flows through your body! You must return it to %l.]", + output = "text", + text = [[The power of %o flows through your body! You feel +as if you could now take on the Wizard of Yendor himself and win, but +you know you must return %o to %l.]], + }, + guardtalk_after = { + "\"Did you see Lash LaRue in 'Song of Old Wyoming' the other night?\"", + "\"Hey man, got any potions of hallucination for sale?\"", + "\"I guess you are guaranteed to make full professor now.\"", + "\"So, what was worse, %n or your entrance exams?\"", + "\"%oC is impressive, but nothing like the bones I dug up!\"", + }, + guardtalk_before = { + "\"Did you see Lash LaRue in 'Song of Old Wyoming' the other night?\"", + "\"Hey man, got any potions of hallucination for sale?\"", + "\"Did you see the artifact %l brought back from the last dig?\"", + "\"So what species do *you* think we evolved from?\"", + "\"So you're %ls prize pupil! I don't know what he sees in you.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to the Astral Plane and sacrifice it at the altar of %d.]", + output = "text", + text = [["Congratulations, %p. I wondered if anyone could prevail against +the Wizard and the minions of Moloch. Now, you must embark on one +final adventure. + +"Take the Amulet, and find your way onto the Astral Plane. +There you must find the altar of %d and sacrifice the +Amulet on that altar to fulfill your destiny. + +"Remember, your path now should always be upwards."]], + }, + killed_nemesis = { + text = "The body of %n dissipates in a cloud of noxious fumes.", + }, + leader_first = { + synopsis = "[\"You have returned, %p, to a difficult task.\"]", + output = "text", + text = [["Finally you have returned, %p. You were always +my most promising student. Allow me to see if you are ready for the +most difficult task of your career."]], + }, + leader_last = { + synopsis = "[\"%pC, you have failed us. Begone!\"]", + output = "text", + text = [["%p, you have failed us. All of my careful training has been in +vain. Begone! Your tenure at this college has been revoked! + +"You are a disgrace to the profession!"]], + }, + leader_next = { + text = [["Again, %p, you stand before me. +Let me see if you have gained experience in the interim."]], + }, + leader_other = { + text = [["Once more, %p, you have returned from the field. +Are you finally ready for the task that must be accomplished?"]], + }, + locate_first = { + synopsis = "[This foreboding edifice must hide the entrance to %i.]", + output = "text", + text = [[A plain opens before you. Beyond the plain lies a foreboding edifice. + +You have the feeling that you will soon find the entrance to +%i.]], + }, + locate_next = { + text = "Once again, you are near the entrance to %i.", + }, + nemesis_first = { + synopsis = "[\"Come, %p, I shall destroy you!\"]", + output = "text", + text = [["So, %p, you think that you can succeed in recovering +%o, when your teacher, %l, has already failed. + +"Come, try your best! I shall destroy you, and gnaw on your bones."]], + }, + nemesis_next = { + synopsis = "[\"Again you try to best me, %p? You shall never recover %o.\"]", + output = "text", + text = [["Again you try to best me, eh %p? Well, you shall fail again. + +"You shall never recover %o. + +"I shall bear your soul to the Plane of Origins for my master's pleasure."]], + }, + nemesis_other = { + text = "\"You persist yet %p! Good. Now, you shall die!\"", + }, + nemesis_wantsit = { + text = [["I shall have %o from you, %p, then feast +upon your entrails!"]], + }, + nexttime = { + text = "Once again, you are back at %H.", + }, + offeredit = { + synopsis = "[%lC instructs you to guard %o from now on.]", + output = "text", + text = [[%lC touches %o briefly, gazes into it, +then smiles at you and says: + +"Well done, %p. You have defeated %n and +recovered %o. But I fear that it shall never be safe +here. + +Please take %o with you. You, %p, can +guard it now far better than I. + +May the blessings of %d follow you and guard you."]], + }, + offeredit2 = { + synopsis = "[\"Resume your search for the Amulet beyond the magic portal to %Z.\"]", + output = "text", + text = [["Careful, %p! %oC might break, and that would be +a tragic loss. You are its keeper now, and the time has come to +resume your search for the Amulet. %Z await your +return through the magic portal that brought you here."]], + }, + othertime = { + text = [[You are back at %H. +You have an odd feeling this may be the last time you ever come here.]], + }, + posthanks = { + synopsis = "[\"Have you progressed with your quest to regain the Amulet of Yendor for %d?\"]", + output = "text", + text = [["Welcome back, %p. Have you progressed with your quest to +regain the Amulet of Yendor for %d?"]], + }, + }, + Bar = { + assignquest = { + synopsis = "[\"Find %n, defeat %ni, and return %o to us.\"]", + output = "text", + text = [["The world is in great need of your assistance, %p. + +"About six months ago, I learned that a mysterious sorcerer, known +as %n, had begun to gather a large group of cutthroats and brigands +about %ni. + +"At about the same time, these people you once rode with `liberated' a +potent magical talisman, %o, from a Turanian caravan. + +"%nC and %nj Black Horde swept down upon %i and defeated +the people there, driving them out into the desert. He has taken +%o, and seeks to bend it to %nj will. I detected the +subtle changes in the currents of fate, and joined these people. +Then I sent forth a summons for you. + +"If %n can bend %o to %nj will, he will become +almost indestructible. He will then be able to enslave the minds of +men across the world. You are the only hope. The gods smile upon you, +and with %d behind you, you alone can defeat %n. + +"You must go to %i. From there, you can track down +%n, defeat %ni, and return %o to us. Only +then will the world be safe."]], + }, + badalign = { + synopsis = "[\"You have wandered from the path of the %a. Come back when you have atoned.\"]", + output = "text", + text = [["%pC! You have wandered from the path of the %a! +If you attempt to overcome %n in this state, he will surely +enslave your soul. Your only hope, and ours, lies in your purification. +Go forth, and return when you feel ready."]], + }, + badlevel = { + synopsis = "[\"You are too inexperienced. Come back when you are %Ra.\"]", + output = "text", + text = [["%p, I fear that you are as yet too inexperienced to face +%n. Only %Ra with the help of %d could ever hope to +defeat %ni."]], + }, + discourage = { + "\"My pets will dine on your carcass tonight!\"", + "\"You are a sorry excuse for %ra.\"", + "\"Run while you can, %c. My next spell will be your last.\"", + "\"I shall use your very skin to bind my next grimoire.\"", + "\"%d cannot protect you now. Here, you die.\"", + "\"Your %a nature makes you weak. You cannot defeat me.\"", + "\"Come, %c. I shall kill you, then unleash the horde on your tribe.\"", + "\"Once you are dead, my horde shall finish off %l, and your tribe.\"", + "\"Fight, %c, or are you afraid of the mighty %n?\"", + "\"You have failed, %c. Now, my victory is complete.\"", + }, + encourage = { + "\"%nC is strong in the dark arts, but not immune to cold steel.\"", + "\"Remember that %n is a great sorcerer. He lived in the time of Atlantis.\"", + "\"If you fail, %p, I will not be able to protect these people long.\"", + "\"To enter %i, you must be very stealthy. The horde will be on guard.\"", + "\"Call upon %d in your time of need.\"", + "\"May %d protect you, and guide your steps.\"", + "\"If you can lay hands upon %o, carry it for good fortune.\"", + "\"I cannot stand against %ns sorcery. But %d will help you.\"", + "\"Do not fear %n. I know you can defeat %ni.\"", + "\"You have a great road to travel, %p, but only after you defeat %n.\"", + }, + firsttime = { + synopsis = "[You reach the vicinity of %H, but sense evil magic nearby.]", + output = "text", + text = [[Warily you scan your surroundings, all of your senses alert for signs +of possible danger. Off in the distance, you can %x the familiar shapes +of %H. + +But why, you think, should %l be there? + +Suddenly, the hairs on your neck stand on end as you detect the aura of +evil magic in the air. + +Without thought, you ready your weapon, and mutter under your breath: + + "By %d, there will be blood spilt today."]], + }, + goal_first = { + synopsis = "[This is surely the lair of %n.]", + output = "text", + text = [[The hairs on the nape of your neck lift as you sense an energy in the +very air around you. You fight down a primordial panic that seeks to +make you turn and run. This is surely the lair of %n.]], + }, + goal_next = { + text = "Yet again you feel the air around you heavy with malevolent magical energy.", + }, + gotit = { + synopsis = "[You feel the power of %o flowing through your hands.]", + output = "text", + text = [[As you pick up %o, you feel the power of it +flowing through your hands. It seems to be in two or more places +at once, even though you are holding it.]], + }, + guardtalk_after = { + "\"The battles here have been good -- our enemies' blood soaks the soil!\"", + "\"Remember that glory is crushing your enemies beneath your feet!\"", + "\"Times will be good again, now that the horde is vanquished.\"", + "\"You have brought our clan much honor in defeating %n.\"", + "\"You will be a worthy successor to %l.\"", + }, + guardtalk_before = { + "\"The battles here have been good -- our enemies' blood soaks the soil!\"", + "\"Remember that glory is crushing your enemies beneath your feet!\"", + "\"There has been little treasure to loot, since the horde arrived.\"", + "\"The horde is mighty in numbers, but they have little courage.\"", + "\"%lC is a strange one, but he has helped defend us.\"", + }, + hasamulet = { + synopsis = "[\"Take the Amulet to the altar of %d on the Astral Plane and offer it.\"]", + output = "text", + text = [["This is wondrous, %p. I feared that you could not possibly +succeed in your quest, but here you are in possession of the Amulet +of Yendor! + +"I have studied the texts of the magi constantly since you left. In +the Book of Skelos, I found this: + + %d will cause a child to be sent into the world. This child is to + be made strong by trial of battle and magic, for %d has willed it so. + It is said that the child of %d will recover the Amulet of Yendor + that was stolen from the Creator at the beginning of time. + +"As you now possess the amulet, %p, I suspect that the Book +speaks of you. + + The child of %d will take the Amulet, and travel to the Astral + Plane, where the Great Temple of %d is to be found. The Amulet + will be sacrificed to %d, there on %dJ altar. Then the child will + stand by %d as champion of all %cP for eternity. + +"This is all I know, %p. I hope it will help you."]], + }, + killed_nemesis = { + synopsis = "[%nC curses you, but you feel the overpowering aura of magic fading.]", + output = "text", + text = [[%nC falls to the ground, and utters a last curse at you. Then %nj +body fades slowly, seemingly dispersing into the air around you. You +slowly become aware that the overpowering aura of magic in the air has +begun to fade.]], + }, + leader_first = { + synopsis = "[\"At last you have returned. There is a great quest you must undertake.\"]", + output = "text", + text = [["Ah, %p. You have returned at last. The world is in dire +need of your help. There is a great quest you must undertake. + +"But first, I must see if you are ready to take on such a challenge."]], + }, + leader_last = { + synopsis = "[\"You have betrayed %d; soon %n will destroy us. Begone!\"]", + output = "text", + text = [["Pah! You have betrayed the gods, %p. You will never attain +the glory which you aspire to. Your failure to follow the true path has +closed this future to you. + +"I will protect these people as best I can, but soon %n will overcome +me and destroy all who once called you %s. Now begone!"]], + }, + leader_next = { + text = "\"%p, you are back. Are you ready now for the challenge?\"", + }, + leader_other = { + text = "\"Again, you stand before me, %p. Surely you have prepared yourself.\"", + }, + locate_first = { + synopsis = "[You have located %i.]", + output = "text", + text = [[The scent of water comes to you in the desert breeze. You know that +you have located %i.]], + }, + locate_next = { + text = "Yet again you have a chance to infiltrate %i.", + }, + nemesis_first = { + synopsis = "[%nC boasts that %nh has slain many. \"Prepare to die, %c.\"]", + output = "text", + text = [["So. This is what that second rate sorcerer %l sends to do %lj bidding. +I have slain many before you. You shall give me little sport. + +"Prepare to die, %c."]], + }, + nemesis_next = { + text = "\"I have wasted too much time on you already. Now, you shall die.\"", + }, + nemesis_other = { + text = "\"You return yet again, %c! Are you prepared for death now?\"", + }, + nemesis_wantsit = { + text = [["I shall have %o back, you pitiful excuse for %ca. +And your life as well."]], + }, + nexttime = { + text = [[Once again, you near %H. You know that %l +will be waiting.]], + }, + offeredit = { + synopsis = "[%lC tells you to guard %o, and to return when you have triumphed.]", + output = "text", + text = [[When %l sees %o, he smiles, and says: + + Well done, %p. You have saved the world from certain doom. + What, now, should be done with %o? + + These people, brave as they are, cannot hope to guard it from + other sorcerers who will detect it, as surely as %n did. + + Take %o with you, %p. It will guard you in + your adventures, and you can best guard it. You embark on a + quest far greater than you realize. + + Remember me, %p, and return when you have triumphed. I + will tell you then of what you must do. You will understand when the + time comes.]], + }, + offeredit2 = { + synopsis = "[\"You keep %o. Return to %Z to search for the Amulet.\"]", + output = "text", + text = [[%l gazes reverently at %o, then back at you. + +"You are its keeper now, and the time has come to resume your search +for the Amulet. %Z await your return through the +magic portal which brought you here."]], + }, + othertime = { + text = [[Again, and you think possibly for the last time, you approach +%H.]], + }, + posthanks = { + text = "\"Tell us, %p, have you fared well on your great quest?\"", + }, + }, + Cav = { + assignquest = { + synopsis = "[Find and defeat %n, recover %o, and return with it.]", + output = "text", + text = [["You are indeed ready now, %p. I shall tell you a tale of +great suffering among your people: + +"Shortly after you left on your vision quest, the caves were invaded by +the creatures sent against us by %n. + +"She, herself, could not attack us due to her great size, but her minions +have harassed us ever since. In the first attacks, many died, and the +minions of %n managed to steal %o. +They took it to %i and there, none of our +%g warriors have been able to go. + +"You must find %i, and within it wrest +%o from %n. She guards it as +jealously as she guards all treasures she attains. But with it, +we can make our caves safe once more. + +"Please, %p, recover %o for us, and return it here."]], + }, + badalign = { + synopsis = "[\"You no longer follow the path of the %a. Go, and purify yourself.\"]", + output = "text", + text = [["%pC! You have deviated from my teachings. You no longer follow +the path of the %a as you should. I banish you from these caves, to +go forth and purify yourself. Then, you might be able to accomplish this +quest."]], + }, + badlevel = { + synopsis = "[\"%rA is too inexperienced. Come back when you have progressed.\"]", + output = "text", + text = [["Alas, %p, you are as yet too inexperienced to embark upon such +a difficult quest as that I propose to give you. + +"%rA could not possibly survive the rigors demanded to find +%i, never mind to confront %n herself. + +"Adventure some more, and you will learn the skills you will require. +%d decrees it."]], + }, + discourage = { + "\"You are weak, %c. No challenge for the Mother of all Dragons.\"", + "\"I grow hungry, %r. You look like a nice appetizer!\"", + "\"Join me for lunch? You're the main course, %c.\"", + "\"With %o, I am invincible! You cannot succeed.\"", + "\"Your mentor, %l has failed. You are nothing to fear.\"", + "\"You shall die here, %c. %rA cannot hope to defeat me.\"", + "\"You, a mere %r challenge the might of %n? Hah!\"", + "\"I am the Mother of all Dragons! You cannot hope to defeat me.\"", + "\"My claws are sharp now. I shall rip you to shreds!\"", + "\"%d has deserted you, %c. This is my domain.\"", + }, + encourage = { + "\"%nC is immune to her own breath weapons. You should use magic upon her that she does not use herself.\"", + "\"When you encounter %n, call upon %d for assistance.\"", + "\"There will be nowhere to hide inside %ns inner sanctum.\"", + "\"Your best chance with %n will be to keep moving.\"", + "\"Do not be distracted by the great treasures in %ns lair. Concentrate on %o.\"", + "\"%oC is the only object that %n truly fears.\"", + "\"Do not be fooled by %ns size. She is fast, and it is rumored that she uses magic.\"", + "\"I would send a party of %gP with you, but we will need all of our strength to defend ourselves.\"", + "\"Remember, be %a at all times. This is your strength.\"", + "\"If only we had an amulet of reflection, this would not have happened.\"", + }, + firsttime = { + synopsis = "[You arrive back at %H, but something is wrong here.]", + output = "text", + text = [[You descend through a barely familiar stairwell that you remember +%l showing you when you embarked upon your vision quest. + +You arrive back at %H, but something seems +wrong here. The usual smoke and glowing light of the fires of the +outer caves are absent, and an uneasy quiet fills the damp air.]], + }, + goal_first = { + synopsis = "[You enter a large cavern. %nC is present.]", + output = "text", + text = [[You find yourself in a large cavern, with neatly polished walls, that +nevertheless show signs of being scorched by fire. + +Bones litter the floor, and there are objects scattered everywhere. +The air is close with the stench of sulphurous fumes. + +%nC is clearly visible, but %nh seems to be asleep.]], + }, + goal_next = { + text = "Once again, you find yourself in the lair of %n.", + }, + gotit = { + synopsis = "[%oC fills you with a feeling of power.]", + output = "text", + text = [[As you pick up %o it seems heavy at first, but as you +hold it strength flows into your arms. + +You suddenly feel full of power, as if nothing could possibly stand +in your path.]], + }, + guardtalk_after = { + "\"The rains have returned and the land grows lush again.\"", + "\"Peace has returned, give thanks to %d!\"", + "\"Welcome back! Did you find %o?\"", + "\"So, %p, tell us the story of your fight with %n.\"", + "\"%lC grows old. Perhaps you will guide us after he ascends.\"", + }, + guardtalk_before = { + "\"We have not been able to gather as much food since the Giants sealed off our access to the outer world.\"", + "\"Since %n sent her minions, we have been constantly fighting.\"", + "\"I have heard your vision quest was successful. Is this so?\"", + "\"So, tell me, %p, how have you fared?\"", + "\"%lC grows old. We know not who will guide us after he ascends.\"", + }, + hasamulet = { + synopsis = "[\"Take the Amulet to the altar of %d on the Astral Plane and offer it.\"]", + output = "text", + text = [["You have been successful, I see, %p. + +"Now that the Amulet of Yendor is yours, here is what you must do: + +"Journey upwards to the open air. The Amulet you carry will then +take you into the Astral Planes, where the Great Temple of %d +casts its influence throughout our world. + +"Sacrifice the Amulet on the altar. Thus shall %d become supreme!"]], + }, + killed_nemesis = { + text = [[%nC sinks to the ground, her heads flailing about. +As she dies, a cloud of noxious fumes billows about her.]], + }, + leader_first = { + synopsis = "[\"You have returned. We are in dire need of your help.\"]", + output = "text", + text = [["You have returned from your vision quest, %p. Thank %d. + +"We are in dire need of your help, my %S. + +"But first, I must see if you are yet capable of the quest I would +ask you to undertake."]], + }, + leader_last = { + synopsis = "[\"You have betrayed the %L. Begone!\"]", + output = "text", + text = [["%pC! You have sealed our fate. You seem unable to reform yourself, +so I must select another to take your place. + +"Begone from %H! You have betrayed us by choosing +the path of the %C over the true path of the %L. + +"You no longer live in our eyes."]], + }, + leader_next = { + text = "\"Again, you return to us, %p. Let me see if you are ready now.\"", + }, + leader_other = { + text = "\"Ah, %p. Are you finally ready?\"", + }, + locate_first = { + synopsis = "[You %x many large claw marks, smell carrion, and notice bones.]", + output = "text", + text = [[You %x many large claw marks on the ground. The tunnels ahead +of you are larger than most of those in any cave complex you have +ever been in before. + +Your nose detects the smell of carrion from within, and bones litter +the sides of the tunnels.]], + }, + locate_next = { + text = "Once again, you approach %i.", + }, + nemesis_first = { + synopsis = "[%nC threatens to eat you.]", + output = "text", + text = [["So, follower of %l, you seek to invade the lair of +%n. Only my meals are allowed down here. Prepare +to be eaten!"]], + }, + nemesis_next = { + text = [["So, again you face me, %c. No one has ever before escaped me. +Now I shall kill you."]], + }, + nemesis_other = { + text = "\"You are getting annoying, %c. Prepare to die.\"", + }, + nemesis_wantsit = { + text = "\"I'll have %o from you, %c. You shall die.\"", + }, + nexttime = { + text = "Once again, you arrive back at %H.", + }, + offeredit = { + synopsis = "[\"Take %o with you. It will help in your quest for the Amulet of Yendor.\"]", + output = "text", + text = [[%lC glimpses %o in your possession. +He smiles and says: + + You have done it! We are saved. But I fear that %o + will always be a target for %C forces who will want it for their + own. + + To prevent further trouble, I would like you, %p, + to take %o away with you. It will help you as you + quest for the Amulet of Yendor.]], + }, + offeredit2 = { + synopsis = "[\"You are the keeper of %o now. Return to %Z to search for the Amulet.]", + output = "text", + text = [[%l grasps %o proudly for a moment, then looks at you. + +"You are its keeper now, and the time has come to resume your search +for the Amulet. %Z await your return through the +magic portal which brought you here."]], + }, + othertime = { + text = [[For some reason, you think that this may be the last time you will +enter %H.]], + }, + posthanks = { + text = [["%pC! Welcome back. +How goes your quest to recover the Amulet for %d?"]], + }, + }, + Hea = { + assignquest = { + synopsis = "[Travel to %i on your way to recover %o from %n.]", + output = "text", + text = [[For the first time, you sense a smile on %ls face. + + "You have indeed learned as much as we can teach you in preparation + for this task. Let me tell you what I know of the symptoms and hope + that you can provide a cure. + + "A short while ago, the dreaded %nt was fooled by the gods + into thinking that %nh could use %o to find a + cure for old age. Think of it, eternal youth! But %nj good + health is accomplished by drawing the health from those around %ni. + + "He has exhausted %nj own supply of healthy people and now %nh seeks to + extend %nj influence into our world. You must recover from %ni + %o and break the spell. + + "You must travel into the swamps to %i, and from there + follow the trail to %ns island lair. Be careful."]], + }, + badalign = { + synopsis = "[Return when you are more %a.]", + output = "text", + text = [["You have learned much of the remedies that benefit, but you must also +know which physic for which ail. That is why %ds teachings are a +part of your training. + +"Return to us when you have healed thyself."]], + }, + badlevel = { + synopsis = "[You are too inexperienced. Return when you are %Ra.]", + output = "text", + text = [["Alas, %p, you are yet too inexperienced to deal with the rigors +of such a task. You must be able to draw on the knowledge of botany, +alchemy and veterinary practices before I can send you on this quest +with good conscience. + +"Return when you wear %Ra's caduceus."]], + }, + discourage = { + "\"They might as well give scalpels to wizards as to let you try to use %o!\"", + "\"If I could strike %l, surrounded by %lj %gP, imagine what I can do to you here by yourself.\"", + "\"I will put my %Rp to work making a physic out of your ashes.\"", + "\"As we speak, Hades gathers your patients to join you.\"", + "\"After I'm done with you, I'll destroy %l as well.\"", + "\"You will have to kill me if you ever hope to leave this place.\"", + "\"I will impale your head on my caduceus for all to see.\"", + "\"There is no materia medica in your sack which will cure you of me!\"", + "\"Do not fight too hard, I want your soul strong, not weakened!\"", + "\"You should have stopped studying at veterinary.\"", + }, + encourage = { + "\"Remember, %p, to always wash your hands before operating.\"", + "\"%nC has no real magic of %nj own. To this %nh is vulnerable.\"", + "\"If you have been true to %d, you can draw on the power of %o.\"", + "\"Bring with you antidotes for poisons.\"", + "\"Remember this, %n can twist the powers of %o to hurt instead of heal.\"", + "\"I have sent for Chiron, but I am afraid he will come too late.\"", + "\"Maybe when you return the snakes will once again begin to shed.\"", + "\"The plague grows worse as we speak. Hurry, %p!\"", + "\"Many times %n has caused trouble in these lands. It is time that %nh was eradicated like the diseases %nh has caused.\"", + "\"With but one eye, %n should be easy to blind. Remember this.\"", + }, + firsttime = { + synopsis = "[You arrive back at %H and must find %l.]", + output = "text", + text = [[What sorcery has brought you back to %H? The smell +of fresh funeral pyres tells you that something is amiss with the healing +powers that used to practice here. + +No rhizotomists are tending the materia medica gardens, and where are the +common folk who used to come for the cures? + +You know that you must quickly make your way to the collegium, and +%ls iatreion, and find out what has happened in your absence.]], + }, + goal_first = { + synopsis = "[You have reached the lair of %n. Take %o away from %ni.]", + output = "text", + text = [[You stand within sight of the infamous Isle of %n. Even +the words of %l had not prepared you for this. + +Steeling yourself against the wails of the ill that pierce your ears, +you hurry on your task. Maybe with %o you can +heal them on your return, but not now.]], + }, + goal_next = { + text = "Once again, you %x the Isle of %n in the distance.", + }, + gotit = { + synopsis = "[You feel the healing power of %o and should return it to %l.]", + output = "text", + text = [[As you pick up %o, you feel its healing begin to +warm your soul. You curse Zeus for taking it from its rightful owner, +but at least you hope that %l can put it to good use once +again.]], + }, + guardtalk_after = { + "\"Did you read that new treatise on the therapeutic use of leeches?\"", + "\"Paint a red caduceus on your shield and monsters won't hit you.\"", + "\"How are you feeling? Perhaps a good bleeding will improve your spirits.\"", + "\"Have you heard the absurd new theory that diseases are caused by microscopic organisms, and not ill humors?\"", + "\"I see that you bring %o, now you can cure this plague!\"", + }, + guardtalk_before = { + "\"Did you read that new treatise on the therapeutic use of leeches?\"", + "\"Paint a red caduceus on your shield and monsters won't hit you.\"", + "\"I passed handwriting so they are demoting me a rank.\"", + "\"I've heard that even %l has not been able to cure Chiron.\"", + "\"We think %n has used %nj alchemists, and %o, to unleash a new disease we call 'the cold' on Gehennom.\"", + }, + hasamulet = { + synopsis = "[\"You have recovered the Amulet. Travel to the Astral Plane and return it to %d.\"]", + output = "text", + text = [["Ah, you have recovered the Amulet, %p. Well done! + +"Now, you should know that you must travel through the Elemental Planes +to the Astral, and there return the Amulet to %d. Go forth and +may our prayers be as a wind upon your back."]], + }, + killed_nemesis = { + synopsis = "[%nC curses you as %nh dies.]", + output = "text", + text = [[The battered body of %n slumps to the ground and gasps +out one last curse: + + "You have defeated me, %p, but I shall have my revenge. + How, I shall not say, but this curse shall be like a cancer + on you." + +With that %n dies.]], + }, + leader_first = { + synopsis = "[%l is weak from the struggle with %n. %lH wants to examine you.]", + output = "text", + text = [[Feebly, %l raises %lj head to look at you. + +"It is good to see you again, %p. I see the concern in your +eyes, but do not worry for me. I am not ready for Hades yet. We have +exhausted much of our healing powers holding off %n. +I need your fresh strength to carry on our work. + +"Come closer and let me lay hands on you, and determine if you have +the skills necessary to accomplish this mission."]], + }, + leader_last = { + synopsis = "[You are a failure as a healer.]", + output = "text", + text = [["You have failed us, %p. You are a quack! A charlatan! + +"Hades will be happy to hear that you are once again practicing your +arts on the unsuspecting."]], + }, + leader_next = { + text = [["Again you return to me, %p. I sense that each trip back +the pleurisy and maladies of our land begin to infect you. Let us +hope and pray to %d that you become ready for your task before +you fall victim to the bad humors."]], + }, + leader_other = { + text = [["Chiron has fallen, Hermes has fallen, what else must I tell you to +impress upon you the importance of your mission! I hope that you +have come prepared this time."]], + }, + locate_first = { + synopsis = "[You have reached %i but all is not well.]", + output = "text", + text = [[You stand before the entrance to %i. Strange +scratching noises come from within the building. + +The swampy ground around you seems to stink with disease.]], + }, + locate_next = { + text = "Once again you stand at the entrance to %i.", + }, + nemesis_first = { + synopsis = "[\"I will take your life, then defeat %l.\"]", + output = "text", + text = [["They have made a mistake in sending you, %p. + +"When I add your youth to mine, it will just make it easier for me +to defeat %l."]], + }, + nemesis_next = { + text = "\"Unlike your patients, you seem to keep coming back, %p!\"", + }, + nemesis_other = { + text = "\"Which would you like, %p? Boils, pleurisy, convulsions?\"", + }, + nemesis_wantsit = { + text = [["I'll have %o back from you, %r. You are +not going to live to escape this place."]], + }, + nexttime = { + text = [[After your last experience you expected to be here, but you certainly +did not expect to see things so much worse. This time you must succeed.]], + }, + offeredit = { + synopsis = "[%l touches %o and tells %lj %gP to do so too, then tells you to take it with you.]", + output = "text", + text = [[As soon as %l sees %o %lh summons %lj +%gP. + +Gently, %l reaches out and touches %o. +He instructs each of the assembled to do the same. When everyone +has finished %lh speaks to you. + + "Now that we have been replenished we can defeat this plague. You must + take %o with you and replenish the worlds you have + been called upon to travel next. I wish you could ride Chiron to the + end of your journey, but I need him to help me spread the cure. Go + now and continue your journey."]], + }, + offeredit2 = { + synopsis = "[%l tells you to keep %o and return to %Z to search for the Amulet.]", + output = "text", + text = [[%l cautiously handles %o while watching you. + +"You are its keeper now, and the time has come to resume your search +for the Amulet. %Z await your return through the +magic portal which brought you here."]], + }, + othertime = { + text = [[Again, you %x %H in the distance. + +The smell of death and disease permeates the air. You do not have +to be %Ra to know that %n is on the verge of victory.]], + }, + posthanks = { + text = [["You have again returned to us, %p. We have done well in your +absence, yes? How fare you upon your quest for the Amulet?"]], + }, + }, + Kni = { + assignquest = { + synopsis = "[Pass through %i to reach %n. Destroy %ni and return with %o.]", + output = "text", + text = [["Ah, %p. Thou art truly ready, as no %c before thee hath +been. Hear now Our words: + +"As thou noticed as thou approached %H, a great battle hath +been fought recently in these fields. Know thou that Merlin himself +came to aid Us here as We battled the foul %n. In the midst of that +battle, %n struck Merlin a great blow, felling him. Then, as Our +forces were pressed back, %n stole %o. + +"We eventually turned the tide, but lost many %cP in doing so. +Merlin was taken off by his apprentice, but hath not recovered. We have +been told that so long as %n possesseth %o, +Merlin will not regain his health. + +"We hereby charge thee with this most important of duties: + +"Go forth from this place, to the fens, and there thou wilt find +%i. From there, thou must track down %n. Destroy the +beast, and return to Us %o. Only then can +We restore Merlin to health."]], + }, + badalign = { + synopsis = "[Go and do penance. Return when you are truly %a.]", + output = "text", + text = [["Thou dishonourest Us, %p! Thou hast strayed from the path of +chivalry! Go from Our presence and do penance. Only when thou art again +pure mayst thou return hence."]], + }, + badlevel = { + synopsis = "[You are not prepared to face %n. Return when you are %Ra.]", + output = "text", + text = [["Verily, %p, thou hast done well. That thou hast survived thus +far is a credit to thy valor, but thou art yet unprepared for +the demands required as Our Champion. %rA, no matter how +pure, could never hope to defeat the foul %n. + +"Journey forth from this place, and hone thy skills. Return to +Our presence when thou hast attained the noble title of %R."]], + }, + discourage = { + "\"A mere %r can never withstand me!\"", + "\"I shall kill thee now, and feast!\"", + "\"Puny %c. What manner of death dost thou wish?\"", + "\"First thee, %p, then I shall feast upon %l.\"", + "\"Hah! Thou hast failed, %r. Now thou shalt die.\"", + "\"Die, %c. Thou art as nothing against my might.\"", + "\"I shall suck the marrow from thy bones, %c.\"", + "\"Let's see... Baked? No. Fried? Nay. Broiled? Yea verily, that is the way I like my %c for dinner.\"", + "\"Thy strength waneth, %p. The time of thy death draweth near.\"", + "\"Call upon thy precious %d, %p. It shall not avail thee.\"", + }, + encourage = { + "\"Remember, %p, follow always the path of %d.\"", + "\"Though %n is verily a mighty foe, We have confidence in thy victory.\"", + "\"Beware, for %n hath surrounded %niself with hordes of foul creatures.\"", + "\"Great treasure, 'tis said, is hoarded in the lair of %n.\"", + "\"If thou possessest %o, %p, %ns magic shall therewith be thwarted.\"", + "\"The gates of %i are guarded by forces unseen, %p. Go carefully.\"", + "\"Return %o to Us quickly, %p.\"", + "\"Destroy %n, %p, else %H shall surely fall.\"", + "\"Call upon %d when thou art in need.\"", + "\"To find %i, thou must keep thy heart pure.\"", + }, + firsttime = { + synopsis = "[Signs of battle include long gouges in the walls of %H.]", + output = "text", + text = [[You materialize in the shadows of %H. Immediately, you notice +that something is wrong. The fields around the castle are trampled and +withered, as if some great battle has been recently fought. + +Exploring further, you %x long gouges in the walls of %H. +You know of only one creature that makes those kinds of marks...]], + }, + goal_first = { + synopsis = "[You %x the entrance to a cavern inside a hill.]", + output = "text", + text = [[As you exit the swamps, you %x before you a huge, gaping hole in the +side of a hill. From within, you smell the foul stench of carrion. + +The pools on either side of the entrance are fouled with blood, and +pieces of rusted metal and broken weapons show above the surface.]], + }, + goal_next = { + text = "Again, you stand at the entrance to %ns lair.", + }, + gotit = { + synopsis = "[You feel the magic of %o.]", + output = "text", + text = [[As you pick up %o, you feel its protective fields +form around your body. You also feel a faint stirring in your mind, as +if you are in two places at once, and in the second, you are waking from +a long sleep.]], + }, + guardtalk_after = { + "\"Hail, %p! Verily, thou lookest well.\"", + "\"So, %p, didst thou find %n in the fens near %i?\"", + "\"Worthy %p, hast thou proven thy right purpose on the body of %n?\"", + "\"Verily, %l could have no better champion, %p.\"", + "\"Hast thou indeed recovered %o?\"", + }, + guardtalk_before = { + "\"Hail, %p! Verily, thou lookest well.\"", + "\"There is word, %p, that %n hath been sighted in the fens near %i.\"", + "\"Thou art our only hope now, %p.\"", + "\"Verily, %l could have no better champion, %p.\"", + "\"Many brave %cP died when %n attacked.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to the Astral Plane and deliver it to %d.]", + output = "text", + text = [["Thou hast succeeded, We see, %p! Now thou art commanded to take +the Amulet to be sacrificed to %d in the Plane of the Astral. + +"Merlin hath counseled Us that thou must travel always upwards through +the Planes of the Elements, to achieve this goal. + +"Go with %d, %p."]], + }, + killed_nemesis = { + synopsis = "[%nC curses you as %nh dies.]", + output = "text", + text = [[As %n sinks to the ground, blood gushing from %nj open mouth, %nh +defiantly curses you and %l: + + "Thou hast not won yet, %r. By the gods, I shall return + and dog thy steps to the grave!" + +%nJ tail flailing madly, %n tries to crawl towards you, but slumps +to the ground and dies in a pool of %nj own blood.]], + }, + leader_first = { + synopsis = "[%lC checks whether you are ready for a great undertaking.]", + output = "text", + text = [["Ah, %p. We see thou hast received Our summons. +We are in dire need of thy prowess. But first, We must needs +decide if thou art ready for this great undertaking."]], + }, + leader_last = { + synopsis = "[You are a disgrace as %ca.]", + output = "text", + text = [["Thou disgracest this noble court with thine impure presence. We have been +lenient with thee, but no more. Thy name shall be spoken no more. We +hereby strip thee of thy title, thy lands, and thy standing as %ca. +Begone from Our sight!"]], + }, + leader_next = { + text = "\"Welcome again, %p. We hope thou art ready now.\"", + }, + leader_other = { + text = "\"Once again, thou standest before Us, %p. Art thou ready now?\"", + }, + locate_first = { + synopsis = "[You have reached %i and can %x a shrine.]", + output = "text", + text = [[You stand at the foot of %i. Atop, you can %x a shrine. +Strange energies seem to be focused here, and the hair on the back of +your neck stands on end.]], + }, + locate_next = { + text = "Again, you stand at the foot of %i.", + }, + nemesis_first = { + synopsis = "[%nC taunts you and issues a threat against %H.]", + output = "text", + text = [["Hah! Another puny %c seeks death. I shall dine well tonight, +then tomorrow, %H shall fall!"]], + }, + nemesis_next = { + text = "\"Again, thou challengest me, %r? So be it. Thou wilt die here.\"", + }, + nemesis_other = { + text = "\"Thou art truly foolish, %r. I shall dispatch thee anon.\"", + }, + nemesis_wantsit = { + text = [["So, thou darest touch MY property! I shall have that bauble back, +puny %r. Thou wilt die in agony!"]], + }, + nexttime = { + text = "Once again you stand in the shadows of %H.", + }, + offeredit = { + synopsis = "[%oC is yours now. It will aid in your search for the Amulet.]", + output = "text", + text = [[As you approach %l, %lh beams at you and says: + + "Well done! Thou art truly the Champion of %H. We + have received word that Merlin is recovering, and shall soon + rejoin Us. + + "He hath instructed Us that thou art now to be the guardian of + %o. He feeleth that thou mayst have need of + its powers in thine adventures. It is Our wish that thou keepest + %o with thee as thou searchest for the fabled + Amulet of Yendor."]], + }, + offeredit2 = { + synopsis = "[You are the keeper of %o. Return to %Z and find the Amulet.]", + output = "text", + text = [["Careful, %p! %oC might break, and that would +be a tragic loss. Thou art its keeper now, and the time hath come +to resume thy search for the Amulet. %Z await thy +return through the magic portal that brought thee here."]], + }, + othertime = { + text = [[Again, you stand before %H. You vaguely sense that this +may be the last time you stand before %l.]], + }, + posthanks = { + text = "\"Well met, %p. How goeth thy search for the Amulet of Yendor?\"", + }, + }, + Mon = { + assignquest = { + synopsis = "[Find %i, then continue to %ns lair. Defeat %ni and return with %o.]", + output = "text", + text = [["Yes, %p. You are truly ready now. Attend to me and I shall +tell you of what has transpired: + +"During one of the Great Meditations a short time ago, %n and +a legion of elementals invaded %H. Many %gP +were killed, including the one bearing %o. + +Now, there are barely enough %gP left to keep the elementals +at bay. + +"We need you to find %i, then, from there, +travel to %ns lair. If you can manage to defeat %n and +return %o here, we can then drive off the legions +of elementals that slay our students. + +"Go with %d as your guide, %p."]], + }, + badalign = { + synopsis = "[You must atone. Come back when you are worthy of %d.]", + output = "text", + text = [["This is terrible, %p. You have deviated from the true path! +You know that %d requires the most strident devotion of this +order. The %shood must stand for utmost piety. + +"Go from here, atone for your sins against %d. Return only when +you have purified yourself."]], + }, + badlevel = { + synopsis = "[You are not ready to face %n. Come back when you are %Ra.]", + output = "text", + text = [["Alas, %p, it is not yet to be. A mere %r could never +withstand the might of %n. Go forth, again into the world, and +return when you have attained the post of %R."]], + }, + discourage = { + "\"Submit to my will, %c, and I shall spare you.\"", + "\"Your puny powers are no match for me, %c.\"", + "\"I shall have you turned into a zombie for my pleasure!\"", + "\"Despair now, %r. %d cannot help you.\"", + "\"I shall feast upon your soul for many days, %c.\"", + "\"Your death will be slow and painful. That I promise!\"", + "\"You cannot defeat %n, you fool. I shall kill you now.\"", + "\"Your precious %lt will be my next victim.\"", + "\"I feel your powers failing you, %r. You shall die now.\"", + "\"With %o, nothing can stand in my way.\"", + }, + encourage = { + "\"You can prevail, if you rely on %d.\"", + "\"Remember that %n has great magic at his command.\"", + "\"Be pure, my %S.\"", + "\"Beware, %i is surrounded by hordes of earth elementals.\"", + "\"Remember your studies, and you will prevail!\"", + "\"Acquire and wear %o if you can. They will aid you against %n.\"", + "\"Call upon %d when your need is greatest. You will be answered.\"", + "\"Remember to use the elementals' strength against them!\"", + "\"Do not lose faith, %p. If you do so, %n will grow stronger.\"", + "\"Wear %o. They will assist you in your efforts.\"", + }, + firsttime = { + synopsis = "[You have reached %H but something is wrong. %lC needs your aid.]", + output = "text", + text = [[You find yourself standing in sight of %H. +Something is obviously wrong here. Strange shapes lumber around +outside %H! + +You realize that %l needs your assistance!]], + }, + goal_first = { + synopsis = "[You are surrounded by brimstone, lava, and elementals.]", + output = "text", + text = [[The stench of brimstone is all about you, and the elementals close in +from all sides! + +Ahead, there is a small clearing amidst the bubbling pits of lava...]], + }, + goal_next = { + text = "Again, you have invaded %ns domain.", + }, + gotit = { + synopsis = "[You feel the essence of %d and realize that you should take %o to %l.]", + output = "text", + text = [[As you pick up %o, you feel the essence of +%d fill your soul. You know now why %n stole %oi from +%H, for with %oi, %ca of %d could +easily defeat his plans. + +You sense a message from %d. Though not verbal, you +get the impression that you must return to %l as soon +as possible.]], + }, + guardtalk_after = { + "\"Greetings, honorable %r. It is good to see you again.\"", + "\"Ah, %p! Our deepest gratitude for all of your help.\"", + "\"Greetings, %s. Perhaps you will take some time to meditate with us?\"", + "\"With this test behind you, may %d bring you enlightenment.\"", + "\"May %d be with you, %s.\"", + }, + guardtalk_before = { + "\"Greetings, honorable %r. It is good to see you.\"", + "\"Ah, %p! Surely you can help us in our hour of need.\"", + "\"Greetings, %s. %lC has great need of your help.\"", + "\"Alas, it seems as if even %d has deserted us.\"", + "\"May %d be with you, %s.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to the Astral Plane and deliver it to %d.]", + output = "text", + text = [["You have prevailed, %p! %d is surely with you. Now, +you must take the Amulet, and sacrifice it on %ds altar on +the Astral Plane. I suspect that I shall never see you again in this +life, but I hope to at %ds feet."]], + }, + killed_nemesis = { + synopsis = "[As %n dies, %nh threatens to return.]", + output = "text", + text = [[%nC gasps: + + "You have only defeated this mortal body. Know this: my spirit + is strong. I shall return and reclaim what is mine!" + +With that, %n expires.]], + }, + leader_first = { + synopsis = "[%lC checks whether you are ready for the great challenge.]", + output = "text", + text = [["Ah, %p, my %S. You have returned to us at last. +A great blow has befallen our order; perhaps you can help us. +First, however, I must determine if you are prepared for this +great challenge."]], + }, + leader_last = { + synopsis = "[You are a heretic and have failed utterly.]", + output = "text", + text = [["You are a heretic, %p! How can you, %ra, deviate so from the +teachings of %d? Begone from this temple. You are no longer +%sa to this order. We will pray to %d for other assistance, +as you have failed us utterly."]], + }, + leader_next = { + text = "\"Again, my %S, you stand before me. Are you ready now to help us?\"", + }, + leader_other = { + text = "\"Once more, %p, you stand within the sanctum. Are you ready now?\"", + }, + locate_first = { + synopsis = "[You have reached %i. %nC lurks further ahead.]", + output = "text", + text = [[You remember the descriptions of %i, given +to you by %l. It is ahead that you will find +%n's trail.]], + }, + locate_next = { + text = "Again, you stand before %i.", + }, + nemesis_first = { + synopsis = "[You are no %g. You shall never regain %o.]", + output = "text", + text = [["Ah, so %l has sent another %g to retrieve +%o. + +"No, I see you are no %g. Perhaps I shall have some fun today +after all. Prepare to die, %r! You shall never regain +%o."]], + }, + nemesis_next = { + text = "\"So, %r. Again you challenge me.\"", + }, + nemesis_other = { + text = "\"Die now, %r. %d has no power here to aid you.\"", + }, + nemesis_wantsit = { + text = "\"You shall die, %r, and I will have %o back.\"", + }, + nexttime = { + text = "Once again, you stand before %H.", + }, + offeredit = { + synopsis = "[Keep %o. %oH will help you recover the Amulet of Yendor.]", + output = "text", + text = [["You have returned, %p. And with %o, I see. +Congratulations. + +"I have been in meditation, and have received direction from +a minion of %d. %d commands that you retain +%o. With %oi, you must recover the Amulet +of Yendor. + +"Go forth, and let %d guide your steps."]], + }, + offeredit2 = { + synopsis = "[Keep %o and return to %Z to search for the Amulet.]", + output = "text", + text = [[%lC studies %o for a moment, +then returns his gaze to you. + +"%oC must remain with you. Use %oi +as you resume your search for the Amulet. +%Z await your return through the magic portal +that brought you here."]], + }, + othertime = { + text = [[Again you face %H. Your intuition hints that this +may be the final time you come here.]], + }, + posthanks = { + text = "\"Welcome back, %p. How is your quest for the Amulet going?\"", + }, + }, + Pri = { + assignquest = { + synopsis = "[%nC invaded %H and captured %o. Defeat %ni and retrieve %oh.]", + output = "text", + text = [["Yes, %p. You are truly ready now. Attend to me and I shall +tell you of what has transpired: + +"At one of the Great Festivals a short time ago, %n and a legion +of undead invaded %H. Many %gP were killed, including +the one carrying %o. + +"As a final act of vengefulness, %n desecrated the altar here. +Without it, we could not mount a counter-attack. Now, there are +barely enough %gP left to keep the undead at bay. + +"We need you to find %i, then, from there, travel +to %ns lair. If you can manage to defeat %n and return +%o here, we can then drive off the legions of +undead that befoul the land. + +"Go with %d as your guide, %p."]], + }, + badalign = { + synopsis = "[You have deviated from the path. Return when you have purified yourself.]", + output = "text", + text = [["This is terrible, %p. You have deviated from the true path! +You know that %d requires the most strident devotion of this +order. The %shood must stand for utmost piety. + +"Go from here, atone for your sins against %d. Return only when +you have purified yourself."]], + }, + badlevel = { + synopsis = "[%rA cannot withstand %n. Come back when you are %Ra.]", + output = "text", + text = [["Alas, %p, it is not yet to be. A mere %r could never +withstand the might of %n. Go forth, again into the world, and return +when you have attained the post of %R."]], + }, + discourage = { + "\"Submit to my will, %c, and I shall spare you.\"", + "\"Your puny powers are no match for me, %c.\"", + "\"I shall have you turned into a zombie for my pleasure!\"", + "\"Despair now, %r. %d cannot help you.\"", + "\"I shall feast upon your soul for many days, %c.\"", + "\"Your death will be slow and painful. That I promise!\"", + "\"You cannot defeat %n, you fool. I shall kill you now.\"", + "\"Your precious %lt will be my next victim.\"", + "\"I feel your powers failing you, %r. You shall die now.\"", + "\"With %o, nothing can stand in my way.\"", + }, + encourage = { + "\"You can prevail, if you rely on %d.\"", + "\"Remember that %n has great magic at his command.\"", + "\"Be pure, my %S.\"", + "\"Beware, %i is surrounded by a great graveyard.\"", + "\"You may be able to affect %n with magical cold.\"", + "\"Acquire and wear %o if you can. It will aid you against %n.\"", + "\"Call upon %d when your need is greatest. You will be answered.\"", + "\"The undead legions are weakest during the daylight hours.\"", + "\"Do not lose faith, %p. If you do so, %n will grow stronger.\"", + "\"Wear %o. It will assist you against the undead.\"", + }, + firsttime = { + synopsis = "[You are at %H; the doors are closed. %lC needs your help!]", + output = "text", + text = [[You find yourself standing in sight of %H. Something +is obviously wrong here. The doors to %H, which usually +stand open, are closed. Strange human shapes shamble around +outside. + +You realize that %l needs your assistance!]], + }, + goal_first = { + synopsis = "[The stench of brimstone surrounds you, the shrieks and moans are endless.]", + output = "text", + text = [[The stench of brimstone is all about you, and the shrieks and moans +of tortured souls assault your psyche. + +Ahead, there is a small clearing amidst the bubbling pits of lava...]], + }, + goal_next = { + text = "Again, you have invaded %ns domain.", + }, + gotit = { + synopsis = "[You feel %d as you pick up %o; return %oh to %l.]", + output = "text", + text = [[As you pick up %o, you feel the essence of +%d fill your soul. You know now why %n stole it from +%H, for with it, %ca of %d could +easily defeat his plans. + +You sense a message from %d. Though not verbal, you +get the impression that you must return to %l as soon +as possible.]], + }, + guardtalk_after = { + "\"Greetings, %r. It is good to see you again.\"", + "\"Ah, %p! Our deepest gratitude for all of your help.\"", + "\"Welcome back, %s! With %o, no undead can stand against us.\"", + "\"Praise be to %d, for delivering us from %n.\"", + "\"May %d be with you, %s.\"", + }, + guardtalk_before = { + "\"Greetings, honored %r. It is good to see you.\"", + "\"Ah, %p! Surely you can help us in our hour of need.\"", + "\"Greetings, %s. %lC has great need of your help.\"", + "\"Alas, it seems as if even %d has deserted us.\"", + "\"May %d be with you, %s.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to the Astral Plane and offer it on %ds altar.]", + output = "text", + text = [["You have prevailed, %p! %d is surely with you. Now, +you must take the amulet, and sacrifice it on %ds altar on +the Astral Plane. I suspect that I shall never see you again in this +life, but I hope to at %ds feet."]], + }, + killed_nemesis = { + synopsis = "[%nC dies. Moloch is aware of you and angry at %n.]", + output = "text", + text = [[You feel a wrenching shift in the ether as %ns body dissolves +into a cloud of noxious gas. + +Suddenly, a voice booms out: + + "Thou hast defeated the least of my minions, %r. + Know now that Moloch is aware of thy presence. + As for thee, %n, I shall deal with thy failure + at my leisure." + +You then hear the voice of %n, screaming in terror...]], + }, + leader_first = { + synopsis = "[You have returned and we need your help. Are you ready?]", + output = "text", + text = [["Ah, %p, my %S. You have returned to us at last. +A great blow has befallen our order; perhaps you can help us. +First, however, I must determine if you are prepared for this +great challenge."]], + }, + leader_last = { + synopsis = "[You are a heretic who has deviated from the teachings of %d.]", + output = "text", + text = [["You are a heretic, %p! How can you, %ra, deviate so from the +teachings of %d? Begone from this temple. You are no longer +%sa to this order. We will pray to %d for other assistance, +as you have failed us utterly."]], + }, + leader_next = { + text = "\"Again, my %S, you stand before me. Are you ready now to help us?\"", + }, + leader_other = { + text = "\"Once more, %p, you stand within the sanctum. Are you ready now?\"", + }, + locate_first = { + synopsis = "[You have found %i. The trail to %n lies ahead.]", + output = "text", + text = [[You stand facing a large graveyard. The sky above is filled with clouds +that seem to get thicker closer to the center. You sense the presence of +undead in larger numbers than you have ever encountered before. + +You remember the descriptions of %i, given to you by +%l. It is ahead that you will find %ns trail.]], + }, + locate_next = { + text = "Again, you stand before %i.", + }, + nemesis_first = { + synopsis = "[%lC has sent you, but you are no %gC. I shall destroy you.]", + output = "text", + text = [["Ah, so %l has sent another %gC to retrieve +%o. + +"No, I see you are no %gC. Perhaps I shall have some fun today +after all. Prepare to die, %r! You shall never regain +%o."]], + }, + nemesis_next = { + text = "\"So, %r. Again you challenge me.\"", + }, + nemesis_other = { + text = "\"Die now, %r. %d has no power here to aid you.\"", + }, + nemesis_wantsit = { + text = "\"You shall die, %r, and I will have %o back.\"", + }, + nexttime = { + text = "Once again, you stand before %H.", + }, + offeredit = { + synopsis = "[Congratulations, %p. Keep %o; go and recover the Amulet.]", + output = "text", + text = [["You have returned, %p. And with %o, I see. +Congratulations. + +"I have been in meditation, and have received direction from +a minion of %d. %d commands that you retain +%o. With it, you must recover the Amulet +of Yendor. + +"Go forth, and let %d guide your steps."]], + }, + offeredit2 = { + synopsis = "[%oC is yours now. Return to %Z and find the Amulet.]", + output = "text", + text = [[%lC reiterates that %o is yours now. + +"The time has come to resume your search for the Amulet. +%Z await your return through the magic portal +that brought you here."]], + }, + othertime = { + text = [[Again you face %H. Your intuition hints that this may be +the final time you come here.]], + }, + posthanks = { + text = "\"Welcome back, %p. How is your quest for the Amulet going?\"", + }, + }, + Ran = { + assignquest = { + synopsis = "[%nC has stolen %o. Infiltrate %i and retrieve %oh for us.]", + output = "text", + text = [["You are indeed ready, %p. I shall tell you what has transpired, +and why we so desperately need your help: + +"A short time ago, the mountain centaurs to the east invaded +and enslaved the plains centaurs in this area. The local +leader is now only a figurehead, and serves %n. + +"During our last gathering of worship here, we were beset by hordes of +hostile centaurs, as you witnessed. In the first onslaught a group, +headed by %n %niself, managed to breach the grove and steal +%o. + +"Since then, we have been besieged. We do not know how much longer +we will be able to maintain our magical barriers. + +"If we are to survive, you, %p, must infiltrate +%i. There, you will find a pathway down, to the +underground cavern of %n. He has always coveted +%o, and will surely keep it. + +"Recover %o for us, %p! Only then will %d be safe."]], + }, + badalign = { + synopsis = "[You are not sufficiently %a. Come back when you have purified yourself.]", + output = "text", + text = [["You have strayed, %p! You know that %d requires that +we maintain a pure devotion to things %a! + +"You must go from us. Return when you have purified yourself."]], + }, + badlevel = { + synopsis = "[You are too inexperienced. Come back when you are %Ra.]", + output = "text", + text = [["%p, you are yet too inexperienced to withstand the demands of that +which we need you to do. %RA might just be able to do this thing. + +"Return to us when you have learned more, my %S."]], + }, + discourage = { + "\"Your %d is nothing, %c. You are mine now!\"", + "\"Run away little %c! You can never hope to defeat %n!\"", + "\"My servants will rip you to shreds!\"", + "\"I shall display your head as a trophy. What do you think about that wall?\"", + "\"I shall break your %ls grove, and destroy all the %gP!\"", + "\"%d has abandoned you, %c. You are doomed.\"", + "\"%rA? %lC sends a mere %r against me? Hah!\"", + "\"%lC has failed, %c. %oC will never leave here.\"", + "\"You really think you can defeat me, eh %c? You are wrong!\"", + "\"You weaken, %c. I shall kill you now.\"", + }, + encourage = { + "\"It is rumored that the Forest and Mountain Centaurs have resolved their ancient feud and now band together against us.\"", + "\"%nC is strong, and very smart.\"", + "\"Use %o, when you find it. It will help you survive to reach us.\"", + "\"Remember, let %d be your guide.\"", + "\"Call upon %d when you face %n. The very act of doing so will infuriate him, and give you advantage.\"", + "\"%n and his kind have always hated us.\"", + "\"We cannot hold the grove much longer, %p. Hurry!\"", + "\"To infiltrate %i, you must be very stealthy.\"", + "\"Remember that %n is a braggart. Trust not what he says.\"", + "\"You can triumph, %p, if you trust in %d.\"", + }, + firsttime = { + synopsis = "[The ancient forest grove is surrounded by centaurs.]", + output = "text", + text = [[You arrive in familiar surroundings. In the distance, you %x the +ancient forest grove, the place of worship to %d. + +Something is wrong, though. Surrounding the grove are centaurs! +And they've noticed you!]], + }, + goal_first = { + synopsis = "[You descend into a subterranean complex. Hooves clatter in the distance.]", + output = "text", + text = [[You descend into a weird place, in which roughly cut cave-like walls +join with smooth, finished ones, as if someone was in the midst of +finishing off the construction of a subterranean complex. + +Off in the distance, you hear a sound like the clattering of many +hooves on rock.]], + }, + goal_next = { + text = "Once again, you enter the distorted castle of %n.", + }, + gotit = { + synopsis = "[You pick up %o and feel power. It's time to return %oh to %l.]", + output = "text", + text = [[As you pick up %o, it seems to glow, and a warmth +fills you completely. You realize that its power is what has protected +your %sp against their enemies for so long. + +You must now return it to %l without delay -- their lives depend +on your speed.]], + }, + guardtalk_after = { + "\"%pC! I have not seen you in many moons. How do you fare?\"", + "\"Birdsong has returned to the grove, surely this means you have defeated %n.\"", + "\"%lC seems to have regained some of his strength.\"", + "\"So, tell us how you entered %i, in case some new evil arises there.\"", + "\"Is that truly %o that I see you carrying?\"", + }, + guardtalk_before = { + "\"%pC! I have not seen you in many moons. How do you fare?\"", + "\"%nC continues to threaten the grove. But we hold fast.\"", + "\"%lC is growing weak. The magic required to defend the grove drains us.\"", + "\"Remember %i is hard to enter. Beware the distraction of leatherwings.\"", + "\"We must regain %o. Without it we will be overrun.\"", + }, + hasamulet = { + synopsis = "[You have the Amulet! Take it to the Astral Plane and offer it to %d.]", + output = "text", + text = [["You have it! You have recovered the Amulet of Yendor! +Now attend to me, %p, and I will tell you what must be done: + +"The Amulet has within it magic, the capability to transport you to +the Astral Plane, where the primary circle of %d resides. + +"To activate this magic, you must travel upwards as far as you can. +When you reach the temple, sacrifice the Amulet to %d. + +"Thus will you fulfill your destiny."]], + }, + killed_nemesis = { + synopsis = "[%nC curses you as %nh dies.]", + output = "text", + text = [[%nC collapses to the ground, cursing you and %l, then says: + + "You have defeated me, %r! But I curse you one final time, with + my dying breath! You shall die before you leave my castle!"]], + }, + leader_first = { + synopsis = "[You have returned, %p. We need your help. Are you ready?]", + output = "text", + text = [["%pC! You have returned! Thank %d. + +"We have great need of you. But first, I must see if you have the +required abilities to take on this responsibility."]], + }, + leader_last = { + synopsis = "[You are not sufficiently %a. We renounce your %shood.]", + output = "text", + text = [["%pC! You have doomed us all. You fairly radiate %L influences +and weaken the power we have raised in this grove as a result! + +"Begone! We renounce your %shood with us! You are an outcast now!"]], + }, + leader_next = { + text = "\"Once again, %p, you stand in our midst. Are you ready now?\"", + }, + leader_other = { + text = "\"Ah, you are here again, %p. Allow me to determine your readiness...\"", + }, + locate_first = { + synopsis = "[This is %i. There are bats nearby. Beware the wumpus!]", + output = "text", + text = [[This must be %i. + +You are in a cave built of many different rooms, all interconnected +by tunnels. Your quest is to find and shoot the evil wumpus that +resides elsewhere in the cave without running into any bottomless +pits or using up your limited supply of arrows. Good luck. + +You are in room 9 of the cave. There are tunnels to rooms +5, 8, and 10. +*rustle* *rustle* (must be bats nearby.) +*sniff* (I can smell the evil wumpus nearby!)]], + }, + locate_next = { + synopsis = "[You are in %i. There are pits. There are bats nearby.]", + output = "text", + text = [[Once again, you descend into %i. + +*whoosh* (I feel a draft from some pits.) +*rustle* *rustle* (must be bats nearby.)]], + }, + nemesis_first = { + synopsis = "[You have come to recover %o, but I shall keep %oh and you shall die.]", + output = "text", + text = [["So, %c. %lC has sent you to recover %o. + +"Well, I shall keep that bauble. It pleases me. You, %c, shall die."]], + }, + nemesis_next = { + text = "\"Back again, eh? Well, a mere %r is no threat to me! Die, %c!\"", + }, + nemesis_other = { + text = "\"You haven't learned your lesson, %c. You can't kill me! You shall die now.\"", + }, + nemesis_wantsit = { + text = [["I shall have %o from you, %r. Then I shall +kill you."]], + }, + nexttime = { + text = "Once again, you stand before %H.", + }, + offeredit = { + synopsis = "[You have succeeded. Take %o with you as you go to find the Amulet.]", + output = "text", + text = [["%pC! You have succeeded! I feared it was not possible! + +"You have returned with %o! + +"I fear, now, that the Centaurs will regroup and plot yet another raid. +This will take some time, but if you can recover the Amulet of Yendor +for %d before that happens, we will be eternally safe. + +"Take %o with you. It will aid in your quest for +the Amulet."]], + }, + offeredit2 = { + synopsis = "[You are the keeper of %o now. Go and find the Amulet.]", + output = "text", + text = [[%l flexes %o reverently. + +"With this wondrous bow, one need never run out of arrows. +You are its keeper now, and the time has come to resume your +search for the Amulet. %Z await your return +through the magic portal that brought you here."]], + }, + othertime = { + text = [[You have the oddest feeling that this may be the last time you +are to enter %H.]], + }, + posthanks = { + text = [["Welcome, %p. How have you fared on your quest for the Amulet +of Yendor?"]], + }, + }, + Rog = { + assignquest = { + synopsis = "[Get %o from %n and bring it to %l.]", + output = "text", + text = [["Will everyone not going to retrieve %o from that +jerk, %n, take one step backwards. Good choice, +%p, because I was going to send you anyway. My other %gp +are too valuable to me. + +"Here's the deal. I want %o, %n +has %o. You are going to get %o +and bring it back to me. So simple an assignment even you can understand +it."]], + }, + badalign = { + synopsis = "[Come back when you are really %a.]", + output = "text", + text = [["Maybe I should chain you to my perch here for a while. Perhaps watching +real %a men at work will bring some sense back to you. I don't +think I could stand the sight of you for that long though. Come back +when you can be trusted to act properly."]], + }, + badlevel = { + synopsis = "[%rA is not adequately trained to handle this job.]", + output = "text", + text = [["In the time that you've been gone you've only been able to master the +arts of %ra? I've trained ten times again as many %Rp +in that time. Maybe I should send one of them, no? Where would that +leave you, %p? Oh yeah, I remember, I was going to kill you!"]], + }, + discourage = { + "\"May I suggest a compromise. Are you interested in gold or gems?\"", + "\"Please don't force me to kill you.\"", + "\"Grim times are upon us all. Will you not see reason?\"", + "\"I knew %l, and you're no %lt, thankfully.\"", + "\"It is a shame that we are not meeting under more pleasant circumstances.\"", + "\"I was once like you are now, %p. Believe in me -- our way is better.\"", + "\"Stay with me, and I will make you %os guardian.\"", + "\"When you return, with or without %o, %l will have you killed.\"", + "\"Do not be fooled; I am prepared to kill to defend %o.\"", + "\"I can reunite you with the Twain. Oh, the stories you can swap.\"", + }, + encourage = { + "\"You don't seem to understand, %o isn't here so neither should you be!\"", + "\"May %d curse you with lead fingers. Get going!\"", + "\"We don't have all year. GET GOING!\"", + "\"How would you like a scar necklace? I'm just the jeweler to do it!\"", + "\"Lazy S.O.B. Maybe I should call up someone else...\"", + "\"Maybe I should open your skull and see if my instructions are inside?\"", + "\"This is not a task you can complete in the afterlife, you know.\"", + "\"Inside every living person is a dead person trying to get out, and I have your key!\"", + "\"We're almost out of hell-hound chow, so why don't you just get moving!\"", + "\"You know, %o isn't going to come when you whistle. You must get it yourself.\"", + }, + firsttime = { + synopsis = "[You are in Ransmannsby, where you trained. Find %l.]", + output = "text", + text = [[Unexpectedly, you find yourself back in Ransmannsby, where you trained to +be a thief. Quickly you make the guild sign, hoping that you AND word +of your arrival reach %ls den.]], + }, + goal_first = { + synopsis = "[You sense %o.]", + output = "text", + text = [[You feel a great swelling up of courage, sensing the presence of +%o. Or is it fear?]], + }, + goal_next = { + text = "The hairs on the back of your neck whisper -- it's fear.", + }, + gotit = { + synopsis = "[You pick up %o and know that %l should not have it.]", + output = "text", + text = [[As you pick up %o, the hairs on the back of your +neck fall out. At once you realize why %n was +willing to die to keep it out of %ls hands. Somehow +you know that you must do likewise.]], + }, + guardtalk_after = { + "\"I was sure wrong about Lady Tyvefelle's house; I barely got away with my life and lost my lock pick in the process.\"", + "\"You're back? Even the Twain don't come back anymore.\"", + "\"Can you spare an old cutpurse a zorkmid for some grog?\"", + "\"Fritz tried to join the other side, and now he's hell-hound chow.\"", + "\"Be careful what you steal, I hear the boss has perfected turning rocks into worthless pieces of glass.\"", + }, + guardtalk_before = { + "\"I hear that Lady Tyvefelle's household is lightly guarded.\"", + "\"You're back? Even the Twain don't come back anymore.\"", + "\"Can you spare an old cutpurse a zorkmid for some grog?\"", + "\"Fritz tried to join the other side, and now he's hell-hound chow.\"", + "\"Be careful what you steal, I hear the boss has perfected turning rocks into worthless pieces of glass.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to the Astral Plane and find %ds temple.]", + output = "text", + text = [["I see that with your abilities, and my brains, we could rule this world. + +"All that we would need to be all-powerful is for you to take that little +trinket you've got there up to the Astral Plane. From there, %d will +show you what to do with it. Once that's done, we will be invincible!"]], + }, + killed_nemesis = { + synopsis = "[Before dying, %n tells you to use the %o wisely.]", + output = "text", + text = [["I know what you are thinking, %p. It is not too late for you +to use %o wisely. For the sake of your guild +%sp, do what is right." + +You sit and wait for death to come for %n, and then you +brace yourself for your next meeting with %l!]], + }, + leader_first = { + synopsis = "[You owe back dues to your guild. You can pay them off if you're up to the job.]", + output = "text", + text = [["Well, look who it is boys -- %p has come home. You seem to have +fallen behind in your dues. I should kill you as an example to these +other worthless cutpurses, but I have a better plan. If you are ready +maybe you could work off your back dues by performing a little job for +me. Let us just see if you are ready..."]], + }, + leader_last = { + synopsis = "[You must go.]", + output = "text", + text = [["Well %gp, it looks like our friend has forgotten who is the boss +around here. Our friend seems to think that %rp have been put in +charge. Wrong. DEAD WRONG!" + +Your sudden shift in surroundings prevents you from hearing the end +of %ls curse.]], + }, + leader_next = { + synopsis = "[Are you stupid or are you ready?]", + output = "text", + text = [["Well, I didn't expect to see you back. It shows that you are either stupid, +or you are finally ready to accept my offer. Let us hope for your sake it +isn't stupidity that brings you back."]], + }, + leader_other = { + text = [["Did you perhaps mistake me for some other %lt? You must +think me as stupid as your behavior. I warn you not to try my patience."]], + }, + locate_first = { + text = "Those damn little hairs tell you that you are nearer to %o.", + }, + locate_next = { + text = "Not wanting to face %l without having stolen %o, you continue.", + }, + nemesis_first = { + text = "\"Ah! You must be %ls ... er, `hero'. A pleasure to meet you.\"", + }, + nemesis_next = { + text = "\"We meet again. Please reconsider your actions.\"", + }, + nemesis_other = { + synopsis = "[You cannot trust %l.]", + output = "text", + text = [["Surely, %p, you have learned that you cannot trust any bargains +that %l has made. I can show you how to continue on +your quest without having to run into him again."]], + }, + nemesis_wantsit = { + synopsis = "[%lC should not have %o.]", + output = "text", + text = [["Please, think for a moment about what you are doing. Do you truly +believe that %d would want %l to have +%o?"]], + }, + nexttime = { + text = [[Once again, you find yourself back in Ransmannsby. Fond memories are +replaced by fear, knowing that %l is waiting for you.]], + }, + offeredit = { + synopsis = "[Take %o with you and go.]", + output = "text", + text = [["Well, I'll be damned. You got it. I am proud of you, a fine %r +you've turned out to be. + +"While you were gone I got to thinking, you and %o +together could bring me more treasure than either of you apart, so why don't +you take it with you. All I ask is a cut of whatever loot you come by. +That is a better deal than I offered %n. + +"But, you see what happened to %n when he refused. +Don't make me find another to send after you this time."]], + }, + offeredit2 = { + synopsis = "[Take %o and acquire the Amulet.]", + output = "text", + text = [[%lC seems tempted to swap %o for +the mundane one you detect in his pocket, but noticing your alertness, +evidently chickens out. + +"Go filch the Amulet before someone else beats you to it. +%Z are back the way you came, through the magic portal."]], + }, + othertime = { + text = [[You rub your hands through your hair, hoping that the little ones on +the back of your neck stay down, and prepare yourself for your meeting +with %l.]], + }, + posthanks = { + synopsis = "[How about trading %o for something?]", + output = "text", + text = [["Quite the little thief, aren't we, %p. Can I interest you in a +swap for %o? Look around, anything in the keep +is yours for the asking."]], + }, + }, + Sam = { + assignquest = { + synopsis = "[You must enter %i, then regain %o from %n.]", + output = "text", + text = [["Domo %p-san, indeed you are ready. I can now tell you what +it is that I require of you. + +"The daimyo, %n, has betrayed us. He has stolen from us +%o and taken it to his donjon deep within +%i. + +"If I cannot show the emperor %o when he comes +for the festival he will know that I have failed in my duty, and +request that I commit seppuku. + +"You must gain entrance to %i and retrieve the +emperor's property. Be quick! The emperor will be here for the +cha-no-you in 5 sticks. + +"Wakarimasu ka?"]], + }, + badalign = { + synopsis = "[When you can think %a and act %a then return.]", + output = "text", + text = [["%p-san, you would do better to join the kyokaku. + +"You have skills, but until you can call upon the bushido to know when and +how to use them you are not samurai. When you can think %a and +act %a then return."]], + }, + badlevel = { + synopsis = "[\"I require %Ra to defeat %n. Return when you are ready.\"]", + output = "text", + text = [["%p-san, you have learned well and honored your family. +I require the skills of %Ra in order to defeat %n. +Go and seek out teachers. Learn what they have learned. When you +are ready, return to me."]], + }, + discourage = { + "\"Ahh, I finally meet the daimyo of the kyokaku!\"", + "\"There is no honor for me in your death.\"", + "\"You know that I cannot resash my swords until they have killed.\"", + "\"Your presence only compounds the dishonor of %l in not coming %liself.\"", + "\"I will make tea with your hair and serve it to %l.\"", + "\"Your fear shows in your eyes, coward!\"", + "\"I have not heard of you, %p-san; has your life been that unworthy?\"", + "\"If you will not obey me, you will die.\"", + "\"Kneel now and make the two cuts of honor. I will tell your %sp of your honorable death.\"", + "\"Your master was a poor teacher. You will pay for his mistakes in your teaching.\"", + }, + encourage = { + "\"To defeat %n you must overcome the seven emotions: hate, adoration, joy, anxiety, anger, grief, and fear.\"", + "\"Remember your honor is my honor, you perform in my name.\"", + "\"I will go to the temple and burn incense for your safe return.\"", + "\"Sayonara.\"", + "\"There can be honor in defeat, but no gain.\"", + "\"Your kami must be strong in order to succeed.\"", + "\"You are indeed a worthy %R, but now you must be a worthy samurai.\"", + "\"If you fail, %n will be like a tai-fun on the land.\"", + "\"If you are truly %a, %d will listen.\"", + "\"Sharpen your swords and your wits for the task before you.\"", + }, + firsttime = { + synopsis = "[The banner of %n flies above town. What has happened to %l?]", + output = "text", + text = [[Even before your senses adjust, you recognize the kami of +%H. + +You %x the standard of your teki, %n, flying above +the town. How could such a thing have happened? Why are ninja +wandering freely; where are the samurai of your daimyo, %l? + +You quickly say a prayer to Izanagi and Izanami and walk towards +town.]], + }, + goal_alt = { + text = "As you arrive once again at the home of %n.", + }, + goal_first = { + synopsis = "[You feel the taunts %n, but after offering a prayer to %d, you proceed.]", + output = "text", + text = [[In your mind, you hear the taunts of %n. + +You become like the rice plant and bend to the ground, offering a +prayer to %d. But when the wind has passed, you stand +proudly again. Putting your kami in the hands of fate, you advance.]], + }, + goal_next = { + text = [[As you arrive once again at the home of %n, your thoughts +turn only to %o.]], + }, + gotit = { + synopsis = "[You feel the power of %o and are humbled.]", + output = "text", + text = [[As you pick up %o, you feel the strength of its karma. +You realize at once why so many good samurai had to die to defend it. +You are humbled knowing that you hold one of the artifacts of the +sun goddess.]], + }, + guardtalk_after = { + "\"Come, join us in celebrating with some sake.\"", + "\"Ikaga desu ka?\"", + "\"You have brought our clan and %l much honor.\"", + "\"Please %r, sit for a while and tell us how you overcame the Ninja.\"", + "\"%lC still lives! You have saved us from becoming ronin.\"", + }, + guardtalk_before = { + "\"To succeed, you must walk like a butterfly on the wind.\"", + "\"Ikaga desu ka?\"", + "\"I fear for The Land of The Gods.\"", + "\"%nC has hired the Ninja -- be careful.\"", + "\"If %o is not returned, we will all be ronin.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to the Astral Plane to finish your task.]", + output = "text", + text = [["Ah, %p-sama. You have wasted your efforts returning home. +Now that you are in possession of the Amulet, you are honor-bound to +finish the quest you have undertaken. There will be plenty of time +for saki and stories when you have finished. + +"Go now, and may our prayers be a wind at your back."]], + }, + killed_nemesis = { + synopsis = "[%nC dies without honor.]", + output = "text", + text = [[Your healing skills tell you that %ns wounds are mortal. + +You know that the bushido tells you to finish him and let his kami +die with honor, but the thought of so many samurai dead due to this +man's dishonor prevents you from giving the final blow. + +You order that his unwashed head be given to the crows and his body +thrown into the sea.]], + }, + leader_first = { + synopsis = "[%lC needs someone to lead %lj samurai against %n. Are you ready?]", + output = "text", + text = [["Ah, %p-san, it is good to see you again. I need someone who can +lead my samurai against %n. If you are ready, you will be +that person."]], + }, + leader_last = { + synopsis = "[Leave and do not come back.]", + output = "text", + text = [["You are no longer my samurai, %p. + +"Hara-kiri is denied. You are ordered to shave your head and then to +become a monk. Your fief and family are forfeit. Wakarimasu ka?"]], + }, + leader_next = { + text = [["Once again, %p-san, you kneel before me. Are you yet capable of +being my vassal?"]], + }, + leader_other = { + synopsis = "[Are you truly a samurai?]", + output = "text", + text = [["You begin to test my matsu, %p-san. +If you cannot determine what I want in a samurai, how can I rely on you +to figure out what I need from a samurai?"]], + }, + locate_first = { + text = [[You instinctively reach for your swords. You do not recognize the +lay of this land, but you know that your teki are everywhere.]], + }, + locate_next = { + text = [[Thankful that your %sp at %H cannot see +your fear, you prepare again to advance.]], + }, + nemesis_first = { + text = [["Ah, so it is to be you, %p-san. I offer you seppuku. +I will be your second if you wish."]], + }, + nemesis_next = { + text = [["I have offered you the honorable exit. Now I will have your +head to send unwashed to %l."]], + }, + nemesis_other = { + text = "\"After I have dispatched you, I will curse your kami.\"", + }, + nemesis_wantsit = { + text = [["You have fought my samurai; surely you must know that you +will not be able to take %o back to +%H."]], + }, + nexttime = { + text = "Once again, you are back at %H.", + }, + offeredit = { + synopsis = "[The emperor wants you to take %o and recover the Amulet.]", + output = "text", + text = [[As you bow before %l, he welcomes you: + + "You have brought your family great honor, %p-sama. + + "While you have been gone the emperor's advisors have discovered in + the ancient texts that the karma of the samurai who seeks to recover + the Amulet and the karma of %o are joined + as the seasons join to make a year. + + "Because you have shown such fidelity, the emperor requests + that you take leave of other obligations and continue on the + road that fate has set your feet upon. I would consider it + an honor if you would allow me to watch your household until + you return with the Amulet." + +With that, %l bows, and places his sword atop +%o.]], + }, + offeredit2 = { + synopsis = "[Take %o, return to %Z, and recover the Amulet.]", + output = "text", + text = [[%l holds %o tightly for a moment, then returns +his gaze to you. + +"The time is ripe to recover the Amulet. Return to %Z +through the magic portal that transported you here so that you may +achieve the destiny which awaits you."]], + }, + othertime = { + synopsis = "[%HC is threatened by %n.]", + output = "text", + text = [[You are back at %H. + +Instantly you sense a subtle change in your karma. You seem to know that +if you do not succeed in your quest, %n will have destroyed +the kami of %H before you return again.]], + }, + posthanks = { + text = "%lC bows. \"%p-sama, tell us of your search for the Amulet.\"", + }, + }, + Tou = { + assignquest = { + synopsis = "[Enter %i and recover %o from %n.]", + output = "text", + text = [["You have indeed proven yourself a worthy %c, %p. + +"But now your kinfolk and I must ask you to put aside your travels and +help us in our time of need. After you left us we elected a new mayor, +%n. He proved to be a most heinous and vile creature. + +"Soon after taking office he absconded with %o +and fled town, leaving behind his henchmen to rule over us. In order +for us to regain control of our town, you must enter %i +and recover %o. + +"Do not be distracted on your quest. If you do not return quickly I fear +that all will be lost. Let us both pray now that %d will guide you +and keep you safe."]], + }, + badalign = { + synopsis = "[You are not sufficiently %a. Return when you are.]", + output = "text", + text = [["It would be an affront to %d to have one not true to the +%a path undertake her bidding. + +"You must not return to us until you have purified yourself of these +bad influences on your actions. Remember, only by following the %a +path can you hope to overcome the obstacles you will face."]], + }, + badlevel = { + synopsis = "[Return when you are %Ra.]", + output = "text", + text = [["There is still too much that you have to learn before you can undertake +the next step. Return to us as a proven %R, and perhaps then +you will be ready. + +"Go back now, and may the teachings of %d serve you well."]], + }, + discourage = { + "\"I defeated %l and I will defeat you, %p.\"", + "\"Where is %d now! You must realize no one can help you here.\"", + "\"Beg for mercy now and I may be lenient on you.\"", + "\"If you were not so %a, you might have stood a chance.\"", + "\"Vengeance is mine at last, %p.\"", + "\"I only wish that %l had a more worthy %r to send against me.\"", + "\"With %o in my possession you cannot hope to defeat me.\"", + "\"%nC has never been defeated, NEVER!\"", + "\"Are you truly the best %H has to send against me? I pity %l.\"", + "\"How do you spell %p? I want to ensure the marker on your grave is correct as a warning to your %sp.\"", + }, + encourage = { + "\"Do not be fooled by the false promises of %n.\"", + "\"To enter %i you must pass many traps.\"", + "\"If you do not return with %o, your quest will be in vain.\"", + "\"Do not be afraid to call upon %d if you truly need help.\"", + "\"If you do not destroy %n, he will follow you back here!\"", + "\"Take %o from %n and you may be able to defeat him.\"", + "\"You must hurry, %p!\"", + "\"You are like %Sa to me, %p. Do not let me down.\"", + "\"If you are %a at all times you may succeed, %p.\"", + "\"Let all who meet you on your journey know that you are on a quest for %l and grant safe passage.\"", + }, + firsttime = { + synopsis = "[You find yourself back at %H, but the quiet is ominous.]", + output = "text", + text = [[You breathe a sigh of relief as you find yourself back in the familiar +surroundings of %H. + +You quickly notice that things do not appear the way they did when you +left. The town is dark and quiet. There are no sounds coming from +behind the town walls, and no campfires burning in the fields. As a +matter of fact, you do not %x any movement in the fields at all, and +the crops seem as though they have been untended for many weeks.]], + }, + goal_alt = { + text = "You have returned to %ns lair.", + }, + goal_first = { + text = "You sense the presence of %o.", + }, + goal_next = { + text = [[You gain confidence, knowing that you may soon be united with +%o.]], + }, + gotit = { + synopsis = "[You pick up %o and feel relief. Return it to %l.]", + output = "text", + text = [[As you pick up %o, you feel a great +weight has been lifted from your shoulders. Your only thoughts are +to quickly return to %H and find %l.]], + }, + guardtalk_after = { + "\"Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me.\"", + "\"Do you know where I could find some nice postcards of The Gnomish Mines?\"", + "\"Have you tried the weird toilets?\"", + "\"If you stick around, I'll show you the pictures from my latest trip.\"", + "\"Did you bring me back any souvenirs?\"", + }, + guardtalk_before = { + "\"Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me.\"", + "\"Do you know where I could find some nice postcards of The Gnomish Mines?\"", + "\"Have you tried the weird toilets?\"", + "\"Don't stay at the Inn, I hear the food is terrible and it has rats.\"", + "\"They told me that this was the off season!\"", + }, + hasamulet = { + synopsis = "[You have the Amulet. Take it to the Astral Plane to finish your task.]", + output = "text", + text = [["Stand back and let me look at you, %p. +Now that you have recovered the Amulet of Yendor, I'm afraid living +out your days in %H would seem pretty tame. + +"You have come too far to stop now, for there are still more tasks that +our oral history foretells for you. Forever more, though, your name shall +be spoken by the %gP with awe. You are truly an inspiration to your +%sp!"]], + }, + killed_nemesis = { + synopsis = "[%nC curses at you as %nh dies.]", + output = "text", + text = [[You turn in the direction of %n. As his earthly body begins +to vanish before your eyes, you hear him curse: + + "You shall never be rid of me, %p! + I will find you where ever you go and regain what is rightly mine."]], + }, + leader_first = { + synopsis = "[Someone must defeat %n. Are your ready?]", + output = "text", + text = [["Is it really you, %p! I had given up hope for your return. +As you can %x, we are desperately in need of your talents. Someone must +defeat %n if our town is to become what it once was. + +"Let me see if you are ready to be that someone."]], + }, + leader_last = { + synopsis = "[Leave %H and never return.]", + output = "text", + text = [["It is too late, %p. You are not even worthy to die amongst us. +Leave %H and never return."]], + }, + leader_next = { + text = "\"Things are getting worse, %p. I hope that this time you are ready.\"", + }, + leader_other = { + text = "\"I hope that for the sake of %H you have prepared yourself this time.\"", + }, + locate_first = { + synopsis = "[You %x the handiwork of %ns henchlings.]", + output = "text", + text = [[Only your faith in %d keeps you from trembling. You %x +the handiwork of %ns henchlings everywhere.]], + }, + locate_next = { + text = "You know that this time you must find and destroy %n.", + }, + nemesis_first = { + synopsis = "[%rA will not defeat me.]", + output = "text", + text = [["So, %p, %l thinks that you can wrest +%o from me! + +"It only proves how desperate he has become that he sends %ra to +try to defeat me. When this day is over, I will have you enslaved +in the mines where you will rue the day that you ever entered +%i."]], + }, + nemesis_next = { + text = [["I let you live the last time because it gave me pleasure. +This time I will destroy you, %p."]], + }, + nemesis_other = { + synopsis = "[Run away or you will suffer severely.]", + output = "text", + text = [["These meetings come to bore me. You disturb my workings with +%o. + +"If you do not run away now, I will inflict so much suffering on you that +%l will feel guilty for ever having sent his %S to me!"]], + }, + nemesis_wantsit = { + synopsis = "[\"Return %o to me and we will rule %H.\"]", + output = "text", + text = [["You fool. You do not know how to call upon the powers of +%o. + +"Return it to me and I will teach you how to use it, and together we +will rule %H. But do so now, as my patience grows thin."]], + }, + nexttime = { + text = "Once again, you are back at %H.", + }, + offeredit = { + synopsis = "[Take %o and with %ds guidance, recover the Amulet.]", + output = "text", + text = [[As %l detects the presence of %o, +he almost smiles for the first time in many a full moon. + +As he looks up from %o he says: + + "You have recovered %o. You are its + owner now, but not its master. Let it work with you as you continue + your journey. With its help, and %d to guide you on the + %a path, you may yet recover the Amulet of Yendor."]], + }, + offeredit2 = { + synopsis = "[Keep %o and return to %Z through the portal.]", + output = "text", + text = [["%oC is yours now. %Z +await your return through the magic portal that brought you here."]], + }, + othertime = { + text = [[You are back at %H. +Things appear to have become so bad that you fear that soon +%H will not be here to return to.]], + }, + posthanks = { + text = [["I could not be more proud than if you were my own %S, %p! +Tell me of your adventures in quest of the Amulet of Yendor."]], + }, + }, + Val = { + assignquest = { + synopsis = "[Find %i; defeat %n; return with %o.]", + output = "text", + text = [["It is not clear, %p, for my sight is limited without our relic. +But it is now likely that you can defeat %n, and recover +%o. + +"A short time ago, %n and his minions attacked this place. They +opened the huge volcanic vents you %x about the hill, and attacked. I knew +that this was to come to pass, and had asked %d for a group of %gP +to help defend this place. The few you %x here are the mightiest of +Valhalla's own, and are all that are left of one hundred %d sent. + +"Despite the great and glorious battle we fought, %n managed at +last to steal %o. This has upset the balance of the universe, +and unless %oh is returned into my care, %n may start Ragnarok. + +"You must find the entrance to %i. Travel downward +from there and you will find %ns lair. Defeat him and +return %o to me."]], + }, + badalign = { + synopsis = "[You have strayed from the %a path. Return after you purify yourself.]", + output = "text", + text = [["NO! This is terrible. I see you becoming an ally of %n, and +leading his armies in the final great battles. This must not come to +pass! You have strayed from the %a path. You must purge yourself, +and return here only when you have regained a state of purity."]], + }, + badlevel = { + synopsis = "[Come back when you are %Ra.]", + output = "text", + text = [["I see you and %n fighting, %p. But you are not prepared and +shall die at %ns hand if you proceed. No. This will not do. +Go back out into the world, and grow more experienced at the ways of war. +Only when you have returned %Ra will you be able to defeat %n."]], + }, + discourage = { + "\"I am your death, %c.\"", + "\"You cannot prevail, %r. I have foreseen your every move.\"", + "\"With you out of the way, Valhalla will be mine for the taking.\"", + "\"I killed scores of %ds best when I took %o. Do you really think that one %c can stand against me?\"", + "\"Who bears the souls of %cP to Valhalla, %r?\"", + "\"No, %d cannot help you here.\"", + "\"Some instrument of %d you are, %p. You are a weakling!\"", + "\"Never have I seen %ca so clumsy in battle.\"", + "\"You die now, little %s.\"", + "\"Your body I destroy now, your soul when my hordes overrun Valhalla!\"", + }, + encourage = { + "\"Go with the blessings of %d.\"", + "\"Call upon %d when you are in need.\"", + "\"Use %o if you can. It will protect you.\"", + "\"Magical cold is very effective against %n.\"", + "\"To face %n, you will need to be immune to fire.\"", + "\"May %d strengthen your sword-arm.\"", + "\"Trust in %d. He will not desert you.\"", + "\"It becomes more likely that Ragnarok will come with every passing moment. You must hurry, %p.\"", + "\"If %n can master %o, he will be powerful enough to face %d far earlier than is fated. This must not be!\"", + "\"Remember your training, %p. You can succeed.\"", + }, + firsttime = { + synopsis = "[You arrive below %H. Something is wrong; there is lava present.]", + output = "text", + text = [[You materialize at the base of a snowy hill. Atop the hill sits +a place you know well, %H. You immediately realize +that something here is very wrong! + +In places, the snow and ice have been melted into steaming pools of +water. Fumaroles and pools of bubbling lava surround the hill. +The stench of sulphur is carried through the air, and you %x creatures +that should not be able to live in this environment moving towards you.]], + }, + goal_first = { + synopsis = "[This is the lair of %n.]", + output = "text", + text = [[Through clouds of sulphurous gasses, you %x a rock palisade +surrounded with a moat of bubbling lava. You remember the description +from something that %l said. This is the lair of %n.]], + }, + goal_next = { + text = "Once again, you stand in sight of %ns lair.", + }, + gotit = { + synopsis = "[You must return %o to %l.]", + output = "text", + text = [[As you pick up %o, your mind is suddenly filled with images, +and you perceive all of the possibilities of each potential choice you +could make. As you begin to control and channel your thoughts, you +realize that you must return %o to %l immediately.]], + }, + guardtalk_after = { + "\"Hail, and well met, brave %c.\"", + "\"May %d guide your steps, %p.\"", + "\"%lC told us you had succeeded!\"", + "\"You recovered %o just in time, %p.\"", + "\"Hail %d, for delivering %o back to us.\"", + }, + guardtalk_before = { + "\"Hail, and well met, brave %c.\"", + "\"May %d guide your steps, %p.\"", + "\"%lC weakens. Without %o, her foresight is dim.\"", + "\"You must hurry, %p, else Ragnarok may well come.\"", + "\"I would deal with this foul %n myself, but %d forbids it.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to %ds temple on the Astral Plane and offer it.]", + output = "text", + text = [["Excellent, %p. I see you have recovered the Amulet! + +"You must take the Amulet to the Great Temple of %d, on the Astral +Plane. There you must offer the Amulet to %d. + +"Go now, my %S. I cannot tell you your fate, as the power of the +Amulet interferes with mine. I hope for your success."]], + }, + killed_nemesis = { + synopsis = "[%nC dies.]", + output = "text", + text = [[A look of surprise and horror appears on %ns face. + + "No!!! %o has lied to me! I have been misled!" + +Suddenly, %n grasps his head and screams in agony, then dies.]], + }, + leader_first = { + synopsis = "[We need your aid. Are you ready?]", + output = "text", + text = [["Ah, %p, my %S. You have returned to %H +at last. We are in dire need of your aid, but I must determine if you +are yet ready for such an undertaking. + +"Let me read your fate..."]], + }, + leader_last = { + synopsis = "[\"Begone from my presence and never return.\"]", + output = "text", + text = [["No, %p. Your fate is sealed. I must cast about for another +champion. Begone from my presence, and never return. Know this, that +you shall never succeed in this life, and Valhalla is denied to you."]], + }, + leader_next = { + text = [["Let me read the future for you now, %p, perhaps you have managed to +change it enough..."]], + }, + leader_other = { + text = [["Again, I shall read your fate, my %S. Let us both hope that you have +made changes to become ready for this task..."]], + }, + locate_first = { + synopsis = "[This is the entrance to %i.]", + output = "text", + text = [[The ice and snow gives way to a valley floor. You %x ahead of you +a huge round hill surrounded by pools of lava. This then is the entrance +to %i. It looks like you're not going to get in without +a fight though.]], + }, + locate_next = { + text = "Once again, you stand before the entrance to %i.", + }, + nemesis_first = { + synopsis = "[\"%oC has shown me that I must kill you.\"]", + output = "text", + text = [["So! %lC has finally sent %ca to challenge me! + +"I thought that mastering %o would enable me to challenge +%d, but it has shown me that first I must kill you! So come, little +%s. Once I defeat you, I can at last begin the final battle with %d."]], + }, + nemesis_next = { + text = "\"Again you challenge me, %r. Good. I will kill you now.\"", + }, + nemesis_other = { + text = "\"Have you not learned yet? You cannot defeat %n!\"", + }, + nemesis_wantsit = { + text = "\"I will kill you, %c, and wrest %o from your mangled hands.\"", + }, + nexttime = { + text = "Once again, you are near the abode of %l.", + }, + offeredit = { + synopsis = "[Take %o. Search for the Amulet.]", + output = "text", + text = [[As you approach, %l rises and touches %o. + +"You may take %o with you, %p. I have removed from +it the power to foretell the future, for that power no mortal should +have. Its other abilities, however, you have at your disposal. + +"You must now begin in %ds name to search for the Amulet of Yendor. +May your steps be guided by %d, my %S."]], + }, + offeredit2 = { + synopsis = "[You are %os keeper now. Return through the portal and find the Amulet.]", + output = "text", + text = [["Careful, %p! %oC might break, and that would be +a tragic loss. You are its keeper now, and the time has come to +resume your search for the Amulet. %Z await your +return through the magic portal that brought you here."]], + }, + othertime = { + text = [[Again you materialize near %ls abode. You have a nagging feeling +that this may be the last time you come here.]], + }, + posthanks = { + text = [["Greetings, %p. I have not been able to pay as much attention to +your search for the Amulet as I have wished. How do you fare?"]], + }, + }, + Wiz = { + assignquest = { + synopsis = "[Travel to %i; overcome %n; return with %o.]", + output = "text", + text = [["Yes, %p, you truly are ready for this dire task. Listen, +carefully, for what I tell you now will be of vital importance. + +"Since you left us to hone your skills in the world, we unexpectedly came +under attack by the forces of %n. As you know, we thought +%n had perished at the end of the last age, but, alas, this was +not the case. + +"%nC sent an army of abominations against us. Among them was a +minion, mindless and ensorcelled, and thus, in the confusion, it was +able to penetrate our defenses. Alas, this creature has stolen +%o and I fear has delivered %oh to %n. + +"Over the years, I had woven most of my power into this amulet, and thus, +without it, I have but a shadow of my former power, and I fear that I +shall soon perish. + +"You must travel to %i, and within its dungeons, +find and overcome %n, and return %o to me. + +"Go now, with %d, and complete this quest before it is too late."]], + }, + badalign = { + synopsis = "[Go; come back when you are worthy of %d.]", + output = "text", + text = [["You amaze me, %p! How many times did I tell you that the way of a mage +is an exacting one. One must use the world with care, lest one leave it +in ruins and simplify the task of %n. + +"You must go back and show your worthiness. Do not return until you are +truly ready for this quest. May %d guide you in this task."]], + }, + badlevel = { + synopsis = "[Go; return when you are %Ra.]", + output = "text", + text = [["Alas, %p, you have not yet shown your proficiency as a worthy +spellcaster. As %ra, you would surely be overcome in the challenge +ahead. Go, now, expand your horizons, and return when you have attained +renown as %Ra."]], + }, + discourage = { + "\"Your puny powers are no match for me, fool!\"", + "\"When you are defeated, your torment will last for a thousand years.\"", + "\"After your downfall, %p, I shall devour %l for dessert!\"", + "\"Are you ready yet to beg for mercy? I could be lenient...\"", + "\"Your soul shall join the enslaved multitude I command!\"", + "\"Your lack of will is evident, and you shall die as a result.\"", + "\"Your faith in %d is for naught! Come, submit to me now!\"", + "\"A mere %r is nothing compared to my skill!\"", + "\"So, you are the best hope of %l? How droll.\"", + "\"Feel my power, %c! My victory is imminent!\"", + }, + encourage = { + "\"Beware, for %n is immune to most magical attacks.\"", + "\"To enter %i you must pass many traps.\"", + "\"%nC may be vulnerable to physical attacks.\"", + "\"%d will come to your aid when you call.\"", + "\"You must utterly destroy %n. He will pursue you otherwise.\"", + "\"%oC is a mighty artifact. With it you can destroy %n.\"", + "\"Go forth with the blessings of %d.\"", + "\"I will have my %gP watch for your return.\"", + "\"Feel free to take any items in that chest that might aid you.\"", + "\"You will know when %o is near. Proceed with care!\"", + }, + firsttime = { + synopsis = "[You have arrived at %ls tower but something is very wrong.]", + output = "text", + text = [[You are suddenly in familiar surroundings. You notice what appears to +be a large, squat stone structure nearby. Wait! That looks like the +tower of your former teacher, %l. + +However, things are not the same as when you were last here. Mists and +areas of unexplained darkness surround the tower. There is movement in +the shadows. + +Your teacher would never allow such unaesthetic forms to surround the +tower... unless something were dreadfully wrong!]], + }, + goal_alt = { + text = "You have returned to %ns lair.", + }, + goal_first = { + text = "You feel your mentor's presence; perhaps %o is nearby.", + }, + goal_next = { + text = "The aura of %o tingles at the edge of your perception.", + }, + gotit = { + synopsis = "[You feel %os power and know you should return %oh to %l.]", + output = "text", + text = [[As you touch %o, its comforting power infuses you +with new energy. You feel as if you can detect others' thoughts flowing +through it. Although you yearn to wear %o and +attack the Wizard of Yendor, you know you must return it to its rightful +owner, %l.]], + }, + guardtalk_after = { + "\"I have some eye of newt to trade, do you have a spare blind-worm's sting?\"", + "\"The magic portal now seems like it will remain stable for quite some time.\"", + "\"Have you noticed how much stronger %l is since %o was recovered?\"", + "\"Thank %d! We weren't positive you would defeat %n.\"", + "\"I, too, will venture into the world, because %n was but one of many evils to be vanquished.\"", + }, + guardtalk_before = { + "\"Would you happen to have some eye of newt in that overstuffed pack, %s?\"", + "\"Ah, the spell to create the magic portal worked. Outstanding!\"", + "\"Hurry! %lC may not survive that casting of the portal spell!\"", + "\"The spells of %n were just too powerful for us to withstand.\"", + "\"I, too, will venture into the world, because %n is but one of many evils to be vanquished.\"", + }, + hasamulet = { + synopsis = "[Take the Amulet to %ds altar on the Astral Plane.]", + output = "text", + text = [["Congratulations, %p. I always knew that if anyone could succeed +in defeating the Wizard of Yendor and his minions, it would be you. + +"Go now, and take the Amulet to the Astral Plane. Once there, present +the Amulet on the altar of %d. Along the way you shall pass through +the four Elemental Planes. These planes are like nothing you have ever +experienced before, so be prepared! + +"For this you were born, %s! I am very proud of you."]], + }, + killed_nemesis = { + synopsis = "[%nC curses you as %nh dies.]", + output = "text", + text = [[%nC, whose body begins to shrivel up, croaks out: + + "I shall haunt your progress until the end of time. A thousand + curses on you and %l." + +Then, the body bursts into a cloud of choking dust, and blows away.]], + }, + leader_first = { + synopsis = "[You have come a long way, but are you ready for the task I require?]", + output = "text", + text = [["Come closer, %p, for my voice falters in my old age. +Yes, I see that you have come a long way since you went out into the +world, leaving the safe confines of this tower. However, I must first +determine if you have all of the skills required to take on the task +I require of you."]], + }, + leader_last = { + synopsis = "[\"Get out of here!\"]", + output = "text", + text = [["You fool, %p! Why did I waste all of those years teaching you +the esoteric arts? Get out of here! I shall find another."]], + }, + leader_next = { + text = "\"Well, %p, you have returned. Perhaps you are now ready...\"", + }, + leader_other = { + text = [["This is getting tedious, %p, but perseverance is a sign of a true mage. +I certainly hope that you are truly ready this time!"]], + }, + locate_first = { + text = "Wisps of fog swirl nearby. You feel that %ns lair is close.", + }, + locate_next = { + text = "You believe that you may once again invade %i.", + }, + nemesis_first = { + synopsis = "[\"Your destruction should make for good sport.\"]", + output = "text", + text = [["Ah, I recognize you, %p. So, %l has sent you to steal +%o from me, hmmm? Well, %lh is a fool to send such +a mental weakling against me. + +"Your destruction, however, should make for good sport. In the end, you +shall beg me to kill you!"]], + }, + nemesis_next = { + synopsis = "[\"Your soul shall soon be mine to command.\"]", + output = "text", + text = [["How nice of you to return, %p! I enjoyed our last meeting. Are you +still hungry for more pain? + +"Come! Your soul, like %o, shall soon be mine to command."]], + }, + nemesis_other = { + text = [["I'm sure that your perseverance shall be the subject of innumerable +ballads, but you shall not be around to hear them, I fear!"]], + }, + nemesis_wantsit = { + text = [["Thief! %oC belongs to me, now. I shall feed +your living flesh to my minions."]], + }, + nexttime = { + text = "Once again, you are back at %H.", + }, + offeredit = { + synopsis = "[Take %o with you in your quest for the Amulet.]", + output = "text", + text = [[%lC notices %o in your possession, +beams at you and says: + + "I knew you could defeat %n and retrieve + %o. We shall never forget this + brave service. + + "Take %oh with you in your quest for the Amulet of Yendor. + I can sense that it has attuned %oiself to you already. + + "May %d guide you in your quest, and keep you from harm."]], + }, + offeredit2 = { + synopsis = "[Keep %o, return through the portal to %Z; find the other Amulet.]", + output = "text", + text = [["You are the keeper of %o now. It is time to +recover the /other/ Amulet. %Z await your return through +the magic portal which brought you here."]], + }, + othertime = { + text = [[You are back at %H. +You have an odd feeling this may be the last time you ever come here.]], + }, + posthanks = { + text = [["Come near, my %S, and share your adventures with me. +So, have you succeeded in your quest for the Amulet of Yendor?"]], + }, + }, +} diff --git a/dat/quest.txt b/dat/quest.txt deleted file mode 100644 index 269ec76a1..000000000 --- a/dat/quest.txt +++ /dev/null @@ -1,3521 +0,0 @@ -# NetHack 3.6 quest.txt $NHDT-Date: 1505170340 2017/09/11 22:52:20 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.34 $ -# Copyright (c) 1991 by M. Stephenson -# NetHack may be freely redistributed. See license for details. -# -# The quest text file for NetHack 3.4 -# -# These are the "standard" message numbers from qtext.h. All class -# dialogue must have at least these entries. -# -# QT_FIRSTTIME 1 -# QT_NEXTTIME 2 -# QT_OTHERTIME 3 -# -# QT_GUARDTALK 5 /* 5 random things guards say before quest */ -# QT_GUARDTALK2 10 /* 5 random things guards say after quest */ -# -# QT_FIRSTLEADER 15 -# QT_NEXTLEADER 16 -# QT_OTHERLEADER 17 -# QT_LASTLEADER 18 -# QT_BADLEVEL 19 -# QT_BADALIGN 20 -# QT_ASSIGNQUEST 21 -# -# QT_ENCOURAGE 25 /* 1-10 random encouragement messages */ -# -# QT_FIRSTLOCATE 35 -# QT_NEXTLOCATE 36 -# -# QT_FIRSTGOAL 40 /* %n (nemesis) and %o (artifact) will always -# be present on first visit in normal play */ -# QT_NEXTGOAL 41 /* subsequent visits to goal level */ -# QT_ALTGOAL 42 /* alternate to NEXTGOAL if quest artifact -# is absent from the level (optional) */ -# QT_FIRSTNEMESIS 50 -# QT_NEXTNEMESIS 51 -# QT_OTHERNEMESIS 52 -# QT_NEMWANTSIT 53 /* you somehow got the artifact */ -# -# QT_DISCOURAGE 60 /* 1-10 random maledictive messages */ -# -# QT_GOTIT 70 -# -# QT_KILLEDNEM 80 -# QT_OFFEREDIT 81 -# QT_OFFEREDIT2 82 /* if you throw artifact to leader after #81 */ -# -# QT_POSTHANKS 90 -# QT_HASAMULET 91 -# -# -# Archeologist -# -%Cc Arc 00001 -You are suddenly in familiar surroundings. The buildings in the distance -seem to be those of your old alma mater, but something is wrong. It feels -as if there has been a riot recently, or %H has -been under siege. - -All of the windows are boarded up, and there are objects scattered around -the entrance. - -Strange forbidding shapes seem to be moving in the distance. -%E [You arrive at %H, but all is not well.] -%Cp Arc 00002 -Once again, you are back at %H. -%E -%Cp Arc 00003 -You are back at %H. -You have an odd feeling this may be the last time you ever come here. -%E -%Cp Arc 00005 -"Did you see Lash LaRue in 'Song of Old Wyoming' the other night?" -%E -%Cp Arc 00006 -"Hey man, got any potions of hallucination for sale?" -%E -%Cp Arc 00007 -"Did you see the artifact %l brought back from the last dig?" -%E -%Cp Arc 00008 -"So what species do *you* think we evolved from?" -%E -%Cp Arc 00009 -"So you're %ls prize pupil! I don't know what he sees in you." -%E -%Cp Arc 00010 -"Did you see Lash LaRue in 'Song of Old Wyoming' the other night?" -%E -%Cp Arc 00011 -"Hey man, got any potions of hallucination for sale?" -%E -%Cp Arc 00012 -"I guess you are guaranteed to make full professor now." -%E -%Cp Arc 00013 -"So, what was worse, %n or your entrance exams?" -%E -%Cp Arc 00014 -"%oC is impressive, but nothing like the bones I dug up!" -%E -%Cc Arc 00015 -"Finally you have returned, %p. You were always -my most promising student. Allow me to see if you are ready for the -most difficult task of your career." -%E ["You have returned, %p, to a difficult task."] -%Cp Arc 00016 -"Again, %p, you stand before me. -Let me see if you have gained experience in the interim." -%E -%Cp Arc 00017 -"Once more, %p, you have returned from the field. -Are you finally ready for the task that must be accomplished?" -%E -%Cc Arc 00018 -"%p, you have failed us. All of my careful training has been in -vain. Begone! Your tenure at this college has been revoked! - -"You are a disgrace to the profession!" -%E ["%pC, you have failed us. Begone!"] -%Cc Arc 00019 -"%p, you are yet too inexperienced to undertake such a demanding -quest. A mere %r could not possibly face the rigors demanded and -survive. Go forth, and come here again when your adventures have further -taught you." -%E [%pC, a mere %r is too inexperienced.] -%Cc Arc 00020 -"%pC! I've heard that you've been using sloppy techniques. Your -results lately can hardly be called suitable for %ra! - -"How could you have strayed from the %a path? Go from here, and come -back only when you have purified yourself." -%E ["%pC, you have strayed from the %a path. Purify yourself!"] -%Cc Arc 00021 -"Grave times have befallen the college, for %na has -stolen %o. Without it, the board of directors of -the university will soon have no choice but to revoke our research grants. - -"You must locate the entrance to %i. Within it, -you will find %n. - -"You must then defeat %n and return %o -to me. - -"Only in this way will we be able to prevent the budget cuts that could -close this college. - -"May the wisdom of %d be your guide." -%E [%nC has stolen %o. Locate %i, defeat %ni, and return %O.] -%Cp Arc 00025 -"Beware, for %n is powerful and cunning." -%E -%Cp Arc 00026 -"To locate the entrance to %i, you must pass -many traps." -%E -%Cp Arc 00027 -"A %nt may be vulnerable to attacks by magical cold." -%E -%Cp Arc 00028 -"Call upon %d when you encounter %n." -%E -%Cp Arc 00029 -"You must destroy %n. It will pursue you otherwise." -%E -%Cp Arc 00030 -"%oC is a mighty talisman. With it you -can destroy %n." -%E -%Cp Arc 00031 -"Go forth with the blessings of %d." -%E -%Cp Arc 00032 -"I will have my %gP watch for your return." -%E -%Cp Arc 00033 -"Remember not to stray from the true %a path." -%E -%Cp Arc 00034 -"You may be able to sense %o when you are near." -%E -%Cc Arc 00035 -A plain opens before you. Beyond the plain lies a foreboding edifice. - -You have the feeling that you will soon find the entrance to -%i. -%E [This foreboding edifice must hide the entrance to %i.] -%Cp Arc 00036 -Once again, you are near the entrance to %i. -%E -%Cc Arc 00040 -A strange feeling washes over you, and you think back to things you -learned during the many lectures of %l. - -You realize the feeling must be the presence of %o. -%E [This strange feeling must be the presence of %o.] -%Cp Arc 00041 -The familiar presence of %o is in the ether. -%E -# delivered instead of 00041 if %o is not on the level anymore; -# hero might already be carrying it, so don't say anything like -# "%o's presence can't be felt" -%Cp Arc 00042 -The have returned to %ns lair. -%E -%Cc Arc 00050 -"So, %p, you think that you can succeed in recovering -%o, when your teacher, %l, has already failed. - -"Come, try your best! I shall destroy you, and gnaw on your bones." -%E ["Come, %p, I shall destroy you!"] -%Cc Arc 00051 -"Again you try to best me, eh %p? Well, you shall fail again. - -"You shall never recover %o. - -"I shall bear your soul to the Plane of Origins for my master's pleasure." -%E ["Again you try to best me, %p? You shall never recover %o."] -%Cp Arc 00052 -"You persist yet %p! Good. Now, you shall die!" -%E -%Cp Arc 00053 -"I shall have %o from you, %p, then feast -upon your entrails!" -%E -%Cp Arc 00060 -"Try your best, %p. You cannot defeat me." -%E -%Cp Arc 00061 -"I shall rend the flesh from your body whilst you still breathe!" -%E -%Cp Arc 00062 -"First you, %p, then I shall destroy your mentor, %l." -%E -%Cp Arc 00063 -"Tiring yet, %p? I draw my power from my master and cannot -falter!" -%E -%Cp Arc 00064 -"I shall rend thy soul from thy body and consume it!" -%E -%Cp Arc 00065 -"You are far too %a -- it weakens you. You shall die in this place." -%E -%Cp Arc 00066 -"%d has forsaken you! You are lost now!" -%E -%Cp Arc 00067 -"A mere %r cannot hope to defeat me!" -%E -%Cp Arc 00068 -"If you are the best %l can send, I have nothing to fear." -%E -%Cp Arc 00069 -"Die %c! I shall exhibit your carcass as a trophy." -%E -%Cc Arc 00070 -The power of %o flows through your body! You feel -as if you could now take on the Wizard of Yendor himself and win, but -you know you must return %o to %l. -%E [The power of %o flows through your body! You must return it to %l.] -%Cp Arc 00080 -The body of %n dissipates in a cloud of noxious fumes. -%E -%Cc Arc 00081 -%lC touches %o briefly, gazes into it, -then smiles at you and says: - -"Well done, %p. You have defeated %n and -recovered %o. But I fear that it shall never be safe -here. - -Please take %o with you. You, %p, can -guard it now far better than I. - -May the blessings of %d follow you and guard you." -%E [%lC instructs you to guard %o from now on.] -# assumes Orb of Detection (glass object) -%Cc Arc 00082 -"Careful, %p! %oC might break, and that would be -a tragic loss. You are its keeper now, and the time has come to -resume your search for the Amulet. %Z await your -return through the magic portal that brought you here." -%E ["Resume your search for the Amulet beyond the magic portal to %Z."] -%Cc Arc 00090 -"Welcome back, %p. Have you progressed with your quest to -regain the Amulet of Yendor for %d?" -%E ["Have you progressed with your quest to regain the Amulet of Yendor for %d?"] -%Cc Arc 00091 -"Congratulations, %p. I wondered if anyone could prevail against -the Wizard and the minions of Moloch. Now, you must embark on one -final adventure. - -"Take the Amulet, and find your way onto the Astral Plane. -There you must find the altar of %d and sacrifice the -Amulet on that altar to fulfill your destiny. - -"Remember, your path now should always be upwards." -%E [Take the Amulet to the Astral Plane and sacrifice it at the altar of %d.] -# -# Barbarian -# -%Cc Bar 00001 -Warily you scan your surroundings, all of your senses alert for signs -of possible danger. Off in the distance, you can %x the familiar shapes -of %H. - -But why, you think, should %l be there? - -Suddenly, the hairs on your neck stand on end as you detect the aura of -evil magic in the air. - -Without thought, you ready your weapon, and mutter under your breath: - - "By %d, there will be blood spilt today." -%E [You reach the vicinity of %H, but sense evil magic nearby.] -%Cp Bar 00002 -Once again, you near %H. You know that %l -will be waiting. -%E -%Cp Bar 00003 -Again, and you think possibly for the last time, you approach -%H. -%E -%Cp Bar 00005 -"The battles here have been good -- our enemies' blood soaks the soil!" -%E -%Cp Bar 00006 -"Remember that glory is crushing your enemies beneath your feet!" -%E -%Cp Bar 00007 -"There has been little treasure to loot, since the horde arrived." -%E -%Cp Bar 00008 -"The horde is mighty in numbers, but they have little courage." -%E -%Cp Bar 00009 -"%lC is a strange one, but he has helped defend us." -%E -%Cp Bar 00010 -"The battles here have been good -- our enemies' blood soaks the soil!" -%E -%Cp Bar 00011 -"Remember that glory is crushing your enemies beneath your feet!" -%E -%Cp Bar 00012 -"Times will be good again, now that the horde is vanquished." -%E -%Cp Bar 00013 -"You have brought our clan much honor in defeating %n." -%E -%Cp Bar 00014 -"You will be a worthy successor to %l." -%E -%Cc Bar 00015 -"Ah, %p. You have returned at last. The world is in dire -need of your help. There is a great quest you must undertake. - -"But first, I must see if you are ready to take on such a challenge." -%E ["At last you have returned. There is a great quest you must undertake."] -%Cp Bar 00016 -"%p, you are back. Are you ready now for the challenge?" -%E -%Cp Bar 00017 -"Again, you stand before me, %p. Surely you have prepared yourself." -%E -%Cc Bar 00018 -"Pah! You have betrayed the gods, %p. You will never attain -the glory which you aspire to. Your failure to follow the true path has -closed this future to you. - -"I will protect these people as best I can, but soon %n will overcome -me and destroy all who once called you %s. Now begone!" -%E ["You have betrayed %d; soon %n will destroy us. Begone!"] -%Cc Bar 00019 -"%p, I fear that you are as yet too inexperienced to face -%n. Only %Ra with the help of %d could ever hope to -defeat %ni." -%E ["You are too inexperienced. Come back when you are %Ra."] -%Cc Bar 00020 -"%pC! You have wandered from the path of the %a! -If you attempt to overcome %n in this state, he will surely -enslave your soul. Your only hope, and ours, lies in your purification. -Go forth, and return when you feel ready." -%E ["You have wandered from the path of the %a. Come back when you have atoned."] -%Cc Bar 00021 -"The world is in great need of your assistance, %p. - -"About six months ago, I learned that a mysterious sorcerer, known -as %n, had begun to gather a large group of cutthroats and brigands -about %ni. - -"At about the same time, these people you once rode with `liberated' a -potent magical talisman, %o, from a Turanian caravan. - -"%nC and %nj Black Horde swept down upon %i and defeated -the people there, driving them out into the desert. He has taken -%o, and seeks to bend it to %nj will. I detected the -subtle changes in the currents of fate, and joined these people. -Then I sent forth a summons for you. - -"If %n can bend %o to %nj will, he will become -almost indestructible. He will then be able to enslave the minds of -men across the world. You are the only hope. The gods smile upon you, -and with %d behind you, you alone can defeat %n. - -"You must go to %i. From there, you can track down -%n, defeat %ni, and return %o to us. Only -then will the world be safe." -%E ["Find %n, defeat %ni, and return %o to us."] -%Cp Bar 00025 -"%nC is strong in the dark arts, but not immune to cold steel." -%E -%Cp Bar 00026 -"Remember that %n is a great sorcerer. He lived in the time -of Atlantis." -%E -%Cp Bar 00027 -"If you fail, %p, I will not be able to protect these people long." -%E -%Cp Bar 00028 -"To enter %i, you must be very stealthy. The horde will be on -guard." -%E -%Cp Bar 00029 -"Call upon %d in your time of need." -%E -%Cp Bar 00030 -"May %d protect you, and guide your steps." -%E -%Cp Bar 00031 -"If you can lay hands upon %o, carry it for good fortune." -%E -%Cp Bar 00032 -"I cannot stand against %ns sorcery. But %d will help you." -%E -%Cp Bar 00033 -"Do not fear %n. I know you can defeat %ni." -%E -%Cp Bar 00034 -"You have a great road to travel, %p, but only after you defeat -%n." -%E -%Cc Bar 00035 -The scent of water comes to you in the desert breeze. You know that -you have located %i. -%E [You have located %i.] -%Cp Bar 00036 -Yet again you have a chance to infiltrate %i. -%E -%Cc Bar 00040 -The hairs on the nape of your neck lift as you sense an energy in the -very air around you. You fight down a primordial panic that seeks to -make you turn and run. This is surely the lair of %n. -%E [This is surely the lair of %n.] -%Cp Bar 00041 -Yet again you feel the air around you heavy with malevolent magical energy. -%E -%Cc Bar 00050 -"So. This is what that second rate sorcerer %l sends to do %lj bidding. -I have slain many before you. You shall give me little sport. - -"Prepare to die, %c." -%E [%nC boasts that %nh has slain many. "Prepare to die, %c."] -%Cp Bar 00051 -"I have wasted too much time on you already. Now, you shall die." -%E -%Cp Bar 00052 -"You return yet again, %c! Are you prepared for death now?" -%E -%Cp Bar 00053 -"I shall have %o back, you pitiful excuse for %ca. -And your life as well." -%E -%Cp Bar 00060 -"My pets will dine on your carcass tonight!" -%E -%Cp Bar 00061 -"You are a sorry excuse for %ra." -%E -%Cp Bar 00062 -"Run while you can, %c. My next spell will be your last." -%E -%Cp Bar 00063 -"I shall use your very skin to bind my next grimoire." -%E -%Cp Bar 00064 -"%d cannot protect you now. Here, you die." -%E -%Cp Bar 00065 -"Your %a nature makes you weak. You cannot defeat me." -%E -%Cp Bar 00066 -"Come, %c. I shall kill you, then unleash the horde on your tribe." -%E -%Cp Bar 00067 -"Once you are dead, my horde shall finish off %l, and your tribe." -%E -%Cp Bar 00068 -"Fight, %c, or are you afraid of the mighty %n?" -%E -%Cp Bar 00069 -"You have failed, %c. Now, my victory is complete." -%E -%Cc Bar 00070 -As you pick up %o, you feel the power of it -flowing through your hands. It seems to be in two or more places -at once, even though you are holding it. -%E [You feel the power of %o flowing through your hands.] -%Cc Bar 00080 -%nC falls to the ground, and utters a last curse at you. Then %nj -body fades slowly, seemingly dispersing into the air around you. You -slowly become aware that the overpowering aura of magic in the air has -begun to fade. -%E [%nC curses you, but you feel the overpowering aura of magic fading.] -%Cc Bar 00081 -When %l sees %o, he smiles, and says: - - Well done, %p. You have saved the world from certain doom. - What, now, should be done with %o? - - These people, brave as they are, cannot hope to guard it from - other sorcerers who will detect it, as surely as %n did. - - Take %o with you, %p. It will guard you in - your adventures, and you can best guard it. You embark on a - quest far greater than you realize. - - Remember me, %p, and return when you have triumphed. I - will tell you then of what you must do. You will understand when the - time comes. -%E [%lC tells you to guard %o, and to return when you have triumphed.] -%Cc Bar 00082 -%l gazes reverently at %o, then back at you. - -"You are its keeper now, and the time has come to resume your search -for the Amulet. %Z await your return through the -magic portal which brought you here." -%E ["You keep %o. Return to %Z to search for the Amulet."] -%Cp Bar 00090 -"Tell us, %p, have you fared well on your great quest?" -%E -%Cc Bar 00091 -"This is wondrous, %p. I feared that you could not possibly -succeed in your quest, but here you are in possession of the Amulet -of Yendor! - -"I have studied the texts of the magi constantly since you left. In -the Book of Skelos, I found this: - - %d will cause a child to be sent into the world. This child is to - be made strong by trial of battle and magic, for %d has willed it so. - It is said that the child of %d will recover the Amulet of Yendor - that was stolen from the Creator at the beginning of time. - -"As you now possess the amulet, %p, I suspect that the Book -speaks of you. - - The child of %d will take the Amulet, and travel to the Astral - Plane, where the Great Temple of %d is to be found. The Amulet - will be sacrificed to %d, there on %dJ altar. Then the child will - stand by %d as champion of all %cP for eternity. - -"This is all I know, %p. I hope it will help you." -%E ["Take the Amulet to the altar of %d on the Astral Plane and offer it."] -# -# Cave(wo)man -# -%Cc Cav 00001 -You descend through a barely familiar stairwell that you remember -%l showing you when you embarked upon your vision quest. - -You arrive back at %H, but something seems -wrong here. The usual smoke and glowing light of the fires of the -outer caves are absent, and an uneasy quiet fills the damp air. -%E [You arrive back at %H, but something is wrong here.] -%Cp Cav 00002 -Once again, you arrive back at %H. -%E -%Cp Cav 00003 -For some reason, you think that this may be the last time you will -enter %H. -%E -%Cp Cav 00005 -"We have not been able to gather as much food since the Giants sealed -off our access to the outer world." -%E -%Cp Cav 00006 -"Since %n sent her minions, we have been constantly fighting." -%E -%Cp Cav 00007 -"I have heard your vision quest was successful. Is this so?" -%E -%Cp Cav 00008 -"So, tell me, %p, how have you fared?" -%E -%Cp Cav 00009 -"%lC grows old. We know not who will guide us after he ascends." -%E -%Cp Cav 00010 -"The rains have returned and the land grows lush again." -%E -%Cp Cav 00011 -"Peace has returned, give thanks to %d!" -%E -%Cp Cav 00012 -"Welcome back! Did you find %o?" -%E -%Cp Cav 00013 -"So, %p, tell us the story of your fight with %n." -%E -%Cp Cav 00014 -"%lC grows old. Perhaps you will guide us after he ascends." -%E -%Cc Cav 00015 -"You have returned from your vision quest, %p. Thank %d. - -"We are in dire need of your help, my %S. - -"But first, I must see if you are yet capable of the quest I would -ask you to undertake." -%E ["You have returned. We are in dire need of your help."] -%Cp Cav 00016 -"Again, you return to us, %p. Let me see if you are ready now." -%E -%Cp Cav 00017 -"Ah, %p. Are you finally ready?" -%E -%Cc Cav 00018 -"%pC! You have sealed our fate. You seem unable to reform yourself, -so I must select another to take your place. - -"Begone from %H! You have betrayed us by choosing -the path of the %C over the true path of the %L. - -"You no longer live in our eyes." -%E ["You have betrayed the %L. Begone!"] -%Cc Cav 00019 -"Alas, %p, you are as yet too inexperienced to embark upon such -a difficult quest as that I propose to give you. - -"%rA could not possibly survive the rigors demanded to find -%i, never mind to confront %n herself. - -"Adventure some more, and you will learn the skills you will require. -%d decrees it." -%E ["%rA is too inexperienced. Come back when you have progressed."] -%Cc Cav 00020 -"%pC! You have deviated from my teachings. You no longer follow -the path of the %a as you should. I banish you from these caves, to -go forth and purify yourself. Then, you might be able to accomplish this -quest." -%E ["You no longer follow the path of the %a. Go, and purify yourself."] -%Cc Cav 00021 -"You are indeed ready now, %p. I shall tell you a tale of -great suffering among your people: - -"Shortly after you left on your vision quest, the caves were invaded by -the creatures sent against us by %n. - -"She, herself, could not attack us due to her great size, but her minions -have harassed us ever since. In the first attacks, many died, and the -minions of %n managed to steal %o. -They took it to %i and there, none of our -%g warriors have been able to go. - -"You must find %i, and within it wrest -%o from %n. She guards it as -jealously as she guards all treasures she attains. But with it, -we can make our caves safe once more. - -"Please, %p, recover %o for us, and return it here." -%E [Find and defeat %n, recover %o, and return with it.] -%Cp Cav 00025 -"%nC is immune to her own breath weapons. -You should use magic upon her that she does not use herself." -%E -%Cp Cav 00026 -"When you encounter %n, call upon %d for assistance." -%E -%Cp Cav 00027 -"There will be nowhere to hide inside %ns inner sanctum." -%E -%Cp Cav 00028 -"Your best chance with %n will be to keep moving." -%E -%Cp Cav 00029 -"Do not be distracted by the great treasures in %ns lair. -Concentrate on %o." -%E -%Cp Cav 00030 -"%oC is the only object that %n truly fears." -%E -%Cp Cav 00031 -"Do not be fooled by %ns size. She is fast, and it is -rumored that she uses magic." -%E -%Cp Cav 00032 -"I would send a party of %gP with you, but we will need all -of our strength to defend ourselves." -%E -%Cp Cav 00033 -"Remember, be %a at all times. This is your strength." -%E -%Cp Cav 00034 -"If only we had an amulet of reflection, this would not have happened." -%E -%Cc Cav 00035 -You %x many large claw marks on the ground. The tunnels ahead -of you are larger than most of those in any cave complex you have -ever been in before. - -Your nose detects the smell of carrion from within, and bones litter -the sides of the tunnels. -%E [You %x many large claw marks, smell carrion, and notice bones.] -%Cp Cav 00036 -Once again, you approach %i. -%E -%Cc Cav 00040 -You find yourself in a large cavern, with neatly polished walls, that -nevertheless show signs of being scorched by fire. - -Bones litter the floor, and there are objects scattered everywhere. -The air is close with the stench of sulphurous fumes. - -%nC is clearly visible, but %nh seems to be asleep. -%E [You enter a large cavern. %nC is present.] -%Cp Cav 00041 -Once again, you find yourself in the lair of %n. -%E -%Cc Cav 00050 -"So, follower of %l, you seek to invade the lair of -%n. Only my meals are allowed down here. Prepare -to be eaten!" -%E [%nC threatens to eat you.] -%Cp Cav 00051 -"So, again you face me, %c. No one has ever before escaped me. -Now I shall kill you." -%E -%Cp Cav 00052 -"You are getting annoying, %c. Prepare to die." -%E -%Cp Cav 00053 -"I'll have %o from you, %c. You shall die." -%E -%Cp Cav 00060 -"You are weak, %c. No challenge for the Mother of all Dragons." -%E -%Cp Cav 00061 -"I grow hungry, %r. You look like a nice appetizer!" -%E -%Cp Cav 00062 -"Join me for lunch? You're the main course, %c." -%E -%Cp Cav 00063 -"With %o, I am invincible! You cannot succeed." -%E -%Cp Cav 00064 -"Your mentor, %l has failed. You are nothing to fear." -%E -%Cp Cav 00065 -"You shall die here, %c. %rA cannot hope to defeat me." -%E -%Cp Cav 00066 -"You, a mere %r challenge the might of %n? Hah!" -%E -%Cp Cav 00067 -"I am the Mother of all Dragons! You cannot hope to defeat me." -%E -%Cp Cav 00068 -"My claws are sharp now. I shall rip you to shreds!" -%E -%Cp Cav 00069 -"%d has deserted you, %c. This is my domain." -%E -%Cc Cav 00070 -As you pick up %o it seems heavy at first, but as you -hold it strength flows into your arms. - -You suddenly feel full of power, as if nothing could possibly stand -in your path. -%E [%oC fills you with a feeling of power.] -%Cp Cav 00080 -%nC sinks to the ground, her heads flailing about. -As she dies, a cloud of noxious fumes billows about her. -%E -%Cc Cav 00081 -%lC glimpses %o in your possession. -He smiles and says: - - You have done it! We are saved. But I fear that %o - will always be a target for %C forces who will want it for their - own. - - To prevent further trouble, I would like you, %p, - to take %o away with you. It will help you as you - quest for the Amulet of Yendor. -%E ["Take %o with you. It will help in your quest for the Amulet of Yendor."] -%Cc Cav 00082 -%l grasps %o proudly for a moment, then looks at you. - -"You are its keeper now, and the time has come to resume your search -for the Amulet. %Z await your return through the -magic portal which brought you here." -%E ["You are the keeper of %o now. Return to %Z to search for the Amulet.] -%Cp Cav 00090 -"%pC! Welcome back. -How goes your quest to recover the Amulet for %d?" -%E -%Cc Cav 00091 -"You have been successful, I see, %p. - -"Now that the Amulet of Yendor is yours, here is what you must do: - -"Journey upwards to the open air. The Amulet you carry will then -take you into the Astral Planes, where the Great Temple of %d -casts its influence throughout our world. - -"Sacrifice the Amulet on the altar. Thus shall %d become supreme!" -%E ["Take the Amulet to the altar of %d on the Astral Plane and offer it."] -# -# Healer -# -%Cc Hea 00001 -What sorcery has brought you back to %H? The smell -of fresh funeral pyres tells you that something is amiss with the healing -powers that used to practice here. - -No rhizotomists are tending the materia medica gardens, and where are the -common folk who used to come for the cures? - -You know that you must quickly make your way to the collegium, and -%ls iatreion, and find out what has happened in your absence. -%E [You arrive back at %H and must find %l.] -%Cp Hea 00002 -After your last experience you expected to be here, but you certainly -did not expect to see things so much worse. This time you must succeed. -%E -%Cp Hea 00003 -Again, you %x %H in the distance. - -The smell of death and disease permeates the air. You do not have -to be %Ra to know that %n is on the verge of victory. -%E -%Cp Hea 00005 -"Did you read that new treatise on the therapeutic use of leeches?" -%E -%Cp Hea 00006 -"Paint a red caduceus on your shield and monsters won't hit you." -%E -%Cp Hea 00007 -"I passed handwriting so they are demoting me a rank." -%E -%Cp Hea 00008 -"I've heard that even %l has not been able to cure Chiron." -%E -%Cp Hea 00009 -"We think %n has used %nj alchemists, and %o, -to unleash a new disease we call 'the cold' on Gehennom." -%E -%Cp Hea 00010 -"Did you read that new treatise on the therapeutic use of leeches?" -%E -%Cp Hea 00011 -"Paint a red caduceus on your shield and monsters won't hit you." -%E -%Cp Hea 00012 -"How are you feeling? Perhaps a good bleeding will improve your spirits." -%E -%Cp Hea 00013 -"Have you heard the absurd new theory that diseases are caused by -microscopic organisms, and not ill humors?" -%E -%Cp Hea 00014 -"I see that you bring %o, now you can cure this plague!" -%E -%Cc Hea 00015 -Feebly, %l raises %lj head to look at you. - -"It is good to see you again, %p. I see the concern in your -eyes, but do not worry for me. I am not ready for Hades yet. We have -exhausted much of our healing powers holding off %n. -I need your fresh strength to carry on our work. - -"Come closer and let me lay hands on you, and determine if you have -the skills necessary to accomplish this mission." -%E [%l is weak from the struggle with %n. %lH wants to examine you.] -%Cp Hea 00016 -"Again you return to me, %p. I sense that each trip back -the pleurisy and maladies of our land begin to infect you. Let us -hope and pray to %d that you become ready for your task before -you fall victim to the bad humors." -%E -%Cp Hea 00017 -"Chiron has fallen, Hermes has fallen, what else must I tell you to -impress upon you the importance of your mission! I hope that you -have come prepared this time." -%E -%Cc Hea 00018 -"You have failed us, %p. You are a quack! A charlatan! - -"Hades will be happy to hear that you are once again practicing your -arts on the unsuspecting." -%E [You are a failure as a healer.] -%Cc Hea 00019 -"Alas, %p, you are yet too inexperienced to deal with the rigors -of such a task. You must be able to draw on the knowledge of botany, -alchemy and veterinary practices before I can send you on this quest -with good conscience. - -"Return when you wear %Ra's caduceus." -%E [You are too inexperienced. Return when you are %Ra.] -%Cc Hea 00020 -"You have learned much of the remedies that benefit, but you must also -know which physic for which ail. That is why %ds teachings are a -part of your training. - -"Return to us when you have healed thyself." -%E [Return when you are more %a.] -%Cc Hea 00021 -For the first time, you sense a smile on %ls face. - - "You have indeed learned as much as we can teach you in preparation - for this task. Let me tell you what I know of the symptoms and hope - that you can provide a cure. - - "A short while ago, the dreaded %nt was fooled by the gods - into thinking that %nh could use %o to find a - cure for old age. Think of it, eternal youth! But %nj good - health is accomplished by drawing the health from those around %ni. - - "He has exhausted %nj own supply of healthy people and now %nh seeks to - extend %nj influence into our world. You must recover from %ni - %o and break the spell. - - "You must travel into the swamps to %i, and from there - follow the trail to %ns island lair. Be careful." -%E [Travel to %i on your way to recover %o from %n.] -%Cp Hea 00025 -"Remember, %p, to always wash your hands before operating." -%E -%Cp Hea 00026 -"%nC has no real magic of %nj own. To this %nh is vulnerable." -%E -%Cp Hea 00027 -"If you have been true to %d, you can draw on the power of -%o." -%E -%Cp Hea 00028 -"Bring with you antidotes for poisons." -%E -%Cp Hea 00029 -"Remember this, %n can twist the powers of %o -to hurt instead of heal." -%E -%Cp Hea 00030 -"I have sent for Chiron, but I am afraid he will come too late." -%E -%Cp Hea 00031 -"Maybe when you return the snakes will once again begin to shed." -%E -%Cp Hea 00032 -"The plague grows worse as we speak. Hurry, %p!" -%E -%Cp Hea 00033 -"Many times %n has caused trouble in these lands. It is -time that %nh was eradicated like the diseases %nh has caused." -%E -%Cp Hea 00034 -"With but one eye, %n should be easy to blind. Remember this." -%E -%Cc Hea 00035 -You stand before the entrance to %i. Strange -scratching noises come from within the building. - -The swampy ground around you seems to stink with disease. -%E [You have reached %i but all is not well.] -%Cp Hea 00036 -Once again you stand at the entrance to %i. -%E -%Cc Hea 00040 -You stand within sight of the infamous Isle of %n. Even -the words of %l had not prepared you for this. - -Steeling yourself against the wails of the ill that pierce your ears, -you hurry on your task. Maybe with %o you can -heal them on your return, but not now. -%E [You have reached the lair of %n. Take %o away from %ni.] -%Cp Hea 00041 -Once again, you %x the Isle of %n in the distance. -%E -%Cc Hea 00050 -"They have made a mistake in sending you, %p. - -"When I add your youth to mine, it will just make it easier for me -to defeat %l." -%E ["I will take your life, then defeat %l."] -%Cp Hea 00051 -"Unlike your patients, you seem to keep coming back, %p!" -%E -%Cp Hea 00052 -"Which would you like, %p? Boils, pleurisy, convulsions?" -%E -%Cp Hea 00053 -"I'll have %o back from you, %r. You are -not going to live to escape this place." -%E -%Cp Hea 00060 -"They might as well give scalpels to wizards as to let you try to -use %o!" -%E -%Cp Hea 00061 -"If I could strike %l, surrounded by %lj %gP, imagine what I -can do to you here by yourself." -%E -%Cp Hea 00062 -"I will put my %Rp to work making a physic out of your ashes." -%E -%Cp Hea 00063 -"As we speak, Hades gathers your patients to join you." -%E -%Cp Hea 00064 -"After I'm done with you, I'll destroy %l as well." -%E -%Cp Hea 00065 -"You will have to kill me if you ever hope to leave this place." -%E -%Cp Hea 00066 -"I will impale your head on my caduceus for all to see." -%E -%Cp Hea 00067 -"There is no materia medica in your sack which will cure you of me!" -%E -%Cp Hea 00068 -"Do not fight too hard, I want your soul strong, not weakened!" -%E -%Cp Hea 00069 -"You should have stopped studying at vetenary." -%E -%Cc Hea 00070 -As you pick up %o, you feel its healing begin to -warm your soul. You curse Zeus for taking it from its rightful owner, -but at least you hope that %l can put it to good use once -again. -%E [You feel the healing power of %o and should return it to %l.] -%Cc Hea 00080 -The battered body of %n slumps to the ground and gasps -out one last curse: - - "You have defeated me, %p, but I shall have my revenge. - How, I shall not say, but this curse shall be like a cancer - on you." - -With that %n dies. -%E [%nC curses you as %nh dies.] -%Cc Hea 00081 -As soon as %l sees %o %lh summons %lj -%gP. - -Gently, %l reaches out and touches %o. -He instructs each of the assembled to do the same. When everyone -has finished %lh speaks to you. - - "Now that we have been replenished we can defeat this plague. You must - take %o with you and replenish the worlds you have - been called upon to travel next. I wish you could ride Chiron to the - end of your journey, but I need him to help me spread the cure. Go - now and continue your journey." -%E [%l touches %o and tells %lj %gP to do so too, then tells you to take it with you.] -%Cc Hea 00082 -%l cautiously handles %o while watching you. - -"You are its keeper now, and the time has come to resume your search -for the Amulet. %Z await your return through the -magic portal which brought you here." -%E [%l tells you to keep %o and return to %Z to search for the Amulet.] -%Cp Hea 00090 -"You have again returned to us, %p. We have done well in your -absence, yes? How fare you upon your quest for the Amulet?" -%E -%Cc Hea 00091 -"Ah, you have recovered the Amulet, %p. Well done! - -"Now, you should know that you must travel through the Elemental Planes -to the Astral, and there return the Amulet to %d. Go forth and -may our prayers be as a wind upon your back." -%E ["You have recovered the Amulet. Travel to the Astral Plane and return it to %d."] -# -# Knight -# -%Cc Kni 00001 -You materialize in the shadows of %H. Immediately, you notice -that something is wrong. The fields around the castle are trampled and -withered, as if some great battle has been recently fought. - -Exploring further, you %x long gouges in the walls of %H. -You know of only one creature that makes those kinds of marks... -%E [Signs of battle include long gouges in the walls of %H.] -%Cp Kni 00002 -Once again you stand in the shadows of %H. -%E -%Cp Kni 00003 -Again, you stand before %H. You vaguely sense that this -may be the last time you stand before %l. -%E -%Cp Kni 00005 -"Hail, %p! Verily, thou lookest well." -%E -%Cp Kni 00006 -"There is word, %p, that %n hath been sighted in the fens -near %i." -%E -%Cp Kni 00007 -"Thou art our only hope now, %p." -%E -%Cp Kni 00008 -"Verily, %l could have no better champion, %p." -%E -%Cp Kni 00009 -"Many brave %cP died when %n attacked." -%E -%Cp Kni 00010 -"Hail, %p! Verily, thou lookest well." -%E -%Cp Kni 00011 -"So, %p, didst thou find %n in the fens near %i?" -%E -%Cp Kni 00012 -"Worthy %p, hast thou proven thy right purpose on the body of %n?" -%E -%Cp Kni 00013 -"Verily, %l could have no better champion, %p." -%E -%Cp Kni 00014 -"Hast thou indeed recovered %o?" -%E -%Cc Kni 00015 -"Ah, %p. We see thou hast received Our summons. -We are in dire need of thy prowess. But first, We must needs -decide if thou art ready for this great undertaking." -%E [%lC checks whether you are ready for a great undertaking.] -%Cp Kni 00016 -"Welcome again, %p. We hope thou art ready now." -%E -%Cp Kni 00017 -"Once again, thou standest before Us, %p. Art thou ready now?" -%E -%Cc Kni 00018 -"Thou disgracest this noble court with thine impure presence. We have been -lenient with thee, but no more. Thy name shall be spoken no more. We -hereby strip thee of thy title, thy lands, and thy standing as %ca. -Begone from Our sight!" -%E [You are a disgrace as %ca.] -%Cc Kni 00019 -"Verily, %p, thou hast done well. That thou hast survived thus -far is a credit to thy valor, but thou art yet unprepared for -the demands required as Our Champion. %rA, no matter how -pure, could never hope to defeat the foul %n. - -"Journey forth from this place, and hone thy skills. Return to -Our presence when thou hast attained the noble title of %R." -%E [You are not prepared to face %n. Return when you are %Ra.] -%Cc Kni 00020 -"Thou dishonourest Us, %p! Thou hast strayed from the path of -chivalry! Go from Our presence and do penance. Only when thou art again -pure mayst thou return hence." -%E [Go and do penance. Return when you are truly %a.] -%Cc Kni 00021 -"Ah, %p. Thou art truly ready, as no %c before thee hath -been. Hear now Our words: - -"As thou noticed as thou approached %H, a great battle hath -been fought recently in these fields. Know thou that Merlin himself -came to aid Us here as We battled the foul %n. In the midst of that -battle, %n struck Merlin a great blow, felling him. Then, as Our -forces were pressed back, %n stole %o. - -"We eventually turned the tide, but lost many %cP in doing so. -Merlin was taken off by his apprentice, but hath not recovered. We have -been told that so long as %n possesseth %o, -Merlin will not regain his health. - -"We hereby charge thee with this most important of duties: - -"Go forth from this place, to the fens, and there thou wilt find -%i. From there, thou must track down %n. Destroy the -beast, and return to Us %o. Only then can -We restore Merlin to health." -%E [Pass through %i to reach %n. Destroy %ni and return with %o.] -%Cp Kni 00025 -"Remember, %p, follow always the path of %d." -%E -%Cp Kni 00026 -"Though %n is verily a mighty foe, We have confidence in thy victory." -%E -%Cp Kni 00027 -"Beware, for %n hath surrounded %niself with hordes of foul creatures." -%E -%Cp Kni 00028 -"Great treasure, 'tis said, is hoarded in the lair of %n." -%E -%Cp Kni 00029 -"If thou possessest %o, %p, %ns magic -shall therewith be thwarted." -%E -%Cp Kni 00030 -"The gates of %i are guarded by forces unseen, %p. -Go carefully." -%E -%Cp Kni 00031 -"Return %o to Us quickly, %p." -%E -%Cp Kni 00032 -"Destroy %n, %p, else %H shall surely fall." -%E -%Cp Kni 00033 -"Call upon %d when thou art in need." -%E -%Cp Kni 00034 -"To find %i, thou must keep thy heart pure." -%E -%Cc Kni 00035 -You stand at the foot of %i. Atop, you can %x a shrine. -Strange energies seem to be focused here, and the hair on the back of -your neck stands on end. -%E [You have reached %i and can %x a shrine.] -%Cp Kni 00036 -Again, you stand at the foot of %i. -%E -%Cc Kni 00040 -As you exit the swamps, you %x before you a huge, gaping hole in the -side of a hill. From within, you smell the foul stench of carrion. - -The pools on either side of the entrance are fouled with blood, and -pieces of rusted metal and broken weapons show above the surface. -%E [You %x the entrance to a cavern inside a hill.] -%Cp Kni 00041 -Again, you stand at the entrance to %ns lair. -%E -%Cc Kni 00050 -"Hah! Another puny %c seeks death. I shall dine well tonight, -then tomorrow, %H shall fall!" -%E [%nC taunts you and issues a threat against %H.] -%Cp Kni 00051 -"Again, thou challengest me, %r? So be it. Thou wilt die here." -%E -%Cp Kni 00052 -"Thou art truly foolish, %r. I shall dispatch thee anon." -%E -%Cp Kni 00053 -"So, thou darest touch MY property! I shall have that bauble back, -puny %r. Thou wilt die in agony!" -%E -%Cp Kni 00060 -"A mere %r can never withstand me!" -%E -%Cp Kni 00061 -"I shall kill thee now, and feast!" -%E -%Cp Kni 00062 -"Puny %c. What manner of death dost thou wish?" -%E -%Cp Kni 00063 -"First thee, %p, then I shall feast upon %l." -%E -%Cp Kni 00064 -"Hah! Thou hast failed, %r. Now thou shalt die." -%E -%Cp Kni 00065 -"Die, %c. Thou art as nothing against my might." -%E -%Cp Kni 00066 -"I shall suck the marrow from thy bones, %c." -%E -%Cp Kni 00067 -"Let's see... Baked? No. Fried? Nay. Broiled? Yea verily, -that is the way I like my %c for dinner." -%E -%Cp Kni 00068 -"Thy strength waneth, %p. The time of thy death draweth near." -%E -%Cp Kni 00069 -"Call upon thy precious %d, %p. It shall not avail thee." -%E -%Cc Kni 00070 -As you pick up %o, you feel its protective fields -form around your body. You also feel a faint stirring in your mind, as -if you are in two places at once, and in the second, you are waking from -a long sleep. -%E [You feel the magic of %o.] -%Cc Kni 00080 -As %n sinks to the ground, blood gushing from %nj open mouth, %nh -defiantly curses you and %l: - - "Thou hast not won yet, %r. By the gods, I shall return - and dog thy steps to the grave!" - -%nJ tail flailing madly, %n tries to crawl towards you, but slumps -to the ground and dies in a pool of %nj own blood. -%E [%nC curses you as %nh dies.] -%Cc Kni 00081 -As you approach %l, %lh beams at you and says: - - "Well done! Thou art truly the Champion of %H. We - have received word that Merlin is recovering, and shall soon - rejoin Us. - - "He hath instructed Us that thou art now to be the guardian of - %o. He feeleth that thou mayst have need of - its powers in thine adventures. It is Our wish that thou keepest - %o with thee as thou searchest for the fabled - Amulet of Yendor." -%E [%oC is yours now. It will aid in your search for the Amulet.] -# assumes Magic Mirror of Merlin (glass object) -%Cc Kni 00082 -"Careful, %p! %oC might break, and that would -be a tragic loss. Thou art its keeper now, and the time hath come -to resume thy search for the Amulet. %Z await thy -return through the magic portal that brought thee here." -%E [You are the keeper of %o. Return to %Z and find the Amulet.] -%Cp Kni 00090 -"Well met, %p. How goeth thy search for the Amulet of Yendor?" -%E -%Cc Kni 00091 -"Thou hast succeeded, We see, %p! Now thou art commanded to take -the Amulet to be sacrificed to %d in the Plane of the Astral. - -"Merlin hath counseled Us that thou must travel always upwards through -the Planes of the Elements, to achieve this goal. - -"Go with %d, %p." -%E [Take the Amulet to the Astral Plane and deliver it to %d.] -# -# Monk -# -# The quest artifact is "The Eyes of the Overworld", hence needs -# to be treated as plural by messages which use %o. -# -%Cc Mon 00001 -You find yourself standing in sight of %H. -Something is obviously wrong here. Strange shapes lumber around -outside %H! - -You realize that the %l needs your assistance! -%E [You have reached %H but something is wrong. %lC needs your aid.] -%Cp Mon 00002 -Once again, you stand before %H. -%E -%Cp Mon 00003 -Again you face %H. Your intuition hints that this -may be the final time you come here. -%E -%Cp Mon 00005 -"Greetings, honorable %r. It is good to see you." -%E -%Cp Mon 00006 -"Ah, %p! Surely you can help us in our hour of need." -%E -%Cp Mon 00007 -"Greetings, %s. %lC has great need of your help." -%E -%Cp Mon 00008 -"Alas, it seems as if even %d has deserted us." -%E -%Cp Mon 00009 -"May %d be with you, %s." -%E -%Cp Mon 00010 -"Greetings, honorable %r. It is good to see you again." -%E -%Cp Mon 00011 -"Ah, %p! Our deepest gratitude for all of your help." -%E -%Cp Mon 00012 -"Greetings, %s. Perhaps you will take some time to meditate with us?" -%E -%Cp Mon 00013 -"With this test behind you, may %d bring you enlightenment." -%E -%Cp Mon 00014 -"May %d be with you, %s." -%E -%Cc Mon 00015 -"Ah, %p, my %S. You have returned to us at last. -A great blow has befallen our order; perhaps you can help us. -First, however, I must determine if you are prepared for this -great challenge." -%E [%lC checks whether you are ready for the great challenge.] -%Cp Mon 00016 -"Again, my %S, you stand before me. Are you ready now to help us?" -%E -%Cp Mon 00017 -"Once more, %p, you stand within the sanctum. Are you ready now?" -%E -%Cc Mon 00018 -"You are a heretic, %p! How can you, %ra, deviate so from the -teachings of %d? Begone from this temple. You are no longer -%sa to this order. We will pray to %d for other assistance, -as you have failed us utterly." -%E [You are a heretic and have failed utterly.] -%Cc Mon 00019 -"Alas, %p, it is not yet to be. A mere %r could never -withstand the might of %n. Go forth, again into the world, and -return when you have attained the post of %R." -%E [You are not ready to face %n. Come back when you are %Ra.] -%Cc Mon 00020 -"This is terrible, %p. You have deviated from the true path! -You know that %d requires the most strident devotion of this -order. The %shood must stand for utmost piety. - -"Go from here, atone for your sins against %d. Return only when -you have purified yourself." -%E [You must atone. Come back when you are worthy of %d.] -%Cc Mon 00021 -"Yes, %p. You are truly ready now. Attend to me and I shall -tell you of what has transpired: - -"During one of the Great Meditations a short time ago, %n and -a legion of elementals invaded %H. Many %gP -were killed, including the one bearing %o. - -Now, there are barely enough %gP left to keep the elementals -at bay. - -"We need you to find %i, then, from there, -travel to %ns lair. If you can manage to defeat %n and -return %o here, we can then drive off the legions -of elementals that slay our students. - -"Go with %d as your guide, %p." -%E [Find %i, then continue to %ns lair. Defeat %ni and return with %o.] -%Cp Mon 00025 -"You can prevail, if you rely on %d." -%E -%Cp Mon 00026 -"Remember that %n has great magic at his command." -%E -%Cp Mon 00027 -"Be pure, my %S." -%E -%Cp Mon 00028 -"Beware, %i is surrounded by hordes of earth elementals." -%E -%Cp Mon 00029 -"Remember your studies, and you will prevail!" -%E -%Cp Mon 00030 -"Acquire and wear %o if you can. They will aid you -against %n." -%E -%Cp Mon 00031 -"Call upon %d when your need is greatest. You will be answered." -%E -%Cp Mon 00032 -"Remember to use the elementals' strength against them!" -%E -%Cp Mon 00033 -"Do not lose faith, %p. If you do so, %n will grow stronger." -%E -%Cp Mon 00034 -"Wear %o. They will assist you in your efforts." -%E -%Cc Mon 00035 -You remember the descriptions of %i, given -to you by the %l. It is ahead that you will find -%n's trail. -%E [You have reached %i. %nC lurks further ahead.] -%Cp Mon 00036 -Again, you stand before %i. -%E -%Cc Mon 00040 -The stench of brimstone is all about you, and the elementals close in -from all sides! - -Ahead, there is a small clearing amidst the bubbling pits of lava... -%E [You are surrounded by brimstone, lava, and elementals.] -%Cp Mon 00041 -Again, you have invaded %ns domain. -%E -%Cc Mon 00050 -"Ah, so %l has sent another %g to retrieve -%o. - -"No, I see you are no %g. Perhaps I shall have some fun today -after all. Prepare to die, %r! You shall never regain -%o." -%E [You are no %g. You shall never regain %o.] -%Cp Mon 00051 -"So, %r. Again you challenge me." -%E -%Cp Mon 00052 -"Die now, %r. %d has no power here to aid you." -%E -%Cp Mon 00053 -"You shall die, %r, and I will have %o back." -%E -%Cp Mon 00060 -"Submit to my will, %c, and I shall spare you." -%E -%Cp Mon 00061 -"Your puny powers are no match for me, %c." -%E -%Cp Mon 00062 -"I shall have you turned into a zombie for my pleasure!" -%E -%Cp Mon 00063 -"Despair now, %r. %d cannot help you." -%E -%Cp Mon 00064 -"I shall feast upon your soul for many days, %c." -%E -%Cp Mon 00065 -"Your death will be slow and painful. That I promise!" -%E -%Cp Mon 00066 -"You cannot defeat %n, you fool. I shall kill you now." -%E -%Cp Mon 00067 -"Your precious %lt will be my next victim." -%E -%Cp Mon 00068 -"I feel your powers failing you, %r. You shall die now." -%E -%Cp Mon 00069 -"With %o, nothing can stand in my way." -%E -%Cc Mon 00070 -As you pick up %o, you feel the essence of -%d fill your soul. You know now why %n stole %oi from -%H, for with %oi, %ca of %d could -easily defeat his plans. - -You sense a message from %d. Though not verbal, you -get the impression that you must return to %l as soon -as possible. -%E [You feel the essence of %d and realize that you should take %o to %l.] -%Cc Mon 00080 -%nC gasps: - - "You have only defeated this mortal body. Know this: my spirit - is strong. I shall return and reclaim what is mine!" - -With that, %n expires. -%E [As %n dies, %nh threatens to return.] -%Cc Mon 00081 -"You have returned, %p. And with %o, I see. -Congratulations. - -"I have been in meditation, and have received direction from -a minion of %d. %d commands that you retain -%o. With %oi, you must recover the Amulet -of Yendor. - -"Go forth, and let %d guide your steps." -%E [Keep %o. %oH will help you recover the Amulet of Yendor.] -%Cc Mon 00082 -%lC studies %o for a moment, -then returns his gaze to you. - -"%oC must remain with you. Use %oi -as you resume your search for the Amulet. -%Z await your return through the magic portal -that brought you here." -%E [Keep %o and return to %Z to search for the Amulet.] -%Cp Mon 00090 -"Welcome back, %p. How is your quest for the Amulet going?" -%E -%Cc Mon 00091 -"You have prevailed, %p! %d is surely with you. Now, -you must take the Amulet, and sacrifice it on %ds altar on -the Astral Plane. I suspect that I shall never see you again in this -life, but I hope to at %ds feet." -%E [Take the Amulet to the Astral Plane and deliver it to %d.] -# -# Priest -# -%Cc Pri 00001 -You find yourself standing in sight of %H. Something -is obviously wrong here. The doors to %H, which usually -stand open, are closed. Strange human shapes shamble around -outside. - -You realize that %l needs your assistance! -%E [You are at %H; the doors are closed. %lC needs your help!] -%Cp Pri 00002 -Once again, you stand before %H. -%E -%Cp Pri 00003 -Again you face %H. Your intuition hints that this may be -the final time you come here. -%E -%Cp Pri 00005 -"Greetings, honored %r. It is good to see you." -%E -%Cp Pri 00006 -"Ah, %p! Surely you can help us in our hour of need." -%E -%Cp Pri 00007 -"Greetings, %s. %lC has great need of your help." -%E -%Cp Pri 00008 -"Alas, it seems as if even %d has deserted us." -%E -%Cp Pri 00009 -"May %d be with you, %s." -%E -%Cp Pri 00010 -"Greetings, %r. It is good to see you again." -%E -%Cp Pri 00011 -"Ah, %p! Our deepest gratitude for all of your help." -%E -%Cp Pri 00012 -"Welcome back, %s! With %o, no undead can stand against us." -%E -%Cp Pri 00013 -"Praise be to %d, for delivering us from %n." -%E -%Cp Pri 00014 -"May %d be with you, %s." -%E -%Cc Pri 00015 -"Ah, %p, my %S. You have returned to us at last. -A great blow has befallen our order; perhaps you can help us. -First, however, I must determine if you are prepared for this -great challenge." -%E [You have returned and we need your help. Are you ready?] -%Cp Pri 00016 -"Again, my %S, you stand before me. Are you ready now to help us?" -%E -%Cp Pri 00017 -"Once more, %p, you stand within the sanctum. Are you ready now?" -%E -%Cc Pri 00018 -"You are a heretic, %p! How can you, %ra, deviate so from the -teachings of %d? Begone from this temple. You are no longer -%sa to this order. We will pray to %d for other assistance, -as you have failed us utterly." -%E [You are a heretic who has deviated from the teachings of %d.] -%Cc Pri 00019 -"Alas, %p, it is not yet to be. A mere %r could never -withstand the might of %n. Go forth, again into the world, and return -when you have attained the post of %R." -%E [%rA cannot withstand %n. Come back when you are %Ra.] -%Cc Pri 00020 -"This is terrible, %p. You have deviated from the true path! -You know that %d requires the most strident devotion of this -order. The %shood must stand for utmost piety. - -"Go from here, atone for your sins against %d. Return only when -you have purified yourself." -%E [You have deviated from the path. Return when you have purified yourself.] -%Cc Pri 00021 -"Yes, %p. You are truly ready now. Attend to me and I shall -tell you of what has transpired: - -"At one of the Great Festivals a short time ago, %n and a legion -of undead invaded %H. Many %gP were killed, including -the one carrying %o. - -"As a final act of vengefulness, %n desecrated the altar here. -Without it, we could not mount a counter-attack. Now, there are -barely enough %gP left to keep the undead at bay. - -"We need you to find %i, then, from there, travel -to %ns lair. If you can manage to defeat %n and return -%o here, we can then drive off the legions of -undead that befoul the land. - -"Go with %d as your guide, %p." -%E [%nC invaded %H and captured %o. Defeat %ni and retrieve %oh.] -%Cp Pri 00025 -"You can prevail, if you rely on %d." -%E -%Cp Pri 00026 -"Remember that %n has great magic at his command." -%E -%Cp Pri 00027 -"Be pure, my %S." -%E -%Cp Pri 00028 -"Beware, %i is surrounded by a great graveyard." -%E -%Cp Pri 00029 -"You may be able to affect %n with magical cold." -%E -%Cp Pri 00030 -"Acquire and wear %o if you can. It will aid you -against %n." -%E -%Cp Pri 00031 -"Call upon %d when your need is greatest. You will be answered." -%E -%Cp Pri 00032 -"The undead legions are weakest during the daylight hours." -%E -%Cp Pri 00033 -"Do not lose faith, %p. If you do so, %n will grow stronger." -%E -%Cp Pri 00034 -"Wear %o. It will assist you against the undead." -%E -%Cc Pri 00035 -You stand facing a large graveyard. The sky above is filled with clouds -that seem to get thicker closer to the center. You sense the presence of -undead in larger numbers than you have ever encountered before. - -You remember the descriptions of %i, given to you by -%l. It is ahead that you will find %ns trail. -%E [You have found %i. The trail to %n lies ahead.] -%Cp Pri 00036 -Again, you stand before %i. -%E -%Cc Pri 00040 -The stench of brimstone is all about you, and the shrieks and moans -of tortured souls assault your psyche. - -Ahead, there is a small clearing amidst the bubbling pits of lava... -%E [The stench of brimstone surrounds you, the shrieks and moans are endless.] -%Cp Pri 00041 -Again, you have invaded %ns domain. -%E -%Cc Pri 00050 -"Ah, so %l has sent another %gC to retrieve -%o. - -"No, I see you are no %gC. Perhaps I shall have some fun today -after all. Prepare to die, %r! You shall never regain -%o." -%E [%lC has sent you, but you are no %gC. I shall destroy you.] -%Cp Pri 00051 -"So, %r. Again you challenge me." -%E -%Cp Pri 00052 -"Die now, %r. %d has no power here to aid you." -%E -%Cp Pri 00053 -"You shall die, %r, and I will have %o back." -%E -%Cp Pri 00060 -"Submit to my will, %c, and I shall spare you." -%E -%Cp Pri 00061 -"Your puny powers are no match for me, %c." -%E -%Cp Pri 00062 -"I shall have you turned into a zombie for my pleasure!" -%E -%Cp Pri 00063 -"Despair now, %r. %d cannot help you." -%E -%Cp Pri 00064 -"I shall feast upon your soul for many days, %c." -%E -%Cp Pri 00065 -"Your death will be slow and painful. That I promise!" -%E -%Cp Pri 00066 -"You cannot defeat %n, you fool. I shall kill you now." -%E -%Cp Pri 00067 -"Your precious %lt will be my next victim." -%E -%Cp Pri 00068 -"I feel your powers failing you, %r. You shall die now." -%E -%Cp Pri 00069 -"With %o, nothing can stand in my way." -%E -%Cc Pri 00070 -As you pick up %o, you feel the essence of -%d fill your soul. You know now why %n stole it from -%H, for with it, %ca of %d could -easily defeat his plans. - -You sense a message from %d. Though not verbal, you -get the impression that you must return to %l as soon -as possible. -%E [You feel %d as you pick up %o; return %oh to %l.] -%Cc Pri 00080 -You feel a wrenching shift in the ether as %ns body dissolves -into a cloud of noxious gas. - -Suddenly, a voice booms out: - - "Thou hast defeated the least of my minions, %r. - Know now that Moloch is aware of thy presence. - As for thee, %n, I shall deal with thy failure - at my leisure." - -You then hear the voice of %n, screaming in terror... -%E [%nC dies. Moloch is aware of you and angry at %n.] -%Cc Pri 00081 -"You have returned, %p. And with %o, I see. -Congratulations. - -"I have been in meditation, and have received direction from -a minion of %d. %d commands that you retain -%o. With it, you must recover the Amulet -of Yendor. - -"Go forth, and let %d guide your steps." -%E [Congratulations, %p. Keep %o; go and recover the Amulet.] -%Cc Pri 00082 -%lC reiterates that %o is yours now. - -"The time has come to resume your search for the Amulet. -%Z await your return through the magic portal -that brought you here." -%E [%oC is yours now. Return to %Z and find the Amulet.] -%Cp Pri 00090 -"Welcome back, %p. How is your quest for the Amulet going?" -%E -%Cc Pri 00091 -"You have prevailed, %p! %d is surely with you. Now, -you must take the amulet, and sacrifice it on %ds altar on -the Astral Plane. I suspect that I shall never see you again in this -life, but I hope to at %ds feet." -%E [Take the Amulet to the Astral Plane and offer it on %ds altar.] -# -# Ranger -# -# [Ran 00001: what if centaurs have been genocided?] -%Cc Ran 00001 -You arrive in familiar surroundings. In the distance, you %x the -ancient forest grove, the place of worship to %d. - -Something is wrong, though. Surrounding the grove are centaurs! -And they've noticed you! -%E [The ancient forest grove is surrounded by centaurs.] -%Cp Ran 00002 -Once again, you stand before %H. -%E -%Cp Ran 00003 -You have the oddest feeling that this may be the last time you -are to enter %H. -%E -%Cp Ran 00005 -"%pC! I have not seen you in many moons. How do you fare?" -%E -%Cp Ran 00006 -"%nC continues to threaten the grove. But we hold fast." -%E -%Cp Ran 00007 -"%lC is growing weak. The magic required to defend the grove drains us." -%E -%Cp Ran 00008 -"Remember %i is hard to enter. Beware the -distraction of leatherwings." -%E -%Cp Ran 00009 -"We must regain %o. Without it we will be overrun." -%E -%Cp Ran 00010 -"%pC! I have not seen you in many moons. How do you fare?" -%E -%Cp Ran 00011 -"Birdsong has returned to the grove, surely this means you have defeated %n." -%E -%Cp Ran 00012 -"%lC seems to have regained some of his strength." -%E -%Cp Ran 00013 -"So, tell us how you entered %i, in case some new evil arises there." -%E -%Cp Ran 00014 -"Is that truly %o that I see you carrying?" -%E -%Cc Ran 00015 -"%pC! You have returned! Thank %d. - -"We have great need of you. But first, I must see if you have the -required abilities to take on this responsibility." -%E [You have returned, %p. We need your help. Are you ready?] -%Cp Ran 00016 -"Once again, %p, you stand in our midst. Are you ready now?" -%E -%Cp Ran 00017 -"Ah, you are here again, %p. Allow me to determine your readiness..." -%E -%Cc Ran 00018 -"%pC! You have doomed us all. You fairly radiate %L influences -and weaken the power we have raised in this grove as a result! - -"Begone! We renounce your %shood with us! You are an outcast now!" -%E [You are not sufficiently %a. We renounce your %shood.] -%Cc Ran 00019 -"%p, you are yet too inexperienced to withstand the demands of that -which we need you to do. %RA might just be able to do this thing. - -"Return to us when you have learned more, my %S." -%E [You are too inexperienced. Come back when you are %Ra.] -%Cc Ran 00020 -"You have strayed, %p! You know that %d requires that -we maintain a pure devotion to things %a! - -"You must go from us. Return when you have purified yourself." -%E [You are not sufficiently %a. Come back when you have purified yourself.] -%Cc Ran 00021 -"You are indeed ready, %p. I shall tell you what has transpired, -and why we so desperately need your help: - -"A short time ago, the mountain centaurs to the east invaded -and enslaved the plains centaurs in this area. The local -leader is now only a figurehead, and serves %n. - -"During our last gathering of worship here, we were beset by hordes of -hostile centaurs, as you witnessed. In the first onslaught a group, -headed by %n %niself, managed to breach the grove and steal -%o. - -"Since then, we have been besieged. We do not know how much longer -we will be able to maintain our magical barriers. - -"If we are to survive, you, %p, must infiltrate -%i. There, you will find a pathway down, to the -underground cavern of %n. He has always coveted -%o, and will surely keep it. - -"Recover %o for us, %p! Only then will %d be safe." -%E [%nC has stolen %o. Infiltrate %i and retrieve %oh for us.] -%Cp Ran 00025 -"It is rumored that the Forest and Mountain Centaurs have resolved -their ancient feud and now band together against us." -%E -%Cp Ran 00026 -"%nC is strong, and very smart." -%E -%Cp Ran 00027 -"Use %o, when you find it. It will help you survive -to reach us." -%E -%Cp Ran 00028 -"Remember, let %d be your guide." -%E -%Cp Ran 00029 -"Call upon %d when you face %n. -The very act of doing so will infuriate him, and give you advantage." -%E -%Cp Ran 00030 -"%n and his kind have always hated us." -%E -%Cp Ran 00031 -"We cannot hold the grove much longer, %p. Hurry!" -%E -%Cp Ran 00032 -"To infiltrate %i, you must be very stealthy." -%E -%Cp Ran 00033 -"Remember that %n is a braggart. Trust not what he says." -%E -%Cp Ran 00034 -"You can triumph, %p, if you trust in %d." -%E -%Cc Ran 00035 -This must be %i. - -You are in a cave built of many different rooms, all interconnected -by tunnels. Your quest is to find and shoot the evil wumpus that -resides elsewhere in the cave without running into any bottomless -pits or using up your limited supply of arrows. Good luck. - -You are in room 9 of the cave. There are tunnels to rooms -5, 8, and 10. -*rustle* *rustle* (must be bats nearby.) -*sniff* (I can smell the evil wumpus nearby!) -%E [This is %i. There are bats nearby. Beware the wumpus!] -%Cc Ran 00036 -Once again, you descend into %i. - -*whoosh* (I feel a draft from some pits.) -*rustle* *rustle* (must be bats nearby.) -%E [You are in %i. There are pits. There are bats nearby.] -# [Ran 00040: 'hear a sound' but hero might be deaf.] -%Cc Ran 00040 -You descend into a weird place, in which roughly cut cave-like walls -join with smooth, finished ones, as if someone was in the midst of -finishing off the construction of a subterranean complex. - -Off in the distance, you hear a sound like the clattering of many -hooves on rock. -%E [You descend into a subterranean complex. Hooves clatter in the distance.] -%Cp Ran 00041 -Once again, you enter the distorted castle of %n. -%E -%Cc Ran 00050 -"So, %c. %lC has sent you to recover %o. - -"Well, I shall keep that bauble. It pleases me. You, %c, shall die." -%E [You have come to recover %o, but I shall keep %oh and you shall die.] -%Cp Ran 00051 -"Back again, eh? Well, a mere %r is no threat to me! Die, %c!" -%E -%Cp Ran 00052 -"You haven't learned your lesson, %c. You can't kill me! You shall die now." -%E -%Cp Ran 00053 -"I shall have %o from you, %r. Then I shall -kill you." -%E -%Cp Ran 00060 -"Your %d is nothing, %c. You are mine now!" -%E -%Cp Ran 00061 -"Run away little %c! You can never hope to defeat %n!" -%E -%Cp Ran 00062 -"My servants will rip you to shreds!" -%E -%Cp Ran 00063 -"I shall display your head as a trophy. What do you think about that wall?" -%E -%Cp Ran 00064 -"I shall break your %ls grove, and destroy all the %gP!" -%E -%Cp Ran 00065 -"%d has abandoned you, %c. You are doomed." -%E -%Cp Ran 00066 -"%rA? %lC sends a mere %r against me? Hah!" -%E -%Cp Ran 00067 -"%lC has failed, %c. %oC will never leave here." -%E -%Cp Ran 00068 -"You really think you can defeat me, eh %c? You are wrong!" -%E -%Cp Ran 00069 -"You weaken, %c. I shall kill you now." -%E -%Cc Ran 00070 -As you pick up %o, it seems to glow, and a warmth -fills you completely. You realize that its power is what has protected -your %sp against their enemies for so long. - -You must now return it to %l without delay -- their lives depend -on your speed. -%E [You pick up %o and feel power. It's time to return %oh to %l.] -%Cc Ran 00080 -%nC collapses to the ground, cursing you and %l, then says: - - "You have defeated me, %r! But I curse you one final time, with - my dying breath! You shall die before you leave my castle!" -%E [%nC curses you as %nh dies.] -%Cc Ran 00081 -"%pC! You have succeeded! I feared it was not possible! - -"You have returned with %o! - -"I fear, now, that the Centaurs will regroup and plot yet another raid. -This will take some time, but if you can recover the Amulet of Yendor -for %d before that happens, we will be eternally safe. - -"Take %o with you. It will aid in your quest for -the Amulet." -%E [You have succeeded. Take %o with you as you go to find the Amulet.] -# assumes The Longbow of Diana -%Cc Ran 00082 -%l flexes %o reverently. - -"With this wondrous bow, one need never run out of arrows. -You are its keeper now, and the time has come to resume your -search for the Amulet. %Z await your return -through the magic portal that brought you here." -%E [You are the keeper of %o now. Go and find the Amulet.] -%Cp Ran 00090 -"Welcome, %p. How have you fared on your quest for the Amulet -of Yendor?" -%E -%Cc Ran 00091 -"You have it! You have recovered the Amulet of Yendor! -Now attend to me, %p, and I will tell you what must be done: - -"The Amulet has within it magic, the capability to transport you to -the Astral Plane, where the primary circle of %d resides. - -"To activate this magic, you must travel upwards as far as you can. -When you reach the temple, sacrifice the Amulet to %d. - -"Thus will you fulfill your destiny." -%E [You have the Amulet! Take it to the Astral Plane and offer it to %d.] -# -# Rogue (with apologies to all Norsk speakers -dean) -# -%Cc Rog 00001 -Unexpectedly, you find yourself back in Ransmannsby, where you trained to -be a thief. Quickly you make the guild sign, hoping that you AND word -of your arrival reach %ls den. -%E [You are in Ransmannsby, where you trained. Find %l.] -%Cp Rog 00002 -Once again, you find yourself back in Ransmannsby. Fond memories are -replaced by fear, knowing that %l is waiting for you. -%E -%Cp Rog 00003 -You rub your hands through your hair, hoping that the little ones on -the back of your neck stay down, and prepare yourself for your meeting -with %l. -%E -%Cp Rog 00005 -"I hear that Lady Tyvefelle's household is lightly guarded." -%E -%Cp Rog 00006 -"You're back? Even the Twain don't come back anymore." -%E -%Cp Rog 00007 -"Can you spare an old cutpurse a zorkmid for some grog?" -%E -%Cp Rog 00008 -"Fritz tried to join the other side, and now he's hell-hound chow." -%E -%Cp Rog 00009 -"Be careful what you steal, I hear the boss has perfected turning -rocks into worthless pieces of glass." -%E -%Cp Rog 00010 -"I was sure wrong about Lady Tyvefelle's house; I barely got away with my -life and lost my lock pick in the process." -%E -%Cp Rog 00011 -"You're back? Even the Twain don't come back anymore." -%E -%Cp Rog 00012 -"Can you spare an old cutpurse a zorkmid for some grog?" -%E -%Cp Rog 00013 -"Fritz tried to join the other side, and now he's hell-hound chow." -%E -%Cp Rog 00014 -"Be careful what you steal, I hear the boss has perfected turning -rocks into worthless pieces of glass." -%E -%Cc Rog 00015 -"Well, look who it is boys -- %p has come home. You seem to have -fallen behind in your dues. I should kill you as an example to these -other worthless cutpurses, but I have a better plan. If you are ready -maybe you could work off your back dues by performing a little job for -me. Let us just see if you are ready..." -%E [You owe back dues to your guild. You can pay them off if you're up to the job.] -%Cc Rog 00016 -"Well, I didn't expect to see you back. It shows that you are either stupid, -or you are finally ready to accept my offer. Let us hope for your sake it -isn't stupidity that brings you back." -%E [Are you stupid or are you ready?] -%Cp Rog 00017 -"Did you perhaps mistake me for some other %lt? You must -think me as stupid as your behavior. I warn you not to try my patience." -%E -%Cc Rog 00018 -"Well %gp, it looks like our friend has forgotten who is the boss -around here. Our friend seems to think that %rp have been put in -charge. Wrong. DEAD WRONG!" - -Your sudden shift in surroundings prevents you from hearing the end -of %ls curse. -%E [You must go.] -%Cc Rog 00019 -"In the time that you've been gone you've only been able to master the -arts of %ra? I've trained ten times again as many %Rp -in that time. Maybe I should send one of them, no? Where would that -leave you, %p? Oh yeah, I remember, I was going to kill you!" -%E [%rA is not adequately trained to handle this job.] -%Cc Rog 00020 -"Maybe I should chain you to my perch here for a while. Perhaps watching -real %a men at work will bring some sense back to you. I don't -think I could stand the sight of you for that long though. Come back -when you can be trusted to act properly." -%E [Come back when you are really %a.] -%Cc Rog 00021 -"Will everyone not going to retrieve %o from that -jerk, %n, take one step backwards. Good choice, -%p, because I was going to send you anyway. My other %gp -are too valuable to me. - -"Here's the deal. I want %o, %n -has %o. You are going to get %o -and bring it back to me. So simple an assignment even you can understand -it." -%E [Get %o from %n and bring it to %l.] -%Cp Rog 00025 -"You don't seem to understand, -%o isn't here so neither should you be!" -%E -%Cp Rog 00026 -"May %d curse you with lead fingers. Get going!" -%E -%Cp Rog 00027 -"We don't have all year. GET GOING!" -%E -%Cp Rog 00028 -"How would you like a scar necklace? I'm just the jeweler to do it!" -%E -%Cp Rog 00029 -"Lazy S.O.B. Maybe I should call up someone else..." -%E -%Cp Rog 00030 -"Maybe I should open your skull and see if my instructions are inside?" -%E -%Cp Rog 00031 -"This is not a task you can complete in the afterlife, you know." -%E -%Cp Rog 00032 -"Inside every living person is a dead person trying to get out, -and I have your key!" -%E -%Cp Rog 00033 -"We're almost out of hell-hound chow, so why don't you just get moving!" -%E -%Cp Rog 00034 -"You know, %o isn't going to come when you whistle. You must get it yourself." -%E -%Cp Rog 00035 -Those damn little hairs tell you that you are nearer to %o. -%E -%Cp Rog 00036 -Not wanting to face %l without having stolen %o, you continue. -%E -%Cc Rog 00040 -You feel a great swelling up of courage, sensing the presence of -%o. Or is it fear? -%E [You sense %o.] -%Cp Rog 00041 -The hairs on the back of your neck whisper -- it's fear. -%E -%Cp Rog 00050 -"Ah! You must be %ls ... er, `hero'. A pleasure to meet you." -%E -%Cp Rog 00051 -"We meet again. Please reconsider your actions." -%E -%Cc Rog 00052 -"Surely, %p, you have learned that you cannot trust any bargains -that %l has made. I can show you how to continue on -your quest without having to run into him again." -%E [You cannot trust %l.] -%Cc Rog 00053 -"Please, think for a moment about what you are doing. Do you truly -believe that %d would want %l to have -%o?" -%E [%lC should not have %o.] -%Cp Rog 00060 -"May I suggest a compromise. Are you interested in gold or gems?" -%E -%Cp Rog 00061 -"Please don't force me to kill you." -%E -%Cp Rog 00062 -"Grim times are upon us all. Will you not see reason?" -%E -%Cp Rog 00063 -"I knew %l, and you're no %lt, thankfully." -%E -%Cp Rog 00064 -"It is a shame that we are not meeting under more pleasant circumstances." -%E -%Cp Rog 00065 -"I was once like you are now, %p. Believe in me -- our way is better." -%E -%Cp Rog 00066 -"Stay with me, and I will make you %os guardian." -%E -%Cp Rog 00067 -"When you return, with or without %o, -%l will have you killed." -%E -%Cp Rog 00068 -"Do not be fooled; I am prepared to kill to defend %o." -%E -%Cp Rog 00069 -"I can reunite you with the Twain. Oh, the stories you can swap." -%E -%Cc Rog 00070 -As you pick up %o, the hairs on the back of your -neck fall out. At once you realize why %n was -willing to die to keep it out of %ls hands. Somehow -you know that you must do likewise. -%E [You pick up %o and know that %l should not have it.] -%Cc Rog 00080 -"I know what you are thinking, %p. It is not too late for you -to use %o wisely. For the sake of your guild -%sp, do what is right." - -You sit and wait for death to come for %n, and then you -brace yourself for your next meeting with %l! -%E [Before dying, %n tells you to use the %o wisely.] -%Cc Rog 00081 -"Well, I'll be damned. You got it. I am proud of you, a fine %r -you've turned out to be. - -"While you were gone I got to thinking, you and %o -together could bring me more treasure than either of you apart, so why don't -you take it with you. All I ask is a cut of whatever loot you come by. -That is a better deal than I offered %n. - -"But, you see what happened to %n when he refused. -Don't make me find another to send after you this time." -%E [Take %o with you and go.] -# assumes Master Key of Thievery (small object) -%Cc Rog 00082 -%lC seems tempted to swap %o for -the mundane one you detect in his pocket, but noticing your alertness, -evidently chickens out. - -"Go filch the Amulet before someone else beats you to it. -%Z are back the way you came, through the magic portal." -%E [Take %o and acquire the Amulet.] -%Cc Rog 00090 -"Quite the little thief, aren't we, %p. Can I interest you in a -swap for %o? Look around, anything in the keep -is yours for the asking." -%E [How about trading %o for something?] -%Cc Rog 00091 -"I see that with your abilities, and my brains, we could rule this world. - -"All that we would need to be all-powerful is for you to take that little -trinket you've got there up to the Astral Plane. From there, %d will -show you what to do with it. Once that's done, we will be invincible!" -%E [Take the Amulet to the Astral Plane and find %ds temple.] -# -# Samurai -# -%Cc Sam 00001 -Even before your senses adjust, you recognize the kami of -%H. - -You %x the standard of your teki, %n, flying above -the town. How could such a thing have happened? Why are ninja -wandering freely; where are the samurai of your daimyo, %l? - -You quickly say a prayer to Izanagi and Izanami and walk towards -town. -%E [The banner of %n flies above town. What has happened to %l?] -%Cp Sam 00002 -Once again, you are back at %H. -%E -%Cc Sam 00003 -You are back at %H. - -Instantly you sense a subtle change in your karma. You seem to know that -if you do not succeed in your quest, %n will have destroyed -the kami of %H before you return again. -%E [%HC is threatened by %n.] -%Cp Sam 00005 -"To succeed, you must walk like a butterfly on the wind." -%E -%Cp Sam 00006 -"Ikaga desu ka?" -%E -%Cp Sam 00007 -"I fear for The Land of The Gods." -%E -%Cp Sam 00008 -"%nC has hired the Ninja -- be careful." -%E -%Cp Sam 00009 -"If %o is not returned, we will all be ronin." -%E -%Cp Sam 00010 -"Come, join us in celebrating with some sake." -%E -%Cp Sam 00011 -"Ikaga desu ka?" -%E -%Cp Sam 00012 -"You have brought our clan and %l much honor." -%E -%Cp Sam 00013 -"Please %r, sit for a while and tell us how you overcame the Ninja." -%E -%Cp Sam 00014 -"%lC still lives! You have saved us from becoming ronin." -%E -%Cc Sam 00015 -"Ah, %p-san, it is good to see you again. I need someone who can -lead my samurai against %n. If you are ready, you will be -that person." -%E [%lC needs someone to lead %lj samurai against %n. Are you ready?] -%Cp Sam 00016 -"Once again, %p-san, you kneel before me. Are you yet capable of -being my vassal?" -%E -# [Sam 00017: This summary is definitely a poor one.] -%Cc Sam 00017 -"You begin to test my matsu, %p-san. -If you cannot determine what I want in a samurai, how can I rely on you -to figure out what I need from a samurai?" -%E [Are you truely a samurai?] -%Cc Sam 00018 -"You are no longer my samurai, %p. - -"Hara-kiri is denied. You are ordered to shave your head and then to -become a monk. Your fief and family are forfeit. Wakarimasu ka?" -%E [Leave and do not come back.] -%Cc Sam 00019 -"%p-san, you have learned well and honored your family. -I require the skills of %Ra in order to defeat %n. -Go and seek out teachers. Learn what they have learned. When you -are ready, return to me." -%E ["I require %Ra to defeat %n. Return when you are ready."] -%Cc Sam 00020 -"%p-san, you would do better to join the kyokaku. - -"You have skills, but until you can call upon the bushido to know when and -how to use them you are not samurai. When you can think %a and -act %a then return." -%E [When you can think %a and act %a then return.] -%Cc Sam 00021 -"Domo %p-san, indeed you are ready. I can now tell you what -it is that I require of you. - -"The daimyo, %n, has betrayed us. He has stolen from us -%o and taken it to his donjon deep within -%i. - -"If I cannot show the emperor %o when he comes -for the festival he will know that I have failed in my duty, and -request that I commit seppuku. - -"You must gain entrance to %i and retrieve the -emperor's property. Be quick! The emperor will be here for the -cha-no-you in 5 sticks. - -"Wakarimasu ka?" -%E [You must enter %i, then regain %o from %n.] -%Cp Sam 00025 -"To defeat %n you must overcome the seven emotions: -hate, adoration, joy, anxiety, anger, grief, and fear." -%E -%Cp Sam 00026 -"Remember your honor is my honor, you perform in my name." -%E -%Cp Sam 00027 -"I will go to the temple and burn incense for your safe return." -%E -%Cp Sam 00028 -"Sayonara." -%E -%Cp Sam 00029 -"There can be honor in defeat, but no gain." -%E -%Cp Sam 00030 -"Your kami must be strong in order to succeed." -%E -%Cp Sam 00031 -"You are indeed a worthy %R, but now you must be a worthy samurai." -%E -%Cp Sam 00032 -"If you fail, %n will be like a tai-fun on the land." -%E -%Cp Sam 00033 -"If you are truly %a, %d will listen." -%E -%Cp Sam 00034 -"Sharpen your swords and your wits for the task before you." -%E -%Cp Sam 00035 -You instinctively reach for your swords. You do not recognize the -lay of this land, but you know that your teki are everywhere. -%E -%Cp Sam 00036 -Thankful that your %sp at %H cannot see -your fear, you prepare again to advance. -%E -%Cc Sam 00040 -In your mind, you hear the taunts of %n. - -You become like the rice plant and bend to the ground, offering a -prayer to %d. But when the wind has passed, you stand -proudly again. Putting your kami in the hands of fate, you advance. -%E [You feel the taunts %n, but after offering a prayer to %d, you proceed.] -%Cp Sam 00041 -As you arrive once again at the home of %n, your thoughts -turn only to %o. -%E -%Cp Sam 00042 -As you arrive once again at the home of %n. -%E -%Cp Sam 00050 -"Ah, so it is to be you, %p-san. I offer you seppuku. -I will be your second if you wish." -%E -%Cp Sam 00051 -"I have offered you the honorable exit. Now I will have your -head to send unwashed to %l." -%E -%Cp Sam 00052 -"After I have dispatched you, I will curse your kami." -%E -%Cp Sam 00053 -"You have fought my samurai; surely you must know that you -will not be able to take %o back to -%H." -%E -%Cp Sam 00060 -"Ahh, I finally meet the daimyo of the kyokaku!" -%E -%Cp Sam 00061 -"There is no honor for me in your death." -%E -%Cp Sam 00062 -"You know that I cannot resash my swords until they have killed." -%E -%Cp Sam 00063 -"Your presence only compounds the dishonor of %l in not coming %liself." -%E -%Cp Sam 00064 -"I will make tea with your hair and serve it to %l." -%E -%Cp Sam 00065 -"Your fear shows in your eyes, coward!" -%E -%Cp Sam 00066 -"I have not heard of you, %p-san; has your life been that unworthy?" -%E -%Cp Sam 00067 -"If you will not obey me, you will die." -%E -%Cp Sam 00068 -"Kneel now and make the two cuts of honor. I will tell your %sp -of your honorable death." -%E -%Cp Sam 00069 -"Your master was a poor teacher. You will pay for his mistakes in -your teaching." -%E -%Cc Sam 00070 -As you pick up %o, you feel the strength of its karma. -You realize at once why so many good samurai had to die to defend it. -You are humbled knowing that you hold one of the artifacts of the -sun goddess. -%E [You feel the power of %o and are humbled.] -%Cc Sam 00080 -Your healing skills tell you that %ns wounds are mortal. - -You know that the bushido tells you to finish him and let his kami -die with honor, but the thought of so many samurai dead due to this -man's dishonor prevents you from giving the final blow. - -You order that his unwashed head be given to the crows and his body -thrown into the sea. -%E [%nC dies without honor.] -%Cc Sam 00081 -As you bow before %l, he welcomes you: - - "You have brought your family great honor, %p-sama. - - "While you have been gone the emperor's advisors have discovered in - the ancient texts that the karma of the samurai who seeks to recover - the Amulet and the karma of %o are joined - as the seasons join to make a year. - - "Because you have shown such fidelity, the emperor requests - that you take leave of other obligations and continue on the - road that fate has set your feet upon. I would consider it - an honor if you would allow me to watch your household until - you return with the Amulet." - -With that, %l bows, and places his sword atop -%o. -%E [The emperor wants you to take %o and recover the Amulet.] -%Cc Sam 00082 -%l holds %o tightly for a moment, then returns -his gaze to you. - -"The time is ripe to recover the Amulet. Return to %Z -through the magic portal that transported you here so that you may -achieve the destiny which awaits you." -%E [Take %o, return to %Z, and recover the Amulet.] -%Cp Sam 00090 -%lC bows. "%p-sama, tell us of your search for the Amulet." -%E -# [Sam 00091: most other roles give more explicit directions for the -# feedback here, so this summary does that too.] -%Cc Sam 00091 -"Ah, %p-sama. You have wasted your efforts returning home. -Now that you are in possession of the Amulet, you are honor-bound to -finish the quest you have undertaken. There will be plenty of time -for saki and stories when you have finished. - -"Go now, and may our prayers be a wind at your back." -%E [Take the Amulet to the Astral Plane to finish your task.] -# -# Tourist -# -%Cc Tou 00001 -You breathe a sigh of relief as you find yourself back in the familiar -surroundings of %H. - -You quickly notice that things do not appear the way they did when you -left. The town is dark and quiet. There are no sounds coming from -behind the town walls, and no campfires burning in the fields. As a -matter of fact, you do not %x any movement in the fields at all, and -the crops seem as though they have been untended for many weeks. -%E [You find yourself back at %H, but the quiet is ominous.] -%Cp Tou 00002 -Once again, you are back at %H. -%E -%Cp Tou 00003 -You are back at %H. -Things appear to have become so bad that you fear that soon -%H will not be here to return to. -%E -%Cp Tou 00005 -"Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me." -%E -%Cp Tou 00006 -"Do you know where I could find some nice postcards of The Gnomish Mines?" -%E -%Cp Tou 00007 -"Have you tried the weird toilets?" -%E -%Cp Tou 00008 -"Don't stay at the Inn, I hear the food is terrible and it has rats." -%E -%Cp Tou 00009 -"They told me that this was the off season!" -%E -%Cp Tou 00010 -"Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me." -%E -%Cp Tou 00011 -"Do you know where I could find some nice postcards of The Gnomish Mines?" -%E -%Cp Tou 00012 -"Have you tried the weird toilets?" -%E -%Cp Tou 00013 -"If you stick around, I'll show you the pictures from my latest trip." -%E -%Cp Tou 00014 -"Did you bring me back any souvenirs?" -%E -%Cc Tou 00015 -"Is it really you, %p! I had given up hope for your return. -As you can %x, we are desperately in need of your talents. Someone must -defeat %n if our town is to become what it once was. - -"Let me see if you are ready to be that someone." -%E [Someone must defeat %n. Are your ready?] -%Cp Tou 00016 -"Things are getting worse, %p. I hope that this time you are ready." -%E -%Cp Tou 00017 -"I hope that for the sake of %H you have prepared yourself this time." -%E -%Cc Tou 00018 -"It is too late, %p. You are not even worthy to die amongst us. -Leave %H and never return." -%E [Leave %H and never return.] -%Cc Tou 00019 -"There is still too much that you have to learn before you can undertake -the next step. Return to us as a proven %R, and perhaps then -you will be ready. - -"Go back now, and may the teachings of %d serve you well." -%E [Return when you are %Ra.] -%Cc Tou 00020 -"It would be an affront to %d to have one not true to the -%a path undertake her bidding. - -"You must not return to us until you have purified yourself of these -bad influences on your actions. Remember, only by following the %a -path can you hope to overcome the obstacles you will face." -%E [You are not sufficiently %a. Return when you are.] -%Cc Tou 00021 -"You have indeed proven yourself a worthy %c, %p. - -"But now your kinfolk and I must ask you to put aside your travels and -help us in our time of need. After you left us we elected a new mayor, -%n. He proved to be a most heinous and vile creature. - -"Soon after taking office he absconded with %o -and fled town, leaving behind his henchmen to rule over us. In order -for us to regain control of our town, you must enter %i -and recover %o. - -"Do not be distracted on your quest. If you do not return quickly I fear -that all will be lost. Let us both pray now that %d will guide you -and keep you safe." -%E [Enter %i and recover %o from %n.] -%Cp Tou 00025 -"Do not be fooled by the false promises of %n." -%E -%Cp Tou 00026 -"To enter %i you must pass many traps." -%E -%Cp Tou 00027 -"If you do not return with %o, your quest -will be in vain." -%E -%Cp Tou 00028 -"Do not be afraid to call upon %d if you truly need help." -%E -%Cp Tou 00029 -"If you do not destroy %n, he will follow you back here!" -%E -%Cp Tou 00030 -"Take %o from %n -and you may be able to defeat him." -%E -%Cp Tou 00031 -"You must hurry, %p!" -%E -%Cp Tou 00032 -"You are like %Sa to me, %p. Do not let me down." -%E -%Cp Tou 00033 -"If you are %a at all times you may succeed, %p." -%E -%Cp Tou 00034 -"Let all who meet you on your journey know that you are on a quest for -%l and grant safe passage." -%E -%Cc Tou 00035 -Only your faith in %d keeps you from trembling. You %x -the handiwork of %ns henchlings everywhere. -%E [You %x the handiwork of %ns henchlings.] -%Cp Tou 00036 -You know that this time you must find and destroy %n. -%E -%Cp Tou 00040 -You sense the presence of %o. -%E -%Cp Tou 00041 -You gain confidence, knowing that you may soon be united with -%o. -%E -%Cp Tou 00042 -You have returned to %ns lair. -%E -%Cc Tou 00050 -"So, %p, %l thinks that you can wrest -%o from me! - -"It only proves how desperate he has become that he sends %ra to -try and defeat me. When this day is over, I will have you enslaved -in the mines where you will rue the day that you ever entered -%i." -%E [%rA will not defeat me.] -%Cp Tou 00051 -"I let you live the last time because it gave me pleasure. -This time I will destroy you, %p." -%E -%Cc Tou 00052 -"These meetings come to bore me. You disturb my workings with -%o. - -"If you do not run away now, I will inflict so much suffering on you that -%l will feel guilty for ever having sent his %S to me!" -%E [Run away or you will suffer severely.] -%Cc Tou 00053 -"You fool. You do not know how to call upon the powers of -%o. - -"Return it to me and I will teach you how to use it, and together we -will rule %H. But do so now, as my patience grows thin." -%E ["Return %o to me and we will rule %H."] -%Cp Tou 00060 -"I defeated %l and I will defeat you, %p." -%E -%Cp Tou 00061 -"Where is %d now! You must realize no one can help you here." -%E -%Cp Tou 00062 -"Beg for mercy now and I may be lenient on you." -%E -%Cp Tou 00063 -"If you were not so %a, you might have stood a chance." -%E -%Cp Tou 00064 -"Vengeance is mine at last, %p." -%E -%Cp Tou 00065 -"I only wish that %l had a more worthy %r to send against me." -%E -%Cp Tou 00066 -"With %o in my possession you cannot -hope to defeat me." -%E -%Cp Tou 00067 -"%nC has never been defeated, NEVER!" -%E -%Cp Tou 00068 -"Are you truly the best %H has to send against me? I pity %l." -%E -%Cp Tou 00069 -"How do you spell %p? I want to ensure the marker on your grave is -correct as a warning to your %sp." -%E -%Cc Tou 00070 -As you pick up %o, you feel a great -weight has been lifted from your shoulders. Your only thoughts are -to quickly return to %H and find %l. -%E [You pick up %o and feel relief. Return it to %l.] -%Cc Tou 00080 -You turn in the direction of %n. As his earthly body begins -to vanish before your eyes, you hear him curse: - - "You shall never be rid of me, %p! - I will find you where ever you go and regain what is rightly mine." -%E [%nC curses at you as %nh dies.] -%Cc Tou 00081 -As %l detects the presence of %o, -he almost smiles for the first time in many a full moon. - -As he looks up from %o he says: - - "You have recovered %o. You are its - owner now, but not its master. Let it work with you as you continue - your journey. With its help, and %d to guide you on the - %a path, you may yet recover the Amulet of Yendor." -%E [Take %o and with %ds guidance, recover the Amulet.] -%Cc Tou 00082 -"%oC is yours now. %Z -await your return through the magic portal that brought you here." -%E [Keep %o and return to %Z through the portal.] -%Cp Tou 00090 -"I could not be more proud than if you were my own %S, %p! -Tell me of your adventures in quest of the Amulet of Yendor." -%E -# [Tou 00091: like Sam 00091, the directions about what to do next are -# missing, so make the summary be a little bit more explicit.] -%Cc Tou 00091 -"Stand back and let me look at you, %p. -Now that you have recovered the Amulet of Yendor, I'm afraid living -out your days in %H would seem pretty tame. - -"You have come too far to stop now, for there are still more tasks that -our oral history foretells for you. Forever more, though, your name shall -be spoken by the %gP with awe. You are truly an inspiration to your -%sp!" -%E [You have the Amulet. Take it to the Astral Plane to finish your task.] -# -# Valkyrie -# -%Cc Val 00001 -You materialize at the base of a snowy hill. Atop the hill sits -a place you know well, %H. You immediately realize -that something here is very wrong! - -In places, the snow and ice have been melted into steaming pools of -water. Fumaroles and pools of bubbling lava surround the hill. -The stench of sulphur is carried through the air, and you %x creatures -that should not be able to live in this environment moving towards you. -%E [You arrive below %H. Something is wrong; there is lava present.] -%Cp Val 00002 -Once again, you are near the abode of %l. -%E -%Cp Val 00003 -Again you materialize near %ls abode. You have a nagging feeling -that this may be the last time you come here. -%E -%Cp Val 00005 -"Hail, and well met, brave %c." -%E -%Cp Val 00006 -"May %d guide your steps, %p." -%E -%Cp Val 00007 -"%lC weakens. Without %o, her foresight is dim." -%E -%Cp Val 00008 -"You must hurry, %p, else Ragnarok may well come." -%E -%Cp Val 00009 -"I would deal with this foul %n myself, but %d forbids it." -%E -%Cp Val 00010 -"Hail, and well met, brave %c." -%E -%Cp Val 00011 -"May %d guide your steps, %p." -%E -%Cp Val 00012 -"%lC told us you had succeeded!" -%E -%Cp Val 00013 -"You recovered %o just in time, %p." -%E -%Cp Val 00014 -"Hail %d, for delivering %o back to us." -%E -%Cc Val 00015 -"Ah, %p, my %S. You have returned to %H -at last. We are in dire need of your aid, but I must determine if you -are yet ready for such an undertaking. - -"Let me read your fate..." -%E [We need your aid. Are you ready?] -%Cp Val 00016 -"Let me read the future for you now, %p, perhaps you have managed to -change it enough..." -%E -%Cp Val 00017 -"Again, I shall read your fate, my %S. Let us both hope that you have -made changes to become ready for this task..." -%E -%Cc Val 00018 -"No, %p. Your fate is sealed. I must cast about for another -champion. Begone from my presence, and never return. Know this, that -you shall never succeed in this life, and Valhalla is denied to you." -%E ["Begone from my presence and never return."] -%Cc Val 00019 -"I see you and %n fighting, %p. But you are not prepared and -shall die at %ns hand if you proceed. No. This will not do. -Go back out into the world, and grow more experienced at the ways of war. -Only when you have returned %Ra will you be able to defeat %n." -%E [Come back when you are %Ra.] -%Cc Val 00020 -"NO! This is terrible. I see you becoming an ally of %n, and -leading his armies in the final great battles. This must not come to -pass! You have strayed from the %a path. You must purge yourself, -and return here only when you have regained a state of purity." -%E [You have strayed from the %a path. Return after you purify yourself.] -%Cc Val 00021 -"It is not clear, %p, for my sight is limited without our relic. -But it is now likely that you can defeat %n, and recover -%o. - -"A short time ago, %n and his minions attacked this place. They -opened the huge volcanic vents you %x about the hill, and attacked. I knew -that this was to come to pass, and had asked %d for a group of %gP -to help defend this place. The few you %x here are the mightiest of -Valhalla's own, and are all that are left of one hundred %d sent. - -"Despite the great and glorious battle we fought, %n managed at -last to steal %o. This has upset the balance of the universe, -and unless %oh is returned into my care, %n may start Ragnarok. - -"You must find the entrance to %i. Travel downward -from there and you will find %ns lair. Defeat him and -return %o to me." -%E [Find %i; defeat %n; return with %o.] -%Cp Val 00025 -"Go with the blessings of %d." -%E -%Cp Val 00026 -"Call upon %d when you are in need." -%E -%Cp Val 00027 -"Use %o if you can. It will protect you." -%E -%Cp Val 00028 -"Magical cold is very effective against %n." -%E -%Cp Val 00029 -"To face %n, you will need to be immune to fire." -%E -%Cp Val 00030 -"May %d strengthen your sword-arm." -%E -%Cp Val 00031 -"Trust in %d. He will not desert you." -%E -%Cp Val 00032 -"It becomes more likely that Ragnarok will come with every passing moment. -You must hurry, %p." -%E -%Cp Val 00033 -"If %n can master %o, he will be powerful enough to -face %d far earlier than is fated. This must not be!" -%E -%Cp Val 00034 -"Remember your training, %p. You can succeed." -%E -%Cc Val 00035 -The ice and snow gives way to a valley floor. You %x ahead of you -a huge round hill surrounded by pools of lava. This then is the entrance -to %i. It looks like you're not going to get in without -a fight though. -%E [This is the entrance to %i.] -%Cp Val 00036 -Once again, you stand before the entrance to %i. -%E -%Cc Val 00040 -Through clouds of sulphurous gasses, you %x a rock palisade -surrounded with a moat of bubbling lava. You remember the description -from something that %l said. This is the lair of %n. -%E [This is the lair of %n.] -%Cp Val 00041 -Once again, you stand in sight of %ns lair. -%E -%Cc Val 00050 -"So! %lC has finally sent %ca to challenge me! - -"I thought that mastering %o would enable me to challenge -%d, but it has shown me that first I must kill you! So come, little -%s. Once I defeat you, I can at last begin the final battle with %d." -%E ["%oC has shown me that I must kill you."] -%Cp Val 00051 -"Again you challenge me, %r. Good. I will kill you now." -%E -%Cp Val 00052 -"Have you not learned yet? You cannot defeat %n!" -%E -%Cp Val 00053 -"I will kill you, %c, and wrest %o from your mangled hands." -%E -%Cp Val 00060 -"I am your death, %c." -%E -%Cp Val 00061 -"You cannot prevail, %r. I have foreseen your every move." -%E -%Cp Val 00062 -"With you out of the way, Valhalla will be mine for the taking." -%E -%Cp Val 00063 -"I killed scores of %ds best when I took %o. -Do you really think that one %c can stand against me?" -%E -%Cp Val 00064 -"Who bears the souls of %cP to Valhalla, %r?" -%E -%Cp Val 00065 -"No, %d cannot help you here." -%E -%Cp Val 00066 -"Some instrument of %d you are, %p. You are a weakling!" -%E -%Cp Val 00067 -"Never have I seen %ca so clumsy in battle." -%E -%Cp Val 00068 -"You die now, little %s." -%E -%Cp Val 00069 -"Your body I destroy now, your soul when my hordes overrun Valhalla!" -%E -%Cc Val 00070 -As you pick up %o, your mind is suddenly filled with images, -and you perceive all of the possibilities of each potential choice you -could make. As you begin to control and channel your thoughts, you -realize that you must return %o to %l immediately. -%E [You must return %o to %l.] -%Cc Val 00080 -A look of surprise and horror appears on %ns face. - - "No!!! %o has lied to me! I have been misled!" - -Suddenly, %n grasps his head and screams in agony, then dies. -%E [%nC dies.] -%Cc Val 00081 -As you approach, %l rises and touches %o. - -"You may take %o with you, %p. I have removed from -it the power to foretell the future, for that power no mortal should -have. Its other abilities, however, you have at your disposal. - -"You must now begin in %ds name to search for the Amulet of Yendor. -May your steps be guided by %d, my %S." -%E [Take %o. Search for the Amulet.] -# assumes Orb of Fate (glass object) -%Cc Val 00082 -"Careful, %p! %oC might break, and that would be -a tragic loss. You are its keeper now, and the time has come to -resume your search for the Amulet. %Z await your -return through the magic portal that brought you here." -%E [You are %os keeper now. Return through the portal and find the Amulet.] -%Cp Val 00090 -"Greetings, %p. I have not been able to pay as much attention to -your search for the Amulet as I have wished. How do you fare?" -%E -%Cc Val 00091 -"Excellent, %p. I see you have recovered the Amulet! - -"You must take the Amulet to the Great Temple of %d, on the Astral -Plane. There you must offer the Amulet to %d. - -"Go now, my %S. I cannot tell you your fate, as the power of the -Amulet interferes with mine. I hope for your success." -%E [Take the Amulet to %ds temple on the Astral Plane and offer it.] -# -# Wizard -# -%Cc Wiz 00001 -You are suddenly in familiar surroundings. You notice what appears to -be a large, squat stone structure nearby. Wait! That looks like the -tower of your former teacher, %l. - -However, things are not the same as when you were last here. Mists and -areas of unexplained darkness surround the tower. There is movement in -the shadows. - -Your teacher would never allow such unaesthetic forms to surround the -tower... unless something were dreadfully wrong! -%E [You have arrived at %ls tower but something is very wrong.] -%Cp Wiz 00002 -Once again, you are back at %H. -%E -%Cp Wiz 00003 -You are back at %H. -You have an odd feeling this may be the last time you ever come here. -%E -%Cp Wiz 00005 -"Would you happen to have some eye of newt in that overstuffed pack, %s?" -%E -%Cp Wiz 00006 -"Ah, the spell to create the magic portal worked. Outstanding!" -%E -%Cp Wiz 00007 -"Hurry! %lC may not survive that casting of the portal spell!" -%E -%Cp Wiz 00008 -"The spells of %n were just too powerful for us to withstand." -%E -%Cp Wiz 00009 -"I, too, will venture into the world, because %n is but one of -many evils to be vanquished." -%E -%Cp Wiz 00010 -"I have some eye of newt to trade, do you have a spare blind-worm's sting?" -%E -%Cp Wiz 00011 -"The magic portal now seems like it will remain stable for quite some time." -%E -%Cp Wiz 00012 -"Have you noticed how much stronger %l is since %o was recovered?" -%E -%Cp Wiz 00013 -"Thank %d! We weren't positive you would defeat %n." -%E -%Cp Wiz 00014 -"I, too, will venture into the world, because %n was but one of -many evils to be vanquished." -%E -%Cc Wiz 00015 -"Come closer, %p, for my voice falters in my old age. -Yes, I see that you have come a long way since you went out into the -world, leaving the safe confines of this tower. However, I must first -determine if you have all of the skills required to take on the task -I require of you." -%E [You have come a long way, but are you ready for the task I require?] -%Cp Wiz 00016 -"Well, %p, you have returned. Perhaps you are now ready..." -%E -%Cp Wiz 00017 -"This is getting tedious, %p, but perseverance is a sign of a true mage. -I certainly hope that you are truly ready this time!" -%E -%Cc Wiz 00018 -"You fool, %p! Why did I waste all of those years teaching you -the esoteric arts? Get out of here! I shall find another." -%E ["Get out of here!"] -%Cc Wiz 00019 -"Alas, %p, you have not yet shown your proficiency as a worthy -spellcaster. As %ra, you would surely be overcome in the challenge -ahead. Go, now, expand your horizons, and return when you have attained -renown as %Ra." -%E [Go; return when you are %Ra.] -%Cc Wiz 00020 -"You amaze me, %p! How many times did I tell you that the way of a mage -is an exacting one. One must use the world with care, lest one leave it -in ruins and simplify the task of %n. - -"You must go back and show your worthiness. Do not return until you are -truly ready for this quest. May %d guide you in this task." -%E [Go; come back when you are worthy of %d.] -%Cc Wiz 00021 -"Yes, %p, you truly are ready for this dire task. Listen, -carefully, for what I tell you now will be of vital importance. - -"Since you left us to hone your skills in the world, we unexpectedly came -under attack by the forces of %n. As you know, we thought -%n had perished at the end of the last age, but, alas, this was -not the case. - -"%nC sent an army of abominations against us. Among them was a -minion, mindless and ensorcelled, and thus, in the confusion, it was -able to penetrate our defenses. Alas, this creature has stolen -%o and I fear has delivered %oh to %n. - -"Over the years, I had woven most of my power into this amulet, and thus, -without it, I have but a shadow of my former power, and I fear that I -shall soon perish. - -"You must travel to %i, and within its dungeons, -find and overcome %n, and return %o to me. - -"Go now, with %d, and complete this quest before it is too late." -%E [Travel to %i; overcome %n; return with %o.] -%Cp Wiz 00025 -"Beware, for %n is immune to most magical attacks." -%E -%Cp Wiz 00026 -"To enter %i you must pass many traps." -%E -%Cp Wiz 00027 -"%nC may be vulnerable to physical attacks." -%E -%Cp Wiz 00028 -"%d will come to your aid when you call." -%E -%Cp Wiz 00029 -"You must utterly destroy %n. He will pursue you otherwise." -%E -%Cp Wiz 00030 -"%oC is a mighty artifact. With it you can -destroy %n." -%E -%Cp Wiz 00031 -"Go forth with the blessings of %d." -%E -%Cp Wiz 00032 -"I will have my %gP watch for your return." -%E -%Cp Wiz 00033 -"Feel free to take any items in that chest that might aid you." -%E -%Cp Wiz 00034 -"You will know when %o is near. Proceed with care!" -%E -%Cp Wiz 00035 -Wisps of fog swirl nearby. You feel that %ns lair is close. -%E -%Cp Wiz 00036 -You believe that you may once again invade %i. -%E -%Cp Wiz 00040 -You feel your mentor's presence; perhaps %o is nearby. -%E -%Cp Wiz 00041 -The aura of %o tingles at the edge of your perception. -%E -%Cp Wiz 00042 -You have returned to %ns lair. -%E -%Cc Wiz 00050 -"Ah, I recognize you, %p. So, %l has sent you to steal -%o from me, hmmm? Well, %lh is a fool to send such -a mental weakling against me. - -"Your destruction, however, should make for good sport. In the end, you -shall beg me to kill you!" -%E ["Your destruction should make for good sport."] -%Cc Wiz 00051 -"How nice of you to return, %p! I enjoyed our last meeting. Are you -still hungry for more pain? - -"Come! Your soul, like %o, shall soon be mine to command." -%E ["Your soul shall soon be mine to command."] -%Cp Wiz 00052 -"I'm sure that your perseverance shall be the subject of innumerable -ballads, but you shall not be around to hear them, I fear!" -%E -%Cp Wiz 00053 -"Thief! %oC belongs to me, now. I shall feed -your living flesh to my minions." -%E -%Cp Wiz 00060 -"Your puny powers are no match for me, fool!" -%E -%Cp Wiz 00061 -"When you are defeated, your torment will last for a thousand years." -%E -%Cp Wiz 00062 -"After your downfall, %p, I shall devour %l for dessert!" -%E -%Cp Wiz 00063 -"Are you ready yet to beg for mercy? I could be lenient..." -%E -%Cp Wiz 00064 -"Your soul shall join the enslaved multitude I command!" -%E -%Cp Wiz 00065 -"Your lack of will is evident, and you shall die as a result." -%E -%Cp Wiz 00066 -"Your faith in %d is for naught! Come, submit to me now!" -%E -%Cp Wiz 00067 -"A mere %r is nothing compared to my skill!" -%E -%Cp Wiz 00068 -"So, you are the best hope of %l? How droll." -%E -%Cp Wiz 00069 -"Feel my power, %c! My victory is imminent!" -%E -%Cc Wiz 00070 -As you touch %o, its comforting power infuses you -with new energy. You feel as if you can detect others' thoughts flowing -through it. Although you yearn to wear %o and -attack the Wizard of Yendor, you know you must return it to its rightful -owner, %l. -%E [You feel %os power and know you should return %oh to %l.] -%Cc Wiz 00080 -%nC, whose body begins to shrivel up, croaks out: - - "I shall haunt your progress until the end of time. A thousand - curses on you and %l." - -Then, the body bursts into a cloud of choking dust, and blows away. -%E [%nC curses you as %nh dies.] -%Cc Wiz 00081 -%lC notices %o in your possession, -beams at you and says: - - "I knew you could defeat %n and retrieve - %o. We shall never forget this - brave service. - - "Take %oh with you in your quest for the Amulet of Yendor. - I can sense that it has attuned %oiself to you already. - - "May %d guide you in your quest, and keep you from harm." -%E [Take %o with you in your quest for the Amulet.] -%Cc Wiz 00082 -"You are the keeper of %o now. It is time to -recover the /other/ Amulet. %Z await your return through -the magic portal which brought you here." -%E [Keep %o, return through the portal to %Z; find the other Amulet.] -%Cp Wiz 00090 -"Come near, my %S, and share your adventures with me. -So, have you succeeded in your quest for the Amulet of Yendor?" -%E -%Cc Wiz 00091 -"Congratulations, %p. I always knew that if anyone could succeed -in defeating the Wizard of Yendor and his minions, it would be you. - -"Go now, and take the Amulet to the Astral Plane. Once there, present -the Amulet on the altar of %d. Along the way you shall pass through -the four Elemental Planes. These planes are like nothing you have ever -experienced before, so be prepared! - -"For this you were born, %s! I am very proud of you." -%E [Take the Amulet to %ds altar on the Astral Plane.] -# -# General -# -%Cc - 00001 -It is written in the Book of %d: - - After the Creation, the cruel god Moloch rebelled - against the authority of Marduk the Creator. - Moloch stole from Marduk the most powerful of all - the artifacts of the gods, the Amulet of Yendor, - and he hid it in the dark cavities of Gehennom, the - Under World, where he now lurks, and bides his time. - -Your %G %d seeks to possess the Amulet, and with it -to gain deserved ascendance over the other gods. - -You, a newly trained %r, have been heralded -from birth as the instrument of %d. You are destined -to recover the Amulet for your deity, or die in the -attempt. Your hour of destiny has come. For the sake -of us all: Go bravely with %d! -%E [%dC has chosen you to recover the Amulet of Yendor for %dI.] -%Cp - 00002 -You receive a faint telepathic message from %l: -Your help is urgently needed at %H! -Look for a ...ic transporter. -You couldn't quite make out that last message. -%E -%Cp - 00003 -You again sense %l pleading for help. -%E -%Cp - 00004 -You again sense %l demanding your attendance. -%E -# Completed the quest by returning with artifact, but not carrying -# the Bell of Opening; quest leader lets you know that it is needed. -#[ Should this be role-specific so that each leader has variant text? ] -%Cp - 00005 -"The silver bell which was hoarded by %n will be -essential in locating the Amulet of Yendor." -%E -# -# Angelic maledictions. -# -%Cp - 00010 -"Repent, and thou shalt be saved!" -%E -%Cp - 00011 -"Thou shalt pay for thine insolence!" -%E -%Cp - 00012 -"Very soon, my child, thou shalt meet thy maker." -%E -%Cp - 00013 -"The great %D has sent me to make you pay for your sins!" -%E -%Cp - 00014 -"The wrath of %D is now upon you!" -%E -%Cp - 00015 -"Thy life belongs to %D now!" -%E -%Cp - 00016 -"Dost thou wish to receive thy final blessing?" -%E -%Cp - 00017 -"Thou art but a godless void." -%E -%Cp - 00018 -"Thou art not worthy to seek the Amulet." -%E -%Cp - 00019 -"No one expects the Spanish Inquisition!" -%E -# -# Demonic maledictions. -# -%Cp - 00030 -"I first mistook thee for a statue, when I regarded thy head of stone." -%E -%Cp - 00031 -"Come here often?" -%E -%Cp - 00032 -"Doth pain excite thee? Wouldst thou prefer the whip?" -%E -%Cp - 00033 -"Thinkest thou it shall tickle as I rip out thy lungs?" -%E -%Cp - 00034 -"Eat slime and die!" -%E -%Cp - 00035 -"Go ahead, fetch thy mama! I shall wait." -%E -%Cp - 00036 -"Go play leapfrog with a herd of unicorns!" -%E -%Cp - 00037 -"Hast thou been drinking, or art thou always so clumsy?" -%E -%Cp - 00038 -"This time I shall let thee off with a spanking, but let it not happen again." -%E -%Cp - 00039 -"I've met smarter (and prettier) acid blobs." -%E -%Cp - 00040 -"Look! Thy bootlace is undone!" -%E -%Cp - 00041 -"Mercy! Dost thou wish me to die of laughter?" -%E -%Cp - 00042 -"Run away! Live to flee another day!" -%E -%Cp - 00043 -"Thou hadst best fight better than thou canst dress!" -%E -%Cp - 00044 -"Twixt thy cousin and thee, Medusa is the prettier." -%E -%Cp - 00045 -"Methinks thou wert unnaturally stirred by yon corpse back there, eh, varlet?" -%E -%Cp - 00046 -"Up thy nose with a rubber hose!" -%E -%Cp - 00047 -"Verily, thy corpse could not smell worse!" -%E -%Cp - 00048 -"Wait! I shall polymorph into a grid bug to give thee a fighting chance!" -%E -%Cp - 00049 -"Why search for the Amulet? Thou wouldst but lose it, cretin." -%E -# -# Banishment message (for converted hero) -# -%Cc - 00060 -"You have betrayed all those who hold allegiance to %d, as you once did. -My allegiance to %d holds fast and I cannot condone or accept what you -have done. - -Leave this place. You shall never set foot at %H again. -That which you seek is now lost forever, for without the Bell of Opening, -you will never be able to enter the place where he who has the Amulet -resides. - -Go now! You are banished from this place. -%E [You are banished from %H for betraying your allegiance to %d.] -# -# TEST PATTERN -# -%Cc - 00099 - %p: return(plname); - %c: return(pl_character); - %r: return((char *)rank_of(u.ulevel)); - %R: return((char *)rank_of(MIN_QUEST_LEVEL)); - %s: return((flags.female) ? "sister" : "brother" ); - %S: return((flags.female) ? "daughter" : "son" ); - %l: return((char *)ldrname()); - %i: return(intermed()); - %o: return(artiname()); - %O: return(shortened(artiname())); - %n: return((char *)neminame()); - %g: return((char *)guardname()); - %G: return((char *)align_gtitle(u.ualignbase[1])); - %H: return((char *)homebase()); - %a: return(Alignnam(u.ualignbase[1])); - %A: return(Alignnam(u.ualign.type)); - %d: return((char *)align_gname(u.ualignbase[1])); - %D: return((char *)align_gname(A_LAWFUL)); - %C: return("chaotic"); - %N: return("neutral"); - %L: return("lawful"); - %x: return((Blind) ? "sense" : "see"); - %Z: return("The Dungeons of Doom"); - %%: return(percent_sign); - a suffix: return an(root); - A suffix: return An(root); - C suffix: return capitalized(root); - h suffix: return pronoun(he_or_she, mon_of(root)); /* for %l,%n,%d,%o */ - H suffix: return capitalized(pronoun(he_or_she, mon_of(root))); - i suffix: return pronoun(him_or_her, mon_of(root)); - I suffix: return capitalized(pronoun(him_or_her, mon_of(root))); - j suffix: return pronoun(his_or_her, mon_of(root)); - J suffix: return capitalized(pronoun(his_or_her, mon_of(root))); - p suffix: return makeplural(root); - P suffix: return makeplural(capitalized(root)); - s suffix: return s_suffix(root); - S suffix: return s_suffix(capitalized(root)); - t suffix: return strip_the_prefix(root); -%E diff --git a/dat/rumors.fal b/dat/rumors.fal index ba01eb462..43895f568 100644 --- a/dat/rumors.fal +++ b/dat/rumors.fal @@ -22,12 +22,13 @@ A visit to the Zoo is very educational; you meet interesting animals. A wand of deaf is a more dangerous weapon than a wand of sheep. A wand of vibration might bring the whole cave crashing about your ears. A winner never quits. A quitter never wins. -A wish? Okay, make me a fortune cookie! +[cookie] A wish? Okay, make me a fortune cookie! Afraid of mimics? Try to wear a ring of true seeing. All monsters are created evil, but some are more evil than others. Always attack a floating eye from behind! An elven cloak is always the height of fashion. Any small object that is accidentally dropped will hide under a larger object. +Archeologists are very squishy, often found under boulders. Archeologists find more bones piles. Austin Powers says: My Mojo is back! Yeah, baby! Balrogs do not appear above level 20. @@ -60,6 +61,7 @@ Drinking potions of booze may land you in jail if you are under 21. Drop your vanity and get rid of your jewels! Pickpockets about! Eat 10 cloves of garlic and keep all humans at a two-square distance. Eels hide under mud. Use a unicorn to clear the water and make them visible. +Eels will help you tie your shoes. Elf has extra speed. Engrave your wishes with a wand of wishing. Eventually you will come to admire the swift elegance of a retreating nymph. @@ -75,11 +77,12 @@ For any remedy there is a misery. Giant bats turn into giant vampires. Good day for overcoming obstacles. Try a steeplechase. Half Moon tonight. (At least it's better than no Moon at all.) -Help! I'm being held prisoner in a fortune cookie factory! +[cookie] Help! I'm being held prisoner in a fortune cookie factory! Housecats have nine lives, kittens only one. How long can you tread water? Hungry? There is an abundance of food on the next level. I guess you've never hit a mail daemon with the Amulet of Yendor... +If there's a spot of blood on your hands, why not wash them? If you are the shopkeeper, you can take things for free. If you ask really nicely, the Wizard will give you the Amulet. If you can't learn to do it well, learn to enjoy doing it badly. @@ -125,7 +128,7 @@ Never teach your pet rust monster to fetch. Never trust a random generator in magic fields. Never use a wand of death. No level contains two shops. The maze is no level. So... -No part of this fortune may be reproduced, stored in a retrieval system, ... +[cookie] No part of this fortune may be reproduced, stored in a retrieval system, ... Not all rumors are as misleading as this one. Nymphs and nurses like beautiful rings. Nymphs are blondes. Are you a gentleman? @@ -154,7 +157,7 @@ Shopkeepers sometimes die from old age. Some mazes (especially small ones) have no solutions, says man 6 maze. Some questions the Sphynx asks just *don't* have any answers. Sometimes "mu" is the answer. -Sorry, no fortune this time. Better luck next cookie! +[cookie] Sorry, no fortune this time. Better luck next cookie! Spare your scrolls of make-edible until it's really necessary! Sticks and stones may break your bones but manes will never hurt you. Stormbringer doesn't steal souls. People steal souls. @@ -187,12 +190,12 @@ They say that a desperate shopper might pay any price in a shop. They say that a diamond dog is everybody's best friend. They say that a dwarf lord can carry a pick-axe because his armor is light. They say that a floating eye can defeat Medusa. -They say that a fortune only has 1 line and you can't read between it. -They say that a fortune only has 1 line, but you can read between it. +[cookie] They say that a fortune only has 1 line and you can't read between it. +[cookie] They say that a fortune only has 1 line, but you can read between it. They say that a fountain looks nothing like a regularly erupting geyser. They say that a gold doubloon is worth more than its weight in gold. They say that a grid bug won't pay a shopkeeper for zapping you in a shop. -They say that a gypsy could tell your fortune for a price. +[cookie] They say that a gypsy could tell your fortune for a price. They say that a hacker named Alice once level teleported by using a mirror. They say that a hacker named David once slew a giant with a sling and a rock. They say that a hacker named Dorothy once rode a fog cloud to Oz. @@ -247,7 +250,7 @@ They say that everyone knows why Medusa stands alone in the dark. They say that everyone wanted rec.games.hack to undergo a name change. They say that finding a winning strategy is a deliberate move on your part. They say that finding worthless glass is worth something. -They say that fortune cookies are food for thought. +[cookie] They say that fortune cookies are food for thought. They say that gold is only wasted on a pet dragon. They say that good things come to those that wait. They say that greased objects will slip out of monsters' hands. @@ -349,8 +352,8 @@ They say that you should never introduce a rope golem to a succubus. They say that you should never sleep near invisible ring wraiths. They say that you should never try to leave the dungeon with a bag of gems. They say that you should remove your armor before sitting on a throne. -This fortune cookie is copy protected. -This fortune cookie is the property of Fortune Cookies, Inc. +[cookie] This fortune cookie is copy protected. +[cookie] This fortune cookie is the property of Fortune Cookies, Inc. This release contains 10% recycled material. Time stands still as the succubus changes her calendar to January 1, 2000. Tired? Try a scroll of charging on yourself. @@ -365,30 +368,30 @@ Waltz, dumb nymph, for quick jigs vex. Want a hint? Zap a wand of make invisible on your weapon! Want to ascend in a hurry? Apply at Gizmonic Institute. Wanted: shopkeepers. Send a scroll of mail to Mage of Yendor/Level 35/Dungeon. -Warning: fortune reading can be hazardous to your health. +[cookie] Warning: fortune reading can be hazardous to your health. We have new ways of detecting treachery... Wet towels make great weapons! -What a pity, you cannot read it! +[cookie] What a pity, you cannot read it! Whatever can go wrong, will go wrong. When a piercer drops in on you, you will be tempted to hit the ceiling! When in a maze follow the right wall and you will never get lost. When you have a key, you don't have to wait for the guard. -Why are you wasting time reading fortunes? +[cookie] Why are you wasting time reading fortunes? Wish for a master key and open the Magic Memory Vault! Wizard expects every monster to do its duty. Wow! You could've had a potion of fruit juice! Yet Another Silly Message (YASM). -You are destined to be misled by a fortune. +[cookie] You are destined to be misled by a fortune. You can get a genuine Amulet of Yendor by doing the following: --More-- You can make holy water by boiling the hell out of it. You can protect yourself from black dragons by doing the following: --More-- You can't get by the snake. -You choke on the fortune cookie. --More-- +[cookie] You choke on the fortune cookie. --More-- You feel like someone is pulling your leg. You have to outwit the Sphynx or pay her. -You hear the fortune cookie's hissing! +[cookie] You hear the fortune cookie's hissing! You may get rich selling letters, but beware of being blackmailed! You offend Shai-Hulud by sheathing your crysknife without having drawn blood. -You swallowed the fortune! +[cookie] You swallowed the fortune! You want to regain strength? Two levels ahead is a guesthouse! You will encounter a tall, dark, and gruesome creature... diff --git a/dat/rumors.tru b/dat/rumors.tru index 464ee8c3a..432b220de 100644 --- a/dat/rumors.tru +++ b/dat/rumors.tru @@ -2,6 +2,7 @@ A blindfold can be very useful if you're telepathic. A candelabrum affixed with seven candles shows the way with a magical light. A cream pie has two uses: food... and entertainment. A crystal plate mail will not rust. +A dead body may protect your live body. But only an item can protect an item. A katana might slice a worm in two. A magic vomit pump could be useful for gourmands. A nymph knows how to unlock chains. @@ -29,7 +30,6 @@ Bandaging wounds helps keep up appearances. Bashing monsters with a bow is not such a good idea. Be careful! The Wizard may plan an ambush! Be nice to a nurse: Put away your weapon and take off your clothes. -Being digested is a painfully slow process. Blank scrolls make more interesting reading. Blind? Catch a floating eye! Booksellers never read scrolls; they might get carried away. @@ -45,6 +45,7 @@ Don't forget! Large dogs are MUCH harder to kill than little dogs. Don't lash out at people while blinded. Don't mess with shopkeepers, or you'll get the Guild after you. Dragons never whip their children; they wouldn't feel it! +Dwarves use their cloaks to keep their drinks cool. Eat your carrots. They're good for your eyes. Eating a freezing sphere is like eating a yeti. Eating a killer bee is like eating a scorpion. @@ -56,9 +57,10 @@ Elf corpses are incompatible with the sandman, and at times the gods as well. Elven cloaks cannot rust. Elves can help you feel less tired. Even evil players have a guardian angel. +Even the most powerful heroes sometimes need to quaff away their injuries. Ever fought with an enchanted tooth? Ever tried reading while confused? -Ever tried to put a troll into a large box? +Ever tried to lock a troll inside a large box? Ever wondered why one would want to dip something in a potion? Expensive cameras have penetrating flash lights. Extra staircases lead to extra levels. @@ -74,6 +76,7 @@ Got a question? Try rec.games.roguelike.nethack. Grave robbers sometimes get rich. Guy Montag keeps his scrolls in a bag. Handle your flasks carefully -- there might be a ghost inside! +Heavy-duty boots can protect more than just your feet. Holy water has many uses. Horses trust their riders, even when not so deserved. Hunger is a confusing experience for a dog! @@ -89,6 +92,8 @@ If you need a wand of digging, kindly ask the minotaur. If you want to hit, use a dagger. If you want to rob a shop, train your dog. If you're lost, try buying a map next time you're in a shop. +If your hands are greasy, why not wash them? +If your items get destroyed, you weren't wearing the right ring. Inside a shop you better take a look at the price tags before buying anything. It is bad manners to use a wand in a shop. It is dangerous to visit a graveyard at midnight. @@ -97,7 +102,7 @@ It is rumored that the Wizard has hired some help. It is the letter 'c' and not 'e' that changes status to statue. It might be a good idea to offer the unicorn a ruby. It would be peculiarly sad were your dog turned to stone. -It's a `d' eats `d' world. +It's a 'd' eats 'd' world. Just because it says READ ME doesn't mean you should. Keep your armors away from rust. Keep your weaponry away from acids. @@ -118,6 +123,7 @@ Nurses are trained to touch naked persons: they don't harm them. Nymphs can unlink more than your chain mail. Once your little dog will be a big dog, and you will be proud of it. Only female monsters can lay eggs. +Only the most confused adventurers would read cursed destroy armor scrolls. Opening a tin is difficult, especially when you attempt it bare handed! Orcs and killer bees share their lifestyle. Orcs do not procreate in dark rooms. @@ -147,18 +153,21 @@ Shopkeepers have incredible patience. Shopkeepers might raise their prices for tourists. Shopkeepers value money more than revenge. Some monsters can be tamed. I once saw a hacker with a tame dragon! +Some remain flexible, while others can't seem to change their tune. Someone once said that what goes up < might come down >. Someone's been spiking the pits! Sometimes monsters are more likely to fight each other than attack you. Spinach, carrot, and jelly -- a meal fit for a nurse! Surviving the full extent of the mines could mean that your luck is changing. Tainted meat is even more sickening than poison! +Take your healing potions to the next level! Telepathy is just a trick: once you know how to do it, it's easy. The Leprechaun Gold Tru$t is no division of the Magic Memory Vault. The Wizard finds death to be quite an experience. The best equipment for your work is, of course, the most expensive. The gods don't appreciate pesky priesthood. The gods will get angry if you kill your dog. +The less magic in your armor, the more you can add. The magic marker is mightier than the sword. The moon is not the only heavenly body to influence this game. The orc swings his orcish broadsword named Elfrist at you. You die... @@ -171,10 +180,10 @@ There is no harm in praising a large dog. There is nothing like eating a mimic. There once was a Knight named Lancelot who liked to ride with his lance a lot. They say a gelatinous cube can paralyze you... -They say that Juiblex is afraid of a wand of digging. +They say that Juiblex is somewhat afraid of a wand of digging. They say that Medusa would like to put you on a pedestal. -They say that Vlad lives!!! ... in the mazes. -They say that `Elbereth' is often written about. +They say that Vlad lives!!! ... near the mazes. +They say that 'Elbereth' is often written about. They say that a bag of holding can't hold everything. They say that a blessed tin of quasit meat is a quick meal. They say that a cat avoids traps. @@ -203,6 +212,7 @@ They say that a unicorn might bring you luck. They say that a wand of cancellation is like a wand of polymorph. They say that a wand of locking can close more than just doors. They say that a wand of polymorph can change your game. +They say that a wise choice of donations lets you choose your blessings. They say that a wizard is even more powerful the second time around. They say that a xorn knows of no obstacles when pursuing you. They say that abusing a credit card could shock you sooner or later. @@ -214,7 +224,6 @@ They say that antique dealers are always interested in precious stones. They say that bandaging one's wounds helps to keep up one's appearance. They say that booze can be diluted but not cancelled. They say that by listening carefully, you can hear a secret door! -They say that calculating your donations lets you choose your blessings. They say that carrots and carrot juice may improve your vision. They say that cave spiders are not considered expensive health food. They say that demigods must leave behind their prized earthly possessions. @@ -225,11 +234,12 @@ They say that dwarves lawfully mind their own business. They say that eating a bat corpse will make you batty, for a while. They say that eating a cram ration is a smart move. They say that eating blue jelly is cool if you don't fight the feeling. +They say that elven armor can hold the most magic. They say that escaping a dungeon is only the beginning of the end. They say that feeling an unexpected draft of air is sort of a breakthrough. They say that finding a cursed gray stone is always bad luck. They say that gaining a level is an experience that can raise your sights. -They say that garter snake meat rarely tastes good but it's still healthy. +They say that garter snake meat may not taste good but it's still healthy. They say that gauntlets of dexterity have a hidden enchanted touch. They say that going to heaven is just another way of escaping the dungeon. They say that golden nagas are law-abiding denizens as long as you are too. @@ -237,6 +247,7 @@ They say that gremlins can make you feel cooler than you are now. They say that grid bugs only exist in a strictly Cartesian sense. They say that hackers often feel jumpy about eating nymphs. They say that having polymorph control won't shock you. +They say that healing potions often come in pairs. They say that if it's hard getting your food down another bite could kill. They say that if you don't wear glasses why bother with carrots? They say that if you notice a loose board beneath you, don't step on it. @@ -269,6 +280,7 @@ They say that only chaotics can kill shopkeepers and get away with it. They say that only female monsters can lay eggs. They say that playing a horn really bad is really good. They say that prayer at an altar can sometimes make the water there holy. +They say that the right wand may help you chase a nymph. They say that rubbing a glowing potion does not make it a magic lamp. They say that scalpels become dull because they're not athames. They say that shopkeepers don't like pick-axes. @@ -278,6 +290,7 @@ They say that shopkeepers often have a large amount of money in their purses. They say that shopkeepers often remember things that you might forget. They say that sinks and armor don't mix, take your cloak off now! They say that sinks run hot and cold and many flavors in between. +They say that sitting on a vampire's throne is worth the danger. They say that snake charmers aren't charismatic, just musical. They say that soldiers are always prepared and usually protected. They say that some eggs could hatch in your pack, lucky or not. @@ -294,6 +307,7 @@ They say that teleport traps are the devil's work. They say that tengu don't wear rings, why should you? They say that tengu never steal gold although they would be good at it. They say that that which was stolen once can be stolen again, ask any nymph. +They say that the best way to fix your injuries is a potion. They say that the Delphic Oracle knows that lizard corpses aren't confusing. They say that the Hand of Elbereth can hold up your prayers. They say that the Leprechaun King is rich as Croesus. @@ -311,7 +325,9 @@ They say that the view from a fog cloud is really very moving. They say that the walls in shops are made of extra hard material. They say that there are at least 15 ways to lose a pair of levitation boots. They say that throwing glass gems is the same as throwing rocks. +They say that to block a shocking sphere, you need the right shield. They say that trespassing a boulder is probably beneath you. +They say that true power comes from within...except when it doesn't. They say that unicorns are fond of precious gems. They say that what goes down the drain might come back up. They say that wielded, a long sword named Fire Brand makes you feel cooler. @@ -321,6 +337,7 @@ They say that with a floating eye you could see in the dark. They say that you are lucky if you can get a unicorn to catch a ruby. They say that you are what you eat. They say that you can find named weapons at an altar if you're lucky. +They say that you can give potions of extra healing new energy. They say that you can safely touch cockatrice eggs but why bother? They say that you can't break an amulet of reflection. They say that you don't always get what you wish for. @@ -330,6 +347,7 @@ They say that you should pray for divine inspiration. They say that you should religiously give your gold away. They say that you will never get healthy by eating geckos. They say that zapping yourself with a wand of undead turning is stupid. +They say the Furies are more furious if you've been sinning. They say the Wizard's castle is booby-trapped! They say the gods get angry if you kill your dog. They say the gods get angry if you pray too much. @@ -347,6 +365,7 @@ Vampires hate garlic. Vault guards never disturb their Lords. Vegetarians enjoy lichen and seaweed. Visitors are requested not to apply genocide to shopkeepers. +Want to heal faster? Dip your potions of healing in a potion of speed! Watch out, the Wizard might come back. Water traps have no effect on dragons. What is a cockatrice going to eat when it gets hungry? @@ -357,6 +376,7 @@ Why would anybody in his sane mind engrave "Elbereth"? Wishing too much may bring you too little. You can't bribe soldier ants. You can't leave a shop through the back door: there isn't one! +You can't reflect explosions. But you might resist them. You may discover a fine spirit inside a potion bottle. You may want to dip into a potion of bottled blessings. You might be able to bribe a demon lord. @@ -365,5 +385,6 @@ You should certainly learn about quantum mechanics. You won't always get a second chance, even with life saving. You're going into the morgue at midnight??? Your dog knows what to eat; maybe you should take lessons. +Your game may go down the drain if you have extra potions or rings. Zap yourself and see what happens... Zapping a wand of undead turning might bring your dog back to life. diff --git a/dat/sanctum.lua b/dat/sanctum.lua new file mode 100644 index 000000000..fe5a85eb0 --- /dev/null +++ b/dat/sanctum.lua @@ -0,0 +1,133 @@ +-- NetHack gehennom sanctum.lua $NHDT-Date: 1652196034 2022/05/10 15:20:34 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "nommap") +-- This is outside the main map, below, so we must do it before adding +-- that map and anchoring coordinates to it. This extends the invisible +-- barrier up to the top row, which falls outside the drawn map. +des.non_passwall(selection.area(39,00,41,00)) +des.map([[ +---------------------------------------------------------------------------- +| -------------- | +| |............| ------- | +| -------............----- |.....| | +| |......................| --.....| --------- | +| ----......................---------|......---- |.......| | +| |........---------..........|......+.........| ------+---..| | +| ---........|.......|..........--S----|.........| |........|..| | +| |..........|.......|.............| |.........-------..---------- | +| |..........|.......|..........---- |..........|....|..|......| | +| |..........|.......|..........| --.......----+---S---S--..| | +| |..........---------..........| |.......|.............|..| | +| ---...........................| -----+-------S---------S--- | +| |...........................| |...| |......| |....|-- | +| ----.....................---- |...---....--- ---......| | +| |.....................| |..........| |.....---- | +| -------...........----- --...------- |.....| | +| |...........| |...| |.....| | +| ------------- ----- ------- | +---------------------------------------------------------------------------- +]]); +des.region({ region={15,07, 21,10}, lit=1, type="temple", filled=2, contents = function() + des.door({ wall = "random", state = "secret" }); +end }) +des.altar({ x=18, y=08, align="noalign", type="sanctum" }) +des.region({ region={41,06, 48,11}, lit=0, type="morgue", filled=1, irregular=1 }) +-- Non diggable walls +des.non_diggable(selection.area(00,00,75,19)) +-- Invisible barrier separating the left & right halves of the level +des.non_passwall(selection.area(37,00,39,19)) +-- Doors +des.door("closed",40,06) +des.door("locked",62,06) +des.door("closed",46,12) +des.door("closed",53,10) +-- Surround the temple with fire +des.trap("fire",13,05) +des.trap("fire",14,05) +des.trap("fire",15,05) +des.trap("fire",16,05) +des.trap("fire",17,05) +des.trap("fire",18,05) +des.trap("fire",19,05) +des.trap("fire",20,05) +des.trap("fire",21,05) +des.trap("fire",22,05) +des.trap("fire",23,05) +des.trap("fire",13,12) +des.trap("fire",14,12) +des.trap("fire",15,12) +des.trap("fire",16,12) +des.trap("fire",17,12) +des.trap("fire",18,12) +des.trap("fire",19,12) +des.trap("fire",20,12) +des.trap("fire",21,12) +des.trap("fire",22,12) +des.trap("fire",23,12) +des.trap("fire",13,06) +des.trap("fire",13,07) +des.trap("fire",13,08) +des.trap("fire",13,09) +des.trap("fire",13,10) +des.trap("fire",13,11) +des.trap("fire",23,06) +des.trap("fire",23,07) +des.trap("fire",23,08) +des.trap("fire",23,09) +des.trap("fire",23,10) +des.trap("fire",23,11) +-- Some traps. +des.trap("spiked pit") +des.trap("fire") +des.trap("sleep gas") +des.trap("anti magic") +des.trap("fire") +des.trap("magic") +-- Some random objects +des.object("[") +des.object("[") +des.object("[") +des.object("[") +des.object(")") +des.object(")") +des.object("*") +des.object("!") +des.object("!") +des.object("!") +des.object("!") +des.object("?") +des.object("?") +des.object("?") +des.object("?") +des.object("?") +-- Some monsters. +des.monster({ id = "horned devil", x=14,y=12,peaceful=0 }) +des.monster({ id = "barbed devil", x=18,y=08,peaceful=0 }) +des.monster({ id = "erinys", x=10,y=04,peaceful=0 }) +des.monster({ id = "marilith", x=07,y=09,peaceful=0 }) +des.monster({ id = "nalfeshnee", x=27,y=08,peaceful=0 }) +-- Moloch's horde +des.monster({ id = "aligned cleric", x=20,y=03,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=15,y=04,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=11,y=05,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=11,y=07,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=11,y=09,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=11,y=12,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=15,y=13,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=17,y=13,align="noalign",peaceful=0 }) +des.monster({ id = "aligned cleric", x=21,y=13,align="noalign",peaceful=0 }) +-- A few nasties +des.monster("L") +des.monster("L") +des.monster("V") +des.monster("V") +des.monster("V") +des.stair("up", 63,15) +-- Teleporting to this level is allowed after the invocation creates its +-- entrance. Force arrival in that case to be on rightmost third of level. +des.teleport_region({ region = {54,1,79,18}, region_islev=1, dir="down" }) diff --git a/dat/soko1-1.lua b/dat/soko1-1.lua new file mode 100644 index 000000000..ac9bcdf31 --- /dev/null +++ b/dat/soko1-1.lua @@ -0,0 +1,112 @@ +-- NetHack sokoban soko1-1.lua $NHDT-Date: 1652196034 2022/05/10 15:20:34 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.6 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); +des.map([[ +-------------------------- +|........................| +|.......|---------------.| +-------.------ |.| + |...........| |.| + |...........| |.| +--------.----- |.| +|............| |.| +|............| |.| +-----.-------- ------|.| + |..........| --|.....|.| + |..........| |.+.....|.| + |.........|- |-|.....|.| +-------.---- |.+.....+.| +|........| |-|.....|-- +|........| |.+.....| +|...|----- --|.....| +----- ------- +]]); + +place = selection.new(); +place:set(16,11); +place:set(16,13); +place:set(16,15); + +des.stair("down", 01, 01); +des.region(selection.area(00,00,25,17),"lit"); +des.non_diggable(selection.area(00,00,25,17)); +des.non_passwall(selection.area(00,00,25,17)); + +-- Boulders +des.object("boulder", 03, 05); +des.object("boulder", 05, 05); +des.object("boulder", 07, 05); +des.object("boulder", 09, 05); +des.object("boulder", 11, 05); +-- +des.object("boulder", 04, 07); +des.object("boulder", 04, 08); +des.object("boulder", 06, 07); +des.object("boulder", 09, 07); +des.object("boulder", 11, 07); +-- +des.object("boulder", 03, 12); +des.object("boulder", 04, 10); +des.object("boulder", 05, 12); +des.object("boulder", 06, 10); +des.object("boulder", 07, 11); +des.object("boulder", 08, 10); +des.object("boulder", 09, 12); +-- +des.object("boulder", 03, 14); + +-- prevent monster generation over the (filled) holes +des.exclusion({ type = "monster-generation", region = { 07,01, 23,01 } }); +-- Traps +des.trap("hole", 07, 01); +des.trap("rolling boulder", 08, 01); +des.trap("hole", 09, 01); +des.trap("hole", 10, 01); +des.trap("hole", 11, 01); +des.trap("hole", 12, 01); +des.trap("hole", 13, 01); +des.trap("hole", 14, 01); +des.trap("hole", 15, 01); +des.trap("hole", 16, 01); +des.trap("hole", 17, 01); +des.trap("hole", 18, 01); +des.trap("hole", 19, 01); +des.trap("hole", 20, 01); +des.trap("hole", 21, 01); +des.trap("hole", 22, 01); +des.trap("hole", 23, 01); + +des.monster({ id = "giant mimic", appear_as = "obj:boulder" }); +des.monster({ id = "giant mimic", appear_as = "obj:boulder" }); + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); + +-- Rewards +des.door("locked", 23, 13); +des.door("closed", 17, 11); +des.door("closed", 17, 13); +des.door("closed", 17, 15); + +des.region({ region={18,10, 22,16}, lit = 1, type = "zoo", filled = 1, irregular = 1 }); + +local pt = selection.rndcoord(place); +if percent(75) then + des.object({ id="bag of holding", coord=pt, + buc="not-cursed", achievement=1 }); +else + des.object({ id="amulet of reflection", coord=pt, + buc="not-cursed", achievement=1 }); +end +des.engraving({ coord = pt, type = "burn", text = "Elbereth" }); +des.object({ id = "scroll of scare monster", coord = pt, buc = "cursed" }); + diff --git a/dat/soko1-2.lua b/dat/soko1-2.lua new file mode 100644 index 000000000..36ab90721 --- /dev/null +++ b/dat/soko1-2.lua @@ -0,0 +1,113 @@ +-- NetHack sokoban soko1-2.lua $NHDT-Date: 1652196034 2022/05/10 15:20:34 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.6 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); + +des.map([[ + ------------------------ + |......................| + |..-------------------.| +----.| ----- |.| +|..|.-- --...| |.| +|.....|--|....| |.| +|.....|..|....| |.| +--....|......-- |.| + |.......|...| ------|.| + |....|..|...| --|.....|.| + |....|--|...| |.+.....|.| + |.......|..-- |-|.....|.| + ----....|.-- |.+.....+.| + ---.--.| |-|.....|-- + |.....| |.+.....| + |..|..| --|.....| + ------- ------- +]]); + +local place = selection.new(); +place:set(16,10); +place:set(16,12); +place:set(16,14); + +des.stair("down", 06,15); +des.region(selection.area(00,00,25,16),"lit"); +des.non_diggable(selection.area(00,00,25,16)); +des.non_passwall(selection.area(00,00,25,16)); + +-- Boulders +des.object("boulder",04,04); +des.object("boulder",02,06); +des.object("boulder",03,06); +des.object("boulder",04,07); +des.object("boulder",05,07); +des.object("boulder",02,08); +des.object("boulder",05,08); +des.object("boulder",03,09); +des.object("boulder",04,09); +des.object("boulder",03,10); +des.object("boulder",05,10); +des.object("boulder",06,12); +-- +des.object("boulder",07,14); +-- +des.object("boulder",11,05); +des.object("boulder",12,06); +des.object("boulder",10,07); +des.object("boulder",11,07); +des.object("boulder",10,08); +des.object("boulder",12,09); +des.object("boulder",11,10); + +-- prevent monster generation over the (filled) holes +des.exclusion({ type = "monster-generation", region = { 05,01, 23,01 } }); +-- Traps +des.trap("rolling boulder",05,01) +des.trap("hole",06,01) +des.trap("hole",07,01) +des.trap("hole",08,01) +des.trap("hole",09,01) +des.trap("hole",10,01) +des.trap("hole",11,01) +des.trap("hole",12,01) +des.trap("hole",13,01) +des.trap("hole",14,01) +des.trap("hole",15,01) +des.trap("hole",16,01) +des.trap("hole",17,01) +des.trap("hole",18,01) +des.trap("hole",19,01) +des.trap("hole",20,01) +des.trap("hole",21,01) +des.trap("hole",22,01) +des.trap("hole",23,01) + +des.monster({ id = "giant mimic", appear_as = "obj:boulder" }); +des.monster({ id = "giant mimic", appear_as = "obj:boulder" }); + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); + +-- Rewards +des.door("locked",23,12) +des.door("closed",17,10) +des.door("closed",17,12) +des.door("closed",17,14) +des.region({ region={18,09, 22,15}, lit = 1, type = "zoo", filled = 1, irregular = 1 }); + +local pt = selection.rndcoord(place); +if percent(25) then + des.object({ id="bag of holding", coord=pt, + buc="not-cursed", achievement=1 }); +else + des.object({ id="amulet of reflection", coord=pt, + buc="not-cursed", achievement=1 }); +end +des.engraving({ coord = pt, type = "burn", text = "Elbereth" }); +des.object({ id = "scroll of scare monster", coord = pt, buc = "cursed" }); diff --git a/dat/soko2-1.lua b/dat/soko2-1.lua new file mode 100644 index 000000000..e8b56efef --- /dev/null +++ b/dat/soko2-1.lua @@ -0,0 +1,70 @@ +-- NetHack sokoban soko2-1.lua $NHDT-Date: 1652196035 2022/05/10 15:20:35 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); + +des.map([[ +-------------------- +|........|...|.....| +|.....-..|.-.|.....| +|..|.....|...|.....| +|-.|..-..|.-.|.....| +|...--.......|.....| +|...|...-...-|.....| +|...|..|...--|.....| +|-..|..|----------+| +|..................| +|...|..|------------ +-------- +]]); +des.stair("down", 06,10); +des.stair("up", 16,04); +des.door("locked", 18,08); +des.region(selection.area(00,00, 19,11), "lit"); +des.non_diggable(selection.area(00,00,19,11)); +des.non_passwall(selection.area(00,00,19,11)); + +-- Boulders +des.object("boulder",02,02) +des.object("boulder",03,02) +-- +des.object("boulder",05,03) +des.object("boulder",07,03) +des.object("boulder",07,02) +des.object("boulder",08,02) +-- +des.object("boulder",10,03) +des.object("boulder",11,03) +-- +des.object("boulder",02,07) +des.object("boulder",02,08) +des.object("boulder",03,09) +-- +des.object("boulder",05,07) +des.object("boulder",06,06) + +-- prevent monster generation over the (filled) holes +des.exclusion({ type = "monster-generation", region = { 07,09, 18,09 } }); +-- Traps +des.trap("rolling boulder",07,09) +des.trap("hole",08,09) +des.trap("hole",09,09) +des.trap("hole",10,09) +des.trap("hole",11,09) +des.trap("hole",12,09) +des.trap("hole",13,09) +des.trap("hole",14,09) +des.trap("hole",15,09) +des.trap("hole",16,09) +des.trap("hole",17,09) + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); diff --git a/dat/soko2-2.lua b/dat/soko2-2.lua new file mode 100644 index 000000000..f11702c1e --- /dev/null +++ b/dat/soko2-2.lua @@ -0,0 +1,72 @@ +-- NetHack sokoban soko2-2.lua $NHDT-Date: 1652196035 2022/05/10 15:20:35 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); + +des.map([[ + -------- +--|.|....| +|........|---------- +|.-...-..|.|.......| +|...-......|.......| +|.-....|...|.......| +|....-.--.-|.......| +|..........|.......| +|.--...|...|.......--- +|....-.|---|.......+.| +--|....|------------.| + |................+.| + -------------------- +]]); +des.stair("down", 06,11) +des.stair("up", 15,06) +des.door("locked",19,09) +des.door("locked",19,11) +des.region(selection.area(00,00,21,12), "lit"); +des.non_diggable(selection.area(00,00,21,12)); +des.non_passwall(selection.area(00,00,21,12)); + +-- Boulders +des.object("boulder",04,02) +des.object("boulder",04,03) +des.object("boulder",05,03) +des.object("boulder",07,03) +des.object("boulder",08,03) +des.object("boulder",02,04) +des.object("boulder",03,04) +des.object("boulder",05,05) +des.object("boulder",06,06) +des.object("boulder",09,06) +des.object("boulder",03,07) +des.object("boulder",04,07) +des.object("boulder",07,07) +des.object("boulder",06,09) +des.object("boulder",05,10) +des.object("boulder",05,11) + +-- prevent monster generation over the (filled) holes +des.exclusion({ type = "monster-generation", region = { 06,11, 18,11 } }); +-- Traps +des.trap("rolling boulder",07,11) +des.trap("hole",08,11) +des.trap("hole",09,11) +des.trap("hole",10,11) +des.trap("hole",11,11) +des.trap("hole",12,11) +des.trap("hole",13,11) +des.trap("hole",14,11) +des.trap("hole",15,11) +des.trap("hole",16,11) +des.trap("hole",17,11) +des.trap("hole",18,11) + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); diff --git a/dat/soko3-1.lua b/dat/soko3-1.lua new file mode 100644 index 000000000..1c7715858 --- /dev/null +++ b/dat/soko3-1.lua @@ -0,0 +1,82 @@ +-- NetHack sokoban soko3-1.lua $NHDT-Date: 1652196035 2022/05/10 15:20:35 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); + +des.map([[ +----------- ----------- +|....|....|-- |.........| +|....|......| |.........| +|.........|-- |.........| +|....|....| |.........| +|-.--------- |.........| +|....|.....| |.........| +|....|.....| |.........| +|..........| |.........| +|....|.....|---------------+| +|....|......................| +----------------------------- +]]); +des.stair("down", 11,02) +des.stair("up", 23,04) +des.door("locked", 27,09) +des.region(selection.area(00,00,28,11), "lit") +des.non_diggable(selection.area(00,00,28,11)) +des.non_passwall(selection.area(00,00,28,11)) + +-- Boulders +des.object("boulder",03,02) +des.object("boulder",04,02) +-- +des.object("boulder",06,02) +des.object("boulder",06,03) +des.object("boulder",07,02) +-- +des.object("boulder",03,06) +des.object("boulder",02,07) +des.object("boulder",03,07) +des.object("boulder",03,08) +des.object("boulder",02,09) +des.object("boulder",03,09) +des.object("boulder",04,09) +-- +des.object("boulder",06,07) +des.object("boulder",06,09) +des.object("boulder",08,07) +des.object("boulder",08,10) +des.object("boulder",09,08) +des.object("boulder",09,09) +des.object("boulder",10,07) +des.object("boulder",10,10) + +-- prevent monster generation over the (filled) holes +des.exclusion({ type = "monster-generation", region = { 11,10, 27,10 } }); +-- Traps +des.trap("rolling boulder",11,10) +des.trap("hole",12,10) +des.trap("hole",13,10) +des.trap("hole",14,10) +des.trap("hole",15,10) +des.trap("hole",16,10) +des.trap("hole",17,10) +des.trap("hole",18,10) +des.trap("hole",19,10) +des.trap("hole",20,10) +des.trap("hole",21,10) +des.trap("hole",22,10) +des.trap("hole",23,10) +des.trap("hole",24,10) +des.trap("hole",25,10) +des.trap("hole",26,10) + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); + diff --git a/dat/soko3-2.lua b/dat/soko3-2.lua new file mode 100644 index 000000000..24236efe2 --- /dev/null +++ b/dat/soko3-2.lua @@ -0,0 +1,74 @@ +-- NetHack sokoban soko3-2.lua $NHDT-Date: 1652196036 2022/05/10 15:20:36 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); + +des.map([[ + ---- ----------- +-|..|------- |.........| +|..........| |.........| +|..-----.-.| |.........| +|..|...|...| |.........| +|.........-| |.........| +|.......|..| |.........| +|.----..--.| |.........| +|........|.-- |.........| +|.---.-.....------------+| +|...|...-................| +|.........---------------- +----|..|..| + ------- +]]); +des.stair("down", 03,01) +des.stair("up", 20,04) +des.door("locked",24,09) +des.region(selection.area(00,00,25,13), "lit") +des.non_diggable(selection.area(00,00,25,13)) +des.non_passwall(selection.area(00,00,25,13)) + +-- Boulders +des.object("boulder",02,03) +des.object("boulder",08,03) +des.object("boulder",09,04) +des.object("boulder",02,05) +des.object("boulder",04,05) +des.object("boulder",09,05) +des.object("boulder",02,06) +des.object("boulder",05,06) +des.object("boulder",06,07) +des.object("boulder",03,08) +des.object("boulder",07,08) +des.object("boulder",05,09) +des.object("boulder",10,09) +des.object("boulder",07,10) +des.object("boulder",10,10) +des.object("boulder",03,11) + +-- prevent monster generation over the (filled) holes +des.exclusion({ type = "monster-generation", region = { 11,10, 24,10 } }); +-- Traps +des.trap("rolling boulder",11,10) +des.trap("hole",12,10) +des.trap("hole",13,10) +des.trap("hole",14,10) +des.trap("hole",15,10) +des.trap("hole",16,10) +des.trap("hole",17,10) +des.trap("hole",18,10) +des.trap("hole",19,10) +des.trap("hole",20,10) +des.trap("hole",21,10) +des.trap("hole",22,10) +des.trap("hole",23,10) + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); + diff --git a/dat/soko4-1.lua b/dat/soko4-1.lua new file mode 100644 index 000000000..3768c1cf7 --- /dev/null +++ b/dat/soko4-1.lua @@ -0,0 +1,104 @@ +-- NetHack sokoban soko4-1.lua $NHDT-Date: 1652196036 2022/05/10 15:20:36 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- In case you haven't played the game Sokoban, you'll learn +-- quickly. This branch isn't particularly difficult, just time +-- consuming. Some players may wish to skip this branch. +-- +-- The following actions are currently permitted without penalty: +-- Carrying or throwing a boulder already in inventory +-- (player or nonplayer). +-- Teleporting boulders. +-- Digging in the floor. +-- The following actions are permitted, but with a luck penalty: +-- Breaking boulders. +-- Stone-to-fleshing boulders. +-- Creating new boulders (e.g., with a scroll of earth). +-- Jumping. +-- Being pulled by a thrown iron ball. +-- Hurtling through the air from Newton's 3rd law. +-- Squeezing past boulders when naked or as a giant. +-- These actions are not permitted: +-- Moving diagonally between two boulders and/or walls. +-- Pushing a boulder diagonally. +-- Picking up boulders (player or nonplayer). +-- Digging or walking through walls. +-- Teleporting within levels or between levels of this branch. +-- Using cursed potions of gain level. +-- Escaping a pit/hole (e.g., by flying, levitation, or +-- passing a dexterity check). +-- Bones files are not permitted. + + +--## Bottom (first) level of Sokoban ### +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "premapped", "sokoban", "solidify"); + +des.map([[ +------ ----- +|....| |...| +|....----...| +|...........| +|..|-|.|-|..| +---------|.--- +|......|.....| +|..----|.....| +--.| |.....| + |.|---|.....| + |...........| + |..|--------- + ---- +]]); +des.levregion({ region = {06,04,06,04}, type = "branch" }) +des.stair("up", 06,06) +des.region(selection.area(00,00,13,12), "lit") +des.non_diggable(selection.area(00,00,13,12)) +des.non_passwall(selection.area(00,00,13,12)) + +-- Boulders +des.object("boulder",02,02) +des.object("boulder",02,03) +-- +des.object("boulder",10,02) +des.object("boulder",09,03) +des.object("boulder",10,04) +-- +des.object("boulder",08,07) +des.object("boulder",09,08) +des.object("boulder",09,09) +des.object("boulder",08,10) +des.object("boulder",10,10) + +-- prevent monster generation over the (filled) pits +des.exclusion({ type = "monster-generation", region = { 01,06, 07,11 } }); + +-- Traps +des.trap("pit",04,06) + +des.trap("pit",02,06) +des.trap("pit",02,07) +des.trap("pit",02,08) +des.trap("rolling boulder",02,09) + +des.trap("pit",02,10) +des.trap("pit",03,10) +des.trap("pit",04,10) +des.trap("pit",05,10) +des.trap("pit",06,10) +des.trap("rolling boulder",07,10) + +-- A little help +des.object("scroll of earth",02,11) +des.object("scroll of earth",03,11) + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); + diff --git a/dat/soko4-2.lua b/dat/soko4-2.lua new file mode 100644 index 000000000..d0606dc6a --- /dev/null +++ b/dat/soko4-2.lua @@ -0,0 +1,74 @@ +-- NetHack sokoban soko4-2.lua $NHDT-Date: 1652196036 2022/05/10 15:20:36 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1998-1999 by Kevin Hugo +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "premapped", "sokoban", "solidify"); + +des.map([[ +-------- ------ +|.|....|-|....| +|.|-..........| +|.||....|.....| +|.||....|.....| +|.|-----|.----- +|.| |......| +|.-----|......| +|.............| +|..|---|......| +---- -------- +]]); +des.levregion({ region = {03,01,03,01}, type = "branch" }) +des.stair("up", 01,01) +des.region(selection.area(00,00,14,10),"lit") +des.non_diggable(selection.area(00,00,14,10)) +des.non_passwall(selection.area(00,00,14,10)) + +-- Boulders +des.object("boulder",05,02) +des.object("boulder",06,02) +des.object("boulder",06,03) +des.object("boulder",07,03) +-- +des.object("boulder",09,05) +des.object("boulder",10,03) +des.object("boulder",11,02) +des.object("boulder",12,03) +-- +des.object("boulder",07,08) +des.object("boulder",08,08) +des.object("boulder",09,08) +des.object("boulder",10,08) + +-- prevent monster generation over the (filled) pits +des.exclusion({ type = "monster-generation", region = { 01,01, 01,09 } }); +des.exclusion({ type = "monster-generation", region = { 01,08, 07,09 } }); +-- Traps +des.trap("pit",01,02) +des.trap("pit",01,03) +des.trap("pit",01,04) +des.trap("pit",01,05) +des.trap("pit",01,06) +des.trap("rolling boulder",01,07) + +des.trap("pit",01,08) +des.trap("pit",02,08) +des.trap("pit",03,08) +des.trap("pit",04,08) +des.trap("pit",05,08) +des.trap("rolling boulder",06,08) + +-- A little help +des.object("scroll of earth",01,09) +des.object("scroll of earth",02,09) + +-- Random objects +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "%" }); +des.object({ class = "=" }); +des.object({ class = "/" }); + + diff --git a/dat/sokoban.des b/dat/sokoban.des deleted file mode 100644 index c4983451d..000000000 --- a/dat/sokoban.des +++ /dev/null @@ -1,637 +0,0 @@ -# NetHack 3.6 sokoban.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ -# Copyright (c) 1998-1999 by Kevin Hugo -# NetHack may be freely redistributed. See license for details. -# -# In case you haven't played the game Sokoban, you'll learn -# quickly. This branch isn't particularly difficult, just time -# consuming. Some players may wish to skip this branch. -# -# The following actions are currently permitted without penalty: -# Carrying or throwing a boulder already in inventory -# (player or nonplayer). -# Teleporting boulders. -# Digging in the floor. -# The following actions are permitted, but with a luck penalty: -# Breaking boulders. -# Stone-to-fleshing boulders. -# Creating new boulders (e.g., with a scroll of earth). -# Jumping. -# Being pulled by a thrown iron ball. -# Hurtling through the air from Newton's 3rd law. -# Squeezing past boulders when naked or as a giant. -# These actions are not permitted: -# Moving diagonally between two boulders and/or walls. -# Pushing a boulder diagonally. -# Picking up boulders (player or nonplayer). -# Digging or walking through walls. -# Teleporting within levels or between levels of this branch. -# Using cursed potions of gain level. -# Escaping a pit/hole (e.g., by flying, levitation, or -# passing a dexterity check). -# Bones files are not permitted. - - -### Bottom (first) level of Sokoban ### -MAZE:"soko4-1",' ' -FLAGS:noteleport,hardfloor,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP ------- ----- -|....| |...| -|....----...| -|...........| -|..|-|.|-|..| ----------|.--- -|......|.....| -|..----|.....| ---.| |.....| - |.|---|.....| - |...........| - |..|--------- - ---- -ENDMAP -BRANCH:(06,04,06,04),(0,0,0,0) -STAIR:(06,06),up -REGION:(00,00,13,12),lit,"ordinary" -NON_DIGGABLE:(00,00,13,12) -NON_PASSWALL:(00,00,13,12) - -# Boulders -OBJECT:('`',"boulder"),(02,02) -OBJECT:('`',"boulder"),(02,03) -# -OBJECT:('`',"boulder"),(10,02) -OBJECT:('`',"boulder"),(09,03) -OBJECT:('`',"boulder"),(10,04) -# -OBJECT:('`',"boulder"),(08,07) -OBJECT:('`',"boulder"),(09,08) -OBJECT:('`',"boulder"),(09,09) -OBJECT:('`',"boulder"),(08,10) -OBJECT:('`',"boulder"),(10,10) - -# Traps -TRAP:"pit",(03,06) -TRAP:"pit",(04,06) -TRAP:"pit",(05,06) -TRAP:"pit",(02,08) -TRAP:"pit",(02,09) -TRAP:"pit",(04,10) -TRAP:"pit",(05,10) -TRAP:"pit",(06,10) -TRAP:"pit",(07,10) - -# A little help -OBJECT:('?',"earth"),(02,11) -OBJECT:('?',"earth"),(03,11) - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - - -MAZE:"soko4-2",' ' -FLAGS:noteleport,hardfloor,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP --------- ------ -|.|....|-|....| -|.|-..........| -|.||....|.....| -|.||....|.....| -|.|-----|.----- -|.| |......| -|.-----|......| -|.............| -|..|---|......| ----- -------- -ENDMAP -BRANCH:(03,01,03,01),(0,0,0,0) -STAIR:(01,01),up -REGION:(00,00,14,10),lit,"ordinary" -NON_DIGGABLE:(00,00,14,10) -NON_PASSWALL:(00,00,14,10) - -# Boulders -OBJECT:('`',"boulder"),(05,02) -OBJECT:('`',"boulder"),(06,02) -OBJECT:('`',"boulder"),(06,03) -OBJECT:('`',"boulder"),(07,03) -# -OBJECT:('`',"boulder"),(09,05) -OBJECT:('`',"boulder"),(10,03) -OBJECT:('`',"boulder"),(11,02) -OBJECT:('`',"boulder"),(12,03) -# -OBJECT:('`',"boulder"),(07,08) -OBJECT:('`',"boulder"),(08,08) -OBJECT:('`',"boulder"),(09,08) -OBJECT:('`',"boulder"),(10,08) - -# Traps -TRAP:"pit",(01,02) -TRAP:"pit",(01,03) -TRAP:"pit",(01,04) -TRAP:"pit",(01,05) -TRAP:"pit",(01,06) -TRAP:"pit",(01,07) -TRAP:"pit",(03,08) -TRAP:"pit",(04,08) -TRAP:"pit",(05,08) -TRAP:"pit",(06,08) - -# A little help -OBJECT:('?',"earth"),(01,09) -OBJECT:('?',"earth"),(02,09) - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - - -### Second level ### -MAZE:"soko3-1",' ' -FLAGS:noteleport,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP ------------ ----------- -|....|....|-- |.........| -|....|......| |.........| -|.........|-- |.........| -|....|....| |.........| -|-.--------- |.........| -|....|.....| |.........| -|....|.....| |.........| -|..........| |.........| -|....|.....|---------------+| -|....|......................| ------------------------------ -ENDMAP -STAIR:(11,02),down -STAIR:(23,04),up -DOOR:locked,(27,09) -REGION:(00,00,28,11),lit,"ordinary" -NON_DIGGABLE:(00,00,28,11) -NON_PASSWALL:(00,00,28,11) - -# Boulders -OBJECT:('`',"boulder"),(03,02) -OBJECT:('`',"boulder"),(04,02) -# -OBJECT:('`',"boulder"),(06,02) -OBJECT:('`',"boulder"),(06,03) -OBJECT:('`',"boulder"),(07,02) -# -OBJECT:('`',"boulder"),(03,06) -OBJECT:('`',"boulder"),(02,07) -OBJECT:('`',"boulder"),(03,07) -OBJECT:('`',"boulder"),(03,08) -OBJECT:('`',"boulder"),(02,09) -OBJECT:('`',"boulder"),(03,09) -OBJECT:('`',"boulder"),(04,09) -# -OBJECT:('`',"boulder"),(06,07) -OBJECT:('`',"boulder"),(06,09) -OBJECT:('`',"boulder"),(08,07) -OBJECT:('`',"boulder"),(08,10) -OBJECT:('`',"boulder"),(09,08) -OBJECT:('`',"boulder"),(09,09) -OBJECT:('`',"boulder"),(10,07) -OBJECT:('`',"boulder"),(10,10) - -# Traps -TRAP:"hole",(12,10) -TRAP:"hole",(13,10) -TRAP:"hole",(14,10) -TRAP:"hole",(15,10) -TRAP:"hole",(16,10) -TRAP:"hole",(17,10) -TRAP:"hole",(18,10) -TRAP:"hole",(19,10) -TRAP:"hole",(20,10) -TRAP:"hole",(21,10) -TRAP:"hole",(22,10) -TRAP:"hole",(23,10) -TRAP:"hole",(24,10) -TRAP:"hole",(25,10) -TRAP:"hole",(26,10) - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - - -MAZE:"soko3-2",' ' -FLAGS:noteleport,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP - ---- ----------- --|..|------- |.........| -|..........| |.........| -|..-----.-.| |.........| -|..|...|...| |.........| -|.........-| |.........| -|.......|..| |.........| -|.----..--.| |.........| -|........|.-- |.........| -|.---.-.....------------+| -|...|...-................| -|.........---------------- -----|..|..| - ------- -ENDMAP -STAIR:(03,01),down -STAIR:(20,04),up -DOOR:locked,(24,09) -REGION:(00,00,25,13),lit,"ordinary" -NON_DIGGABLE:(00,00,25,13) -NON_PASSWALL:(00,00,25,13) - -# Boulders -OBJECT:('`',"boulder"),(02,03) -OBJECT:('`',"boulder"),(08,03) -OBJECT:('`',"boulder"),(09,04) -OBJECT:('`',"boulder"),(02,05) -OBJECT:('`',"boulder"),(04,05) -OBJECT:('`',"boulder"),(09,05) -OBJECT:('`',"boulder"),(02,06) -OBJECT:('`',"boulder"),(05,06) -OBJECT:('`',"boulder"),(06,07) -OBJECT:('`',"boulder"),(03,08) -OBJECT:('`',"boulder"),(07,08) -OBJECT:('`',"boulder"),(05,09) -OBJECT:('`',"boulder"),(10,09) -OBJECT:('`',"boulder"),(07,10) -OBJECT:('`',"boulder"),(10,10) -OBJECT:('`',"boulder"),(03,11) - -# Traps -TRAP:"hole",(12,10) -TRAP:"hole",(13,10) -TRAP:"hole",(14,10) -TRAP:"hole",(15,10) -TRAP:"hole",(16,10) -TRAP:"hole",(17,10) -TRAP:"hole",(18,10) -TRAP:"hole",(19,10) -TRAP:"hole",(20,10) -TRAP:"hole",(21,10) -TRAP:"hole",(22,10) -TRAP:"hole",(23,10) - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - - -### Third level ### -MAZE:"soko2-1",' ' -FLAGS:noteleport,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP --------------------- -|........|...|.....| -|.....-..|.-.|.....| -|..|.....|...|.....| -|-.|..-..|.-.|.....| -|...--.......|.....| -|...|...-...-|.....| -|...|..|...--|.....| -|-..|..|----------+| -|..................| -|...|..|------------ --------- -ENDMAP -STAIR:(06,10),down -STAIR:(16,04),up -DOOR:locked,(18,08) -REGION:(00,00,19,11),lit,"ordinary" -NON_DIGGABLE:(00,00,19,11) -NON_PASSWALL:(00,00,19,11) - -# Boulders -OBJECT:('`',"boulder"),(02,02) -OBJECT:('`',"boulder"),(03,02) -# -OBJECT:('`',"boulder"),(05,03) -OBJECT:('`',"boulder"),(07,03) -OBJECT:('`',"boulder"),(07,02) -OBJECT:('`',"boulder"),(08,02) -# -OBJECT:('`',"boulder"),(10,03) -OBJECT:('`',"boulder"),(11,03) -# -OBJECT:('`',"boulder"),(02,07) -OBJECT:('`',"boulder"),(02,08) -OBJECT:('`',"boulder"),(03,09) -# -OBJECT:('`',"boulder"),(05,07) -OBJECT:('`',"boulder"),(06,06) - -# Traps -TRAP:"hole",(08,09) -TRAP:"hole",(09,09) -TRAP:"hole",(10,09) -TRAP:"hole",(11,09) -TRAP:"hole",(12,09) -TRAP:"hole",(13,09) -TRAP:"hole",(14,09) -TRAP:"hole",(15,09) -TRAP:"hole",(16,09) -TRAP:"hole",(17,09) - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - - -MAZE:"soko2-2",' ' -FLAGS:noteleport,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP - -------- ---|.|....| -|........|---------- -|.-...-..|.|.......| -|...-......|.......| -|.-....|...|.......| -|....-.--.-|.......| -|..........|.......| -|.--...|...|.......| -|....-.|---|.......| ---|....|----------+| - |................| - ------------------ -ENDMAP -STAIR:(06,11),down -STAIR:(15,06),up -DOOR:locked,(18,10) -REGION:(00,00,19,12),lit,"ordinary" -NON_DIGGABLE:(00,00,19,12) -NON_PASSWALL:(00,00,19,12) - -# Boulders -OBJECT:('`',"boulder"),(04,02) -OBJECT:('`',"boulder"),(04,03) -OBJECT:('`',"boulder"),(05,03) -OBJECT:('`',"boulder"),(07,03) -OBJECT:('`',"boulder"),(08,03) -OBJECT:('`',"boulder"),(02,04) -OBJECT:('`',"boulder"),(03,04) -OBJECT:('`',"boulder"),(05,05) -OBJECT:('`',"boulder"),(06,06) -OBJECT:('`',"boulder"),(09,06) -OBJECT:('`',"boulder"),(03,07) -OBJECT:('`',"boulder"),(04,07) -OBJECT:('`',"boulder"),(07,07) -OBJECT:('`',"boulder"),(06,09) -OBJECT:('`',"boulder"),(05,10) -OBJECT:('`',"boulder"),(05,11) - -# Traps -TRAP:"hole",(07,11) -TRAP:"hole",(08,11) -TRAP:"hole",(09,11) -TRAP:"hole",(10,11) -TRAP:"hole",(11,11) -TRAP:"hole",(12,11) -TRAP:"hole",(13,11) -TRAP:"hole",(14,11) -TRAP:"hole",(15,11) -TRAP:"hole",(16,11) -TRAP:"hole",(17,11) - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - - -### Top (last) level of Sokoban ### -MAZE:"soko1-1",' ' -FLAGS:noteleport,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP --------------------------- -|........................| -|.......|---------------.| --------.------ |.| - |...........| |.| - |...........| |.| ---------.----- |.| -|............| |.| -|............| |.| ------.-------- ------|.| - |..........| --|.....|.| - |..........| |.+.....|.| - |.........|- |-|.....|.| --------.---- |.+.....+.| -|........| |-|.....|-- -|........| |.+.....| -|...|----- --|.....| ------ ------- -ENDMAP -$place = { (16,11),(16,13),(16,15) } -SHUFFLE: $place - -STAIR:(01,01),down -REGION:(00,00,25,17),lit,"ordinary" -NON_DIGGABLE:(00,00,25,17) -NON_PASSWALL:(00,00,25,17) - -# Boulders -OBJECT:('`',"boulder"),(03,05) -OBJECT:('`',"boulder"),(05,05) -OBJECT:('`',"boulder"),(07,05) -OBJECT:('`',"boulder"),(09,05) -OBJECT:('`',"boulder"),(11,05) -# -OBJECT:('`',"boulder"),(04,07) -OBJECT:('`',"boulder"),(04,08) -OBJECT:('`',"boulder"),(06,07) -OBJECT:('`',"boulder"),(09,07) -OBJECT:('`',"boulder"),(11,07) -# -OBJECT:('`',"boulder"),(03,12) -OBJECT:('`',"boulder"),(04,10) -OBJECT:('`',"boulder"),(05,12) -OBJECT:('`',"boulder"),(06,10) -OBJECT:('`',"boulder"),(07,11) -OBJECT:('`',"boulder"),(08,10) -OBJECT:('`',"boulder"),(09,12) -# -OBJECT:('`',"boulder"),(03,14) - -# Traps -TRAP:"hole",(08,01) -TRAP:"hole",(09,01) -TRAP:"hole",(10,01) -TRAP:"hole",(11,01) -TRAP:"hole",(12,01) -TRAP:"hole",(13,01) -TRAP:"hole",(14,01) -TRAP:"hole",(15,01) -TRAP:"hole",(16,01) -TRAP:"hole",(17,01) -TRAP:"hole",(18,01) -TRAP:"hole",(19,01) -TRAP:"hole",(20,01) -TRAP:"hole",(21,01) -TRAP:"hole",(22,01) -TRAP:"hole",(23,01) - -MONSTER:('m',"giant mimic"), random, m_object "boulder" -MONSTER:('m',"giant mimic"), random, m_object "boulder" - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - -# Rewards -DOOR:locked,(23,13) -DOOR:closed,(17,11) -DOOR:closed,(17,13) -DOOR:closed,(17,15) -REGION:(18,10,22,16),lit,"zoo",filled,irregular -IF [50%] { - OBJECT:('(',"bag of holding"),$place[0] -} ELSE { - OBJECT:('"',"amulet of reflection"),$place[0] -} -ENGRAVING:$place[0],burn,"Elbereth" -OBJECT:('?', "scare monster"),$place[0],cursed - - -MAZE:"soko1-2",' ' -FLAGS:noteleport,premapped,solidify -GEOMETRY:center,center -#12345678901234567890123456789012345678901234567890 -MAP - ------------------------ - |......................| - |..-------------------.| -----.| ----- |.| -|..|.-- --...| |.| -|.....|--|....| |.| -|.....|..|....| |.| ---....|......-- |.| - |.......|...| ------|.| - |....|..|...| --|.....|.| - |....|--|...| |.+.....|.| - |.......|..-- |-|.....|.| - ----....|.-- |.+.....+.| - ---.--.| |-|.....|-- - |.....| |.+.....| - |..|..| --|.....| - ------- ------- -ENDMAP -$place = { (16,10),(16,12),(16,14) } -SHUFFLE: $place - -STAIR:(06,15),down -REGION:(00,00,25,16),lit,"ordinary" -NON_DIGGABLE:(00,00,25,16) -NON_PASSWALL:(00,00,25,16) - -# Boulders -OBJECT:('`',"boulder"),(04,04) -OBJECT:('`',"boulder"),(02,06) -OBJECT:('`',"boulder"),(03,06) -OBJECT:('`',"boulder"),(04,07) -OBJECT:('`',"boulder"),(05,07) -OBJECT:('`',"boulder"),(02,08) -OBJECT:('`',"boulder"),(05,08) -OBJECT:('`',"boulder"),(03,09) -OBJECT:('`',"boulder"),(04,09) -OBJECT:('`',"boulder"),(03,10) -OBJECT:('`',"boulder"),(05,10) -OBJECT:('`',"boulder"),(06,12) -# -OBJECT:('`',"boulder"),(07,14) -# -OBJECT:('`',"boulder"),(11,05) -OBJECT:('`',"boulder"),(12,06) -OBJECT:('`',"boulder"),(10,07) -OBJECT:('`',"boulder"),(11,07) -OBJECT:('`',"boulder"),(10,08) -OBJECT:('`',"boulder"),(12,09) -OBJECT:('`',"boulder"),(11,10) - -# Traps -TRAP:"hole",(05,01) -TRAP:"hole",(06,01) -TRAP:"hole",(07,01) -TRAP:"hole",(08,01) -TRAP:"hole",(09,01) -TRAP:"hole",(10,01) -TRAP:"hole",(11,01) -TRAP:"hole",(12,01) -TRAP:"hole",(13,01) -TRAP:"hole",(14,01) -TRAP:"hole",(15,01) -TRAP:"hole",(16,01) -TRAP:"hole",(17,01) -TRAP:"hole",(18,01) -TRAP:"hole",(19,01) -TRAP:"hole",(20,01) -TRAP:"hole",(21,01) -TRAP:"hole",(22,01) - -MONSTER:('m',"giant mimic"), random, m_object "boulder" -MONSTER:('m',"giant mimic"), random, m_object "boulder" - -# Random objects -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'%',random -OBJECT:'=',random -OBJECT:'/',random - -# Rewards -DOOR:locked,(23,12) -DOOR:closed,(17,10) -DOOR:closed,(17,12) -DOOR:closed,(17,14) -REGION:(18,09,22,15),lit,"zoo",filled,irregular -IF [50%] { - OBJECT:('(',"bag of holding"),$place[0] -} ELSE { - OBJECT:('"',"amulet of reflection"),$place[0] -} -ENGRAVING:$place[0],burn,"Elbereth" -OBJECT:('?', "scare monster"),$place[0],cursed diff --git a/dat/symbols b/dat/symbols index 06aa31f66..cb46ec197 100644 --- a/dat/symbols +++ b/dat/symbols @@ -1,8 +1,8 @@ -# NetHack 3.6 symbols $NHDT-Date: 1572892906 2019/11/04 18:41:46 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.21 $ +# NetHack 5.0 symbols $NHDT-Date: 1725052751 2024/08/30 21:19:11 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.36 $ # Copyright (c) 2006 by Michael Allison # NetHack may be freely redistributed. See license for details. # -# Symbol sets for use in NetHack's text-based display. +# Symbol sets and handlers for use in NetHack's text-based display. # # IBMgraphics works by specifying special characters which reside # outside the range of normal printable characters. It has subsets @@ -22,6 +22,20 @@ # on an old graphics mode for the Curses interface and is the default # on that windowport if no symset is specified. The Curses interface # can also use DECgraphics as-is; IBMgraphics probably won't work. +# +# Symsets that use the UTF8 handler work a little differently than +# those that do not. When the UTF8 handler is in effect, any NetHack +# glyphs that have a utf8str entry present in the runtime glyphmap[] +# array will utilize that UTF-8 character sequence for the glyph display +# instead of the NetHack ttychar symbol that would otherwise be used. +# Any NetHack glyphs that don't actually have a utf8str sequence present +# in the internal glyphmap will simply fall back to utilizing the typical +# NetHack ttychar symbol as usual. That is true even when the UTF-8 +# handler is in effect. +# +# \xnn specifies a hexadecimal value for nn. +# \0nn specifies a decimal value for nn, not octal as leading 0 indicates +# in C and programming languages influenced by it. # plain looks decent for room+corridor levels where there aren't a lot # of wall corners and ones present tend to be spread out, but it looks @@ -39,101 +53,6 @@ start: plain S_trwall: '+' finish #plain -- other symbols implicitly retain their default values -# Recommended symset for blind players -# courtesy Michael Feir -start: NHAccess - Description: recommended for blind players - S_stone: \032 - S_vwall: \124 - S_hwall: \045 - S_tlcorn: \124 - S_trcorn: \124 - S_blcorn: \124 - S_brcorn: \124 - S_crwall: \045 - S_tuwall: \045 - S_tdwall: \045 - S_tlwall: \124 - S_trwall: \124 - S_ndoor: \046 - S_vodoor: \045 - S_hodoor: \124 - S_vcdoor: \043 - S_hcdoor: \043 - S_bars: \046 - S_tree: \035 - S_room: \035 - S_corr: \060 - S_litcorr: \062 - S_upstair: \060 - S_dnstair: \062 - S_upladder: \095 - S_dnladder: \092 - S_altar: \035 - S_grave: \126 - S_throne: \126 - S_sink: \126 - S_fountain: \126 - S_pool: \042 - S_ice: \042 - S_lava: \035 - S_vodbridge: \035 - S_hodbridge: \032 - S_vcdbridge: \035 - S_hcdbridge: \126 - S_arrow_trap: \094 - S_dart_trap: \094 - S_falling_rock_trap: \094 - S_squeaky_board: \094 - S_bear_trap: \094 - S_land_mine: \094 - S_rolling_boulder_trap: \094 - S_sleeping_gas_trap: \094 - S_rust_trap: \094 - S_fire_trap: \094 - S_pit: \094 - S_spiked_pit: \094 - S_hole: \094 - S_trap_door: \094 - S_teleportation_trap: \094 - S_level_teleporter: \094 - S_magic_portal: \094 - S_web: \094 - S_statue_trap: \094 - S_magic_trap: \094 - S_anti_magic_trap: \094 - S_polymorph_trap: \094 - S_vbeam: \124 - S_hbeam: \095 - S_lslant: \092 - S_rslant: \047 - S_digbeam: \042 - S_flashbeam: \033 - S_boomleft: \041 - S_boomright: \040 - S_ss1: \048 - S_ss2: \035 - S_ss3: \064 - S_ss4: \042 - S_sw_tl: \047 - S_sw_tc: \045 - S_sw_tr: \092 - S_sw_ml: \058 - S_sw_mr: \058 - S_sw_bl: \092 - S_sw_bc: \045 - S_sw_br: \047 - S_explode1: \047 - S_explode2: \045 - S_explode3: \092 - S_explode4: \058 - S_explode5: \032 - S_explode6: \058 - S_explode7: \092 - S_explode8: \045 - S_explode9: \047 -finish - # All symbols are spaces start: Blank Description: completely blank symbols @@ -170,19 +89,23 @@ start: Blank S_digbeam: \032 S_dnladder: \032 S_dnstair: \032 + S_brdnladder: \032 + S_brdnstair: \032 S_dog: \032 S_dragon: \032 S_eel: \032 S_elemental: \032 - S_explode1: \032 - S_explode2: \032 - S_explode3: \032 - S_explode4: \032 - S_explode5: \032 - S_explode6: \032 - S_explode7: \032 - S_explode8: \032 - S_explode9: \032 + S_engroom: \032 + S_engrcorr: \032 + S_expl_tl: \032 + S_expl_tc: \032 + S_expl_tr: \032 + S_expl_ml: \032 + S_expl_mc: \032 + S_expl_mr: \032 + S_expl_bl: \032 + S_expl_bc: \032 + S_expl_br: \032 S_eye: \032 S_falling_rock_trap: \032 S_feline: \032 @@ -216,6 +139,7 @@ start: Blank S_kop: \032 S_land_mine: \032 S_lava: \032 + S_lavawall: \032 S_leprechaun: \032 S_level_teleporter: \032 S_lich: \032 @@ -288,7 +212,9 @@ start: Blank S_umber: \032 S_unicorn: \032 S_upladder: \032 + S_brupladder: \032 S_upstair: \032 + S_brupstair: \032 S_vampire: \032 S_vbeam: \032 S_vcdbridge: \032 @@ -331,15 +257,19 @@ start: IBMgraphics S_ndoor: \xfa # meta-z, centered dot S_vodoor: \xfe # meta-~, small centered square S_hodoor: \xfe # meta-~, small centered square + S_engroom: \xee # epsilon S_bars: \xf0 # equivalence symbol S_tree: \xf1 # plus or minus symbol S_room: \xfa # meta-z, centered dot S_corr: \xb0 # meta-0, light shading S_litcorr: \xb1 # meta-1, medium shading + S_engrcorr: \xb0 # meta-0, light shading S_fountain: \xf4 # meta-t, integral top half + S_sink: \xf4 # meta-t, integral top half S_pool: \xf7 # meta-w, approx. equals S_ice: \xfa # meta-z, centered dot S_lava: \xf7 # meta-w, approx. equals + S_lavawall: \xf7 # meta-w, approx. equals S_vodbridge: \xfa # meta-z, centered dot S_hodbridge: \xfa # meta-z, centered dot S_water: \xf7 # meta-w, approx. equals @@ -347,8 +277,52 @@ start: IBMgraphics S_hbeam: \xc4 # meta-D, horizontal rule S_sw_ml: \xb3 # meta-3, vertical rule S_sw_mr: \xb3 # meta-3, vertical rule - S_explode4: \xb3 # meta-3, vertical rule - S_explode6: \xb3 # meta-3, vertical rule + S_expl_ml: \xb3 # meta-3, vertical rule + S_expl_mr: \xb3 # meta-3, vertical rule + G_vwall_sokoban: /blue + G_hwall_sokoban: /blue + G_tlcorn_sokoban: /blue + G_trcorn_sokoban: /blue + G_blcorn_sokoban: /blue + G_brcorn_sokoban: /blue + G_crwall_sokoban: /blue + G_tuwall_sokoban: /blue + G_tdwall_sokoban: /blue + G_tlwall_sokoban: /blue + G_trwall_sokoban: /blue + G_vwall_gehennom: /red + G_hwall_gehennom: /red + G_tlcorn_gehennom: /red + G_trcorn_gehennom: /red + G_blcorn_gehennom: /red + G_brcorn_gehennom: /red + G_crwall_gehennom: /red + G_tuwall_gehennom: /red + G_tdwall_gehennom: /red + G_tlwall_gehennom: /red + G_trwall_gehennom: /red + G_vwall_knox: /yellow + G_hwall_knox: /yellow + G_tlcorn_knox: /yellow + G_trcorn_knox: /yellow + G_blcorn_knox: /yellow + G_brcorn_knox: /yellow + G_crwall_knox: /yellow + G_tuwall_knox: /yellow + G_tdwall_knox: /yellow + G_tlwall_knox: /yellow + G_trwall_knox: /yellow + G_vwall_mines: /brown + G_hwall_mines: /brown + G_tlcorn_mines: /brown + G_trcorn_mines: /brown + G_blcorn_mines: /brown + G_brcorn_mines: /brown + G_crwall_mines: /brown + G_tuwall_mines: /brown + G_tdwall_mines: /brown + G_tlwall_mines: /brown + G_trwall_mines: /brown finish start: IBMGraphics_1 @@ -365,12 +339,57 @@ start: IBMGraphics_1 S_tdwall: \xc2 # meta-B, T down S_tlwall: \xb4 # meta-4, T left S_trwall: \xc3 # meta-C, T right + S_engroom: \xee # epsilon S_vbeam: \xb3 # meta-3, vertical rule S_hbeam: \xc4 # meta-D, horizontal rule S_sw_ml: \xb3 # meta-3, vertical rule S_sw_mr: \xb3 # meta-3, vertical rule - S_explode4: \xb3 # meta-3, vertical rule - S_explode6: \xb3 # meta-3, vertical rule + S_expl_ml: \xb3 # meta-3, vertical rule + S_expl_mr: \xb3 # meta-3, vertical rule + G_vwall_sokoban: /blue + G_hwall_sokoban: /blue + G_tlcorn_sokoban: /blue + G_trcorn_sokoban: /blue + G_blcorn_sokoban: /blue + G_brcorn_sokoban: /blue + G_crwall_sokoban: /blue + G_tuwall_sokoban: /blue + G_tdwall_sokoban: /blue + G_tlwall_sokoban: /blue + G_trwall_sokoban: /blue + G_vwall_gehennom: /red + G_hwall_gehennom: /red + G_tlcorn_gehennom: /red + G_trcorn_gehennom: /red + G_blcorn_gehennom: /red + G_brcorn_gehennom: /red + G_crwall_gehennom: /red + G_tuwall_gehennom: /red + G_tdwall_gehennom: /red + G_tlwall_gehennom: /red + G_trwall_gehennom: /red + G_vwall_knox: /yellow + G_hwall_knox: /yellow + G_tlcorn_knox: /yellow + G_trcorn_knox: /yellow + G_blcorn_knox: /yellow + G_brcorn_knox: /yellow + G_crwall_knox: /yellow + G_tuwall_knox: /yellow + G_tdwall_knox: /yellow + G_tlwall_knox: /yellow + G_trwall_knox: /yellow + G_vwall_mines: /brown + G_hwall_mines: /brown + G_tlcorn_mines: /brown + G_trcorn_mines: /brown + G_blcorn_mines: /brown + G_brcorn_mines: /brown + G_crwall_mines: /brown + G_tuwall_mines: /brown + G_tdwall_mines: /brown + G_tlwall_mines: /brown + G_trwall_mines: /brown finish start: IBMGraphics_2 @@ -389,14 +408,60 @@ start: IBMGraphics_2 S_trwall: \xc3 # meta-C, T right S_vodoor: \xfe # meta-~, small centered square S_hodoor: \xfe # meta-~, small centered square + S_engroom: \xee # epsilon S_corr: \xb0 # meta-0, light shading S_litcorr: \xb1 # meta-1, medium shading + S_engrcorr: \xb0 # meta-0, light shading S_vbeam: \xb3 # meta-3, vertical rule S_hbeam: \xc4 # meta-D, horizontal rule S_sw_ml: \xb3 # meta-3, vertical rule S_sw_mr: \xb3 # meta-3, vertical rule - S_explode4: \xb3 # meta-3, vertical rule - S_explode6: \xb3 # meta-3, vertical rule + S_expl_ml: \xb3 # meta-3, vertical rule + S_expl_mr: \xb3 # meta-3, vertical rule + G_vwall_sokoban: /blue + G_hwall_sokoban: /blue + G_tlcorn_sokoban: /blue + G_trcorn_sokoban: /blue + G_blcorn_sokoban: /blue + G_brcorn_sokoban: /blue + G_crwall_sokoban: /blue + G_tuwall_sokoban: /blue + G_tdwall_sokoban: /blue + G_tlwall_sokoban: /blue + G_trwall_sokoban: /blue + G_vwall_gehennom: /red + G_hwall_gehennom: /red + G_tlcorn_gehennom: /red + G_trcorn_gehennom: /red + G_blcorn_gehennom: /red + G_brcorn_gehennom: /red + G_crwall_gehennom: /red + G_tuwall_gehennom: /red + G_tdwall_gehennom: /red + G_tlwall_gehennom: /red + G_trwall_gehennom: /red + G_vwall_knox: /yellow + G_hwall_knox: /yellow + G_tlcorn_knox: /yellow + G_trcorn_knox: /yellow + G_blcorn_knox: /yellow + G_brcorn_knox: /yellow + G_crwall_knox: /yellow + G_tuwall_knox: /yellow + G_tdwall_knox: /yellow + G_tlwall_knox: /yellow + G_trwall_knox: /yellow + G_vwall_mines: /brown + G_hwall_mines: /brown + G_tlcorn_mines: /brown + G_trcorn_mines: /brown + G_blcorn_mines: /brown + G_brcorn_mines: /brown + G_crwall_mines: /brown + G_tuwall_mines: /brown + G_tdwall_mines: /brown + G_tlwall_mines: /brown + G_trwall_mines: /brown finish start: RogueIBM @@ -426,8 +491,11 @@ start: RogueIBM S_room: \xfa # centered dot S_corr: \xb1 S_litcorr: \xb2 + S_engrcorr: \xb1 S_upstair: \xf0 # Greek Xi S_dnstair: \xf0 + S_brupstair: \xf0 # Greek Xi + S_brdnstair: \xf0 finish start: RogueEpyx @@ -450,10 +518,14 @@ start: RogueEpyx S_vodoor: \xce S_hodoor: \xce S_room: \xfa # centered dot + S_engroom: \xee # epsilon S_corr: \xb1 S_litcorr: \xb2 + S_engrcorr: \xb1 S_upstair: \xf0 # Greek Xi S_dnstair: \xf0 + S_brupstair: \xf0 # Greek Xi + S_brdnstair: \xf0 S_arrow_trap: \x04 # diamond (cards) S_dart_trap: \x04 S_falling_rock_trap: \x04 @@ -526,10 +598,14 @@ start: RogueWindows S_vodoor: \xce S_hodoor: \xce S_room: \xfa # centered dot + S_engroom: \xee # epsilon S_corr: \xb1 S_litcorr: \xb2 + S_engrcorr: \xb1 S_upstair: \xf0 # Greek Xi S_dnstair: \xf0 + S_brupstair: \xf0 # Greek Xi + S_brdnstair: \xf0 finish start: curses @@ -551,8 +627,10 @@ start: curses S_bars: \xfc # meta-|, not-equals sign (was '#') S_tree: \xe7 # meta-g, plus or minus sign S_room: \xfe # meta-z, centered dot - S_corr: \xe1 # meta-a, solid block - S_litcorr: \xe1 # meta-a, solid block + # S_engroom: \xee # epsilon [\xee is actually cross wall] + S_corr: \xe1 # meta-a, checkerboard + S_litcorr: \xe1 # meta-a, checkerboard + S_engrcorr: \xe1 # meta-a, checkerboard S_ice: \xfe # meta-z, centered dot S_vodbridge: \xfe # meta-z, centered dot S_hodbridge: \xfe # meta-z, centered dot @@ -560,8 +638,52 @@ start: curses S_hbeam: \xf1 # meta-D, horizontal rule S_sw_ml: \xf8 # meta-3, vertical rule S_sw_mr: \xf8 # meta-3, vertical rule - S_explode4: \xf8 # meta-3, vertical rule - S_explode6: \xf8 # meta-3, vertical rule + S_expl_ml: \xf8 # meta-3, vertical rule + S_expl_mr: \xf8 # meta-3, vertical rule + G_vwall_sokoban: /blue + G_hwall_sokoban: /blue + G_tlcorn_sokoban: /blue + G_trcorn_sokoban: /blue + G_blcorn_sokoban: /blue + G_brcorn_sokoban: /blue + G_crwall_sokoban: /blue + G_tuwall_sokoban: /blue + G_tdwall_sokoban: /blue + G_tlwall_sokoban: /blue + G_trwall_sokoban: /blue + G_vwall_gehennom: /red + G_hwall_gehennom: /red + G_tlcorn_gehennom: /red + G_trcorn_gehennom: /red + G_blcorn_gehennom: /red + G_brcorn_gehennom: /red + G_crwall_gehennom: /red + G_tuwall_gehennom: /red + G_tdwall_gehennom: /red + G_tlwall_gehennom: /red + G_trwall_gehennom: /red + G_vwall_knox: /yellow + G_hwall_knox: /yellow + G_tlcorn_knox: /yellow + G_trcorn_knox: /yellow + G_blcorn_knox: /yellow + G_brcorn_knox: /yellow + G_crwall_knox: /yellow + G_tuwall_knox: /yellow + G_tdwall_knox: /yellow + G_tlwall_knox: /yellow + G_trwall_knox: /yellow + G_vwall_mines: /brown + G_hwall_mines: /brown + G_tlcorn_mines: /brown + G_trcorn_mines: /brown + G_blcorn_mines: /brown + G_brcorn_mines: /brown + G_crwall_mines: /brown + G_tuwall_mines: /brown + G_tdwall_mines: /brown + G_tlwall_mines: /brown + G_trwall_mines: /brown finish start: DECgraphics @@ -580,17 +702,20 @@ start: DECgraphics S_tlwall: \xf5 # meta-u, T left S_trwall: \xf4 # meta-t, T right S_ndoor: \xfe # meta-~, centered dot - S_vodoor: \xe1 # meta-a, solid block - S_hodoor: \xe1 # meta-a, solid block + S_vodoor: \xe1 # meta-a, checkerboard + S_hodoor: \xe1 # meta-a, checkerboard S_bars: \xfc # meta-|, not-equals (used to be pi) S_tree: \xe7 # meta-g, plus-or-minus S_room: \xfe # meta-~, centered dot S_upladder: \xf9 # meta-y, less-than-or-equals S_dnladder: \xfa # meta-z, greater-than-or-equals + S_brupladder: \xf9 # meta-y, less-than-or-equals + S_brdnladder: \xfa # meta-z, greater-than-or-equals S_altar: \xfb # meta-{, pi (used to default to '_') S_pool: \xe0 # meta-\, diamond S_ice: \xfe # meta-~, centered dot S_lava: \xe0 # meta-\, diamond + S_lavawall: \xe0 # meta-\, diamond S_vodbridge: \xfe # meta-~, centered dot S_hodbridge: \xfe # meta-~, centered dot S_water: \xe0 # meta-\, diamond @@ -600,10 +725,54 @@ start: DECgraphics S_sw_ml: \xf8 # meta-x, vertical rule S_sw_mr: \xf8 # meta-x, vertical rule S_sw_bc: \xf3 # meta-s, low horizontal line - S_explode2: \xef # meta-o, high horizontal line - S_explode4: \xf8 # meta-x, vertical rule - S_explode6: \xf8 # meta-x, vertical rule - S_explode8: \xf3 # meta-s, low horizontal line + S_expl_tc: \xef # meta-o, high horizontal line + S_expl_ml: \xf8 # meta-x, vertical rule + S_expl_mr: \xf8 # meta-x, vertical rule + S_expl_bc: \xf3 # meta-s, low horizontal line + G_vwall_sokoban: /blue + G_hwall_sokoban: /blue + G_tlcorn_sokoban: /blue + G_trcorn_sokoban: /blue + G_blcorn_sokoban: /blue + G_brcorn_sokoban: /blue + G_crwall_sokoban: /blue + G_tuwall_sokoban: /blue + G_tdwall_sokoban: /blue + G_tlwall_sokoban: /blue + G_trwall_sokoban: /blue + G_vwall_gehennom: /red + G_hwall_gehennom: /red + G_tlcorn_gehennom: /red + G_trcorn_gehennom: /red + G_blcorn_gehennom: /red + G_brcorn_gehennom: /red + G_crwall_gehennom: /red + G_tuwall_gehennom: /red + G_tdwall_gehennom: /red + G_tlwall_gehennom: /red + G_trwall_gehennom: /red + G_vwall_knox: /yellow + G_hwall_knox: /yellow + G_tlcorn_knox: /yellow + G_trcorn_knox: /yellow + G_blcorn_knox: /yellow + G_brcorn_knox: /yellow + G_crwall_knox: /yellow + G_tuwall_knox: /yellow + G_tdwall_knox: /yellow + G_tlwall_knox: /yellow + G_trwall_knox: /yellow + G_vwall_mines: /brown + G_hwall_mines: /brown + G_tlcorn_mines: /brown + G_trcorn_mines: /brown + G_blcorn_mines: /brown + G_brcorn_mines: /brown + G_crwall_mines: /brown + G_tuwall_mines: /brown + G_tdwall_mines: /brown + G_tlwall_mines: /brown + G_trwall_mines: /brown finish start: MACgraphics @@ -629,8 +798,305 @@ start: MACgraphics S_bars: \xf0 # equivalency symbol S_tree: \xf1 # plus-or-minus S_corr: \xb0 + S_engrcorr: \xb0 S_grave: \xef # same as open door S_pool: \xe0 finish +# When using Unicode glyphs, care must be taken with how terminals +# render them and how completely fonts cover them. +# +# Depending on the font, terminal, and operating system, unsupported +# glyphs may be replaced by placeholder symbols (e.g. � U+FFFD +# replacement character or □ U+25A1 white square), omitted entirely, or +# substituted from fallback fonts. Such fallback can introduce visual +# inconsistencies due to differences in style, metrics, or alignment. +# +# Support for glyphs defined in the Windows Glyph List 4 +# (https://en.wikipedia.org/wiki/WGL4) is generally good across common +# fonts and platforms. Beyond that baseline, coverage becomes less +# predictable and should be evaluated case by case. +# +# Emoji support often is problematic, and wide glyphs occupy two display +# columns, which NetHack does not support. +# +# Symset Enhanced1 should be considered the conservative Unicode symset, +# while Enhanced2 (and any future symsets) may make use of more advanced +# Unicode features. +start: Enhanced1 + Description: Enhanced with Unicode glyphs and 24-bit color + Restrictions: primary + Handling: UTF8 + S_corr: U+2591 # ░ LIGHT SHADE + S_engrcorr: U+2591 # ░ LIGHT SHADE + S_litcorr: U+2592 # ▒ MEDIUM SHADE + S_vwall: U+2502 # │ BOX DRAWINGS LIGHT VERTICAL + S_hwall: U+2500 # ─ BOX DRAWINGS LIGHT HORIZONTAL + S_tlcorn: U+250c # ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + S_trcorn: U+2510 # ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + S_blcorn: U+2514 # └ BOX DRAWINGS LIGHT UP AND RIGHT + S_brcorn: U+2518 # ┘ BOX DRAWINGS LIGHT UP AND LEFT + S_crwall: U+253c # ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + S_tuwall: U+2534 # ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + S_tdwall: U+252c # ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + S_tlwall: U+2524 # ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + S_trwall: U+251c # ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT + S_ndoor: U+00b7 # · MIDDLE DOT + S_vodoor: U+2592 # ▒ MEDIUM SHADE + S_hodoor: U+2592 # ▒ MEDIUM SHADE + S_bars: U+2261 # ≡ IDENTICAL TO + S_tree: U+03a8 # Ψ GREEK CAPITAL LETTER PSI + S_room: U+00b7 # · MIDDLE DOT + S_engroom: U+03BE # ξ Greek Small Letter Xi + S_darkroom: U+00b7 # · MIDDLE DOT + S_upladder: U+2264 # ≤ LESS-THAN OR EQUAL TO + S_dnladder: U+2265 # ≥ GREATER-THAN OR EQUAL TO + S_altar: U+03A9 # Ω GREEK CAPITAL LETTER OMEGA + S_grave: U+2020 # † DAGGER + G_fountain: U+2320/0-150-255 # ⌠ TOP HALF INTEGRAL + S_pool: U+224b # ≋ TRIPLE TILDE + S_ice: U+00b7 # · MIDDLE DOT + S_lava: U+224b # ≋ TRIPLE TILDE + S_lavawall: U+2248 # ≈ ALMOST EQUAL TO + S_vodbridge: U+00b7 # · MIDDLE DOT + S_hodbridge: U+00b7 # · MIDDLE DOT + S_water: U+2248 # ≈ ALMOST EQUAL TO + S_web: U+00A4 # ¤ CURRENCY SIGN + S_vbeam: U+2502 # │ BOX DRAWINGS LIGHT VERTICAL + S_hbeam: U+2500 # ─ BOX DRAWINGS LIGHT HORIZONTAL + S_sw_tc: U+2594 # ▔ UPPER ONE EIGHTH BLOCK + S_sw_ml: U+258f # ▏ LEFT ONE EIGHTH BLOCK + S_sw_mr: U+2595 # ▕ RIGHT ONE EIGHTH BLOCK + S_sw_bc: U+2581 # LOWER ONE EIGHTH BLOCK + S_expl_tc: U+2594 # ▔ UPPER ONE EIGHTH BLOCK + S_expl_ml: U+258f # ▏ LEFT ONE EIGHTH BLOCK + S_expl_mr: U+2595 # ▕ RIGHT ONE EIGHTH BLOCK + S_expl_bc: U+2581 # LOWER ONE EIGHTH BLOCK + G_vwall_sokoban: U+2502/blue # │ BOX DRAWINGS LIGHT VERTICAL + G_hwall_sokoban: U+2500/blue # ─ BOX DRAWINGS LIGHT HORIZONTAL + G_tlcorn_sokoban: U+250c/blue # ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + G_trcorn_sokoban: U+2510/blue # ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + G_blcorn_sokoban: U+2514/blue # └ BOX DRAWINGS LIGHT UP AND RIGHT + G_brcorn_sokoban: U+2518/blue # ┘ BOX DRAWINGS LIGHT UP AND LEFT + G_crwall_sokoban: U+253C/blue # ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + G_tuwall_sokoban: U+2534/blue # ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + G_tdwall_sokoban: U+252C/blue # ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + G_tlwall_sokoban: U+2524/blue # ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + G_trwall_sokoban: U+251C/blue # ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT + G_vwall_gehennom: U+2502/red # │ BOX DRAWINGS LIGHT VERTICAL + G_hwall_gehennom: U+2500/red # ─ BOX DRAWINGS LIGHT HORIZONTAL + G_tlcorn_gehennom: U+250c/red # ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + G_trcorn_gehennom: U+2510/red # ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + G_blcorn_gehennom: U+2514/red # └ BOX DRAWINGS LIGHT UP AND RIGHT + G_brcorn_gehennom: U+2518/red # ┘ BOX DRAWINGS LIGHT UP AND LEFT + G_crwall_gehennom: U+253C/red # ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + G_tuwall_gehennom: U+2534/red # ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + G_tdwall_gehennom: U+252C/red # ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + G_tlwall_gehennom: U+2524/red # ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + G_trwall_gehennom: U+251C/red # ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT + G_vwall_knox: U+2502/126-230-230 # │ BOX DRAWINGS LIGHT VERTICAL + G_hwall_knox: U+2500/126-230-230 # ─ BOX DRAWINGS LIGHT HORIZONTAL + G_tlcorn_knox: U+250c/126-230-230 # ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + G_trcorn_knox: U+2510/126-230-230 # ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + G_blcorn_knox: U+2514/126-230-230 # └ BOX DRAWINGS LIGHT UP AND RIGHT + G_brcorn_knox: U+2518/126-230-230 # ┘ BOX DRAWINGS LIGHT UP AND LEFT + G_crwall_knox: U+253C/126-230-230 # ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + G_tuwall_knox: U+2534/126-230-230 # ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + G_tdwall_knox: U+252C/126-230-230 # ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + G_tlwall_knox: U+2524/126-230-230 # ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + G_trwall_knox: U+251C/126-230-230 # ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT + G_vwall_mines: U+2502/190-126-0 # │ BOX DRAWINGS LIGHT VERTICAL + G_hwall_mines: U+2500/190-126-0 # ─ BOX DRAWINGS LIGHT HORIZONTAL + G_tlcorn_mines: U+250c/190-126-0 # ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + G_trcorn_mines: U+2510/190-126-0 # ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + G_blcorn_mines: U+2514/190-126-0 # └ BOX DRAWINGS LIGHT UP AND RIGHT + G_brcorn_mines: U+2518/190-126-0 # ┘ BOX DRAWINGS LIGHT UP AND LEFT + G_crwall_mines: U+253C/190-126-0 # ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + G_tuwall_mines: U+2534/190-126-0 # ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + G_tdwall_mines: U+252C/190-126-0 # ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + G_tlwall_mines: U+2524/190-126-0 # ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + G_trwall_mines: U+251C/190-126-0 # ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT +finish + +start: Enhanced2 +# contributed in GitHub pull request 1503 by abcbarryn. +# This has double line wall symbols. + Description: Enhanced with more Unicode glyphs and 24-bit color + Restrictions: primary + Handling: UTF8 + S_corr: U+2591 + S_litcorr: U+2592 + S_engrcorr: U+2591 + S_amulet: U+2299 # ☉ + S_cloud: U+2601 # ☁ + S_vwall: U+2551 # ║ BOX DRAWINGS DOUBLE VERTICAL + S_hwall: U+2550 # ═ BOX DRAWINGS DOUBLE HORIZONTAL + S_tlcorn: U+2554 # ╔ BOX DRAWINGS DOUBLE DOWN AND RIGHT + S_trcorn: U+2557 # ╗ BOX DRAWINGS DOUBLE DOWN AND LEFT + S_blcorn: U+255a # ╚ BOX DRAWINGS DOUBLE UP AND RIGHT + S_brcorn: U+255d # ╝ BOX DRAWINGS DOUBLE UP AND LEFT + S_crwall: U+256c # ╬ BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + S_tuwall: U+2569 # ╩ BOX DRAWINGS DOUBLE UP AND HORIZONTAL + S_tdwall: U+2566 # ╦ BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + S_tlwall: U+2563 # ╣ BOX DRAWINGS DOUBLE VERTICAL AND LEFT + S_trwall: U+2560 # ╠ BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + S_ndoor: U+00b7 # MIDDLE DOT + S_vodoor: U+2592 # MEDIUM SHADE + S_hodoor: U+2592 # MEDIUM SHADE +# S_bars: U+2261 # IDENTICAL TO + S_bars: U+2980 # ⦀ +# S_tree: U+03a8 # GREEK CAPITAL LETTER PSI +# S_tree: U+1F332 # 🌲 + S_tree: U+2660 # ♠ + S_room: U+00b7 # MIDDLE DOT + S_engroom: U+03BE # Greek Small Letter Xi + S_darkroom: U+00b7 # MIDDLE DOT + S_upladder: U+2264 # LESS-THAN OR EQUAL TO + S_dnladder: U+2265 # GREATER-THAN OR EQUAL TO + S_altar: U+03A9 # GREEK CAPITAL LETTER OMEGA + S_grave: U+2020 # DAGGER + G_fountain: U+2320/0-150-255 # TOP HALF INTEGRAL + S_pool: U+224b # TRIPLE TILDE + S_ice: U+00b7 # MIDDLE DOT +# S_ice: U+2744 # ❄️ + S_lava: U+224b # TRIPLE TILDE + S_lavawall: U+2248 # ALMOST EQUAL TO + S_vodbridge: U+00b7 # MIDDLE DOT + S_hodbridge: U+00b7 # MIDDLE DOT + S_water: U+2248 # ALMOST EQUAL TO + S_web: U+00A4 # CURRENCY SIGN + S_vbeam: U+2502 # BOX DRAWINGS LIGHT VERTICAL + S_hbeam: U+2500 # BOX DRAWINGS LIGHT HORIZONTAL + S_sw_tc: U+2594 # UPPER ONE EIGHTH BLOCK + S_sw_ml: U+258f # LEFT ONE EIGHTH BLOCK + S_sw_mr: U+2595 # RIGHT ONE EIGHTH BLOCK + S_sw_bc: U+2581 # LOWER ONE EIGHTH BLOCK + S_expl_tc: U+2594 # UPPER ONE EIGHTH BLOCK + S_expl_ml: U+258f # LEFT ONE EIGHTH BLOCK + S_expl_mr: U+2595 # RIGHT ONE EIGHTH BLOCK + S_expl_bc: U+2581 # LOWER ONE EIGHTH BLOCK + G_vwall_sokoban: U+2502/blue + G_hwall_sokoban: U+2500/blue + G_tlcorn_sokoban: U+250c/blue + G_trcorn_sokoban: U+2510/blue + G_blcorn_sokoban: U+2514/blue + G_brcorn_sokoban: U+2518/blue + G_crwall_sokoban: U+253C/blue + G_tuwall_sokoban: U+2534/blue + G_tdwall_sokoban: U+252C/blue + G_tlwall_sokoban: U+2524/blue + G_trwall_sokoban: U+251C/blue + G_vwall_gehennom: U+2502/red + G_hwall_gehennom: U+2500/red + G_tlcorn_gehennom: U+250c/red + G_trcorn_gehennom: U+2510/red + G_blcorn_gehennom: U+2514/red + G_brcorn_gehennom: U+2518/red + G_crwall_gehennom: U+253C/red + G_tuwall_gehennom: U+2534/red + G_tdwall_gehennom: U+252C/red + G_tlwall_gehennom: U+2524/red + G_trwall_gehennom: U+251C/red + G_vwall_knox: U+2502/126-230-230 + G_hwall_knox: U+2500/126-230-230 + G_tlcorn_knox: U+250c/126-230-230 + G_trcorn_knox: U+2510/126-230-230 + G_blcorn_knox: U+2514/126-230-230 + G_brcorn_knox: U+2518/126-230-230 + G_crwall_knox: U+253C/126-230-230 + G_tuwall_knox: U+2534/126-230-230 + G_tdwall_knox: U+252C/126-230-230 + G_tlwall_knox: U+2524/126-230-230 + G_trwall_knox: U+251C/126-230-230 + G_vwall_mines: U+2502/190-126-0 + G_hwall_mines: U+2500/190-126-0 + G_tlcorn_mines: U+250c/190-126-0 + G_trcorn_mines: U+2510/190-126-0 + G_blcorn_mines: U+2514/190-126-0 + G_brcorn_mines: U+2518/190-126-0 + G_crwall_mines: U+253C/190-126-0 + G_tuwall_mines: U+2534/190-126-0 + G_tdwall_mines: U+252C/190-126-0 + G_tlwall_mines: U+2524/190-126-0 + G_trwall_mines: U+251C/190-126-0 +finish + +start: AmigaFont + Description: Amiga hack.font line-drawing and effect characters + # Dungeon features + S_stone: \x20 + S_vwall: \xc0 + S_hwall: \xc1 + S_tlcorn: \xc2 + S_trcorn: \xc3 + S_blcorn: \xc4 + S_brcorn: \xc5 + S_crwall: \xc6 + S_tuwall: \xd8 + S_tdwall: \xd6 + S_tlwall: \xd7 + S_trwall: \xd5 + S_ndoor: \xd9 + S_vodoor: \x91 + S_hodoor: \x92 + S_vcdoor: \x93 + S_hcdoor: \x94 + S_bars: '#' + S_tree: '#' + S_room: '.' + S_darkroom: \x20 + S_corr: \xe5 + S_litcorr: \xe5 + S_upstair: '<' + S_dnstair: '>' + S_upladder: '<' + S_dnladder: '>' + S_altar: '_' + S_grave: \x5c + S_throne: '#' + S_sink: '{' + S_fountain: '}' + S_pool: '*' + S_ice: '}' + S_lava: '*' + S_vodbridge: '*' + S_hodbridge: '#' + S_vcdbridge: '#' + S_hcdbridge: '.' + S_air: '#' + S_cloud: '}' + # Traps: all default to '^' except web + S_web: '"' + # Effects + S_vbeam: \xf1 + S_hbeam: \xf0 + S_lslant: \xf2 + S_rslant: \xf3 + S_digbeam: '*' + S_flashbeam: '!' + S_boomleft: '{' + S_boomright: '}' + S_ss1: '@' + S_ss2: '&' + S_ss3: '*' + S_ss4: '#' + S_sw_tl: \xf4 + S_sw_tc: \xf5 + S_sw_tr: \xf6 + S_sw_ml: \xf7 + S_sw_mr: \xef + S_sw_bl: \xf8 + S_sw_bc: \xf9 + S_sw_br: \xfa + S_explode1: \xe6 + S_explode2: \xea + S_explode3: \xe7 + S_explode4: \xec + S_explode5: \xd4 + S_explode6: \xed + S_explode7: \xe8 + S_explode8: \xeb + S_explode9: \xe9 +finish + # symbols EOF diff --git a/dat/themerms.lua b/dat/themerms.lua new file mode 100644 index 000000000..6aff95286 --- /dev/null +++ b/dat/themerms.lua @@ -0,0 +1,1097 @@ +-- NetHack themerms.lua $NHDT-Date: 1744445274 2025/04/12 00:07:54 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.40 $ +-- Copyright (c) 2020 by Pasi Kallinen +-- NetHack may be freely redistributed. See license for details. +-- +-- themerooms is an array of tables. +-- the tables define "name", "frequency", "contents", "mindiff" and "maxdiff". +-- * "name" is not shown in-game; it is so that developers can specify a +-- certain room to generate by using the THEMERM or THEMERMFILL environment +-- variable. While technically optional, it should be provided on all the +-- rooms; if it isn't, the room can't be directly specified. +-- * "frequency" is optional; if omitted, 1 is assumed. +-- * "contents" is a function describing what gets put into the room. +-- * "mindiff" and "maxdiff" are optional and independent; if omitted, the +-- room is not constrained by level difficulty. +-- * "eligible" is optional; if omitted, True is assumed. +-- +-- themeroom_fills is an array of tables with the exact same structure as +-- themerooms. It is used for contents of a room that are independent of its +-- shape, so that interestingly-shaped themerooms can be filled with a variety +-- of contents. +-- * The "contents" functions in themeroom_fills take the room they are +-- filling as an argument. +-- * Frequency of themeroom_fills is a separate pool from themerooms, and has +-- no effect on how likely that any given room will receive a themeroom_fill. +-- +-- des.room({ type = "ordinary", filled = 1 }) +-- - ordinary rooms can be converted to shops or any other special rooms. +-- - filled = 1 means the room gets random room contents, even if it +-- doesn't get converted into a special room. Without filled, +-- the room only gets what you define in here. +-- - use type = "themed" to force a room that's never converted +-- to a special room, such as a shop or a temple. +-- +-- for each level, the core first calls pre_themerooms_generate(), +-- then it calls themerooms_generate() multiple times until it decides +-- enough rooms have been generated, and then it calls +-- post_themerooms_generate(). When the level has been generated, with +-- joining corridors and rooms filled, the core calls post_level_generate(). +-- The lua state is persistent through the gameplay, but not across saves, +-- so remember to reset any variables. + +local postprocess = { }; + +themeroom_fills = { + + { + name = "Ice room", + contents = function(rm) + local ice = selection.room(); + des.terrain(ice, "I"); + if (percent(25)) then + local mintime = 1000 - (nh.level_difficulty() * 100); + local ice_melter = function(x,y) + nh.start_timer_at(x,y, "melt-ice", mintime + nh.rn2(1000)); + end; + ice:iterate(ice_melter); + end + end, + }, + + { + name = "Cloud room", + contents = function(rm) + local fog = selection.room(); + for i = 1, (fog:numpoints() / 4) do + des.monster({ id = "fog cloud", asleep = true }); + end + des.gas_cloud({ selection = fog }); + end, + }, + + { + name = "Boulder room", + mindiff = 4, + contents = function(rm) + local locs = selection.room():percentage(30); + local func = function(x,y) + if (percent(50)) then + des.object("boulder", x, y); + else + des.trap("rolling boulder", x, y); + end + end; + locs:iterate(func); + end, + }, + + { + name = "Spider nest", + contents = function(rm) + local spooders = nh.level_difficulty() > 8; + local locs = selection.room():percentage(30); + local func = function(x,y) + des.trap({ type = "web", x = x, y = y, + spider_on_web = spooders and percent(80) }); + end + locs:iterate(func); + end, + }, + + { + name = "Trap room", + contents = function(rm) + local traps = { "arrow", "dart", "falling rock", "bear", + "land mine", "sleep gas", "rust", + "anti magic" }; + shuffle(traps); + local locs = selection.room():percentage(30); + local func = function(x,y) + des.trap(traps[1], x, y); + end + locs:iterate(func); + end, + }, + + { + name = "Garden", + eligible = function(rm) return rm.lit == true; end, + contents = function(rm) + local s = selection.room(); + local npts = (s:numpoints() / 6); + for i = 1, npts do + des.monster({ id = "wood nymph", asleep = true }); + if (percent(30)) then + des.feature("fountain"); + end + end + table.insert(postprocess, { handler = make_garden_walls, + data = { sel = selection.room() } }); + end + }, + + { + name = "Buried treasure", + contents = function(rm) + des.object({ id = "chest", buried = true, contents = function(otmp) + local xobj = otmp:totable(); + -- keep track of the last buried treasure + if (xobj.NO_OBJ == nil) then + table.insert(postprocess, { handler = make_dig_engraving, + data = { x = xobj.ox, y = xobj.oy }}); + end + for i = 1, d(3,4) do + des.object(); + end + end }); + end, + }, + + { + name = "Buried zombies", + contents = function(rm) + local diff = nh.level_difficulty() + -- start with [1..4] for low difficulty + local zombifiable = { "kobold", "gnome", "orc", "dwarf" }; + if diff > 3 then -- medium difficulty + zombifiable[5], zombifiable[6] = "elf", "human"; + if diff > 6 then -- high difficulty (relatively speaking) + zombifiable[7], zombifiable[8] = "ettin", "giant"; + end + end + for i = 1, (rm.width * rm.height) / 2 do + shuffle(zombifiable); + local o = des.object({ id = "corpse", montype = zombifiable[1], + buried = true }); + o:stop_timer("rot-corpse"); + o:start_timer("zombify-mon", math.random(990, 1010)); + end + end, + }, + + { + name = "Massacre", + contents = function(rm) + local mon = { "apprentice", "warrior", "ninja", "thug", + "hunter", "acolyte", "abbot", "page", + "attendant", "neanderthal", "chieftain", + "student", "wizard", "valkyrie", "tourist", + "samurai", "rogue", "ranger", "priestess", + "priest", "monk", "knight", "healer", + "cavewoman", "caveman", "barbarian", + "archeologist" }; + local idx = math.random(#mon); + for i = 1, d(5,5) do + if (percent(10)) then idx = math.random(#mon); end + des.object({ id = "corpse", montype = mon[idx] }); + end + end, + }, + + { + name = "Statuary", + contents = function(rm) + for i = 1, d(5,5) do + des.object({ id = "statue" }); + end + for i = 1, d(3) do + des.trap("statue"); + end + end, + }, + + + { + name = "Light source", + eligible = function(rm) return rm.lit == false; end, + contents = function(rm) + des.object({ id = "oil lamp", lit = true }); + end + }, + + { + name = "Temple of the gods", + contents = function(rm) + des.altar({ align = align[1] }); + des.altar({ align = align[2] }); + des.altar({ align = align[3] }); + end, + }, + + { + name = "Ghost of an Adventurer", + contents = function(rm) + local loc = selection.room():rndcoord(0); + des.monster({ id = "ghost", asleep = true, waiting = true, + coord = loc }); + if percent(65) then + des.object({ id = "dagger", coord = loc, buc = "not-blessed" }); + end + if percent(55) then + des.object({ class = ")", coord = loc, buc = "not-blessed" }); + end + if percent(45) then + des.object({ id = "bow", coord = loc, buc = "not-blessed" }); + des.object({ id = "arrow", coord = loc, buc = "not-blessed" }); + end + if percent(65) then + des.object({ class = "[", coord = loc, buc = "not-blessed" }); + end + if percent(20) then + des.object({ class = "=", coord = loc, buc = "not-blessed" }); + end + if percent(20) then + des.object({ class = "?", coord = loc, buc = "not-blessed" }); + end + end, + }, + + { + name = "Storeroom", + contents = function(rm) + local locs = selection.room():percentage(30); + local func = function(x,y) + if (percent(25)) then + des.object("chest"); + else + des.monster({ class = "m", appear_as = "obj:chest" }); + end + end; + locs:iterate(func); + end, + }, + + { + name = "Teleportation hub", + contents = function(rm) + local locs = selection.room():filter_mapchar("."); + for i = 1, 2 + nh.rn2(3) do + local pos = locs:rndcoord(1); + if (pos.x > 0) then + pos.x = pos.x + rm.region.x1 - 1; + pos.y = pos.y + rm.region.y1; + table.insert(postprocess, { handler = make_a_trap, + data = { type = "teleport", seen = true, + coord = pos, teledest = 1 } }); + end + end + end, + }, +}; + +themerooms = { + { + name = "default", + frequency = 1000, + contents = function() + des.room({ type = "ordinary", filled = 1 }); + end + }, + + { + name = "Fake Delphi", + contents = function() + des.room({ type = "ordinary", w = 11,h = 9, filled = 1, + contents = function() + des.room({ type = "ordinary", x = 4,y = 3, w = 3,h = 3, + filled = 1, + contents = function() + des.door({ state="random", wall="all" }); + end + }); + end + }); + end, + }, + + { + name = "Room in a room", + contents = function() + des.room({ type = "ordinary", filled = 1, + contents = function() + des.room({ type = "ordinary", + contents = function() + des.door({ state="random", wall="all" }); + end + }); + end + }); + end, + }, + + { + name = "Huge room with another room inside", + contents = function() + des.room({ type = "ordinary", w = nh.rn2(10)+11,h = nh.rn2(5)+8, + filled = 1, + contents = function() + if (percent(90)) then + des.room({ type = "ordinary", filled = 1, + contents = function() + des.door({ state="random", wall="all" }); + if (percent(50)) then + des.door({ state="random", wall="all" }); + end + end + }); + end + end + }); + end, + }, + + { + name = "Nesting rooms", + contents = function() + des.room({ type = "ordinary", w = 9 + nh.rn2(4), h = 9 + nh.rn2(4), + filled = 1, + contents = function(rm) + local wid = math.random(math.floor(rm.width / 2), rm.width - 2); + local hei = math.random(math.floor(rm.height / 2), + rm.height - 2); + des.room({ type = "ordinary", w = wid,h = hei, filled = 1, + contents = function() + if (percent(90)) then + des.room({ type = "ordinary", filled = 1, + contents = function() + des.door({ state="random", wall="all" }); + if (percent(15)) then + des.door({ state="random", wall="all" }); + end + end + }); + end + des.door({ state="random", wall="all" }); + if (percent(15)) then + des.door({ state="random", wall="all" }); + end + end + }); + end + }); + end, + }, + + { + name = "Default room with themed fill", + frequency = 6, + contents = function() + des.room({ type = "themed", contents = themeroom_fill }); + end + }, + + { + name = "Unlit room with themed fill", + frequency = 2, + contents = function() + des.room({ type = "themed", lit = 0, contents = themeroom_fill }); + end + }, + + { + name = "Room with both normal contents and themed fill", + frequency = 2, + contents = function() + des.room({ type = "themed", filled = 1, contents = themeroom_fill }); + end + }, + + { + name = 'Pillars', + contents = function() + des.room({ type = "themed", w = 10, h = 10, + contents = function(rm) + local terr = { "-", "-", "-", "-", "L", "P", "T" }; + shuffle(terr); + for x = 0, (rm.width / 4) - 1 do + for y = 0, (rm.height / 4) - 1 do + des.terrain({ x = x * 4 + 2, y = y * 4 + 2, typ = terr[1], lit = -2 }); + des.terrain({ x = x * 4 + 3, y = y * 4 + 2, typ = terr[1], lit = -2 }); + des.terrain({ x = x * 4 + 2, y = y * 4 + 3, typ = terr[1], lit = -2 }); + des.terrain({ x = x * 4 + 3, y = y * 4 + 3, typ = terr[1], lit = -2 }); + end + end + end + }); + end, + }, + + { + name = 'Mausoleum', + contents = function() + des.room({ type = "themed", w = 5 + nh.rn2(3)*2, h = 5 + nh.rn2(3)*2, + contents = function(rm) + des.room({ type = "themed", + x = (rm.width - 1) / 2, y = (rm.height - 1) / 2, + w = 1, h = 1, joined = false, + contents = function() + if (percent(50)) then + local mons = { "M", "V", "L", "Z" }; + shuffle(mons); + des.monster({ class = mons[1], x=0,y=0, waiting = 1 }); + else + des.object({ id = "corpse", montype = "@", coord = {0,0} }); + end + if (percent(20)) then + des.door({ state="secret", wall="all" }); + end + end + }); + end + }); + end, + }, + + { + name = 'Random dungeon feature in the middle of an odd-sized room', + contents = function() + local wid = 3 + (nh.rn2(3) * 2); + local hei = 3 + (nh.rn2(3) * 2); + des.room({ type = "ordinary", filled = 1, w = wid, h = hei, + contents = function(rm) + local feature = { "C", "L", "I", "P", "T" }; + shuffle(feature); + des.terrain((rm.width - 1) / 2, (rm.height - 1) / 2, + feature[1]); + end + }); + end, + }, + + { + name = 'L-shaped', + contents = function() + des.map({ map = [[ +-----xxx +|...|xxx +|...|xxx +|...---- +|......| +|......| +|......| +--------]], contents = function(m) filler_region(1,1); end }); + end, + }, + + { + name = 'L-shaped, rot 1', + contents = function() + des.map({ map = [[ +xxx----- +xxx|...| +xxx|...| +----...| +|......| +|......| +|......| +--------]], contents = function(m) filler_region(5,1); end }); + end, + }, + + { + name = 'L-shaped, rot 2', + contents = function() + des.map({ map = [[ +-------- +|......| +|......| +|......| +----...| +xxx|...| +xxx|...| +xxx-----]], contents = function(m) filler_region(1,1); end }); + end, + }, + + { + name = 'L-shaped, rot 3', + contents = function() + des.map({ map = [[ +-------- +|......| +|......| +|......| +|...---- +|...|xxx +|...|xxx +-----xxx]], contents = function(m) filler_region(1,1); end }); + end, + }, + + { + name = 'Blocked center', + contents = function() + des.map({ map = [[ +----------- +|.........| +|.........| +|.........| +|...LLL...| +|...LLL...| +|...LLL...| +|.........| +|.........| +|.........| +-----------]], contents = function(m) + if (percent(30)) then + local terr = { "-", "P" }; + shuffle(terr); + des.replace_terrain({ region = {1,1, 9,9}, + fromterrain = "L", + toterrain = terr[1] }); + end + filler_region(1,1); + end }); + end, + }, + + { + name = 'Circular, small', + contents = function() + des.map({ map = [[ +xx---xx +x--.--x +--...-- +|.....| +--...-- +x--.--x +xx---xx]], contents = function(m) filler_region(3,3); end }); + end, + }, + + { + name = 'Circular, medium', + contents = function() + des.map({ map = [[ +xx-----xx +x--...--x +--.....-- +|.......| +|.......| +|.......| +--.....-- +x--...--x +xx-----xx]], contents = function(m) filler_region(4,4); end }); + end, + }, + + { + name = 'Circular, big', + contents = function() + des.map({ map = [[ +xxx-----xxx +x---...---x +x-.......-x +--.......-- +|.........| +|.........| +|.........| +--.......-- +x-.......-x +x---...---x +xxx-----xxx]], contents = function(m) filler_region(5,5); end }); + end, + }, + + { + name = 'T-shaped', + contents = function() + des.map({ map = [[ +xxx-----xxx +xxx|...|xxx +xxx|...|xxx +----...---- +|.........| +|.........| +|.........| +-----------]], contents = function(m) filler_region(5,5); end }); + end, + }, + + { + name = 'T-shaped, rot 1', + contents = function() + des.map({ map = [[ +-----xxx +|...|xxx +|...|xxx +|...---- +|......| +|......| +|......| +|...---- +|...|xxx +|...|xxx +-----xxx]], contents = function(m) filler_region(2,2); end }); + end, + }, + + { + name = 'T-shaped, rot 2', + contents = function() + des.map({ map = [[ +----------- +|.........| +|.........| +|.........| +----...---- +xxx|...|xxx +xxx|...|xxx +xxx-----xxx]], contents = function(m) filler_region(2,2); end }); + end, + }, + + { + name = 'T-shaped, rot 3', + contents = function() + des.map({ map = [[ +xxx----- +xxx|...| +xxx|...| +----...| +|......| +|......| +|......| +----...| +xxx|...| +xxx|...| +xxx-----]], contents = function(m) filler_region(5,5); end }); + end, + }, + + { + name = 'S-shaped', + contents = function() + des.map({ map = [[ +-----xxx +|...|xxx +|...|xxx +|...---- +|......| +|......| +|......| +----...| +xxx|...| +xxx|...| +xxx-----]], contents = function(m) filler_region(2,2); end }); + end, + }, + + { + name = 'S-shaped, rot 1', + contents = function() + des.map({ map = [[ +xxx-------- +xxx|......| +xxx|......| +----......| +|......---- +|......|xxx +|......|xxx +--------xxx]], contents = function(m) filler_region(5,5); end }); + end, + }, + + { + name = 'Z-shaped', + contents = function() + des.map({ map = [[ +xxx----- +xxx|...| +xxx|...| +----...| +|......| +|......| +|......| +|...---- +|...|xxx +|...|xxx +-----xxx]], contents = function(m) filler_region(5,5); end }); + end, + }, + + { + name = 'Z-shaped, rot 1', + contents = function() + des.map({ map = [[ +--------xxx +|......|xxx +|......|xxx +|......---- +----......| +xxx|......| +xxx|......| +xxx--------]], contents = function(m) filler_region(2,2); end }); + end, + }, + + { + name = 'Cross', + contents = function() + des.map({ map = [[ +xxx-----xxx +xxx|...|xxx +xxx|...|xxx +----...---- +|.........| +|.........| +|.........| +----...---- +xxx|...|xxx +xxx|...|xxx +xxx-----xxx]], contents = function(m) filler_region(6,6); end }); + end, + }, + + { + name = 'Four-leaf clover', + contents = function() + des.map({ map = [[ +-----x----- +|...|x|...| +|...---...| +|.........| +---.....--- +xx|.....|xx +---.....--- +|.........| +|...---...| +|...|x|...| +-----x-----]], contents = function(m) filler_region(6,6); end }); + end, + }, + + { + name = 'Water-surrounded vault', + contents = function() + des.map({ map = [[ +}}}}}} +}----} +}|..|} +}|..|} +}----} +}}}}}}]], contents = function(m) + des.region({ region={3,3,3,3}, type="themed", irregular=true, + filled=0, joined=false }); + local nasty_undead = { "giant zombie", "ettin zombie", "vampire lord" }; + local chest_spots = { { 2, 2 }, { 3, 2 }, { 2, 3 }, { 3, 3 } }; + + shuffle(chest_spots) + -- Guarantee an escape item inside one of the chests, to prevent + -- the hero falling in from above and becoming permanently stuck + -- [cf. generate_way_out_method(sp_lev.c)]. + -- If the escape item is made of glass or crystal, make sure that + -- the chest isn't locked so that kicking it to gain access to its + -- contents won't be necessary; otherwise retain lock state from + -- random creation. + -- "pick-axe", "dwarvish mattock" could be included in the list of + -- escape items but don't normally generate in containers. + local escape_items = { + "scroll of teleportation", "ring of teleportation", + "wand of teleportation", "wand of digging" + }; + local itm = obj.new(escape_items[math.random(#escape_items)]); + local itmcls = itm:class() + local box + if itmcls[ "material" ] == "glass" then + -- explicitly force chest to be unlocked + box = des.object({ id = "chest", coord = chest_spots[1], + olocked = "no" }); + else + -- accept random locked/unlocked state + box = des.object({ id = "chest", coord = chest_spots[1] }); + end; + box:addcontent(itm); + + for i = 2, #chest_spots do + des.object({ id = "chest", coord = chest_spots[i] }); + end + + shuffle(nasty_undead); + des.monster(nasty_undead[1], 2, 2); + des.exclusion({ type = "teleport", region = { 2,2, 3,3 } }); + end }); + end, + }, + + { + name = 'Twin businesses', + mindiff = 4, -- arbitrary + contents = function() + -- Due to the way room connections work in mklev.c, we must guarantee + -- that the "aisle" between the shops touches all four walls of the + -- larger room. Thus it has an extra width and height. + des.room({ type="themed", w=9, h=5, contents = function() + -- There are eight possible placements of the two shops, four of + -- which have the vertical aisle in the center. + southeast = function() return percent(50) and "south" or "east" end + northeast = function() return percent(50) and "north" or "east" end + northwest = function() return percent(50) and "north" or "west" end + southwest = function() return percent(50) and "south" or "west" end + placements = { + { lx = 1, ly = 1, rx = 4, ry = 1, lwall = "south", rwall = southeast() }, + { lx = 1, ly = 2, rx = 4, ry = 2, lwall = "north", rwall = northeast() }, + { lx = 1, ly = 1, rx = 5, ry = 1, lwall = southeast(), rwall = southwest() }, + { lx = 1, ly = 1, rx = 5, ry = 2, lwall = southeast(), rwall = northwest() }, + { lx = 1, ly = 2, rx = 5, ry = 1, lwall = northeast(), rwall = southwest() }, + { lx = 1, ly = 2, rx = 5, ry = 2, lwall = northeast(), rwall = northwest() }, + { lx = 2, ly = 1, rx = 5, ry = 1, lwall = southwest(), rwall = "south" }, + { lx = 2, ly = 2, rx = 5, ry = 2, lwall = northwest(), rwall = "north" } + } + ltype,rtype = "weapon shop","armor shop" + if percent(50) then + ltype,rtype = rtype,ltype + end + shopdoorstate = function() + if percent(1) then + return "locked" + elseif percent(50) then + return "closed" + else + return "open" + end + end + p = placements[d(#placements)] + des.room({ type=ltype, x=p["lx"], y=p["ly"], w=3, h=3, filled=1, joined=false, + contents = function() + des.door({ state=shopdoorstate(), wall=p["lwall"] }) + end + }); + des.room({ type=rtype, x=p["rx"], y=p["ry"], w=3, h=3, filled=1, joined=false, + contents = function() + des.door({ state=shopdoorstate(), wall=p["rwall"] }) + end + }); + end + }); + end + }, + +}; + +-- store these at global scope, they will be reinitialized in +-- pre_themerooms_generate +debug_rm_idx = nil +debug_fill_idx = nil + +-- Given a point in a themed room, ensure that themed room is stocked with +-- regular room contents. +-- With 30% chance, also give it a random themed fill. +function filler_region(x, y) + local rmtyp = "ordinary"; + local func = nil; + if (percent(30)) then + rmtyp = "themed"; + func = themeroom_fill; + end + des.region({ region={x,y,x,y}, type=rmtyp, irregular=true, filled=1, contents = func }); +end + +function is_eligible(room, mkrm) + local t = type(room); + local diff = nh.level_difficulty(); + if (room.mindiff ~= nil and diff < room.mindiff) then + return false + elseif (room.maxdiff ~= nil and diff > room.maxdiff) then + return false + end + if (mkrm ~= nil and room.eligible ~= nil) then + return room.eligible(mkrm); + end + return true +end + +-- given the name of a themed room or fill, return its index in that array +function lookup_by_name(name, checkfills) + if name == nil then + return nil + end + if checkfills then + for i = 1, #themeroom_fills do + if themeroom_fills[i].name == name then + return i + end + end + else + for i = 1, #themerooms do + if themerooms[i].name == name then + return i + end + end + end + return nil +end + +-- called repeatedly until the core decides there are enough rooms +function themerooms_generate() + if debug_rm_idx ~= nil then + -- room may not be suitable for stairs/portals, so create the "default" + -- room half of the time + -- (if the user specified BOTH a room and a fill, presumably they are + -- interested in what happens when that room gets that fill, so don't + -- bother generating default-with-fill rooms as happens below) + local actualrm = lookup_by_name("default", false); + if percent(50) then + if is_eligible(themerooms[debug_rm_idx]) then + actualrm = debug_rm_idx + else + pline("Warning: themeroom '"..themerooms[debug_rm_idx].name + .."' is ineligible") + end + end + themerooms[actualrm].contents(); + return + elseif debug_fill_idx ~= nil then + -- when a fill is requested but not a room, still create the "default" + -- room half of the time, and "default with themed fill" half of the time + -- (themeroom_fill will take care of guaranteeing the fill in it) + local actualrm = lookup_by_name(percent(50) and "Default room with themed fill" + or "default") + themerooms[actualrm].contents(); + return + end + local pick = nil; + local total_frequency = 0; + for i = 1, #themerooms do + if (type(themerooms[i]) ~= "table") then + nh.impossible('themed room '..i..' is not a table') + elseif is_eligible(themerooms[i], nil) then + -- Reservoir sampling: select one room from the set of eligible rooms, + -- which may change on different levels because of level difficulty. + local this_frequency; + if (themerooms[i].frequency ~= nil) then + this_frequency = themerooms[i].frequency; + else + this_frequency = 1; + end + total_frequency = total_frequency + this_frequency; + -- avoid rn2(0) if a room has freq 0 + if this_frequency > 0 and nh.rn2(total_frequency) < this_frequency then + pick = i; + end + end + end + if pick == nil then + nh.impossible('no eligible themed rooms?') + return + end + themerooms[pick].contents(); +end + +-- called before any rooms are generated +function pre_themerooms_generate() + local debug_themerm = nh.debug_themerm(false) + local debug_fill = nh.debug_themerm(true) + local xtrainfo = "" + debug_rm_idx = lookup_by_name(debug_themerm, false) + debug_fill_idx = lookup_by_name(debug_fill, true) + if debug_themerm ~= nil and debug_rm_idx == nil then + if lookup_by_name(debug_themerm, true) ~= nil then + xtrainfo = "; it is a fill type" + end + pline("Warning: themeroom '"..debug_themerm + .."' not found in themerooms"..xtrainfo, true) + end + if debug_fill ~= nil and debug_fill_idx == nil then + if lookup_by_name(debug_fill, false) ~= nil then + xtrainfo = "; it is a room type" + end + pline("Warning: themeroom fill '"..debug_fill + .."' not found in themeroom_fills"..xtrainfo, true) + end +end + +-- called after all rooms have been generated +-- but before creating connecting corridors/doors, or filling rooms +function post_themerooms_generate() +end + +function themeroom_fill(rm) + if debug_fill_idx ~= nil then + if is_eligible(themeroom_fills[debug_fill_idx], rm) then + themeroom_fills[debug_fill_idx].contents(rm); + else + -- ideally this would be a debugpline, not a full pline, and offer + -- some more context on whether it failed because of difficulty or + -- because of eligible function returning false; the warning doesn't + -- necessarily mean anything. + pline("Warning: fill '"..themeroom_fills[debug_fill_idx].name + .."' is not eligible in room that generated it") + end + return + end + local pick = nil; + local total_frequency = 0; + for i = 1, #themeroom_fills do + if (type(themeroom_fills[i]) ~= "table") then + nh.impossible('themeroom fill '..i..' must be a table') + elseif is_eligible(themeroom_fills[i], rm) then + -- Reservoir sampling: select one room from the set of eligible rooms, + -- which may change on different levels because of level difficulty. + local this_frequency; + if (themeroom_fills[i].frequency ~= nil) then + this_frequency = themeroom_fills[i].frequency; + else + this_frequency = 1; + end + total_frequency = total_frequency + this_frequency; + -- avoid rn2(0) if a fill has freq 0 + if this_frequency > 0 and nh.rn2(total_frequency) < this_frequency then + pick = i; + end + end + end + if pick == nil then + nh.impossible('no eligible themed room fills?') + return + end + themeroom_fills[pick].contents(rm); +end + +-- postprocess callback: create an engraving pointing at a location +function make_dig_engraving(data) + local floors = selection.negate():filter_mapchar("."); + local pos = floors:rndcoord(0); + local tx = data.x - pos.x - 1; + local ty = data.y - pos.y; + local dig = ""; + if (tx == 0 and ty == 0) then + dig = " here"; + else + if (tx < 0 or tx > 0) then + dig = string.format(" %i %s", math.abs(tx), (tx > 0) and "east" or "west"); + end + if (ty < 0 or ty > 0) then + dig = dig .. string.format(" %i %s", math.abs(ty), (ty > 0) and "south" or "north"); + end + end + des.engraving({ coord = pos, type = "burn", text = "Dig" .. dig }); +end + +-- postprocess callback: turn room walls into trees +function make_garden_walls(data) + local sel = data.sel:grow(); + -- change walls to trees + des.replace_terrain({ selection = sel, fromterrain="w", toterrain = "T" }); + -- update secret doors; attempting to change to AIR will set arboreal flag + des.replace_terrain({ selection = sel, fromterrain="S", toterrain = "A" }); +end + +-- postprocess callback: make a trap +function make_a_trap(data) + if (data.teledest == 1 and data.type == "teleport") then + local locs = selection.negate():filter_mapchar("."); + repeat + data.teledest = locs:rndcoord(1); + until (data.teledest.x ~= data.coord.x and data.teledest.y ~= data.coord.y); + end + des.trap(data); +end + +-- called once after the whole level has been generated +function post_level_generate() + for i, v in ipairs(postprocess) do + v.handler(v.data); + end + postprocess = { }; +end diff --git a/dat/tower.des b/dat/tower.des deleted file mode 100644 index c58fb8b5e..000000000 --- a/dat/tower.des +++ /dev/null @@ -1,147 +0,0 @@ -# NetHack 3.6 tower.des $NHDT-Date: 1432512784 2015/05/25 00:13:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# NetHack may be freely redistributed. See license for details. -# -# Upper stage of Vlad's tower -MAZE:"tower1",' ' -FLAGS: noteleport,hardfloor,solidify -GEOMETRY:half-left,center -MAP - --- --- --- - |.| |.| |.| ----S---S---S--- -|.......+.+...| ----+-----.----- - |...\.|.+.| ----+-----.----- -|.......+.+...| ----S---S---S--- - |.| |.| |.| - --- --- --- -ENDMAP -$niches = { (03,01), (03,09), (07,01), (07,09), (11,01), (11,09) } -SHUFFLE: $niches -LADDER:(11,05),down -# The lord and his court -MONSTER:('V',"Vlad the Impaler"),(06,05) -MONSTER:'V',$niches[0] -MONSTER:'V',$niches[1] -MONSTER:'V',$niches[2] -MONSTER:'V',$niches[3] -MONSTER:'V',$niches[4] -MONSTER:'V',$niches[5] -# The doors -DOOR:closed,(08,03) -DOOR:closed,(10,03) -DOOR:closed,(03,04) -DOOR:locked,(10,05) -DOOR:locked,(08,07) -DOOR:locked,(10,07) -DOOR:closed,(03,06) -# treasures -OBJECT:('(',"chest"),(07,05) - -OBJECT:('(',"chest"),$niches[0] -OBJECT:('(',"chest"),$niches[1] -OBJECT:('(',"chest"),$niches[2] -OBJECT:('(',"chest"),$niches[3] -CONTAINER:('(',"chest"),$niches[4] { - OBJECT:('(', "wax candle"), quantity:4d2 -} -CONTAINER:('(',"chest"),$niches[5] { - OBJECT:('(', "tallow candle"), quantity:4d2 -} -# We have to protect the tower against outside attacks -NON_DIGGABLE:(00,00,14,10) - - -# Intermediate stage of Vlad's tower -MAZE:"tower2",' ' -FLAGS: noteleport,hardfloor,solidify -GEOMETRY:half-left,center -MAP - --- --- --- - |.| |.| |.| ----S---S---S--- -|.S.........S.| ----.------+---- - |......|..| ---------.------ -|.S......+..S.| ----S---S---S--- - |.| |.| |.| - --- --- --- -ENDMAP -# Random places are the 10 niches -$place = { (03,01),(07,01),(11,01),(01,03),(13,03), - (01,07),(13,07),(03,09),(07,09),(11,09) } -SHUFFLE: $place -LADDER:(11,05),up -LADDER:(03,07),down -DOOR:locked,(10,04) -DOOR:locked,(09,07) -MONSTER:'&',$place[0] -MONSTER:'&',$place[1] -MONSTER:('d',"hell hound pup"),$place[2] -MONSTER:('d',"hell hound pup"),$place[3] -MONSTER:('d',"winter wolf"),$place[4] -CONTAINER:('(',"chest"),$place[5] { - OBJECT:('"',"amulet of life saving") -} -CONTAINER:('(',"chest"),$place[6] { - OBJECT:('"',"amulet of strangulation") -} -OBJECT:('[',"water walking boots"),$place[7] -OBJECT:('[',"crystal plate mail"),$place[8] -OBJECT:('+',"invisibility"),$place[9] -# Walls in the tower are non diggable -NON_DIGGABLE:(00,00,14,10) - - -# Bottom most stage of Vlad's tower -MAZE:"tower3",' ' -FLAGS: noteleport,hardfloor,solidify -GEOMETRY:half-left,center -MAP - --- --- --- - |.| |.| |.| - ---S---S---S--- - |.S.........S.| ------.........----- -|...|.........+...| -|.---.........---.| -|.|.S.........S.|.| -|.---S---S---S---.| -|...|.|.|.|.|.|...| ----.---.---.---.--- - |.............| - --------------- -ENDMAP -# Random places are the 10 niches -$place = { (05,01),(09,01),(13,01),(03,03),(15,03), - (03,07),(15,07),(05,09),(09,09),(13,09) } -SHUFFLE: $place -BRANCH:(02,05,02,05),(00,00,00,00) -LADDER:(05,07),up -# Entry door is, of course, locked -DOOR:locked,(14,05) -# Let's put a dragon behind the door, just for the fun... -MONSTER:'D',(13,05) -MONSTER:random,(12,04) -MONSTER:random,(12,06) -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -MONSTER:random,random -OBJECT:(')',"long sword"),$place[0] -TRAP:random,$place[0] -OBJECT:('(',"lock pick"),$place[1] -TRAP:random,$place[1] -OBJECT:('[',"elven cloak"),$place[2] -TRAP:random,$place[2] -OBJECT:('(',"blindfold"),$place[3] -TRAP:random,$place[3] -# Walls in the tower are non diggable -NON_DIGGABLE:(00,00,18,12) diff --git a/dat/tower1.lua b/dat/tower1.lua new file mode 100644 index 000000000..eae3016b3 --- /dev/null +++ b/dat/tower1.lua @@ -0,0 +1,74 @@ +-- NetHack tower tower1.lua $NHDT-Date: 1717178759 2024/05/31 18:05:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- Upper stage of Vlad's tower +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "solidify") +des.map({ halign = "half-left", valign = "center", map = [[ + --- --- --- + |.| |.| |.| +---S---S---S--- +|.......+.+...| +---+-----.----- + |...\.|.+.| +---+-----.----- +|.......+.+...| +---S---S---S--- + |.| |.| |.| + --- --- --- +]] }); + +local niches = { {03,01}, {03,09}, {07,01}, {07,09}, {11,01}, {11,09} }; +shuffle(niches); + +des.ladder("down", 11,05) +-- The lord and his court +des.monster("Vlad the Impaler", 06, 05) +des.monster("V",niches[1]) +des.monster("V",niches[2]) +des.monster("V",niches[3]) +-- The brides; they weren't named in Bram Stoker's original _Dracula_ +-- and when appearing in umpteen subsequent books and movies there is +-- no consensus for their names. According to the Wikipedia entry for +-- "Brides of Dracula", the "Czechoslovakian TV film Hrabe Drakula (1971)" +-- gave them titles rather than (or perhaps in addition to) specific names +-- and we use those titles here. Marking them as 'waiting' forces them to +-- start in vampire form instead of vampshifted into bat/fog/wolf form. +local Vgenod = nh.is_genocided("vampire"); +local Vnames = { nil, nil, nil }; +if (not Vgenod) then + Vnames = { "Madame", "Marquise", "Countess" }; +end +des.monster({ id="vampire lady", coord=niches[4], name=Vnames[1], waiting=1 }) +des.monster({ id="vampire lady", coord=niches[5], name=Vnames[2], waiting=1 }) +des.monster({ id="vampire lady", coord=niches[6], name=Vnames[3], waiting=1 }) +-- The doors +des.door("closed",08,03) +des.door("closed",10,03) +des.door("closed",03,04) +des.door("locked",10,05) +des.door("locked",08,07) +des.door("locked",10,07) +des.door("closed",03,06) +-- treasures +des.object("chest", 07,05) + +des.object("chest",niches[6]) +des.object("chest",niches[1]) +des.object("chest",niches[2]) +des.object("chest",niches[3]) +des.object({ id = "chest", coord=niches[4], + contents = function() + des.object({ id = "wax candle", quantity=math.random(4,8) }) + end +}); +des.object({ id = "chest", coord=niches[5], + contents = function() + des.object({ id = "tallow candle", quantity=math.random(4,8) }) + end +}); +-- We have to protect the tower against outside attacks +des.non_diggable(selection.area(00,00,14,10)) diff --git a/dat/tower2.lua b/dat/tower2.lua new file mode 100644 index 000000000..57b5d6003 --- /dev/null +++ b/dat/tower2.lua @@ -0,0 +1,62 @@ +-- NetHack tower tower2.lua $NHDT-Date: 1652196037 2022/05/10 15:20:37 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "solidify") +des.map({ halign = "half-left", valign = "center", map = [[ + --- --- --- + |.| |.| |.| +---S---S---S--- +|.S.........S.| +---.------+---- + |......|..| +--------.------ +|.S......+..S.| +---S---S---S--- + |.| |.| |.| + --- --- --- +]] }); +-- Random places are the 10 niches +local place = { {03,01},{07,01},{11,01},{01,03},{13,03}, + {01,07},{13,07},{03,09},{07,09},{11,09} } +shuffle(place) + +des.ladder("up", 11,05) +des.ladder("down", 03,07) +des.door("locked",10,04) +des.door("locked",09,07) +des.monster("&",place[10]) +des.monster("&",place[1]) +des.monster("hell hound pup",place[2]) +des.monster("hell hound pup",place[3]) +des.monster("winter wolf",place[4]) +des.object({ id = "chest", coord = place[5], + contents = function() + des.object("amulet of life saving") + end +}); +des.object({ id = "chest", coord = place[6], + contents = function() + des.object("amulet of strangulation") + end +}); +des.object("water walking boots",place[7]) +des.object("crystal plate mail",place[8]) + +local spbooks = { + "spellbook of invisibility", + "spellbook of cone of cold", + "spellbook of create familiar", + "spellbook of clairvoyance", + "spellbook of charm monster", + "spellbook of stone to flesh", + "spellbook of polymorph" +} +shuffle(spbooks); +des.object(spbooks[1],place[9]) + +-- Walls in the tower are non diggable +des.non_diggable(selection.area(00,00,14,10)) + diff --git a/dat/tower3.lua b/dat/tower3.lua new file mode 100644 index 000000000..fe1484db2 --- /dev/null +++ b/dat/tower3.lua @@ -0,0 +1,50 @@ +-- NetHack tower tower3.lua $NHDT-Date: 1652196038 2022/05/10 15:20:38 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "solidify") +des.map({ halign = "half-left", valign = "center", map = [[ + --- --- --- + |.| |.| |.| + ---S---S---S--- + |.S.........S.| +-----.........----- +|...|.........+...| +|.---.........---.| +|.|.S.........S.|.| +|.---S---S---S---.| +|...|.|.|.|.|.|...| +---.---.---.---.--- + |.............| + --------------- +]] }); +-- Random places are the 10 niches +local place = { {05,01},{09,01},{13,01},{03,03},{15,03}, + {03,07},{15,07},{05,09},{09,09},{13,09} } + +des.levregion({ type="branch", region={02,05,02,05} }) +des.ladder("up", 05,07) +-- Entry door is, of course, locked +des.door("locked",14,05) +-- Let's put a dragon behind the door, just for the fun... +des.monster("D", 13, 05) +des.monster({ x=12, y=04 }) +des.monster({ x=12, y=06 }) +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.monster() +des.object("long sword",place[4]) +des.trap({ coord = place[4] }) +des.object("lock pick",place[1]) +des.trap({ coord = place[1] }) +des.object("elven cloak",place[2]) +des.trap({ coord = place[2] }) +des.object("blindfold",place[3]) +des.trap({ coord = place[3] }) +-- Walls in the tower are non diggable +des.non_diggable(selection.area(00,00,18,12)) diff --git a/dat/tribute b/dat/tribute index 73a5a3815..a2944d7d6 100644 --- a/dat/tribute +++ b/dat/tribute @@ -1,4 +1,4 @@ -# NetHack 3.6 tribute $NHDT-Date: 1574107001 2019/11/18 19:56:41 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.86 $ +# NetHack 5.0 tribute $NHDT-Date: 1726809275 2024/09/20 05:14:35 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.118 $ # Copyright (c) 2017 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. # A tribute introduced in NetHack 3.6.0 to: @@ -1064,7 +1064,7 @@ The bursar scowled at him. "No need to get carried away," he said. # # # -%title Sourcery (10) +%title Sourcery (11) # p. 9 (Signet edition; passage starts mid-paragraph and ends mid-paragraph) %passage 1 "[...] And what would humans be without love?" @@ -1073,6 +1073,7 @@ RARE, said Death. [...] [Sourcery, by Terry Pratchett] %e passage +# p. 180 (passage starts mid-paragraph) %passage 2 They suffered from the terrible delusion that something could be done. They seemed prepared to make the world the way they wanted it or die in the @@ -1094,8 +1095,10 @@ MANY HAVE, said Death evenly. [Sourcery, by Terry Pratchett] %e passage -# pp. 40-41 (text has 'the moment and the words' which is obviously a typo; -# it might have intended 'that' for 'and'; we just drop 'and') +# pp. 40-41 (this used to have a correction for "an obvious typo" in the last +# sentence [before the footnote] which was actually a transcription +# error, with "were" erroneously inserted [causing the sentence to +# parse oddly] but not present in the original text; fixed now) %passage 4 The thief, as will become apparent, was a special type of thief. This thief was an artist of theft. Other thieves merely stole everything that @@ -1113,8 +1116,8 @@ while it was in the process of winning a race. When Gritoller Mimpsey, vice-president of the Thieves' Guild, was jostled in the marketplace and then found on returning home that a freshly-stolen handful of diamonds had vanished from their place of concealment, he knew who to blame.(1) -This was the type of thief that could steal the initiative, the moment the -words were out of your mouth. +This was the type of thief that could steal the initiative, the moment +and the words out of your mouth. (1) This was because Gritoller had swallowed the jewels for safe keeping. @@ -1259,6 +1262,26 @@ They are not necessarily very good at it. [Sourcery, by Terry Pratchett] %e passage +# +# additional passage added for 5.0 +# +# p. 164 (passage begins mid-sentence) +%passage 11 +[...] killing a brother wizard with magic was well-nigh impossible on +account of the layers of protective spells that any cautious wizard +maintained about his person at all times.(1) The first thing a young +wizard learns at Unseen University--apart from where his peg is, and +which way to the lavatory--is that he must protect himself at all times. + +Some people think this is paranoia, but it isn't. Paranoids only think +everyone is out to get them. Wizards /know/ it. + +(1) Of course, wizards often killed one another by ordinary, non-magical +means, but this was perfectly allowable and death by assassination was +considered natural causes for a wizard. + + [Sourcery, by Terry Pratchett] +%e passage %e title # # @@ -1473,7 +1496,7 @@ Nanny Ogg massaged some like back into her fingers. "I said, what about this rule about not meddling?" said Magrat. -"Ah," said Nanny. She took the girl's arm. "The thing is," she explained, +"Ah," said Nanny. She took the girl's arm. "The thing is," she explained, "as you advance in the Craft, you'll learn there is another rule. Esme's obeyed it all her life." @@ -1794,7 +1817,7 @@ yards away rather than the innocent bystander at whom it was aimed. %e passage # p. 26 (first and second paragraphs are actually end of one section, # start of next one; first 'Thunder rolled...' had three dot -# ellipsis, second has four, elipsis plus final period-- +# ellipsis, second has four, ellipsis plus final period-- # first changed to four here so that they match) %passage 3 Thunder rolled.... @@ -2184,7 +2207,9 @@ so far was the ability to turn gold into less gold. [Moving Pictures, by Terry Pratchett] %e passage -# pp. 44, 45, 46 (multiple paragraphs skipped in the first two gaps) +# pp. 44, 45, 46 (multiple paragraphs skipped in the first two gaps; +# the dog is Gaspode, who can talk but conceals that from +# almost everybody; his use of 'bin' for 'been' is accurate) %passage 3 He looked down. There was a dog sitting by his feet. @@ -2328,7 +2353,7 @@ nearest salad growing district was thirty slow miles away. Fruntkin the short-order chef hazarded a guess. -'Celery?" he said. He peered closer. "Yeah, celery." +"Celery?" he said. He peered closer. "Yeah, celery." "It /brown/." @@ -2380,7 +2405,7 @@ Rock grinned. "Right you are, Mr Dibbler," he said. # p. 189 %passage 12 Magic wasn't difficult. That was the big secret that the whole baroque -edifice or wizardry had been set up to conceal. Anyone with a bit of +edifice of wizardry had been set up to conceal. Anyone with a bit of intelligence and enough perseverance could do magic, which was why the wizards cloaked it with rituals and the whole pointy-hat business. @@ -2396,7 +2421,8 @@ All over the entire room, sometimes. [Moving Pictures, by Terry Pratchett] %e passage -# p. 204 (passage ends mid-paragraph; musings are by Gaspode the dog) +# p. 204 (passage ends mid-paragraph; musings are by Gaspode the dog; +# 'sunnink', 'fings', 'wot' are accurate, as is 'finds' for 'find') %passage 13 Sunnink dreadful in there, he thought. Prob'ly tentacled fings that rips your face off. I mean, when you finds mysterious doors in old hills, it @@ -2419,7 +2445,7 @@ megalomaniac!" Dibbler removed his cigar. -"That's /Mister/ Megalomanic to you," he said. +"That's /Mister/ Megalomaniac to you," he said. [Moving Pictures, by Terry Pratchett] %e passage @@ -2437,6 +2463,37 @@ Dibbler removed his cigar. [Moving Pictures, by Terry Pratchett] %e passage +# +# New for 5.0 - these are worthy but 16 passages are already more than enough. +#-# +#-# p. 304 +#-%passage 17 +#-"Did I hear things, or can that little dog speak?" said Dibbler. +#- +#-"He says he can't," said Victor. +#- +#-Dibbler hesitated. The excitement was unhinging him a little. "Well," he +#-said, "I suppose he should know." +#- +#- [Moving Pictures, by Terry Pratchett] +#-%e passage +#-# p. 329 (two farmers have just watched a pair of wizards incompetently +#-# flying together on a broom crash into a barn containing harvested +#-# cabbages; one of them had predicted, accurately as it turned out, +#-# that the flyers would crash out the far side accompanied by +#-# scattering chickens and a shower of feathers; 'believer' had +#-# scoffed at the prediction because there were no chickens inside; +#-# they've just looked inside and confirmed the lack of any poultry) +#-%passage 18 +#-The farmers crept away. +#- +#-"Dang me," said the believer in cabbages. "They're wizards. Best not to +#-meddle in the affairs of danged wizards." +#- +#-"Yeah," said the other farmer. "Er... what does dang mean? Exactly?" +#- +#- [Moving Pictures, by Terry Pratchett] +#-%e passage %e title # # @@ -2929,15 +2986,22 @@ The witches watched with interest. # # # -%title Small Gods (12) +%title Small Gods (15) +# p. 174 (Harper Torch edition; passage starts mid-paragraph; speaker is +# the blind philosopher Didactylos referring to a book in scroll +# form called /On Religion/ by another philosopher, Abraxas; +# Didactylos mentions that Old 'Charcoal' Abraxas had been hit by +# lightning 15 times) %passage 1 -He says gods like to see an atheist around. Gives them something to aim at. +"[...] He says gods like to see an atheist around. Gives them something +to aim at." [Small Gods, by Terry Pratchett] %e passage +# p. 79 (passage starts mid-paragraph; speaker is Cut-Me-Own-Hand-Off Dhblah) %passage 2 -Pets are always a great help in times of stress. And in times of starvation -too, o'course. +[...] "Pets are always a great help in times of stress. And in times of +starvation too, o'course." [Small Gods, by Terry Pratchett] %e passage @@ -3136,11 +3200,40 @@ But, on the whole, there are worse places to be buried than inside a lion. [Small Gods, by Terry Pratchett] %e passage +# +# 3 more passages added for 5.0 +# +# p. 7 (Brother Nhumrod is in charge of a group of novices; he's thinking +# about one of them, Brutha, the main character of the story) +%passage 13 +There was something creepy about the boy, Nhumrod thought. It was the way +he looked at you when you were talking, as if he was /listening/. + + [Small Gods, by Terry Pratchett] +%e passage +# p. 11 (musing by the Great God Om) +%passage 14 +The trouble with being a god is that you've got no one to pray to. + + [Small Gods, by Terry Pratchett] +%e passage +# p. 210 (speaker is Didactylos the Ephebian philosopher) +%passage 15 +"Life in this world," he said, "is, as it were, a sojourn in a cave. What +can we know of reality? For all we see of the true nature of existence +is, shall we say, no more than bewildering and amusing shadows cast upon +the inner wall of the cave by the unseen blinding light of absolute truth, +from which we may or may not deduce some glimmer of veracity, and we as +troglodyte seekers of wisdom can only lift our voices to the unseen and +say, humbly, 'Go on, do Deformed Rabbit... it's my favorite.'" + + [Small Gods, by Terry Pratchett] +%e passage %e title # # # -%title Lords and Ladies (12) +%title Lords and Ladies (13) # p. 122 (Harper Torch edition) %passage 1 Elves are wonderful. They provoke wonder. @@ -3160,7 +3253,7 @@ Elves are bad. [Lords and Ladies, by Terry Pratchett] %e passage -# p. 32 +# p. 32 (Magrat has given up being a witch to marry Verence II, Lancre's king) %passage 2 "Hope she does all right as queen," said Nanny. @@ -3224,7 +3317,7 @@ down and further down. "Don't look like a dwarf apart from the height?" -I mean, the helmet and iron boots department is among those you are lacking +"I mean, the helmet and iron boots department is among those you are lacking in," said Ridcully. [Lords and Ladies, by Terry Pratchett] @@ -3244,7 +3337,7 @@ the impossibility of reality, and so on: what this means is that they have got hold of something hot and are gabbling the physics as they go along. (1) It was here that the thaum, hitherto believed to be the smallest -possible particle of magic, was successfully demonstrated to made up of +possible particle of magic, was successfully demonstrated to be made up of /resons/(2) or reality fragments. Currently research indicates that each reson is itself made up of a combination of at least five "flavors," known as "up," "down," "sideways," "sex appeal," and "peppermint." @@ -3271,7 +3364,7 @@ Younger witches, on the other hand, talk about it all the time and believe it involves crystals, mystic forces, and dancing about without yer drawers on. -Everyone may to right, all at the same time. That's the thing about +Everyone may be right, all at the same time. That's the thing about quantum. [Lords and Ladies, by Terry Pratchett] @@ -3369,13 +3462,36 @@ kingdom. [Lords and Ladies, by Terry Pratchett] %e passage +# +# passage added for 5.0 +# +# p. 60 (passage starts mid-paragraph; "paddlin'" is accurate but unclear; +# "ooh-jar" is accurate for ouija after having been butchered by +# Nanny Ogg's previously established 'mastery' of foreign languages) +%passage 13 +"[...] Playing at witches. You know, ooh-jar boards and cards and wearing +black lace gloves with no fingers to 'em and paddlin' with the occult." + +"I don't hold with paddlin' with the occult," said Granny firmly. "Once +you start paddlin' with the occult you start believing in spirits, and +when you start believing in spirits you start believing in demons, and then +before you know where you are you're believing in gods. And then you're +in /trouble/." + +"But all them things exist," said Nanny Ogg. + +"That's no call to go around believing in them. It only encourages 'em." + + [Lords and Ladies, by Terry Pratchett] +%e passage %e title # # # %title Men at Arms (14) +# p. 72 (Harper Torch edition) %passage 1 -The maze was so small that people got lost looking for it. +The maze was so small that people got lost looking /for/ it. [Men at Arms, by Terry Pratchett] %e passage @@ -3383,11 +3499,11 @@ The maze was so small that people got lost looking for it. %passage 2 Ankh-Morpork had a king again. -And this was /right/. And it was /fate/ that let Edward recognize this +And this was /right/. And it was /fate/ that had let Edward recognize this /just/ when he'd got his Plan. And it was /right/ that it was /Fate/, and the city would be /Saved/ from its ignoble present by its /glorius/ -past. He had the /Means/, and he had the /end/. And so on ... -Edward's thoughts often ran like this. +past. He had the /Means/, and he had the /end/. And so on ... Edward's +thoughts often ran like this. He could think in /italics/. Such people need watching. @@ -3549,7 +3665,7 @@ and needs to see in the dark. Strange but true. %e passage # p. 218 %passage 9 -"He's bound to have done /something/," Noddy repeated. +"He's bound to have done /something/," Nobby repeated. In this he was echoing the Patrician's view of crime and punishment. If there was a crime, there should be punishment. If the specific criminal @@ -3622,19 +3738,23 @@ Willie the Vampire masks in order, he said, to take him out of himself. # # # -%title Soul Music (11) +%title Soul Music (13) +# p. 121 (Harper Torch edition; passage starts mid-paragraph) %passage 1 -But this didn't feel like magic. It felt a lot older than that. It felt +But this didn't /feel/ like magic. It felt a lot older than that. It felt like music. [Soul Music, by Terry Pratchett] %e passage +# p. 49 (the skull is a traditional decoration for a wizard's abode; this one +# is the usual perch for, and is conversing with, a talking raven that +# has been translating the Death of Rats' SQUEAKs for Susan Sto Helit) %passage 2 "Yes," said the skull. "Quit while you're a head, that's what I say." [Soul Music, by Terry Pratchett] %e passage -# p.2 (Harper Torch edition) +# p. 2 %passage 3 But if it is true that the act of observing changes the thing which is observed,(1) it's even more true that it changes the observer. @@ -3643,7 +3763,7 @@ observed,(1) it's even more true that it changes the observer. [Soul Music, by Terry Pratchett] %e passage -# p.8 +# p. 8 %passage 4 It is said that whomsoever the gods wish to destroy, they first make mad. In fact, whomsoever the gods wish to destroy, they first hand the @@ -3720,7 +3840,7 @@ Some religions say that the universe was started with a word, a song, a dance, a piece of music. The Listening Monks of the Ramtops have trained their hearing until they can tell the value of a playing card by listening to it, and have made it their task to listen intently to the -subtle sounds of the universe to piece together, from the fossile echoes, +subtle sounds of the universe to piece together, from the fossil echoes, the very first noises. There was certainly, they say, a very strange noise at the beginning of @@ -3800,7 +3920,7 @@ nine times out of ten." "How many times have you had to rely on them, sir?" "Well ... there was Mr. Hong ... that business with the thing in the -Bursar's wardrobe ... that dragon, you remember ..." Ridcully's lips +Bursar's wardrobe ... that dragon, you remember ..." Ridcully's lips moved silently as he counted on his fingers. "Nine times, so far." "It worked every time, sir?" @@ -3841,20 +3961,44 @@ The Chair came down slowly, occasionally glancing fearfully up the stairs. [Soul Music, by Terry Pratchett] %e passage +# +# 2 more passages added for 5.0 +# +# p. 242 (passage starts and ends mid-paragraph; "the Old" rather than "the +# Old " is accurate) +%passage 12 +Wizards were rumored to be wise--in fact, that's where the word came +from.(1) + +(1) From the Old /wys-ars/, lit: one who, at bottom, is very smart. + + [Soul Music, by Terry Pratchett] +%e passage +# p. 351 (passage starts mid-paragraph; Death normally isn't bound by time +# and space so can be everywhere at once, more or less, but in this +# case he is speeding out of Ankh-Morpork and across the countryside +# on a motorcycle invented by UU's Librarian; despite racing along +# at such high speed that the vehicle has steadily disintegrated out +# from under him, progress is slow by his usual standard) +%passage 13 +The fastest way to travel is to be there already. + + [Soul Music, by Terry Pratchett] +%e passage %e title # # # -%title Interesting Times (10) -# p.1 (footnote) +%title Interesting Times (13) +# p. 1 (Harper Torch edition; passage is a footnote) %passage 1 Whatever happens, they say afterwards, it must have been fate. People are always a little confused about this, as they are in the case of miracles. When someone is saved from certain death by a strange concatenation of circumstances, they say that's a miracle. But of course if someone is -killed by a freak chain of events--the oil spilled just there, the safety -fence broken just there--that must also be a miracle. Just because it's -not nice doesn't mean it's not miraculous. +/killed/ by a freak chain of events--the oil spilled just /there/, the +safety fence broken just /there/--that must /also/ be a miracle. Just +because it's not nice doesn't mean it's not miraculous. [Interesting Times, by Terry Pratchett] %e passage @@ -3863,7 +4007,7 @@ not nice doesn't mean it's not miraculous. "Oh, no," said the Lecturer in Recent Runes, pushing his chair back. "Not that. That's meddling with things you don't understand." -"Well, we /are/ wizards," said Ridcully. "We're supposed to meddle with +"Well, we /are/ wizards," said Ridcully. "We're supposed to meddle with things we don't understand. If we hung around waitin' till we understood things we'd never get anything done." @@ -3993,11 +4137,80 @@ followed by long periods of being dead." [Interesting Times, by Terry Pratchett] %e passage +# +# 3 new passages for 5.0 +# +# p. 45 +%passage 11 +Adventure! People talked about the idea as if it was something worthwhile, +rather than a mess of bad food, no sleep, and strange people inexplicably +trying to stick pointed objects in bits of you. + + [Interesting Times, by Terry Pratchett] +%e passage +# p. 52 +%passage 12 +"How /will/ I get back?" he said. + +"Same way you went. We'll find you and bring you out. With surgical +precision." + +Rincewind groaned. He knew what surgical precision meant in Ankh-Morpork. +It meant "to within an inch or two, accompanied by a lot of screaming, and +then they pour hot tar on you just where your leg was." + +But... if you put aside for the moment the certainty that something would +definitely go horribly wrong, it looked foolproof. The trouble was that +wizards were such ingenious fools. + + [Interesting Times, by Terry Pratchett] +%e passage +# pp. 272-274 (most of page 273, is omitted: War introduces his children and +# Rincewind asks Death about the outcome of a battle which is +# imminent; Death's response is that he wouldn't answer even if +# he knew, and Rincewind is astonished that he might not know; +# Death holds a finger up and a butterfly--as a symbol of chaos +# theory--briefly lands on it, then flies away) +%passage 13 +RINCEWIND, ISN'T IT? said Death. YES. GOOD EVENING. I DON'T BELIEVE YOU +HAVE MET WAR. RINCEWIND, WAR. WAR, RINCEWIND. + +[...] + +ON A NIGHT LIKE THIS, said Death, THE ONLY CERTAIN THING IS UNCERTAINTY. +TRITE, I KNOW, BUT TRUE. + +Somewhere on the horizon, thunder rumbled. + +"I'll, er, just be sort of going, then," said Rincewind. + +DON'T BE A STRANGER, said Death, as the wizard hurried off. + +"Odd person," said War. + +WITH HIM HERE, EVEN UNCERTAINTY IS UNCERTAIN. AND I'M NOT SURE EVEN +ABOUT THAT. + +War pulled a large paper-wrapped package out of his saddlebag. + +"We've got... let's see now... Egg and Cress, Chicken Tikka, and Mature +Cheese with Chunky Pickle, I think." + +THEY DO SUCH MARVELOUS THINGS WITH SANDWICHES THESE DAYS. + +"Oh... and Bacon Surprise." + +REALLY? WHAT IS SO SURPRISING ABOUT BACON? + +"I don't know. I suppose it comes as something of a shock to the pig." + + [Interesting Times, by Terry Pratchett] +%e passage %e title # # # -%title Maskerade (9) +%title Maskerade (13) # pp. 81-82, continued on pp. 87-89 (Harper Torch edition; apparently # transcribed from some other edition based on quote marks used; # a great number of very short paragraphs--it stretches a long way @@ -4112,7 +4325,9 @@ barely noticeable even to the closest observation, one winked off. [Maskerade, by Terry Pratchett] %e passage -# p. 67 (Harper Torch edition; as above, transcribed from some other edition) +# p. 67 (Harper Torch edition; as above, transcribed from some other edition; +# passage ends mid-paragraph; the text of the note uses irregular +# indentation and a distinct font that hints at cursive handwriting) %passage 2 The letter inside was on a sheet of the Opera House's own note paper. In neat, copperplate writing, it said: @@ -4251,20 +4466,93 @@ Come on. I want to try a leg of the elephant that bit me." [Maskerade, by Terry Pratchett] %e passage +# +# 4 new passages added for 5.0 +# +# pp. 51-52 (Granny Weatherwax and Nanny Ogg are traveling to Ankh-Morpork +# and Nanny feels that the weather is too chilly for flying; +# Cando Cutoff is a bystander who has told them that the next +# stagecoach won't stop here; they stand in the road to block it) +%passage 10 +"Why've you got broomsticks?" shouted the driver. "Are you witches?" + +"Yes. Have you got any special low terms for witches?" + +"Yeah, how about 'meddling, interfering old baggages'?" + +Cutoff felt that he must have missed part of the conversation, because the +next exchange went like this: + +"What was that again, young man?" + +"Two complimentary tickets to Ankh-Morpork, ma'am. No problem." + +"Inside seats, mind. No traveling on the top." + +"Certainly, ma'am. Excuse me while I just kneel in the dirt so's you can +step up, ma'am." + +Cutoff nodded happily to himself as the coach pulled away again. It was +nice to see that good manners and courtesy were still alive. + + [Maskerade, by Terry Pratchett] +%e passage +# p. 69 (passage starts mid-paragraph) +%passage 11 +"[...] If you wanted a quiet retirement, Mr. Bucket, you shouldn't have +bought the Opera House. You should have done something peaceful, like +alligator dentistry." + + [Maskerade, by Terry Pratchett] +%e passage +# pp. 108-109 (Mr. Pounder, the Opera House rat catcher, has been murdered; +# instead of Death coming to release his soul, the Death of Rats +# is attending; we skip a couple of very short paragraphs) +%passage 12 +"Er... I'm dead, aren't I...?" + +SQUEAK. + +[...] + +The soul of Mr. Pounder looked at his hands. They seemed to be elongating, +and getting hairier. He could feel his ears growing, and a certain rather +embarrassing elongation at the base of his spine. He'd spent most of his +life in a single-minded activity in dark places, yet even so... + +"But I don't /believe/ in reincarnation!" he protested. + +SQUEAK. + +And this, Mr. Pounder understood with absolute rodent clarity, meant: +reincarnation believes in /you/. + + [Maskerade, by Terry Pratchett] +%e passage +# p. 198 (Nanny has come into a substantial sum of money and has grumbled +# about Granny spending so much of it) +%passage 13 +"Money don't buy happiness, Gytha." + +"I only wanted to rent it for a few weeks." + + [Maskerade, by Terry Pratchett] +%e passage %e title # # # %title Feet of Clay (14) +# pp. 66-67 (Harper Torch edition) %passage 1 Rumour is information distilled so finely that it can filter through -anything. It does not need doors and windows -- sometimes it does not need -people. It can exist free and wild, running from ear to ear without ever -touching lips. +anything. It does not need doors and windows--sometimes it doesn't even +need people. It can exist free and wild, running from ear to ear without +ever touching lips. [Feet of Clay, by Terry Pratchett] %e passage -# p. 337 (Harper Torch edition) +# p. 337 %passage 2 It was hard enough to kill a vampire. You could stake them down and turn them into dust and ten years later someone drops a drop of blood in the @@ -4483,7 +4771,7 @@ them. [...]" # # # -%title Hogfather (10) +%title Hogfather (13) # p. 1 (Harper Torch edition) %passage 1 Everything starts somewhere, though many physicists disagree. @@ -4702,9 +4990,9 @@ sleep. "I just knocked over the coal shovel." -"Why are feeling around on the mantelpiece?" +"Why are you feeling around on the mantelpiece?" -Oh, just ... you know, just ... just looking. A little ... experiment. +"Oh, just ... you know, just ... just looking. A little ... experiment. After all, you never know." "You never know what?" @@ -4755,11 +5043,70 @@ Death. OR THE FAME. OR BECAUSE THEY SHOULDN'T. [Hogfather, by Terry Pratchett] %e passage +# +# 3 new passages added for 5.0 +# +# pp. 2-3 (the door turns out to lead to a bathroom designed by Bergholt +# Stuttly "Bloody Stupid" Johnson, an infamous architect and +# landscape designer known for creating dangerous and/or unusable +# versions of whatever he'd been hired to produce) +%passage 11 +The senior wizards of Unseen University stood and looked at the door. + +There was no doubt that whoever had shut it wanted it to stay shut. Dozens +of nails secured it to the door frame. Planks had been nailed right across. +And finally it had, up until this morning, been hidden by a bookcase that +had been put in front of it. + +"And there's the sign, Ridcully," said the Dean. "You /have/ read it, I +assume. You know? The sign which says 'Do not, under any circumstances, +open this door'?" + +"Of course I've read it," said Ridcully. "Why d'yer think I want it +opened?" + +"Er... why?" said the Lecturer in Recent Runes. + +"To see why they wanted it shut, of course."(1) + +(1) This exchange contains almost all you need to know about human +civilization. At least, those bits of it that are now under the sea, +fenced off or still smoking. + + [Hogfather, by Terry Pratchett] +%e passage +# p. 144 (the wizards have been discussing hangover cures and are hoping to +# produce one for Bilious, the god--actually "oh god"--of hangovers) +%passage 12 +Then the Dean repeated the mantra that has had such a marked effect on the +progress of knowledge throughout the ages. + +"Why don't we just mix up absolutely everything and see what happens?" he +said. + +And Ridcully responded with the traditional response. + +"It's got to be worth a try," he said. + + [Hogfather, by Terry Pratchett] +%e passage +# p. 192 (senior wizards are discussing Hex, an organic+clockwork computer +# invented, built, and run by junior wizards and advanced students) +%passage 13 +"I don't hold with using that thinking machine," said the Dean. "I've said +this before. It's meddling with the cult. The /oc/cult has always been +good enough for me, thank you very much." + +"On the other hand it's the only person round here who can think straight +and it does what it's told," said Ridcully. + + [Hogfather, by Terry Pratchett] +%e passage %e title # # # -%title Jingo (12) +%title Jingo (14) %passage 1 # p. 206 (Harper Torch Edition; passage starts mid-paragraph) It was so much easier to blame it on Them. It was bleakly depressing to @@ -4788,7 +5135,7 @@ Selachii thumped the table. 'We could certainly do with one,' said Lord Vetinari. 'We need the money. I was about to say that we cannot /afford/ mercenaries.' -'How can this be?' said Lord Downey. Don't we pay our taxes?' +'How can this be?' said Lord Downey. 'Don't we pay our taxes?' 'Ah, I thought we might come to that,' said Lord Vetinari. He raised his hand and, on cue again, his clerk placed a piece of paper in it. @@ -4824,7 +5171,7 @@ They just haven't been paid.' 'That is a disgusting state of affairs!' -The Patrician raised his eyebrows. 'Commander Vines?' +The Patrician raised his eyebrows. 'Commander Vimes?' 'Yes, sir?' @@ -4835,7 +5182,7 @@ please? My clerk here will give you a list of the prime defaulters.' 'Right, sir. And if they resist, sir?' said Vimes, smiling nastily. 'Oh, how can they resist, commander? This is the will of our civic -leaders.' He took the paper his clerk profferred. 'Let me see, now. Top +leaders.' He took the paper his clerk proffered. 'Let me see, now. Top of the list--' Lord Selachii coughed hurriedly. 'Far too late for that sort of nonsense @@ -5006,8 +5353,8 @@ Patrician up the ladder. called it the Going-Under-the-Water-Safely Device," said Leonard, behind him.(1) "But usually I just think of it as the boat." -(1) Thinking up good names was, oddly enough, was one area where Leonard -of Quirm's genious tended to give up. +(1) Thinking up good names was, oddly enough, one area where Leonard of +Quirm's genius tended to give up. [Jingo, by Terry Pratchett] %e passage @@ -5025,11 +5372,52 @@ him and he's warm for the rest of his life.' See my point?" [Jingo, by Terry Pratchett] %e passage +# +# 2 new passages added for 5.0 +# +# p. 90 (second line beginning with "Sir." rather than "Sir," is accurate) +%passage 13 +"We need simple answers, Vimes." + +"Sir. Fred and Nobby are /good/ at simple." + +The Patrician turned away and looked out over the city. + +"Ah," he said in a quieter voice. "Simple men to see the simple truth." + +"This is a fact, sir." + +"You are learning fast, Vimes." + +"Couldn't say about that, sir." + +"And when they have found the simple truth, Vimes?" + +"Can't argue with the truth, sir." + +"In my experience, Vimes, you can argue with anything." + + [Jingo, by Terry Pratchett] +%e passage +# p. 238 (the name "71-hour Ahmed" is accurate) +%passage 14 +71-hour Ahmed was not /super/stitious. He was substitious, which put him +in a minority among humans. He didn't believe in the things everyone +believed in but which nevertheless weren't true. He believed instead in +the things that were true in which no one else believed. There are many +such substitions, ranging from "It'll get better if you don't pick at it" +all the way up to "Sometimes things just happen." + + [Jingo, by Terry Pratchett] +%e passage %e title # # # -%title The Last Continent (10) +# The last continent is Discworld's analog of Australia, known variously +# as "XXXX", "EcksEcksEcksEcks", and "FourEcks". +# +%title The Last Continent (14) # p. 260 (Harper Torch edition) %passage 1 "Is it true that your life passes before your eyes before you die?" @@ -5045,13 +5433,14 @@ FRONT OF THEIR EYES BEFORE THEY DIE. THE PROCESS IS CALLED "LIVING". [...] [The Last Continent, by Terry Pratchett] %e passage +# p. 16 %passage 2 "When You're Up to Your Ass in Alligators, Today Is the First Day of the Rest of Your Life." [The Last Continent, by Terry Pratchett] %e passage -# p.3 (Harper Torch edition) +# p. 3 (Harper Torch edition) %passage 3 All tribal myths are true, for a given value of "true." @@ -5205,11 +5594,104 @@ of clothes, often with the same sort of insignia. [The Last Continent, by Terry Pratchett] %e passage +# +# 4 new passages added for 5.0 +# +# pp. 113-114 (passage ends mid-paragraph) +%passage 11 +"This is certainly a very... /original/ cart," said Rincewind. + +"Got a few modifications of my own," said Mad. He grinned evilly. "You a +wizard, mister?" + +"Broadly speaking, yes." + +"Any good?" Mad was loading another crossbow. + +Rincewind hesitated. "No," he said. + +"Lucky for you," said Mad. "I'd have killed you if you were. Can't stand +wizards. Bunch of wowsers, right?" + +He grasped the handles of the bent stovepipe and swiveled it around. + +"Here they come," he muttered. + +Rincewind peered over the top of Mad's head. There was a piece of mirror +in the bend of the pipe. It showed the road behind, and half a dozen dots +under another cloud of red dust. + +"Road gang," said Mad. "After my cargo. Steal anything, they will. All +bastards are bastards, but some bastards is /bastards/." [...] + + [The Last Continent, by Terry Pratchett] +%e passage +# pp. 246-247 (Ponder Stibbins had stayed behind, then changed his mind and +# isn't wearing his robe after swimming to catch up with the +# senior wizards' boat; Ridcully is smoking a pipe) +%passage 12 +"And, while it is good to see you, Stibbins, albeit rather more of you +than I would usually care to contemplate, I am moved to ask why you are, +in fact, here." + +"I suddenly felt it would be unfair to deprive the University of my +services, sir." + +"Really? A sudden rush of nostalgia for the old alma mater, eh?" + +"You could say that, sir." + +Ridcully's eyes twinkled behind the smoke and, not for the first time, +Ponder suspected that the man was sometimes rather cleverer than he +appeared. It would not be hard. + + [The Last Continent, by Terry Pratchett] +%e passage +# p. 263 (Rincewind is going to be executed the next day; a previous prisoner +# who was well known for multiple escapes had scratched "look at the +# hinges" on the cell's wall--the cell's door just lifts off) +%passage 13 +At moments like this cowardice was an exact science. There were times +that called for mindless, terror-filled panic, and times that called for +measured, considered, /thoughtful/ panic. Right now he was in a place of +safety. It was, admittedly, the death cell, but the point was that it +was perhaps the one place in this country where nothing bad was going to +happen for a little while. The Ecksians didn't look like the kind of +people who went in for torture, although it was always possible that they +might make him eat some more of their food. So, for the moment, he had +/time/. Time to plan ahead, to consider his next move, to apply his +intellect to the problem at hand. + +He stared at the wall for a moment, then stood up and gripped the bars. + +Right. That seemed to be about long enough. Now to run like hell. + + [The Last Continent, by Terry Pratchett] +%e passage +# pp. 333-334 (passage starts mid-paragraph and ends mid-paragraph; Rincewind +# has asked whether a haunted brewery might have been built on a +# site that's sacred to indigenous people; the answer is no) +%passage 14 +"[...] Some chief went to prison to see the prime minister and said, +'Mate, your mob can dig it all up and drop it over the edge of the world, +no worries.'" + +"Why did he have to go to prison?" + +"We put all our politicians in prison as soon as they're elected. Don't +you?" + +"Why?" + +"It saves time. [...]" + + [The Last Continent, by Terry Pratchett] +%e passage %e title # # # -%title Carpe Jugulum (8) +%title Carpe Jugulum (12) # p. 10 (Harper Torch edition) %passage 1 Agnes tended to obey rules. Perdita didn't. Perdita thought that not @@ -5304,19 +5786,80 @@ saw what happened to the others! /You/ got your fingers burned!." [Carpe Jugulum, by Terry Pratchett] %e passage +# +# 4 new passages added for 5.0 +# +# p. 24 (ellipsis occurs at start of paragraph; Quite Reverend Oats has opened +# /The Book of Om/ at random and is reading the passage found there) +%passage 9 +"... silence is an answer that begs three more questions. Seek and you will +find, but first you should know what you seek." + + [Carpe Jugulum, by Terry Pratchett] +%e passage +# p. 71 (conversation between witches Nanny Ogg and Agnes Nitt; King Verance II +# of Lancre has invited a family of vampires from Uberwald, among many +# other guests, to attend his and Queen Magrat's baby's naming ceremony +# at midnight; Nanny has gotten their servant Igor drunk; he passed out) +%passage 10 +"But /vampires/... what's Granny going to say?" + +"Listen, my girl. They'll be gone by tomorrow... well today, really. We'll +just keep an eye on 'em and wave 'em goodbye when they go." + +"We don't even know what they look like!" + +Nanny looked at the recumbant Igor. + +"On reflection, maybe, I should've asked him." she said. She brightened up. +"Still, there's one way to find them. There's something everyone knows +about vampires..." + +In fact there are many things everyone knows about vampires, without really +taking into account that perhaps the vampires known them by now, too. + + [Carpe Jugulum, by Terry Pratchett] +%e passage +# p. 297 (Granny Weatherwax has just regained consciousness after nearly +# freezing to death and has figured out that Oats has used his copy of +# /The Book of Om/ as fuel for a campfire to save her) +%passage 11 +"Good thing you were able to get a fire going, all the same," she said, +without turning around. + +"I have always found that if I put my trust in Om a way will be found," +said Oats, hurrying after her. + +"I reckon Om helps those who helps themselves," said Granny. + + [Carpe Jugulum, by Terry Pratchett] +%e passage +# p. 316 ("He" is Shawn Ogg, Lancre's one-man army [because they haven't +# needed more rather than because of competence on his part]) +%passage 12 +He was trying to find some help in the ancient military journals of General +Tacticus, whose intelligent campaigning had been so successful that he'd +lent his very name to the detailed prosecution of martial endeavor, and had +actually found a section headed What to Do If One Army Occupies a Well- +fortified and Superior Ground and the Other Does Not, but since the first +sentence read "Endeavor to be the one inside" he'd rather lost heart. + + [Carpe Jugulum, by Terry Pratchett] +%e passage %e title # # # -%title The Fifth Elephant (9) +%title The Fifth Elephant (12) +# p. 25 (Harper Torch edition) [passage starts mid-paragraph] %passage 1 -You did something because it had always been done, -and the explanation was "but we've always done it this way." -A million dead people can't have been wrong, can they? +You did something because it had always been done, and the explanation +was "but we've /always/ done it this way." A million dead people can't +have been wrong, can they? [The Fifth Elephant, by Terry Pratchett] %e passage -# p. 233 (Harper Torch edition) [this is a footnote] +# p. 233 (this is a footnote) %passage 2 He'd noticed that sex bore some resemblance to cookery: It fascinated people, they sometimes bought books full of complicated recipes and @@ -5327,7 +5870,9 @@ maybe had a slice of tomato. [The Fifth Elephant, by Terry Pratchett] %e passage -# pp. 80-81 (Harper Torch edition) [the pigeon is trained to carry messages] +# pp. 80-81 ('[...]' represents more than a full page which has been omitted; +# passage ends mid-paragraph; +# the pigeon is trained to carry messages for the Watch) %passage 3 Constable Shoe saluted, but a little testily. He'd been waiting rather a long time. @@ -5437,7 +5982,60 @@ I'M NOT SURE. "And who gives him /his/ orders?" "Everyone," said Tantony bitterly. Vimes nodded. Been there, he thought. -Been there, done that, bought the dublet... +Been there, done that, bought the doublet... + + [The Fifth Elephant, by Terry Pratchett] +%e passage +# +# 3 new passages added for 5.0 +# +# pp. 34-35 (a footnote about Cpl Nobbs lately dressing as a woman omitted) +%passage 10 +Corporal Cheery Littlebottom pronounced her name "Cheri." She was a she, +and therefore a rare bloom in Ankh-Morpork. + +It wasn't that dwarfs weren't interested in sex. They saw the vital need +for fresh dwarfs to leave their goods to and continue the mining work +after they had gone. It was simply that they also saw no point in +distinguishing between the sexes anywhere but in private. There was no +such thing as a Dwarfish female pronoun or, once the children were on +solids, any such thing as women's work. + +Then Cheery Littlebottom had arrived in Ankh-Morpork, and had seen that +there were men out there who did /not/ wear chain mail or leather +underwear(1), but /did/ wear interesting colors and exciting makeup, and +these men were called "women." + +And in the little bullet head the thought had arisen: "Why not me?" + +Now she was being denounced in cellars and dwarf bars across the city as +the first dwarf in Ankh-Morpork to wear a skirt. It was hard-wearing +brown leather and as objectively erotic as a piece of wood but, as some +older dwarfs would point out, somewhere under there were his /knees/.(2) + +(1) At least of the sort /she/ normally wore. + +(2) They couldn't bring themselves to utter the word "her." + + [The Fifth Elephant, by Terry Pratchett] +%e passage +# p. 38 (omitted portion spans two separate sentences; pasg ends mid-paragraph) +%passage 11 +Uberwald [...] was mostly so thickly forested, so creased by little +mountain ranges and beset by rivers, that it was largely unmapped. It +was mostly unexplored, too.(1) + +(1) At least, by proper explorers. Just living there doesn't count. + + [The Fifth Elephant, by Terry Pratchett] +%e passage +# p. 219 (passage begins mid-sentence) +%passage 12 +[...] Sam Vimes had learned a lot from watching Lady Sybil. She didn't +mean to act like that, but she'd been born to it, into a class which had +always behaved this way: You went through the world as if there was +/no possibility/ that anyone would stop you or question you, and most of +the time that's exactly what didn't happen. [The Fifth Elephant, by Terry Pratchett] %e passage @@ -5445,27 +6043,29 @@ Been there, done that, bought the dublet... # # # -%title The Truth (8) +%title The Truth (13) +# p. 21 (Harper Torch edition) %passage 1 There are, it has been said, two types of people in the world. There are those who, when presented with a glass that is exactly half full, say: this glass is half full. And then there are those who say: this glass is half empty. -The world belongs, however, to those who can look at the glass and say: -What's up with this glass? Excuse me? Excuse me? This is my glass? I -don't think so. My glass was full! And it was a bigger glass! Who's been -pinching my beer? +The world /belongs/, however, to those who can look at the glass and say: +What's up with this glass? Excuse me? Excuse /me/? /This/ is my glass? +I don't /think/ so. My glass was full! /And/ it was a bigger glass! +Who's been pinching my beer? [The Truth, by Terry Pratchett] -%e passage 1 +%e passage +# p. 5 %passage 2 -The world is made up of four elements: Earth, Air, Fire and Water. -This is a fact well known even to Corporal Nobbs. It's also wrong. -There's a fifth element, and generally it's called Surprise. +The world is made up of four elements: Earth, Air, Fire and Water. This +is a fact well known even to Corporal Nobbs. It's also wrong. There's a +fifth element, and generally it's called Surprise. [The Truth, by Terry Pratchett] -%e passage 2 +%e passage # pp. 1-2 (Harper Torch edition) %passage 3 The rumor spread through the city like wildfire (which had quite often @@ -5572,11 +6172,97 @@ EYES... [The Truth, by Terry Pratchett] %e passage +# +# 5 new passages added for 5.0 +# +# p. 3 (two paragraphs in the middle skipped) +%passage 9 +And the rumor came to the ears of William de Worde, and in a sense it +stopped there, because he dutifully wrote it down. + +It was his job. Lady Margolotta of Uberwald sent him five dollars a month +to do it. The Dowager Duchess of Quirm also sent him five dollars. So +did King Verence of Lancre, and a few other Ramtop notables. So did the +Seriph of Al-Khali, although in this case the payment was half a cartload +of figs, twice a year. + +[...] + +A young man without too many responsibilities could live modestly in +Ankh-Morpork on thirty or forty dollars a month; he always sold the figs, +because although it was possible to live on figs you soon wished you +didn't. + + [The Truth, by Terry Pratchett] +%e passage +# p. 31 +%passage 10 +"And these are your reasons, my lord?" + +"Do you think I have others?" said Lord Vetenari. "My motives, as ever, +are entirely transparent." + +Hughnon reflected that "entirely transparent" meant either that you could +see right through them or couldn't see them at all. + + [The Truth, by Terry Pratchett] +%e passage +# p. 59-60 (passage ends mid-paragraph) +%passage 11 +The Firm had, indeed, not operated in Ankh-Morpork before. Mr. Pin had +kept away because, well, there were plenty of other cities, and an +instinct for survival had told him that the Big Wahooni(1) should wait +a while. [...] + +(1) The world's rarest and most evil-smelling vegetable, and consequently +much prized by connoisseurs (who seldom prize anything cheap and common). +Also a slang term for Ankh-Morpork, although it does not smell as bad as +that. + + [The Truth, by Terry Pratchett] +%e passage +# p. 87-88 ('it' is an imp inside the PDA; warranty text is in a smaller font +# than the rest of text; page 297 has more conditions, effectively +# impossible to comply with, applying to transfer of ownership) +%passage 12 +"Good for you!" it said. "You have wisely purchased the Dis-organizer +Mk II, the latest in biothaumaturgic design, with a host of useful +features and no resemblance whatsoever to the Mk I, which you may have +inadvertently destroyed by stamping on it heavily!" it said, adding, +"This device is provided without warranty of any kind as to reliability, +accuracy, existence or otherwise or fitness for any particular purpose +and Bioalchemic Products specifically does not warrant, guarantee, imply +or make any representations as to its merchantability for any particular +purpose and furthermore shall have no liability for or responsibility to +you or any other person, entity or deity with respect to any loss or +damage whatsoever caused by this device or object or by any attempts to +destroy it by hammering it against a wall or dropping it into a deep well +or by any other means whatsoever and moreover asserts that you indicate +your acceptance of this agreement or any other agreement that may be +substituted at any time by coming within five miles of the product or +observing it through large telescopes or by any other means because you +are such an easily cowed moron who will happily accept arrogant and +unilateral conditions on a piece of highly priced garbage that you would +not dream of accepting on a bag of dog biscuits and is used solely at +your own risk." + + [The Truth, by Terry Pratchett] +%e passage +# p. 168 +%passage 13 +It looked to Sacharissa that the only tools a dwarf needed was his ax and +some means of making fire. That'd eventually get him a forge, and with +that he could make simple tools, and with those he could make /complex/ +tools, and with complex tools a dwarf could more or less make anything. + + [The Truth, by Terry Pratchett] +%e passage %e title # # # -%title Thief of Time (8) +%title Thief of Time (14) +# p. 97 (Harper Torch edition) %passage 1 "No running with scythes!" @@ -5584,7 +6270,7 @@ EYES... %e passage # p. 24 (Harper Torch edition) %passage 2 -Silver stars weren't awarded frequently, and gold starts happened less +Silver stars weren't awarded frequently, and gold stars happened less than once a fortnight, and were vied for accordingly. Right now, Miss Susan selected a silver star. Pretty soon Vincent the Keen would have a galaxy of his very own. To give him his due, he was quite disinterested @@ -5780,6 +6466,94 @@ there to make you think before you broke them. [Thief of Time, by Terry Pratchett] %e passage +# +# 6 new passages added for 5.0 +# +# p. 80 (passage ends mid-paragraph) +%passage 9 +Well, she was partly immortal, and that was all there was to it. She could +see things that were really there(1) [...] + +(1) Which is much harder than seeing things that /aren't/ there. /Everyone/ +does that. + + [Thief of Time, by Terry Pratchett] +%e passage +# p. 82 (passage starts mid-paragraph) +%passage 10 +[...] Some humans would do anything to see if it was possible to do it. +If you put a large switch in some cave somewhere, with a sign on it saying +"End-of-the-World Switch. PLEASE DO NOT TOUCH," the paint wouldn't even +have time to dry. + + [Thief of Time, by Terry Pratchett] +%e passage +# p. 115 (passage ends mid-paragraph; Lobsang's "there" is inside the area +# below, where a hole in the wall leads; Lu-Tze is already inside and +# his "there" is outside where he just was and Lobsang still is) +%passage 11 +"But novices aren't allowed in there under pain of death!" + +"That's a coincidence," said Lu-Tze, lowering himself to the tips of his +fingers. "Because death is what awaits you if you stay out there, too." + +He dropped into the darkness. A moment later there was an unenlightened +curse from below. + +Lobsang climbed in, hung by his fingertips, dropped, and rolled when he hit +the floor below. + +"Well done," said Lu-Tze in the gloom. "When in doubt, choose to live." + + [Thief of Time, by Terry Pratchett] +%e passage +# p. 132 (passage starts mid-paragraph; the abbot's recent reincarnation is +# still an infant) +%passage 12 +"[...] I mean, mentally he's nine hundred years old." + +"That must make him very wise." + +"Pretty wise, pretty wise. But age and wisdom don't necessarily go +together, I've always found," said Lu-Tze, as they approached the abbot's +rooms. "Some people just become stupid with more authority. Not his +Reverence, of course." + + [Thief of Time, by Terry Pratchett] +%e passage +# p. 144 (two instances of singular "Igor" for the person then two plural +# "Igors" for his clan is accurate) +%passage 13 +Igor didn't much like the clock. He was a /people/ person. He preferred +things that bled. And as the clock grew, with its shimmering crystal parts +that didn't seem entirely all /here/, so Jeremy grew more absorbed and Igor +grew more tense. There was definitely something new happening here, and +Igors were avid to learn new things. But there were limits. Igors did not +believe in "Forbidden Knowledge" and "Things Man Was Not Meant to Know" but +obviously there were /some/ things a man was not meant to know, such as +what it felt like to have every single particle of your body sucked into a +little hole, and that seemed to be one of the options available in the +immediate future. + + [Thief of Time, by Terry Pratchett] +%e passage +# p. 170 ('spake' is accurate, as is ending the first paragraph with a colon) +%passage 14 +/In the Second Scroll of Wen the Eternally Surprised/, a story is written +concerning one day when the apprentice Clodpool, in a rebellious mood, +approached Wen and spake thusly: + +"Master, what is the difference between a humanistic, monastic system of +belief in which wisdom is sought by means of an apparently nonsensical +system of questions and answers, and a lot of mystic gibberish made up on +the spur of the moment?" + +Wen considered this for some time, and at last said: "A fish!" + +And Clodpool went away, satisfied. + + [Thief of Time, by Terry Pratchett] +%e passage %e title # # @@ -5789,7 +6563,7 @@ there to make you think before you broke them. # text pages include decorations of varying degrees of elaborateness. # The actual text is probably only novella length. # -%title The Last Hero (7) +%title The Last Hero (13) # p. 41 (EOS edition) %passage 1 Too many people, when listing all the perils to be found in the search @@ -5907,6 +6681,102 @@ betray 'em, quick as a wink. 'Cos that's villaining.' [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] %e passage +# +# 6 new passages added for 5.0 +# +# p. 16 +%passage 8 +The wizards began to gather around the device. + +'Can you see into the future?' said Lord Vetinari. + +'In /theory/ yes, sir.' said Ponder. 'But that would be highly... well, +inadvisable, you see, because initial studies indicate that the fact of +observation would collapse the waveform in phase space.' + +Not a muscle moved on the Patrician's face. + +'Pardon me, I'm a little out of date on faculty staff,' he said. 'Are you +the one who has to take the dried frog pills?' + +'No, sir. That's the Bursar, sir,' said Ponder. 'He has to have them +because he's insane, sir.' + +'Ah,' said Lord Vetinari, and now he /did/ have an expression. It was that +of a man resolutely refraining from saying what was on his mind. + +'What Mr Stibbons /means/, my lord,' said the Archancellor, 'is that there +are billions and billions of futures that, er, /sort of/ exist, d'yer see? +They're all... the possible /shapes/ of the future. But apparently the +first one you actually /look/ at is the one that /becomes/ the future. +It might not be one you'd like. Apparently it's all to do with the +Uncertainty Principle.' + +'And that is...' + +'I'm not sure. Mr Stibbons is the one who knows about that sort of thing.' + + [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] +%e passage +# p. 31 (Leonard of Quirm is heading up a project for Lord Vetinari and +# describing requirements) +%passage 9 +[...] + +'And the help of, oh, sixty apprentices and journeymen from the Guild of +Cunning Artificers. Perhaps there should be a hundred. They will need to +work round the clock.' + +'Apprentices? But I can see to it that the finest craftsmen--' + +Leonard held up a hand. + +'Not craftsmen, my lord,' he said. 'I have no use for people who have +learned the limits of the possible.' + + [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] +%e passage +# p. 80 +%passage 10 +'I'd rather die than sign my name,' said Boy Willie. + +'I'd rather face a dragon,' said Caleb. 'One of the proper old ones, too, +not the fireworky ones you get today.' + +'Once they get you signin' your name, they've got you where they want you,' +said Cohen. + +'Too many letters,' said Truckle. 'All different shapes, too. I always +put an X.' + + [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] +%e passage +# p. 97 +%passage 11 +He hesitated. Lord Vetinari was not a man who delighted in the technical. +There were two cultures, as far as he was concerned. One was the real +one, the other was occupied by people who liked machinery and ate pizza +at unreasonable hours. + + [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] +%e passage +# p. 122 (/Kite/ is the ship's name) +%passage 12 +On the /Kite/, the situation was being 'workshopped.' This is the means by +which people who don't know anything get together to pool their ignorance. + + [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] +%e passage +# p. 161 (Carrot and Rincewind are wondering about the fate of Cohen and +# "the Silver Horde" who seem to have plummeted to certain death) +%passage 13 +'There's always hope.' + +'So? There's always taxes, too. It doesn't make any /difference/. + +Carrot sighed and straightened up. 'I wish you weren't right.' + + [The Last Hero, written by Terry Pratchett, illustrated by Paul Kidby] %e title # # @@ -5920,10 +6790,16 @@ betray 'em, quick as a wink. 'Cos that's villaining.' # which is awarded for best children's book of the year. # (The other Young Adult Discworld books are the five Tiffany Aching ones.) # +# "Mr so-called Amazing Maurice and His Educated Rodents!" (the characters +# rather than the book named for them) were first mentioned--in passing +# rather than part of the story--about 1/3 of the way through _Reaper_Man_. +# (p. 115, ROC edition; the text there does capitalize 'His'; 'Mr' without +# period is accurate; the exclamation is derogatory). +# # _The_Amazing_Maurice..._ may well be the most serious Discworld book. # (Don't worry, it has lots of humor/humour in it....) # -%title The Amazing Maurice and His Educated Rodents (10) +%title The Amazing Maurice and His Educated Rodents (14) # p. 68 (Harperteen edition; _Mr._Bunnsy_Has_an_Adventure_ is a book # within the book, and a brief quote is shown at the beginning # of each chapter. This one is from the start of chapter 4.) @@ -6058,7 +6934,7 @@ merely didn't know where everything else was. [The Amazing Maurice and His Educated Rodents, by Terry Pratchett] %e passage -# pp. 298-300 (Keith has challanged the professional rat piper and offered +# pp. 298-300 (Keith has challenged the professional rat piper and offered # to rid the town of rats for a much lower price; Sardines is # one of the Educated Rodents, known for dancing all the time; # "hwun/two/three/four/" is run-together "one /two/ three /four/"; @@ -6136,11 +7012,83 @@ I'll promise to pretend that humans can think, too." [The Amazing Maurice and His Educated Rodents, by Terry Pratchett] %e passage +# +# 4 new passages added for 5.0 +# +# p. 19 (passage begins mid-paragraph) +%passage 11 +If you knew what it was that people really, /really/ wanted, you very +nearly controlled them. + + [The Amazing Maurice and His Educated Rodents, by Terry Pratchett] +%e passage +# p. 78 +%passage 12 +Sardines had pulled his straw hat out of his knapsack and was holding a +small walking stick. + +It was a /good/ routine, even Maurice had to admit. Some towns had +advertised for a rat piper the very first time he'd done it. People could +tolerate rats in the cream, and rats in the roof, and rats in the teapot, +but they drew the line at tap dancing. If you saw tap dancing-rats, you +were in big trouble. Maurice had reckoned that if only the rats could +play an accordion as well, they could do two towns a day. + + [The Amazing Maurice and His Educated Rodents, by Terry Pratchett] +%e passage +# p. 113-114 (mentioned earlier, when Malicia's parents punish her, she's +# locked out of her bedroom to deny her access to her books) +%passage 13 +"Luckily I'm prepared for every eventuality," said Malicia, and reached +into her bag. There was a sound as of lumps of metal and bottles being +moved around. + +"What have you got in here?" said Maurice. "Everything?" + +"The grapnel and rope ladder take up a lot of room," said Malicia still +feeling around. "And then there's the big medicine kit, and the small +medicine kit, and the knife, and the other knife, and the sewing kit, and +the mirror for sending signals, and... these." + +She pulled out a small bundle of black cloth. When she unrolled it, +Maurice saw the gleam of metal. + +"Ah," he said. "Lock picks, right? I've seen burglars at work--" + +"Hairpins," said Malicia, selecting one. "Hairpins always work in the +books I've read. You just push one into the keyhole and twiddle. I have +a selection of prebent ones." + +Once again Maurice felt a little chill at the back of his head. They work +in /stories/, he thought. Oh dear me. + +"And how come you know so much about picking locks?" he said. + +"I told you, they lock me out of my room to punish me," said Malicia, +twiddling. + +Maurice /had/ seen thieves at work. Men breaking into buildings at night +hated to see dogs, but they didn't mind cats. Cats never attempted to +tear their throats out. And what thieves tended to have, he knew, were +complicated little tools that were used with great care and precision. +They didn't use stu-- + +/Click!/ + + [The Amazing Maurice and His Educated Rodents, by Terry Pratchett] +%e passage +# p. 243 +%passage 14 +Bloodthirsty rats right behind you can give you wings. + + [The Amazing Maurice and His Educated Rodents, by Terry Pratchett] +%e passage %e title # # # -%title Night Watch (7) +%title Night Watch (12) +# p. 393 %passage 1 When Mister Safety Catch Is Not On, Mister Crossbow Is Not Your Friend. @@ -6266,11 +7214,102 @@ And they had to give the target a chance. [Night Watch, by Terry Pratchett] %e passage +# p. 51 +%passage 8 +"We are here, and this is now." Constable Visit, a strict believer in +the Omnian religion, occasionally quoted from their holy book. Vimes +understood it to mean, in less exalted copperspeak, that you have to do +the job that is in front of you. + + [Night Watch, by Terry Pratchett] +%e passage +# p. 85 (Vimes fell through the roof of Unseen University's Library during +# a thunderstorm and ended up 30 years in the past; the Discworld's +# "history monks" aren't just observers and Lu-Tze wants to help +# Vimes get back to same time and circumstances that he came from) +%passage 9 +"Oh, for heavens' sake, Lu-Tze! This is completely unauthorized, you +know! We're supposed to prune out rogue history loops, not expend vast +amounts of time keeping them going!" + +"This one's important. We owe it to the man. It wasn't his fault we had +a temporal shattering just as he fell through the dome." + +"Two timelines running side by side," moaned Qu. "That's quite +unacceptable, you know. I'm having to use techniques that are completely +untried." + +"Yes, but it's only a few days." + +"What about Vimes? Is he strong enough? He's got no training for this!" + +"He defaults to being a copper. A copper's a copper, wherever he is." + + [Night Watch, by Terry Pratchett] +%e passage +# p. 198 (young assassin is Vetinari, well before he eventually becomes +# Patrician; Sam Vimes is living as John Keel, a Watch sergeant, +# and among other things, training his younger self to be a Watchman) +%passage 10 +"Really? That doesn't sound like Swing. How much do I owe you." + +The young man called Havelock gave a shrug. "Call it a dollar," he said. + +"That's very cheap." + +"He wasn't worth more. I should warn you, though. Soon you may want me +to deal with Keel." + +"Surely someone like him wouldn't side with people like Winder and Swing?" + +"He's a side all by himself. He's a complication. You may think it best +if he... ceased to complicate." + +The rattling of the coach underlined the silence this remark caused. It +was moving through a richer part of the city now, where there was more +light and the curfew, being for poorer people, was less rigorously +observed. The figure opposite the Assassin stroked the cat on her lap. + +"No. He'll serve some purpose," said Madam. "Everyone is telling me +about Keel. In a world where we all move in curves he proceeds in a +straight line. And going straight in a world of curves makes things +happen." + + [Night Watch, by Terry Pratchett] +%e passage +# p. 199 (this is a continuation of the conversation in passage 10, with +# several paragraphs leading to it skipped; topic is now about a +# rare book that has callously been destroyed; a sentence about +# "dark green" is omitted) +%passage 11 +"Ah. It contained information of value. [...] Will you tell me?" + +"I /could/ tell you." Havelock smiled again. "But then I would have to +find someone to pay me to kill you." + + [Night Watch, by Terry Pratchett] +%e passage +# p. 250 +%passage 12 +People on the side of The People always ended up disappointed, in any +case. They found that The People tended not to be grateful or +appreciative or forward-thinking or obedient. The People tended to +be small-minded and conservative and not very clever and were even +distrustful of cleverness. And so, the children of the revolution +were faced with the age-old problem: it wasn't that you had the wrong +kind of government, which was obvious, but that you had the wrong kind +of people. + +As soon as you saw people as things to be measured, they didn't measure +up. + + [Night Watch, by Terry Pratchett] +%e passage %e title # # # -%title The Wee Free Men (9) +%title The Wee Free Men (13) # p. 100 (HarperTempest edition; quin==queen; # this rallying cry occurs multiple times; p. 167 has "/Nae quin! # Nae king! Nae laird! Nae master! We willna be fooled again!/", @@ -6433,11 +7472,82 @@ Anybody. "I want to make that point perfectly clear!" [The Wee Free Men, by Terry Pratchett] %e passage +# pp. 2-3 (passage begins mid-paragraph) +%passage 10 +The lowlands weren't good to witches. Miss Tick was making pennies by +doing bits of medicine and misfortune-telling,(1) and slept in barns +most nights. She'd twice been thrown into ponds. + +(1) Ordinary fortune-tellers tell you what you /want/ to happen; witches +tell you what's going to happen whether you want it to or not. Strangely +enough, witches tend to be more accurate but less popular. + + [The Wee Free Men, by Terry Pratchett] +%e passage +# pp. 103-104 (passage ends mid-paragraph; the talking toad has been loaned +# from Miss Tick to Tiffany; it is apparently a transformed human +# lawyer [Feegles' swords don't glow in its presence though :-] +# 'ye', 'agin', 'distrainment', and hyphenated 'comp-li-cated' +# are all accurate) +%passage 11 +"I'm the Big Man o' the clan, mistress," he said. "An' my name it is..." +he swallowed. "Rob Anybody Feegle, mistress. But I beg ye not to use it +agin me!" + +The toad was ready for this. + +"They think names have magic in them," he murmured. "They don't tell them +to people in case they are written down." + +"Aye, an' put upon comp-li-cated documents," said a Feegle. + +"An' summonses and such things," said another. + +"Or 'Wanted' posters," said another. + +"Aye, an' bills an' affidavits," said another. + +"Writs of distrainment, even!" The Feegles looked around in panic at the +very thought of written-down things. + +"They think written words are even more powerful," whispered the toad. +"They think all writing is magic. Words worry them. See their swords? +They glow in the presence of lawyers." + +"All /right/," said Tiffany. "We're getting somewhere. I promise not +to write his name down. [...]" + + [The Wee Free Men, by Terry Pratchett] +%e passage +# p. 130 ('whut' for 'what' is accurate) +%passage 12 +"Whut's the plan, Rob?" said one of them. + +"Okay, lads, this is what we'll do. As soon as we see somethin', we'll +attack it. Right?" + +This caused a cheer. + +"Ach, 'tis a good plan," said Daft Wullie. + + [The Wee Free Men, by Terry Pratchett] +%e passage +# p. 145 (passage ends mid-paragraph) +%passage 13 +"On your honor as a drunken rowdy thief?" said Tiffany. + +Rob Anybody beamed. "Aye!" he said. "An' I got a lot of good big +reputation to protect there! [...]" + + [The Wee Free Men, by Terry Pratchett] +%e passage %e title # # # -%title Monstrous Regiment (8) +%title Monstrous Regiment (12) +# pp. 44-45 (page citation if for Harper Torch Edition; that uses double +# quotes so the transciption came from some other edition) %passage 1 'How can you protect yourself by carrying a sword if you don't know how to use it?' @@ -6576,11 +7686,58 @@ girls of seven are magnetically attracted to the color pink. [Monstrous Regiment, by Terry Pratchett] %e passage +# +# 4 new passages added for 5.0 +# +# p. 114 (the sergeant known as "Threeparts" is a bit daft, but Polly does +# eventually walk with Death--not die, just walk and talk with him) +%passage 9 +"Best of luck, lads," he added cheerfully. "You'll walk with Death every +day, but I've seen 'im and he's been known to wink. And remember: fill +your boots with soup!" + + [Monstrous Regiment, by Terry Pratchett] +%e passage +# pp. 191-192 (passage starts mid-paragraph; speaker is William de Worde, +# writer/editor/publisher of Ankh-Morpork's leading newspaper) +%passage 10 +"[...] You see, the curious thing is that although Ankh-Morpork is probably +the biggest bully around, in a subtle kind of way, we nevertheless have a +soft spot for people who stand up to bullies. Especially royal ones. We +tend to be on their side, provided it doesn't cost us too much." + + [Monstrous Regiment, by Terry Pratchett] +%e passage +# pp. 211-212 (passage starts mid-paragraph) +%passage 11 +The presence of those seeking the truth is infinitely to be preferred to +the presence of those who think they've found it. + + [Monstrous Regiment, by Terry Pratchett] +%e passage +# p. 225 ("[Sam Vimes]" inserted for clarity) +%passage 12 +He [Sam Vimes] swore under his breath. Prince Heinrich had inherited the +throne in a country where the chief export was a kind of hand-painted +wooden clog, but in ten years, he vowed, his capital city of Rigour would +be "the Ankh-Morpork of the mountains!" + +For some reason, he thought Ankh-Morpork would be pleased about this. + +He was anxious, he said, to learn the Ankh-Morpork way of doing things, the +kind of innocent ambition that could well lead to an aspiring leader... +well, finding out the Ankh-Morpork way of doing things. Heinrich had a +reputation locally for cunning, but Ankh-Morpork had overtaken cunning a +thousand years ago, had sped past devious, had left artful far behind, and +had now, by a roundabout route, arrived at straightforward. + + [Monstrous Regiment, by Terry Pratchett] +%e passage %e title # # # -%title A Hat Full of Sky (11) +%title A Hat Full of Sky (13) # p. 405 (HarperTempest edition) %passage 1 Why do you go away? So that you can come back. So that you can see the @@ -6631,7 +7788,7 @@ Cradle and the House and the Flock and the Three Old Ladies, One With a Squint, Carrying the Bucket of Fish to Market When They Meet the Donkey, although you need two people for that one, and I only ever did it once, and Betsy Tupper scratched her nose at the wrong moment and I had to get -some scissors to to cut her loose..." +some scissors to cut her loose..." [A Hat Full of Sky, by Terry Pratchett] %e passage @@ -6696,7 +7853,7 @@ done." "You /looked/ at her /diary/?" said Miss Level, horrified. "Why?" -Really, she though later, she should have expected the answer. +Really, she thought later, she should have expected the answer. "Cuz it wuz locked," said Daft Wullie. "If she didna want anyone tae look at it, why'd she keep it at the back o' her sock drawer? [...]" @@ -6736,6 +7893,29 @@ is 'me'?" [A Hat Full of Sky, by Terry Pratchett] %e passage +# +# 2 new passages added for 5.0 +# +# p. 124 (first speaker is Tiffany) +%passage 12 +"Well, couldn't you help him by magic?" + +"I'll see to it that he's in no pain, yes," said Miss Level. + +"But that's just herbs." + +"It's still magic. Knowing things is magical, if other people don't know +them." + + [A Hat Full of Sky, by Terry Pratchett] +%e passage +# p. 405 (passage starts mid-paragraph, actually the next one after passage 1) +%passage 13 +Joy is to fun what the deep sea is to a puddle. It's a feeling inside that +can hardly be contained. + + [A Hat Full of Sky, by Terry Pratchett] +%e passage %e title # # @@ -6975,7 +8155,7 @@ I AM, said Death, sitting down again. 'But you're here!' -AS WELL. Death turned a page and, for a person without breath, managed a +AS WELL. Death turned a page and, for a person without breath, managed a pretty good sigh. IT APPEARS THAT THE BUTLER DID IT. 'Did what?' @@ -8649,7 +9829,7 @@ survived long enough. %section Death %title Death Quotes (31) %passage 1 -WHERE THE FIRST PRIMAL CELL WAS, THERE WAS I ALSO. WHERE MAN IS, THERE AM I. WHEN THE LAST LIFE CRAWLS UNDER FREEZING STARS, THERE WILL I BE. +WHERE THE FIRST PRIMAL CELL WAS, THERE WAS I ALSO. WHERE MAN IS, THERE AM I. WHEN THE LAST LIFE CRAWLS UNDER FREEZING STARS, THERE WILL I BE. %e passage # Feet of Clay, p. 17 (Harper Torch edition) %passage 2 @@ -8748,7 +9928,7 @@ I AM NOT KNOWN FOR MY SENSE OF FUN. I MEAN THAT THERE IS A TIME FOR EVERYONE TO DIE. # p. 227 %passage 29 -JUST BECAUSE SOMETHING IS A METAPHORE DOESN'T MEAN IT CAN'T BE REAL. +JUST BECAUSE SOMETHING IS A METAPHOR DOESN'T MEAN IT CAN'T BE REAL. # p. 334 %passage 30 I AM ALWAYS ALONE. BUT JUST NOW I WANT TO BE ALONE BY MYSELF. diff --git a/dat/tut-1.lua b/dat/tut-1.lua new file mode 100644 index 000000000..b30e4edb2 --- /dev/null +++ b/dat/tut-1.lua @@ -0,0 +1,347 @@ + +local tut_ctrl_key = nil; +local tut_alt_key = nil; + +function tut_key(command) + local s = nh.eckey(command); + local m = s:match("^^([A-Z])$"); -- ^X is Ctrl-X + if (m ~= nil) then + tut_ctrl_key = m; + return "Ctrl-" .. m; + end + + m = s:match("^M%-([A-Z])$"); -- M-X is Alt-X + if (m ~= nil) then + tut_alt_key = m; + return "Alt-" .. m; + end + + return s; +end + +function tut_key_help(x, y) + if (tut_ctrl_key ~= nil) then + des.engraving({ coord = { x,y }, type = "engrave", text = "Note: Outside the tutorial, Ctrl-key combinations are shown prefixed with a caret, like '^" .. tut_ctrl_key .. "'", degrade = false }); + tut_ctrl_key = nil; + end +end + +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip", + "nomongen", "nodeathdrops", "noautosearch"); + +des.map([[ +--------------------------------------------------------------------------- +|-.--|.......|......|..S....|.F.......|.............|.......|.............| +|.-..........|......|--|....|.F.....|.|S-------.....|.....................| +||.--|.......|..T......|....|.F.....|.|.......|.....|.......|.............| +||.|.|.......|......|-.|....|.F.....|.|.......|.....|--------.............| +||.|.|.......|......||.|-.-----------.-.......|-S----.....................| +|-+-S---------..---.||........................|...|.......................| +|......| |.-------------------.......|...|....--S----............| +|......| ###### |.........| |..S.......|...|....|.....|............| +|----.-| -+- # |.....---.|######+..|.......S...|....|.....|............| +|----+----.----+---.|.--|.|.|# ------------...|....|.....F............| +|........|.|......|.|...F...|# ........|.....+...|....|.....|............| +|.P......-S|......|------.---# .........|.....|...|....-------........----| +|..........|......+.|...|.|.S# ..--S-----.....|LLL|..................|..| | +|.W......---......|.|.|.|.|.|# ..|......|.....|LLL|..................|..--| +|....Z.L.S.F......|.|.|.|.---# |......+.....|...|..................|..|.| +|........|--......|...|.....|####+......|.....|...+..................||...| +--------------------------------------------------------------------------- +]]); + + +des.region(selection.area(01,01, 73, 16), "lit"); + +des.non_diggable(); + +des.teleport_region({ region = { 9,3, 9,3 } }); + +-- TODO: +-- - save (more of) hero state when entering +-- - quit-command should maybe exit the tutorial? + +-- turn on some newbie-friendly options +nh.parse_config("OPTIONS=mention_walls"); +nh.parse_config("OPTIONS=mention_decor"); +nh.parse_config("OPTIONS=lit_corridor"); + +local movekeys = tut_key("movewest") .. " " .. + tut_key("movesouth") .. " " .. + tut_key("movenorth") .. " " .. + tut_key("moveeast"); + +local diagmovekeys = tut_key("movesouthwest") .. " " .. + tut_key("movenortheast") .. " " .. + tut_key("movesoutheast") .. " " .. + tut_key("movenorthwest"); + +des.engraving({ coord = { 9,3 }, type = "engrave", text = "Move around with " .. movekeys, degrade = false }); +des.engraving({ coord = { 5,2 }, type = "engrave", text = "Move diagonally with " .. diagmovekeys, degrade = false }); + +if (u.role == "Knight") then + des.engraving({ coord = { 12,1 }, type = "engrave", text = "Knights can jump with '" .. tut_key("jump") .. "'", degrade = false }); +end + +-- + +des.engraving({ coord = { 2,4 }, type = "engrave", text = "Some actions may require multiple tries before succeeding", degrade = false }); +des.engraving({ coord = { 2,5 }, type = "engrave", text = "Open the door by moving into it", degrade = false }); +des.door({ coord = { 2,6 }, state = "closed" }); + +des.engraving({ coord = { 2,7 }, type = "engrave", text = "Close the door with '" .. tut_key("close") .. "'", degrade = false }); + + +-- + +des.engraving({ coord = { 4,5 }, type = "engrave", text = "You can leave the tutorial via the magic portal.", degrade = false }); +des.trap({ type = "magic portal", coord = { 4,4 }, seen = true }); + +-- + +des.engraving({ coord = { 5,9 }, type = "engrave", text = "This door is locked. Kick it with '" .. tut_key("kick") .. "'", degrade = false }); +des.door({ coord = { 5,10 }, state = "locked" }); + +-- by default, kick is the first command that can be a ctrl-key combo +tut_key_help(6, 8); + + +des.engraving({ coord = { 5,12 }, type = "engrave", text = "Look around the map with '" .. tut_key("glance") .. "', press ESC when you're done", degrade = false }); + +-- + +des.engraving({ coord = { 10,13 }, type = "engrave", text = "Use '" .. tut_key("search") .. "' to search for secret doors", degrade = false }); + +des.engraving({ coord = { 10,15 }, type = "engrave", text = "Wrong secret", degrade = false }); + +-- + +des.engraving({ coord = { 10,10 }, type = "engrave", text = "Behind this door is a dark corridor", degrade = false }); +des.door({ coord = { 10,9 }, state = percent(50) and "locked" or "closed" }); +des.region(selection.match("#"), "unlit"); +des.region(selection.match(" "), "unlit"); +des.door({ coord = { 15,10 }, state = percent(50) and "locked" or "closed" }); + +-- + +des.engraving({ coord = { 15,11 }, type = "engrave", text = "There are four traps next to you! Search for them.", degrade = false }); +local locs = { {14,11}, {14,12}, {15,12}, {16,12}, {16,11} }; +shuffle(locs); +for i = 1, 4 do + des.trap({ type = percent(50) and "sleep gas" or "board", + coord = locs[i], victim = false }); +end + +des.engraving({ coord = { 15,15 }, type = "engrave", text = "Some traps can be disabled with '" .. tut_key("untrap") .. "'", degrade = false }); +des.trap({ coord = { 15,16 }, type = "web", spider_on_web = false }); + +-- + +des.door({ coord = { 18,13 }, state = "closed" }); + +des.engraving({ coord = { 19,13 }, type = "engrave", text = "Pick up items with '" .. tut_key("pickup") .. "'", degrade = false }); + +local armor = (u.role == "Monk") and "leather gloves" or "leather armor"; + +des.object({ id = armor, spe = 0, buc = "cursed", coord = { 19,14} }); + +des.engraving({ coord = { 19,15 }, type = "engrave", text = "Wear armor with '" .. tut_key("wear") .. "'", degrade = false }); + +des.object({ id = "dagger", spe = 0, buc = "not-cursed", coord = { 21,15} }); + +des.engraving({ coord = { 21,14 }, type = "engrave", text = "Wield weapons with '" .. tut_key("wield") .. "'", degrade = false }); + + +des.engraving({ coord = { 22,13 }, type = "engrave", text = "Hit monsters by walking into them.", degrade = false }); + +des.monster({ id = "lichen", coord = { 23,15 }, waiting = true, countbirth = false }); + +-- + +des.engraving({ coord = { 24,16 }, type = "engrave", text = "Now you know the very basics. You can leave the tutorial via the magic portal.", degrade = false }); + +des.engraving({ coord = { 26,16 }, type = "engrave", text = "Step into this portal to leave the tutorial", degrade = false }); +des.trap({ type = "magic portal", coord = { 27,16 }, seen = true }); + +-- + +des.engraving({ coord = { 25,13 }, type = "engrave", text = "Push boulders by moving into them", degrade = false }); +des.object({ id = "boulder", coord = {25,12} }); + +-- + +des.engraving({ coord = { 27,9 }, type = "engrave", text = "Take off armor with '" .. tut_key("takeoff") .. "'", degrade = false }); + +-- + +des.object({ class = "?", id = "remove curse", buc = "blessed", coord = {23,11} }) +des.engraving({ coord = { 22,11 }, type = "engrave", text = "Some items have shuffled descriptions, different each game", degrade = false }); +des.engraving({ coord = { 23,11 }, type = "engrave", text = "Pick up this scroll, read it with '" .. tut_key("read") .. "', and try to remove the armor again", degrade = false }); + +-- + +des.engraving({ coord = { 19,10 }, type = "engrave", text = "Another magic portal, a way to leave this tutorial", degrade = false }); +des.trap({ type = "magic portal", coord = { 19,11 }, seen = true }); + +-- + +-- rock fall +des.object({ coord = {14, 5}, id = "rock", quantity = math.random(50,99) }); +des.object({ coord = {15, 5}, id = "rock", quantity = math.random(10,30) }); +des.object({ coord = {14, 4}, id = "rock", quantity = math.random(10,30) }); +des.object({ coord = {15, 6}, id = "rock", quantity = math.random(30,60) }); +des.object({ coord = {14, 6}, id = "rock", quantity = math.random(30,60) }); +des.object({ coord = {14, 6}, id = "boulder" }); + +des.door({ coord = { 20,3 }, state = percent(50) and "open" or "closed" }); + +des.engraving({ coord = { 21,3 }, type = "engrave", text = "Avoid being burdened, it slows you down", degrade = false }); +des.engraving({ coord = { 22,3 }, type = "engrave", text = "Drop items with '" .. tut_key("drop") .. "'", degrade = false }); +des.engraving({ coord = { 22,4 }, type = "engrave", text = "You can drop partial stacks by prefixing the item slot letter with a number", degrade = false }); + +-- + +des.monster({ id = "yellow mold", coord = { 26,2 }, waiting = true, countbirth = false }); + +des.engraving({ coord = { 25,5 }, type = "engrave", text = "Throw items with '" .. tut_key("throw") .. "'", degrade = false }); + +des.trap({ type = "magic portal", coord = { 21,1 }, seen = true }); + +-- + +des.monster({ id = "wolf", coord = { 29,2 }, peaceful = 0, waiting = true, countbirth = false }); + +des.engraving({ coord = { 37,4 }, type = "engrave", text = "Missiles, such as rocks, work better when fired from appropriate launcher", degrade = false }); + +des.object({ coord = { 37,3 }, id = "sling", buc = "not-cursed", spe = 9 }); +des.engraving({ coord = { 37,3 }, type = "engrave", text = "Wield the sling", degrade = false }); +des.engraving({ coord = { 36,1 }, type = "engrave", text = "Use '" .. tut_key("fire") .. "' to fire missiles with the wielded launcher", degrade = false }); + +des.engraving({ coord = { 35,4 }, type = "engrave", text = "Firing launches items from your quiver; Use '" .. tut_key("quiver") .. "' to put items in it", degrade = false }); + +des.engraving({ coord = { 33,4 }, type = "engrave", text = "You can wait a turn with '" .. tut_key("wait") .. "'", degrade = false }); + + +-- + +des.door({ coord = { 38,6 }, state = "closed" }); + +des.engraving({ coord = { 39,6 }, type = "engrave", text = "You loot containers with '" .. tut_key("loot") .. "'", degrade = false }); + +des.object({ coord = { 41,6 }, id = "large box", broken = true, trapped = false, + contents = function(obj) + des.object({ id = "secret door detection", class = "/", spe = 30 }); end +}); +des.engraving({ coord = { 42,6 }, type = "engrave", text = "Containers can also be emptied with '" .. tut_key("tip") .. "'", degrade = false }); + +des.engraving({ coord = { 45,6 }, type = "engrave", text = "Magic wands are used with '" .. tut_key("zap") .. "'", degrade = false }); + +-- + +des.door({ coord = { 35,9 }, state = "nodoor" }); +des.engraving({ coord = { 34,9 }, type = "engrave", text = "You can run by prefixing a movement key with '" .. tut_key("run") .. "'", degrade = false }); + +-- + +des.door({ coord = { 33,16 }, state = "nodoor" }); +des.engraving({ coord = { 35,15 }, type = "engrave", text = "Travel across the level with '" .. tut_key("travel") .. "'", degrade = false }); + +-- + +des.trap({ type = "magic portal", coord = { 27,14 }, seen = true }); + +-- + +des.engraving({ coord = { 48,1 }, type = "burn", text = "Use '" .. tut_key("eat") .. "' to eat edible things", degrade = false }); + +des.object({ coord = { 50,3 }, id = "apple", buc = "not-cursed" }); +des.object({ coord = { 50,3 }, id = "candy bar", buc = "not-cursed" }); + +des.object({ coord = { 50,3 }, id = "corpse", montype = "lichen", buc = "not-cursed" }); + +-- + +des.door({ coord = { 46,11 }, state = "closed" }); + +des.engraving({ coord = { 43,11 }, type = "burn", text = "Use '" .. tut_key("twoweapon") .. "' to use two weapons at once", degrade = false }); +des.object({ coord = { 43,13 }, id = "knife", buc = "uncursed" }); +des.object({ coord = { 43,14 }, id = "dagger", buc = "blessed" }); + +des.engraving({ coord = { 43,16 }, type = "burn", text = "Swap weapons quickly with '" .. tut_key("swap") .. "'", degrade = false }); + +des.door({ coord = { 40,15 }, state = "random" }); + +-- + +des.object({ coord = { 48,7 }, id = "ring of levitation", buc = "not-cursed" }); + +des.engraving({ coord = { 48,10 }, type = "burn", text = "Put on accessories with '" .. tut_key("puton") .. "'", degrade = false }); + +des.engraving({ coord = { 48,16 }, type = "burn", text = "Remove accessories with '" .. tut_key("remove") .. "'", degrade = false }); + +des.door({ coord = { 50,16 }, state = "closed" }); + + +-- + +des.engraving({ coord = { 58,9 }, type = "burn", text = "Use '" .. tut_key("down") .. "' to go down the stairs", degrade = false }); +des.stair({ dir = "down", coord = { 58,10 } }); + +-- + +-- one more ctrl-key help, if needed +tut_key_help(64, 4); + +des.engraving({ coord = { 65,3 }, type = "burn", text = "UNDER CONSTRUCTION", degrade = false }); + +des.trap({ type = "magic portal", coord = { 66,2 }, seen = true }); + +-- + +-- squeezing through small gaps + +des.engraving({ coord = { 69,12 }, type = "burn", text = "Can't get through? You're carrying too much.", degrade = false }); + +-- try to squeeze over boulders, find a trap door + +des.object({ id = "boulder", coord = {71,16} }); +des.object({ id = "boulder", coord = {72,16} }); +des.object({ id = "boulder", coord = {73,16} }); +des.trap({ type = "trap door", coord = { 73,15 } }); + +-- + +des.engraving({ coord = { 60,2 }, type = "engrave", text = "Spellcasting", degrade = false }); +if (u.uenmax < 5) then + -- TODO: make sure hero has enough Pw to cast the spell (5 pw) instead? + -- TODO: ensure the first cast of this spell succeeds? + des.engraving({ coord = { 59,2 }, type = "engrave", text = "Unfortunately you don't have enough energy to cast spells.", degrade = false }); +end +des.engraving({ coord = { 57,2 }, type = "engrave", text = "Pick up the spellbook with '" .. tut_key("pickup") .. "'", degrade = false }); +des.object({ coord = { 57,2 }, id = "spellbook of light", buc = "blessed" }); +des.engraving({ coord = { 55,2 }, type = "engrave", text = "Read the spellbook with '" .. tut_key("read") .. "'", degrade = false }); +des.engraving({ coord = { 53,2 }, type = "engrave", text = "Use '" .. tut_key("cast") .. "' to cast a spell", degrade = false }); +des.region(selection.area(53,01, 59, 3), "unlit"); + +-- + +des.engraving({ coord = { 72,2 }, type = "engrave", text = "You \"quaff\" potions with '" .. tut_key("quaff") .. "'", degrade = false }); +des.object({ coord = { 72,2 }, id = "potion of object detection", buc = "blessed" }); + + +---------------- + +-- entering and leaving tutorial _branch_ now handled by core +-- // nh.callback("cmd_before", "tutorial_cmd_before"); +-- // nh.callback("level_enter", "tutorial_enter"); +-- // nh.callback("level_leave", "tutorial_leave"); +-- // nh.callback("end_turn", "tutorial_turn"); + +---------------- + +-- temporary stuff here +-- des.trap({ type = "magic portal", coord = { 9,5 }, seen = true }); +-- des.trap({ type = "magic portal", coord = { 9,1 }, seen = true }); +-- des.object({ id = "leather armor", spe = 0, coord = { 9,2} }); + diff --git a/dat/tut-2.lua b/dat/tut-2.lua new file mode 100644 index 000000000..bea2f0698 --- /dev/null +++ b/dat/tut-2.lua @@ -0,0 +1,27 @@ + +des.level_init({ style = "solidfill", fg = " " }); +des.level_flags("mazelevel", "noflip", + "nomongen", "nodeathdrops", "noautosearch"); + +des.map([[ +-------------- +|............| +|............| +|............| +|............| +|............| +|............| +-------------- +]]); + + +des.region(selection.area(01,01, 73, 16), "lit"); + +des.stair({ dir = "up", coord = { 2,2 } }); + +des.engraving({ coord = { 1,1 }, type = "burn", text = "Use '" .. nh.eckey("up") .. "' to go up the stairs", degrade = false }); + + +des.trap({ type = "magic portal", coord = { 11,5 }, seen = true }); + +des.non_diggable(); diff --git a/dat/usagehlp b/dat/usagehlp new file mode 100644 index 000000000..cfa879351 --- /dev/null +++ b/dat/usagehlp @@ -0,0 +1,139 @@ +This is a terse description of nethack's command line arguments. +It is oriented toward UNIX (including descendants such as linux and macOS) +and might not be accurate for other platforms. + +When starting play, if there is a save file for the chosen character name +then it will be restored, otherwise a new game using that name will begin. + +nethack + with no arguments; uses character name from run-time configuration file's + OPTIONS=name:character-name entry, or player's username if none. + +nethack -u character-name [-X or -D] + '-u character-name' specifies the name to use for this game's character; + -u must be lowercase; the space between it and character-name may + be omitted; + '-X' play in non-scoring explore mode also known as discovery mode; + -X must be uppercase; character starts with a wand of wishing and + player may opt to be life-saved and keep going if character dies; + '-D' run in debug mode also known as wizard mode; -D must be uppercase; + if player is not allowed then nethack will switch to -X; if player + is allowed, character name will be changed to "wizard". + + A character name may have a suffix specifying any or all of role, race, + gender, and alignment such as -u Conan-Bar-Hum-Mal-Neu or -u Tim-Wiz. + The components present must be at least three letters long but can be + longer; their case doesn't matter. See also -p and -r, next, + +nethack -p Ppp -r Rrr [-@] + '-p Ppp' specify role; p for "profession" is used because -r is in use; + 'Ppp' is three or more letters of the role name such as Val for + Valkyrie; unlike -p itself, upper/lower case of Ppp doesn't matter + '-r Rrr' specify race or species: Hum[an], Elf, Orc, Dwa[rf], Gno[me]; + '-@' force non-interactive start; any of role, race, gender, and + alignment that is not specified on the command line or in the + run-time configuration file gets chosen randomly without prompting; + the at-sign might need to be quoted by preceding it with backslash. + + The old form for role is also still accepted: -A or -Arc[heologist], + -B or -Bar[barian], -C or -Cav[eman] or -Cavew[oman], -H or -Hea[ler], + -K or -Kni[ght], -M or -Mon[k], -P or -Pri[est] or -Prieste[ss], + -Ran[ger], -R or -Rog[ue], -S or -Sam[urai], -T or -Tou[rist], + -V or -Val[kyrie], -W or -Wiz[ard]. The single-letter form must be in + uppercase, the three or more letter form can be in any case. There is + no single-letter option for the Ranger role. + +nethack -DEC[graphics] +nethack -IBM[graphics] + selects the DEC or IBM symbol set to use line-drawing characters on a + text map; might be ignored depending on interface, or ineffective or + even scrambled depending on display capability; -DECgraphics and + -IBMgraphics are mutually exclusive; they can be any case but must use + at least three letters. + +nethack -wIii +nethack --windowtype:Iii + where 'Iii' represents an interface designation: tty, curses, X11, or + Qt; only useful if the program was built to support more than one + interface (the game's '#version' command will disclose that); overrides + OPTIONS=windowtype:Iii in run-time configuration file and build-time + default; '-w' or '--windowtype' must be lowercase, the interface + designation itself may be any case; variations '--windowtype Iii' and + '-w Iii' work too. + + On Windows, nethack.exe supports tty or curses or both depending on + settings at the time the program is built from source; nethackW.exe + supports mswin (also referred to as Win GUI) and optionally curses. + For MS-DOS, the program supports tty or curses or both. + +nethack -n + don't show the 'news' file if one is present in nethack's directory. + +nethack --nethackrc:RC-file + use RC-file instead of the default run-time configuration file (which is + usually '~/.nethackrc'); the file name should include full path unless + located in nethack's directory; +nethack --no-nethackrc + don't use any run-time configuration file; equivalent to + --nethackrc:/dev/null which behaves as if an empty file. + +nethack -dDir +nethack --directory:Dir + could be used to override the build-time value of NETHACKDIR with + location Dir; if used, it should precede other command line arguments. + +The assorted options above can be combined on a single command line; +they're listed separately for readability. + +******* + +Other options which perform some action and then exit rather than play +the game: + +nethack -s +nethack --scores + show scores for the default character; optional additional arguments: +nethack -s -v + show scores for all versions present in the high scores file (record) + if it contains scores for any older versions; by default, only scores + for current version of nethack are shown; when '-v' is used, it should + immediately follow -s or --scores, preceding any name(s) or -p or -r; +nethack -s character-name [character-name2 [character-name3 [...]]] + show scores for one or more specific character names (might not be + effective if PERS_IS_UID=1 is specified in nethack's sysconf file); + character names may be preceded by '-u' but that isn't required; + special character-name "all" is used to display all scores that pass + other criteria; +nethack -s -p Ppp -r Rrr + show scores for specific roles or races; multiple instances can be used; + if both '-p' and '-r' are used, scores that match either will be shown + rather than scores that match both; +nethack -dDir -s +nethack --directory:Dir -s + as above; alternate directory, if specified, should come first. + +nethack --version or --version:copy or --version:dump or --version:show + '--version' display the program's version number plus the date and + time it was built from source code, then exit; + '--version:copy' display version number and also copy it into system + pasteboard (should work on macOS and Windows; might not work on other + systems) so that it could be pasted from there into a subsequent email + or web contact form, then exit; + '--version:dump' display several internal values, then exit; + '--version:show' same as '--version'. + +nethack --showpaths + list expected locations for various files and directories, then exit; + includes the name and location for the run-time configuration file which + can vary from platform to platform. + +nethack --usage +nethack --help + show this text; 'nethack -?' and 'nethack ?' also work but the question + mark may need to be quoted to prevent the shell from intercepting it. + +******* + +This text is available during play in the menu for the game's '?' command +or can be viewed via 'nethack --usage | more' at the shell prompt. + diff --git a/dat/valley.lua b/dat/valley.lua new file mode 100644 index 000000000..96bceb997 --- /dev/null +++ b/dat/valley.lua @@ -0,0 +1,174 @@ +-- NetHack gehennom valley.lua $NHDT-Date: 1652196038 2022/05/10 15:20:38 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +-- + +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "nommap", "temperate"); + +des.map([[ +---------------------------------------------------------------------------- +|...S.|..|.....| |.....-| |................| |...............| |...| +|---|.|.--.---.| |......--- ----..........-----.-----....---........---.-.| +| |.|.|..| |.| --........| |.............| |.......---| |-...........--| +| |...S..| |.| |.......-----.......------| |--------..---......------- | +|----------- |.| |-......| |....|...-- |...-----................---- | +|.....S....---.| |.......| |....|...| |..............----------- | +|.....|.|......| |.....--- |......--- |....---.......| | +|.....|.|------| |....-- --....-- |-------- ----....--------------- | +|.....|--......---BBB-| |...-- |.......| |..................| | +|..........||........-| --...| |.......| |...||.............| | +|.....|...-||-........------....| |.......---- |...||.............-- | +|.....|--......---...........--------..........| |.......---------...-- | +|.....| |------| |--.......--| |..B......----- -----....| |.| |....--- | +|.....| |......--| ------..| |----..B......| |.--------.-- |-.....---| +|------ |........| |.|....| |.....----BBBB---------...........---.........| +| |........| |...|..| |.....| |-.............--------...........---| +| --.....-----------.| |....-----.....---------- |.........---- | +| |..|..B...........| |.|..........|.| |.|........| | +---------------------------------------------------------------------------- +]]); + +-- Make the path somewhat unpredictable +-- If you get "lucky", you may have to go through all three graveyards. +if percent(50) then + des.terrain(selection.line(50,8, 53,8), '-') + des.terrain(selection.line(40,8, 43,8), 'B') +end +if percent(50) then + des.terrain({ x=27, y=12, typ='|' }) + des.terrain(selection.line(27,3, 29,3), 'B') + des.terrain({ x=28, y=2, typ='-' }) +end +if percent(50) then + des.terrain(selection.line(16,10, 16,11), '|') + des.terrain(selection.line(9,13, 14,13), 'B') +end + + +-- Dungeon Description +-- The shrine to Moloch. +des.region({ region={01,06, 05,14},lit=1,type="temple",filled=2 }) +-- The Morgues +des.region({ region={19,01, 24,08},lit=0,type="morgue",filled=1,irregular=1 }) +des.region({ region={09,14, 16,18},lit=0,type="morgue",filled=1,irregular=1 }) +des.region({ region={37,09, 43,14},lit=0,type="morgue",filled=1,irregular=1 }) +-- Stairs +des.stair("down", 01,01) +-- Branch location +des.levregion({ type="branch", region={66,17,66,17} }) +des.teleport_region({ region = {58,09,72,18}, dir="down" }) + +-- Secret Doors +des.door("locked",04,01) +des.door("locked",08,04) +des.door("locked",06,06) + +-- The altar of Moloch. +des.altar({ x=03,y=10,align="noalign", type="shrine" }) + +-- Non diggable walls - everywhere! +des.non_diggable(selection.area(00,00,75,19)) + +-- Objects +-- **LOTS** of dead bodies (all human). +-- note: no priest(esse)s or monks - maybe Moloch has a *special* +-- fate reserved for members of *those* classes. +-- +des.object({ id="corpse",montype="archeologist" }) +des.object({ id="corpse",montype="archeologist" }) +des.object({ id="corpse",montype="barbarian" }) +des.object({ id="corpse",montype="barbarian" }) +des.object({ id="corpse",montype="caveman" }) +des.object({ id="corpse",montype="cavewoman" }) +des.object({ id="corpse",montype="healer" }) +des.object({ id="corpse",montype="healer" }) +des.object({ id="corpse",montype="knight" }) +des.object({ id="corpse",montype="knight" }) +des.object({ id="corpse",montype="ranger" }) +des.object({ id="corpse",montype="ranger" }) +des.object({ id="corpse",montype="rogue" }) +des.object({ id="corpse",montype="rogue" }) +des.object({ id="corpse",montype="samurai" }) +des.object({ id="corpse",montype="samurai" }) +des.object({ id="corpse",montype="tourist" }) +des.object({ id="corpse",montype="tourist" }) +des.object({ id="corpse",montype="valkyrie" }) +des.object({ id="corpse",montype="valkyrie" }) +des.object({ id="corpse",montype="wizard" }) +des.object({ id="corpse",montype="wizard" }) +-- +-- Some random weapons and armor. +-- +des.object("[") +des.object("[") +des.object("[") +des.object("[") +des.object(")") +des.object(")") +des.object(")") +des.object(")") +-- +-- Some random loot. +-- +des.object("ruby") +des.object("*") +des.object("*") +des.object("!") +des.object("!") +des.object("!") +des.object("?") +des.object("?") +des.object("?") +des.object("/") +des.object("/") +des.object("=") +des.object("=") +des.object("+") +des.object("+") +des.object("(") +des.object("(") +des.object("(") + +-- (Not so) Random traps. +des.trap("spiked pit", 05,02) +des.trap("spiked pit", 14,05) +des.trap("sleep gas", 03,01) +des.trap("board", 21,12) +des.trap("board") +des.trap("dart", 60,01) +des.trap("dart", 26,17) +des.trap("anti magic") +des.trap("anti magic") +des.trap("magic") +des.trap("magic") + +-- Random monsters. +-- The ghosts. +des.monster("ghost") +des.monster("ghost") +des.monster("ghost") +des.monster("ghost") +des.monster("ghost") +des.monster("ghost") +-- Add a few bats for atmosphere. +des.monster("vampire bat") +des.monster("vampire bat") +des.monster("vampire bat") +-- And a lich for good measure. +des.monster("L") +-- Some undead nasties for good measure +des.monster("V") +des.monster("V") +des.monster("V") +des.monster("Z") +des.monster("Z") +des.monster("Z") +des.monster("Z") +des.monster("M") +des.monster("M") +des.monster("M") +des.monster("M") diff --git a/dat/water.lua b/dat/water.lua new file mode 100644 index 000000000..760c83eb5 --- /dev/null +++ b/dat/water.lua @@ -0,0 +1,102 @@ +-- NetHack endgame water.lua $NHDT-Date: 1652196038 2022/05/10 15:20:38 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, +-- and Timo Hakulinen +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style = "solidfill", fg = " " }); + +des.level_flags("mazelevel", "noteleport", "hardfloor", "shortsighted") +des.message("You find yourself suspended in an air bubble surrounded by water.") +-- The player lands upon arrival to an air bubble +-- within the leftmost third of the level. The +-- portal to the next level is randomly located in an air +-- bubble within the rightmost third of the level. +-- Bubbles are generated by special code in mkmaze.c for now. +des.map([[ +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +]]); +des.teleport_region({ region = {0,0,25,19} }) +des.levregion({ type="portal", region={51,0,75,19}, name="astral" }) +-- A fisherman's dream... +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("giant eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("electric eel") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("kraken") +des.monster("shark") +des.monster("shark") +des.monster("shark") +des.monster("shark") +des.monster("piranha") +des.monster("piranha") +des.monster("piranha") +des.monster("piranha") +des.monster("jellyfish") +des.monster("jellyfish") +des.monster("jellyfish") +des.monster("jellyfish") +des.monster(";") +des.monster(";") +des.monster(";") +des.monster(";") +-- These guys feel like home here +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) +des.monster({ id = "water elemental", peaceful = 0 }) + diff --git a/dat/wizard1.lua b/dat/wizard1.lua new file mode 100644 index 000000000..f1d4be198 --- /dev/null +++ b/dat/wizard1.lua @@ -0,0 +1,102 @@ +-- NetHack yendor wizard1.lua $NHDT-Date: 1652196039 2022/05/10 15:20:39 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +-- +-- The top (real) wizard level. +-- Keeping the Moat for old-time's sake +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +local wiz1 = des.map({ halign = "center", valign = "center", map = [[ +----------------------------x +|.......|..|.........|.....|x +|.......S..|.}}}}}}}.|.....|x +|..--S--|..|.}}---}}.|---S-|x +|..|....|..|.}--.--}.|..|..|x +|..|....|..|.}|...|}.|..|..|x +|..--------|.}--.--}.|..|..|x +|..|.......|.}}---}}.|..|..|x +|..S.......|.}}}}}}}.|..|..|x +|..|.......|.........|..|..|x +|..|.......|-----------S-S-|x +|..|.......S...............|x +----------------------------x +]], contents = function(rm) + des.levregion({ type="stair-up", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.levregion({ type="stair-down", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.levregion({ type="branch", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.teleport_region({ region={01,00,79,20}, region_islev=1, exclude={0,0,27,12} }) + des.region({ region={12,01, 20,09}, lit=0, type="morgue", filled=2, contents=function() + local sdwall = { "south", "west", "east" }; + des.door({ wall = sdwall[math.random(1, #sdwall)], state = "secret" }); + end }) + -- another region to constrain monster arrival + des.region({ region={01,01, 10,11}, lit=0, type="ordinary", arrival_room=true }) + des.mazewalk(28,05,"east") + des.ladder("down", 06,05) + -- Non diggable walls + -- Walls inside the moat stay diggable + des.non_diggable(selection.area(00,00,11,12)) + des.non_diggable(selection.area(11,00,21,00)) + des.non_diggable(selection.area(11,10,27,12)) + des.non_diggable(selection.area(21,00,27,10)) + -- Non passable walls + des.non_passwall(selection.area(00,00,11,12)) + des.non_passwall(selection.area(11,00,21,00)) + des.non_passwall(selection.area(11,10,27,12)) + des.non_passwall(selection.area(21,00,27,10)) + -- The wizard and his guards + des.monster({ id = "Wizard of Yendor", x=16, y=05, asleep=1 }) + des.monster("hell hound", 15, 05) + des.monster("vampire lord", 17, 05) + -- The local treasure + des.object("Book of the Dead", 16, 05) + -- Surrounding terror + des.monster("kraken", 14, 02) + des.monster("giant eel", 17, 02) + des.monster("kraken", 13, 04) + des.monster("giant eel", 13, 06) + des.monster("kraken", 19, 04) + des.monster("giant eel", 19, 06) + des.monster("kraken", 15, 08) + des.monster("giant eel", 17, 08) + des.monster("piranha", 15, 02) + des.monster("piranha", 19, 08) + -- Random monsters + des.monster("D") + des.monster("H") + des.monster("&") + des.monster("&") + des.monster("&") + des.monster("&") + -- And to make things a little harder. + des.trap("board",16,04) + des.trap("board",16,06) + des.trap("board",15,05) + des.trap("board",17,05) + -- Random traps. + des.trap("spiked pit") + des.trap("sleep gas") + des.trap("anti magic") + des.trap("magic") + -- Some random loot. + des.object("ruby") + des.object("!") + des.object("!") + des.object("?") + des.object("?") + des.object("+") + des.object("+") + des.object("+") +end +}); + +local protected = bounds2:negate() | wiz1; +hell_tweaks(protected); diff --git a/dat/wizard2.lua b/dat/wizard2.lua new file mode 100644 index 000000000..34f48005d --- /dev/null +++ b/dat/wizard2.lua @@ -0,0 +1,62 @@ +-- NetHack yendor wizard2.lua $NHDT-Date: 1652196039 2022/05/10 15:20:39 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +local wiz2 = des.map({ halign = "center", valign = "center", map = [[ +----------------------------x +|.....|.S....|.............|x +|.....|.-------S--------S--|x +|.....|.|.........|........|x +|..-S--S|.........|........|x +|..|....|.........|------S-|x +|..|....|.........|.....|..|x +|-S-----|.........|.....|..|x +|.......|.........|S--S--..|x +|.......|.........|.|......|x +|-----S----S-------.|......|x +|............|....S.|......|x +----------------------------x +]], contents = function(rm) + des.levregion({ type="stair-up", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.levregion({ type="stair-down", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.levregion({ type="branch", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.teleport_region({ region={01,00,79,20}, region_islev=1, exclude={0,0,27,12} }) + -- entire tower in a region, constrains monster migration + des.region({ region={01,01, 26,11}, lit=0, type="ordinary", arrival_room=true }) + des.region({ region={09,03, 17,09}, lit=0, type="zoo", filled=1 }) + des.door("closed",15,02) + des.door("closed",11,10) + des.mazewalk(28,05,"east") + des.ladder("up", 12,01) + des.ladder("down", 14,11) + -- Non diggable walls everywhere + des.non_diggable(selection.area(00,00,27,12)) + -- + des.non_passwall(selection.area(00,00,27,12)) + -- Random traps. + des.trap("spiked pit") + des.trap("sleep gas") + des.trap("anti magic") + des.trap("magic") + -- Some random loot. + des.object("!") + des.object("!") + des.object("?") + des.object("?") + des.object("+") + -- treasures + des.object("\"", 04, 06) +end +}); + +local protected = bounds2:negate() | wiz2; +hell_tweaks(protected); diff --git a/dat/wizard3.lua b/dat/wizard3.lua new file mode 100644 index 000000000..3166d799c --- /dev/null +++ b/dat/wizard3.lua @@ -0,0 +1,90 @@ +-- NetHack yendor wizard3.lua $NHDT-Date: 1652196040 2022/05/10 15:20:40 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $ +-- Copyright (c) 1989 by Jean-Christophe Collet +-- Copyright (c) 1992 by M. Stephenson and Izchak Miller +-- NetHack may be freely redistributed. See license for details. +-- +des.level_init({ style="mazegrid", bg ="-" }); + +des.level_flags("mazelevel", "noteleport", "hardfloor") + +local tmpbounds = selection.match("-"); +local bnds = tmpbounds:bounds(); +local bounds2 = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); + +local wiz3 = des.map({ halign = "center", valign = "center", map = [[ +----------------------------x +|..|............S..........|x +|..|..------------------S--|x +|..|..|.........|..........|x +|..S..|.}}}}}}}.|..........|x +|..|..|.}}---}}.|-S--------|x +|..|..|.}--.--}.|..|.......|x +|..|..|.}|...|}.|..|.......|x +|..---|.}--.--}.|..|.......|x +|.....|.}}---}}.|..|.......|x +|.....S.}}}}}}}.|..|.......|x +|.....|.........|..|.......|x +----------------------------x +]], contents = function(rm) + des.levregion({ type="stair-up", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.levregion({ type="stair-down", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.levregion({ type="branch", region={01,00,79,20}, region_islev=1, exclude={0,0,28,12} }) + des.teleport_region({ region={01,00,79,20}, region_islev=1, exclude={0,0,27,12} }) + des.levregion({ region={25,11,25,11}, type="portal", name="fakewiz1" }); + des.mazewalk(28,09,"east") + des.region({ region={07,03, 15,11}, lit=0 ,type="morgue", filled=2 }) + des.region({ region={17,06, 18,11}, lit=0, type="beehive", filled=1 }) + -- make the entry chamber a real room; it affects monster arrival + des.region({ region={20,06,26,11},lit=0,type="ordinary",arrival_room=true, + contents = function() + local w = "north"; + if percent(50) then w = "west" end + des.door({ state="secret", wall=w }) + end + }); + des.door("closed",18,05) + des.ladder("up", 11,07) + -- Non diggable walls + -- Walls inside the moat stay diggable + des.non_diggable(selection.area(00,00,06,12)) + des.non_diggable(selection.area(06,00,27,02)) + des.non_diggable(selection.area(16,02,27,12)) + des.non_diggable(selection.area(06,12,16,12)) + -- + des.non_passwall(selection.area(00,00,06,12)) + des.non_passwall(selection.area(06,00,27,02)) + des.non_passwall(selection.area(16,02,27,12)) + des.non_passwall(selection.area(06,12,16,12)) + -- + des.monster("L", 10, 07) + des.monster("vampire lord", 12, 07) + -- Some surrounding horrors + des.monster("kraken", 08, 05) + des.monster("giant eel", 08, 08) + des.monster("kraken", 14, 05) + des.monster("giant eel", 14, 08) + -- Other monsters + des.monster("L") + des.monster("D") + des.monster("D", 26, 09) + des.monster("&") + des.monster("&") + des.monster("&") + -- And to make things a little harder. + des.trap("board",10,07) + des.trap("board",12,07) + des.trap("board",11,06) + des.trap("board",11,08) + -- Some loot + des.object(")") + des.object("!") + des.object("?") + des.object("?") + des.object("(") + -- treasures + des.object("\"", 11, 07) +end +}); + +local protected = bounds2:negate() | wiz3; +hell_tweaks(protected); diff --git a/dat/wizhelp b/dat/wizhelp index 519ca1687..1945214b0 100644 --- a/dat/wizhelp +++ b/dat/wizhelp @@ -1,6 +1,6 @@ Debug-Mode Quick Reference: -^E == detect secret doors and traps +^E == detect secret doors and traps nearby ^F == map level; reveals traps and secret corridors but not secret doors ^G == create monster by name or class ^I == identify items in pack @@ -9,24 +9,43 @@ Debug-Mode Quick Reference: ^W == make a wish for an item or a trap or a limited subset of terrain ^X == show status, attributes, and characteristics (extended enlightenment) +#debugfuzzer == set game to run on autopilot; keeps going until failure; + escalates impossible warnings to panic #levelchange == set hero's experience level #lightsources == show mobile light sources +#migratemons == show migrating monsters; [Opt] potentially create some #panic == panic test (warning: current game will be terminated) #polyself == polymorph self -#seenv == show seen vectors #stats == show memory statistics #terrain == show current level (more options than in normal play) #timeout == look at timeout queue and hero's timed intrinsics -#vanquished == disclose counts of dead monsters sorted in various ways #vision == show vision array +#wizborn == show monster birth/death/geno/extinct stats +#wizcast == cast any spell +#wizdispmacros == [Opt] check internal display classifications +#wizfliplevel == transpose the current dungeon level #wizintrinsic == set selected intrinsic timeouts +#wizkill == remove monster(s) from play +#wizloaddes == load and execute a special level description lua script +#wizloadlua == load and execute a lua script #wizmakemap == recreate the current dungeon level -#wizrumorcheck == validate first and last rumor for true and false set +#wizmondiff == [Opt] check for discrepancies in monster difficulty ratings +#wizobjprobs == [Opt] list actual probabilities of item generation +#wizrumorcheck == validate rumor indexing; also show first, second, and last + random engravings, epitaphs, and hallucinatory monsters +#wizseenv == show map locations' seen vectors #wizsmell == smell a monster +#wiztelekinesis == magically shove a monster #wizwhere == show dungeon placement of all special levels #wmode == show wall modes Options: +debug_hunger == disable hero's hunger +debug_mongen == disable random monster generation +debug_overwrite_stairs + == allows stairs to be replaced by other terrain monpolycontrol == prompt for new form whenever any monster changes shape sanity_check == evaluate monsters, objects, and map prior to each turn wizweight == augment object descriptions with their objects' weight + +[Opt] = conditionally available depending upon build-time settings diff --git a/dat/yendor.des b/dat/yendor.des deleted file mode 100644 index 34b780988..000000000 --- a/dat/yendor.des +++ /dev/null @@ -1,281 +0,0 @@ -# NetHack 3.6 yendor.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ -# Copyright (c) 1989 by Jean-Christophe Collet -# Copyright (c) 1992 by M. Stephenson and Izchak Miller -# NetHack may be freely redistributed. See license for details. -# -# The top (real) wizard level. -# Keeping the Moat for old-time's sake -MAZE:"wizard1",random -FLAGS:noteleport,hardfloor -GEOMETRY:center,center -MAP -----------------------------. -|.......|..|.........|.....|. -|.......S..|.}}}}}}}.|.....|. -|..--S--|..|.}}---}}.|---S-|. -|..|....|..|.}--.--}.|..|..|. -|..|....|..|.}|...|}.|..|..|. -|..--------|.}--.--}.|..|..|. -|..|.......|.}}---}}.|..|..|. -|..S.......|.}}}}}}}.|..|..|. -|..|.......|.........|..|..|. -|..|.......|-----------S-S-|. -|..|.......S...............|. -----------------------------. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,28,12),up -STAIR:levregion(01,00,79,20),(0,0,28,12),down -BRANCH:levregion(01,00,79,20),(0,0,28,12) -TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) -# Make it a morgue for rm id in mkmaze.c -# for the purpose of random sdoor placement -REGION:(12,01,20,09),unlit,"morgue",unfilled -# another region to constrain monster arrival -REGION:(01,01,10,11),unlit,"ordinary",unfilled -MAZEWALK:(28,05),east -LADDER:(06,05),down -# Non diggable walls -# Walls inside the moat stay diggable -NON_DIGGABLE:(00,00,11,12) -NON_DIGGABLE:(11,00,21,00) -NON_DIGGABLE:(11,10,27,12) -NON_DIGGABLE:(21,00,27,10) -# Non passable walls -NON_PASSWALL:(00,00,11,12) -NON_PASSWALL:(11,00,21,00) -NON_PASSWALL:(11,10,27,12) -NON_PASSWALL:(21,00,27,10) -# The wizard and his guards -MONSTER:('@',"Wizard of Yendor"),(16,05),asleep -MONSTER:('d',"hell hound"),(15,05) -MONSTER:('V',"vampire lord"),(17,05) -# The local treasure -OBJECT:('+',"Book of the Dead"),(16,05) -# Surrounding terror -MONSTER:(';',"kraken"),(14,02) -MONSTER:(';',"giant eel"),(17,02) -MONSTER:(';',"kraken"),(13,04) -MONSTER:(';',"giant eel"),(13,06) -MONSTER:(';',"kraken"),(19,04) -MONSTER:(';',"giant eel"),(19,06) -MONSTER:(';',"kraken"),(15,08) -MONSTER:(';',"giant eel"),(17,08) -MONSTER:(';',"piranha"),(15,02) -MONSTER:(';',"piranha"),(19,08) -# Random monsters -MONSTER:'D',random -MONSTER:'H',random -MONSTER:'&',random -MONSTER:'&',random -MONSTER:'&',random -MONSTER:'&',random -# And to make things a little harder. -TRAP:"board",(16,04) -TRAP:"board",(16,06) -TRAP:"board",(15,05) -TRAP:"board",(17,05) -# Random traps. -TRAP:"spiked pit",random -TRAP:"sleep gas",random -TRAP:"anti magic",random -TRAP:"magic",random -# Some random loot. -OBJECT:('*',"ruby"),random -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'+',random -OBJECT:'+',random -OBJECT:'+',random - - -# The middle wizard level. -MAZE:"wizard2",random -FLAGS:noteleport,hardfloor -GEOMETRY:center,center -MAP -----------------------------. -|.....|.S....|.............|. -|.....|.-------S--------S--|. -|.....|.|.........|........|. -|..-S--S|.........|........|. -|..|....|.........|------S-|. -|..|....|.........|.....|..|. -|-S-----|.........|.....|..|. -|.......|.........|S--S--..|. -|.......|.........|.|......|. -|-----S----S-------.|......|. -|............|....S.|......|. -----------------------------. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,28,12),up -STAIR:levregion(01,00,79,20),(0,0,28,12),down -BRANCH:levregion(01,00,79,20),(0,0,28,12) -TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) -# entire tower in a region, constrains monster migration -REGION:(01,01,26,11),unlit,"ordinary",unfilled -REGION:(09,03,17,09),unlit,"zoo" -DOOR:closed,(15,02) -DOOR:closed,(11,10) -MAZEWALK:(28,05),east -LADDER:(12,01),up -LADDER:(14,11),down -# Non diggable walls everywhere -NON_DIGGABLE:(00,00,27,12) -# -NON_PASSWALL:(00,00,06,12) -NON_PASSWALL:(06,00,27,02) -NON_PASSWALL:(16,02,27,12) -NON_PASSWALL:(06,12,16,12) -# Random traps. -TRAP:"spiked pit",random -TRAP:"sleep gas",random -TRAP:"anti magic",random -TRAP:"magic",random -# Some random loot. -OBJECT:'!',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'+',random -# treasures -OBJECT:'"',(04,06) - - -# The bottom wizard level. -# Memorialize the fakewiz setup. -MAZE:"wizard3",random -FLAGS:noteleport,hardfloor -GEOMETRY:center,center -MAP -----------------------------. -|..|............S..........|. -|..|..------------------S--|. -|..|..|.........|..........|. -|..S..|.}}}}}}}.|..........|. -|..|..|.}}---}}.|-S--------|. -|..|..|.}--.--}.|..|.......|. -|..|..|.}|...|}.|..|.......|. -|..---|.}--.--}.|..|.......|. -|.....|.}}---}}.|..|.......|. -|.....S.}}}}}}}.|..|.......|. -|.....|.........|..|.......|. -----------------------------. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,28,12),up -STAIR:levregion(01,00,79,20),(0,0,28,12),down -BRANCH:levregion(01,00,79,20),(0,0,28,12) -TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) -PORTAL:(25,11,25,11),(0,0,0,0),"fakewiz1" -MAZEWALK:(28,09),east -REGION:(07,03,15,11),unlit,"morgue",unfilled -REGION:(17,06,18,11),unlit,"beehive" -# make the entry chamber a real room; it affects monster arrival; -# `unfilled' is a kludge to force an ordinary room to remain a room -REGION:(20,06,26,11),unlit,"ordinary",unfilled { - ROOMDOOR:true, closed, north|west, random -} -DOOR:closed,(18,05) -LADDER:(11,07),up -# Non diggable walls -# Walls inside the moat stay diggable -NON_DIGGABLE:(00,00,06,12) -NON_DIGGABLE:(06,00,27,02) -NON_DIGGABLE:(16,02,27,12) -NON_DIGGABLE:(06,12,16,12) -# -NON_PASSWALL:(00,00,06,12) -NON_PASSWALL:(06,00,27,02) -NON_PASSWALL:(16,02,27,12) -NON_PASSWALL:(06,12,16,12) -# -MONSTER:'L',(10,07) -MONSTER:('V',"vampire lord"),(12,07) -# Some surrounding horrors -MONSTER:(';',"kraken"),(08,05) -MONSTER:(';',"giant eel"),(08,08) -MONSTER:(';',"kraken"),(14,05) -MONSTER:(';',"giant eel"),(14,08) -# Other monsters -MONSTER:'L',random -MONSTER:'D',random -MONSTER:'D',(26,09) -MONSTER:'&',random -MONSTER:'&',random -MONSTER:'&',random -# And to make things a little harder. -TRAP:"board",(10,07) -TRAP:"board",(12,07) -TRAP:"board",(11,06) -TRAP:"board",(11,08) -# Some loot -OBJECT:')',random -OBJECT:'!',random -OBJECT:'?',random -OBJECT:'?',random -OBJECT:'(',random -# treasures -OBJECT:'"',(11,07) - - -# The former decoy wizard levels. -# There are two of these, and we need to -# distinguish between them for the portal. -MAZE:"fakewiz1",random -GEOMETRY:center,center -MAP -......... -.}}}}}}}. -.}}---}}. -.}--.--}. -.}|...|}. -.}--.--}. -.}}---}}. -.}}}}}}}. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,8,7),up -STAIR:levregion(01,00,79,20),(0,0,8,7),down -BRANCH:levregion(01,00,79,20),(0,0,8,7) -TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6) -PORTAL:(4,4,4,4),(0,0,0,0),"wizard3" -MAZEWALK:(08,05),east -REGION:(04,03,06,06),unlit,"ordinary",unfilled,irregular -MONSTER:'L',(04,04) -MONSTER:('V',"vampire lord"),(03,04) -MONSTER:(';',"kraken"),(06,06) -# And to make things a little harder. -TRAP:"board",(04,03) -TRAP:"board",(04,05) -TRAP:"board",(03,04) -TRAP:"board",(05,04) - - -MAZE:"fakewiz2",random -GEOMETRY:center,center -MAP -......... -.}}}}}}}. -.}}---}}. -.}--.--}. -.}|...|}. -.}--.--}. -.}}---}}. -.}}}}}}}. -ENDMAP -STAIR:levregion(01,00,79,20),(0,0,8,7),up -STAIR:levregion(01,00,79,20),(0,0,8,7),down -BRANCH:levregion(01,00,79,20),(0,0,8,7) -TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6) -MAZEWALK:(08,05),east -REGION:(04,03,06,06),unlit,"ordinary",unfilled,irregular -MONSTER:'L',(04,04) -MONSTER:('V',"vampire lord"),(03,04) -MONSTER:(';',"kraken"),(06,06) -# And to make things a little harder. -TRAP:"board",(04,03) -TRAP:"board",(04,05) -TRAP:"board",(03,04) -TRAP:"board",(05,04) -# treasures -OBJECT:'"',(04,04)