Source files from Richard Bartle.
authorLars Brinkhoff <lars@nocrew.org>
Sat, 14 Jan 2017 18:32:39 +0000 (19:32 +0100)
committerLars Brinkhoff <lars@nocrew.org>
Sat, 14 Jan 2017 18:32:39 +0000 (19:32 +0100)
35 files changed:
DBADAT.MAC [new file with mode: 0644]
DBASE.BCL [new file with mode: 0644]
DUNGEN.GET [new file with mode: 0644]
MBOOTS.MAC [new file with mode: 0644]
MUD.BOX [new file with mode: 0644]
MUD.SUB [new file with mode: 0644]
MUD.TXT [new file with mode: 0644]
MUD0.BCL [new file with mode: 0644]
MUD1.BCL [new file with mode: 0644]
MUD2.BCL [new file with mode: 0644]
MUD3.BCL [new file with mode: 0644]
MUD4.BCL [new file with mode: 0644]
MUD5.BCL [new file with mode: 0644]
MUD6.BCL [new file with mode: 0644]
MUD7.BCL [new file with mode: 0644]
MUD8.BCL [new file with mode: 0644]
MUDLIB.BCL [new file with mode: 0644]
MUDLIB.GET [new file with mode: 0644]
MUDTXT.SUB [new file with mode: 0644]
TXTBTM.GET [new file with mode: 0644]
TXTCBT.GET [new file with mode: 0644]
TXTCSY.GET [new file with mode: 0644]
TXTDAC.GET [new file with mode: 0644]
TXTDMN.GET [new file with mode: 0644]
TXTHRS.GET [new file with mode: 0644]
TXTLEV.GET [new file with mode: 0644]
TXTMAP.GET [new file with mode: 0644]
TXTMTN.GET [new file with mode: 0644]
TXTOBJ.GET [new file with mode: 0644]
TXTOSY.GET [new file with mode: 0644]
TXTRMS.GET [new file with mode: 0644]
TXTTOP.GET [new file with mode: 0644]
TXTTXT.GET [new file with mode: 0644]
TXTVOC.GET [new file with mode: 0644]
VALLEY.TXT [new file with mode: 0644]

diff --git a/DBADAT.MAC b/DBADAT.MAC
new file mode 100644 (file)
index 0000000..b13f51b
--- /dev/null
@@ -0,0 +1,103 @@
+;Copyright (C) 1980 by\r
+;Roy Trubshaw, Richard Bartle & Ronan Flood,\r
+;Essex University, Colchester. CO4 3SQ.\r
+;\r
+;      This software is furnished on the understanding that\r
+;it may be used and or copied only with the inclusion of this\r
+;notice.  No title or ownership of this software is hereby\r
+;transferred. The information in this software is subject to\r
+;change without notice. No responsibility is assumed for the\r
+;use or reliability of this software.\r
\r
+       TITLE   Database for MUD version 3\r
+       TWOSEG  400K\r
+       SALL\r
+       .DIRECTIVE      SFCOND\r
+       NOSYM\r
\r
+       MAXPLY==^D36\r
\r
+       IF2     <PRINTX Assembling Database for MUD version 3>\r
\r
+       DEFINE  FLIST(SIZE,NUM)<\r
+       EXP     .+1\r
+       REPEAT  NUM-1,<\r
+       EXP     .+SIZE\r
+       BLOCK   SIZE-1>\r
+       BLOCK   SIZE>\r
\r
+       DEFINE  VEC(SIZE,VALUE<0>)<\r
+       EXP     .+1\r
+       IFE     VALUE,  <BLOCK  SIZE>\r
+       IFN     VALUE,  <REPEAT SIZE,       <EXP       VALUE>>>\r
\r
+STARTL::EXP    .                               ;Address of start of database.\r
+INDEX:: EXP    0                               ;Room index.\r
+DICTIO::BLOCK  1                               ;Dictionary hash table.\r
+STLIST::BLOCK  1                               ;Pointer to start location list.\r
+MAX.RO::BLOCK  1                               ;Max number of rooms.\r
+MAX.DE::BLOCK  1                               ;Max number of demons.\r
+DEMONS::BLOCK  1                               ;Table of demons\r
+GDEMON::EXP    0                               ;List of global demons\r
+DATE:: BLOCK   1                               ;DECsystem 10 date of creation.\r
+RDATE::        EXP     0                               ;DECsystem 10 date of last reset\r
+RHOURS::EXP    0                               ;Accumulated time since last Reset\r
+RNDMS::        EXP     0                               ;List of room lists for randomisation\r
+FTIME::        EXP     0                               ;First time played this version?\r
+TIME:: BLOCK   1                               ;DECsystem 10 time of creation.\r
+BACKWD::BLOCK  1                               ;Says if a direction has an opposite\r
+TVERB::        BLOCK   1                               ;movement check word\r
+NAPCT::        0                                       ;number of naps before assume crash\r
+SUPERS::0                                      ;whether this is superseded by us or not\r
+DEMO:: 0                                       ;is there a demo on?\r
+RANDIR::0                                      ;random directions in travel table\r
+CODES::        BLOCK   1                               ;vdu manipulation codes.\r
+LOW1:: EXP     0                               ;overload measure\r
+LOW2:: EXP     0                               ;near-overload measure\r
+TIMES::        EXP .+1                                 ;vector of lists of playing times\r
+       BLOCK 7\r
+MOTVEC::       BLOCK   1                       ;Inverse movement no. to names\r
+MOVERS::       BLOCK   1                       ;Objects which are mobile\r
+MVLOCK::       EXP     -1                      ;So don't try to move above twice at once\r
+DELOCK::       EXP     -1                      ;Global demon lock\r
+MELTED::       EXP     -1                      ;Whether objects can move\r
+PEACE::        EXP     0                               ;whether can fight or not\r
+SPECT::        EXP     0                               ;whether there's a spectacular on\r
+MALE:: VEC     ^D10                            ;names for males\r
+                                               ;I bet I forget to alter with MAX.LEVEL...\r
+FEMALE::       VEC     ^D10                    ;names for females\r
+MUDNAM::       BLOCK   ^D27                    ;Name of dungeon as BCPL string\r
+MUD6:: EXP     0                               ;first 6 letters of above in 6bit\r
+ESXWD::        BLOCK   1                               ;memory location for manifest ESSEX constant\r
+PS6::  BLOCK   1                               ;first 6 letters of persona file\r
+MAX.ME::BLOCK  1                               ;Max number of text messages.\r
+TEXT:: BLOCK   1                               ;Table of text messages.\r
+TXTVEC::       BLOCK   1                       ;Word count for disc file\r
+INIDR:: EXP    -1                              ;Initialisation door.\r
+DELDR::        EXP     -1                              ;Delay door for timing out.\r
+ACTIVE::VEC    MAXPLY, -1                      ;To ensure you're still playing\r
+PLAYER::EXP    -1                              ;Stack pointer.\r
+       COUNT==MAXPLY+2                         ;2 is the frig factor!\r
+PLYNUM::VEC    MAXPLY,   <<COUNT=COUNT-1>>\r
+       PURGE   COUNT\r
+MQUEUE::VEC    MAXPLY                          ;Message queue.\r
+PNAMES::VEC    MAXPLY                          ;Player names.\r
+JOBNOS::VEC    MAXPLY                          ;Player job numbers. Forget locking it...\r
+KIPS:: VEC     MAXPLY                          ;Times at which people went to sleep.\r
+QDOORS::VEC    MAXPLY, -1                      ;Doors to message queues.\r
+PDOOR::        EXP     -1                              ;persona file door\r
+MDOOR:: EXP    -1                              ;Door to message freelist.\r
+NDOOR::        EXP     -1                              ;Door to name selection\r
+TABS:: VEC     ^D24                            ;Combat tables\r
+SHELF::        EXP     0                               ;Shelf for arch-wiz items\r
+SHORTM::FLIST  3,      200                     ;Short message freelist.\r
+LONGME::FLIST  20,     100                     ;Long message freelist.\r
+%RANSE::XWD    1,      -1                      ;Random number seed.\r
+MAGIC:: EXP    0                               ;If non zero u get thrown out.\r
+NOWIZ::        EXP     0                               ;true if no wiz's allowed\r
+LOCKED::EXP    0                               ;Whether the game is wizard-locked or not\r
+ENDLOC::EXP    HERE/^D512                      ;Current page\r
+FREE.S::EXP    .+1                             ;Freestore pointer\r
+       BLOCK   1\r
+HERE==.\r
+END\r
diff --git a/DBASE.BCL b/DBASE.BCL
new file mode 100644 (file)
index 0000000..4a46301
--- /dev/null
+++ b/DBASE.BCL
@@ -0,0 +1,1732 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.  No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "bcl:acs"\r
+get "bcl:rfs"\r
+get "bcl:iolib"\r
+get "dungen"\r
+get "bcl:bits"\r
+get "bcl:kernel"\r
+get "bcl:jobdat"\r
\r
+$ldtext "/runame:dbase"\r
\r
+manifest\r
+$(     MSLEN           =       127\r
+       SCRSIZ          =       WDSPERBUF\r
+$)\r
\r
+STATIC\r
+$(     procs           =       vec S.TEXT\r
+       name.string     =       vec 26\r
+       res             =       vec HASHSIZE\r
+       cbl             =       vec 1\r
+       roomput         =       false\r
+       textput         =       false\r
+       objput          =       false\r
+       mapput          =       false\r
+       comput          =       false\r
+       cmndput         =       false\r
+       getput          =       0\r
+       nextroom        =       0\r
+       nexttext        =       0\r
+       nextcombat      =       0\r
+       nextobj         =       1       //a hack...\r
+       nextmap         =       1       //ditto\r
+       nextcmnd        =       1       //ditto again!\r
+       filename        =       ?\r
+       scanch          =       0\r
+       mvec            =       vec 36\r
+       scan.info       =       0\r
+       roomlist        =       ?\r
+       forward.ref     =       0\r
+       rmfwdref        =       0\r
+       list            =       (table  #777777)\r
+       reserved        =       (TABLE\r
+                               "richard",      -1,             0,      0,\r
+                               "roy",  -1,             0,      0,\r
+                               "ronan",        -1,             0,      0,\r
+                               "brian",        -1,             0,      0,\r
+                               "debugger",     -1,             0,      0,\r
+                               "rooms",        S.ROOMS,        0,      0,\r
+                               "vocabulary",   S.VOCAB,        0,      0,\r
+                               "travel",       S.TRAVEL,       0,      0,\r
+                               "objects",      S.OBJECT,       0,      0,\r
+                               "object",       S.OBJECT,       0,      0,\r
+                               "maps",         S.MAP,          0,      0,\r
+                               "map",          S.MAP,          0,      0,\r
+                               "hours",        S.HOURS,        0,      0,\r
+                               "combat",       S.COMBAT,       0,      0,\r
+                               "persona",      S.PERSONA,      0,      0,\r
+                               "text",         S.TEXT,         0,      0,\r
+                               "levels",       S.LEVELS,       0,      0,\r
+                               "demons",       S.DEMONS,       0,      0,\r
+                               "demon",        S.DEMONS,       0,      0,\r
+                               "name",         S.MUDNAM,       0,      0,\r
+                               "light",        S.ATTR,         0,      B35,\r
+                               "water",        S.ATTR,         0,      B34,\r
+                               "oil",          S.ATTR,         0,      B33,\r
+                               "death",        S.ATTR,         0,      B32,\r
+                               "sanctuary",    S.ATTR,         0,      B31,\r
+                               "hideaway",     S.ATTR,         0,      B30,\r
+                               "small",        S.ATTR,         0,      B29,\r
+                               "chain",        S.ATTR,         0,      B28,\r
+                               "hide",         S.ATTR,         0,      B27,\r
+                               "dmove",        S.ATTR,         0,      B26,\r
+                               "nolook",       S.ATTR,         0,      B25,\r
+                               "silent",       S.ATTR,         0,      B24,\r
+                               "startrm",      S.ATTR,         0,      B23,\r
+                               "motion",       S.MOTION,       0,      0,\r
+                               "action",       S.ACTION,       0,      0,\r
+                               "fastatn",      S.FASTATN,      0,      0,\r
+                               "male",         S.MALE,         0,      0,\r
+                               "female",       S.FEMALE,       0,      0,\r
+                               "class",        S.CLASS,        0,      0,\r
+                               "bright",       S.BRIGHT,       0,      0,\r
+                               "noget",        S.NOGET,        0,      0,\r
+                               "contains",     S.CONTAINS,     0,      0,\r
+                               "transparent",  S.TRANSPARENT,  0,      0,\r
+                               "opened",       S.OPENED,       0,      0,\r
+                               "noit",         S.NOIT,         0,      0,\r
+                               "nosummon",     S.NOSUMMON,     0,      0,\r
+                               "always",       S.ALWAYS,       0,      0,\r
+                               "global",       S.GLOBAL,       0,      0,\r
+                               "enabled",      S.ENABLED,      0,      0,\r
+                               "disguised",    S.DISGUISED,    0,      0,\r
+                               "syn",          S.SYN,          0,      0,\r
+                               "synonym",      S.SYN,          0,      0,\r
+                               "noise",        S.NOISE,        0,      0,\r
+                               "conj",         S.CONT,         0,      0,\r
+                               "fprep",        S.WITH,         0,      0,\r
+                               "bprep",        S.AT,           0,      0,\r
+                               "quant",        S.ALL,          0,      0,\r
+                               "pron",         S.IT,           0,      0,\r
+                               "mpron",        S.HIM,          0,      0,\r
+                               "fpron",        S.HER,          0,      0,\r
+                               "ppron",        S.THEM,         0,      0,\r
+                               "place",        S.THERE,        0,      0,\r
+                               "self",         S.ME,           0,      0,\r
+                               "inst",         S.WHICHEVER,    0,      0,\r
+                               "universal",    S.SPECIAL,      0,      0,\r
+                               "noclass",      S.NONE,         0,      0,\r
+                               "persn",        S.PERSON,       #777777,        0,\r
+                               "sthing",       S.SOMETHING,    #777776,        0,\r
+                               "athing",       S.ANYTHING,     #777775,        0,\r
+                               ".tell",        S.SFUNC,        SF.TELL,        0,\r
+                               ".say",         S.SFUNC,        SF.SAY,         0,\r
+                               ".get",         S.SFUNC,        SF.GET,         0,\r
+                               ".drop",        S.SFUNC,        SF.DROP,        0,\r
+                               ".kill",        S.SFUNC,        SF.KILL,        0,\r
+                               ".quit",        S.SFUNC,        SF.QUIT,        0,\r
+                               ".score",       S.SFUNC,        SF.SCRE,        0,\r
+                               ".look",        S.SFUNC,        SF.LOOK,        0,\r
+                               ".log",         S.SFUNC,        SF.LOG, 0,\r
+                               ".inven",       S.SFUNC,        SF.INVN,0,\r
+                               ".debug",       S.SFUNC,        SF.DBUG,0,\r
+                               ".make",        S.SFUNC,        SF.FRCE,        0,\r
+                               ".summon",      S.SFUNC,        SF.SUMMON,      0,\r
+                               ".fod",         S.SFUNC,        SF.FOD, 0,\r
+                               ".go",          S.SFUNC,        SF.GO,  0,\r
+                               ".sget",        S.SFUNC,        SF.SGET,        0,\r
+                               ".sgo",         S.SFUNC,        SF.SGO, 0,\r
+                               ".back",        S.SFUNC,        SF.BACK,        0,\r
+                               ".bug",         S.SFUNC,        SF.BUG, 0,\r
+                               ".who",         S.SFUNC,        SF.WHO, 0,\r
+                               ".autowho",     S.SFUNC,        SF.AUTOWHO,     0,\r
+                               ".quickwho",    S.SFUNC,        SF.QUICKWHO,    0,\r
+                               ".reset",       S.SFUNC,        SF.RESET,       0,\r
+                               ".rooms",       S.SFUNC,        SF.ROOMS,       0,\r
+                               ".berserk",     S.SFUNC,        SF.BERSERK,     0,\r
+                               ".weigh",       S.SFUNC,        SF.WEIGH,       0,\r
+                               ".value",       S.SFUNC,        SF.VALUE,       0,\r
+                               ".ctrap",       S.SFUNC,        SF.CTRAP,       0,\r
+                               ".follow",      S.SFUNC,        SF.FOLLOW,      0,\r
+                               ".lose",        S.SFUNC,        SF.LOSE,        0,\r
+                               ".begone",      S.SFUNC,        SF.BEGONE,      0,\r
+                               ".demo",        S.SFUNC,        SF.DEMO,        0,\r
+                               ".laugh",       S.SFUNC,        SF.LAUGH,       0,\r
+                               ".provoke",     S.SFUNC,        SF.PROVOKE,     0,\r
+                               ".purge",       S.SFUNC,        SF.PURGE,       0,\r
+                               ".save",        S.SFUNC,        SF.SAVE,        0,\r
+                               ".assist",      S.SFUNC,        SF.JOIN,        0,\r
+                               ".refuse",      S.SFUNC,        SF.REFUSE,      0,\r
+                               ".set",         S.SFUNC,        SF.SET,         0,\r
+                               ".password",    S.SFUNC,        SF.PASSWORD,    0,\r
+                               ".snoop",       S.SFUNC,        SF.SNOOP,       0,\r
+                               ".p",           S.SFUNC,        SF.P,           0,\r
+                               ".unveil",      S.SFUNC,        SF.UNVEIL,      0,\r
+                               ".unsnoop",     S.SFUNC,        SF.UNSNOOP,     0,\r
+                               ".direct",      S.SFUNC,        SF.DIRECT,      0,\r
+                               ".where",       S.SFUNC,        SF.WHERE,       0,\r
+                               ".brief",       S.SFUNC,        SF.BRIEF,       0,\r
+                               ".ignore",      S.SFUNC,        SF.IGNORE,      0,\r
+                               ".verbose",     S.SFUNC,        SF.VERBOSE,     0,\r
+                               ".flee",        S.SFUNC,        SF.FLEE,        0,\r
+                               ".diagnose",    S.SFUNC,        SF.DIAGNOSE,    0,\r
+                               ".blind",       S.SFUNC,        SF.blind,       0,\r
+                               ".deafen",      S.SFUNC,        SF.deafen,      0,\r
+                               ".dumb",        S.SFUNC,        SF.dumb,        0,\r
+                               ".paralyse",    S.SFUNC,        SF.paralyse,    0,\r
+                               ".cure",        S.SFUNC,        SF.cure,        0,\r
+                               ".exorcise",    S.SFUNC,        SF.EXORCISE,    0,\r
+                               ".freeze",      S.SFUNC,        SF.FREEZE,      0,\r
+                               ".unfreeze",    S.SFUNC,        SF.UNFREEZE,    0,\r
+                               ".mobile",      S.SFUNC,        SF.MOBILE,      0,\r
+                               ".humble",      S.SFUNC,        SF.HUMBLE,      0,\r
+                               ".proof",       S.SFUNC,        SF.PROOF,       0,\r
+                               ".shelve",      S.SFUNC,        SF.SHELVE,      0,\r
+                               ".unshelve",    S.SFUNC,        SF.UNSHELVE,    0,\r
+                               ".invis",       S.SFUNC,        SF.INVIS,       0,\r
+                               ".vis",         S.SFUNC,        SF.VIS,         0,\r
+                               ".peace",       S.SFUNC,        SF.PEACE,       0,\r
+                               ".war",         S.SFUNC,        SF.WAR,         0,\r
+                               ".haste",       S.SFUNC,        SF.HASTE,       0,\r
+                               ".stamina",     S.SFUNC,        SF.STAMINA,     0,\r
+                               ".sleep",       S.SFUNC,        SF.SLEEP,       0,\r
+                               ".flush",       S.SFUNC,        SF.FLUSH,       0,\r
+                               ".wake",        S.SFUNC,        SF.WAKE,        0,\r
+                               ".change",      S.SFUNC,        SF.CHANGE,      0,\r
+                               ".enchant",     S.SFUNC,        SF.ENCHANT,     0,\r
+                               ".police",      S.SFUNC,        SF.POLICE,      0,\r
+                               ".resurrect",   S.SFUNC,        SF.RESURRECT,   0,\r
+                               ".keep",        S.SFUNC,        SF.KEEP,        0,\r
+                               ".unkeep",      S.SFUNC,        SF.UNKEEP,      0,\r
+                               ".attach",      S.SFUNC,        SF.ATTACH,      0,\r
+                               ".detach",      S.SFUNC,        SF.DETACH,      0,\r
+                               ".insert",      S.SFUNC,        SF.INSERT,      0,\r
+                               ".remove",      S.SFUNC,        SF.REMOVE,      0,\r
+                               ".pronouns",    S.SFUNC,        SF.PRONOUNS,    0,\r
+                               ".hours",       S.SFUNC,        SF.HOURS,       0,\r
+                               ".newhours",    S.SFUNC,        SF.NEWHOURS,    0,\r
+                               ".spectacular", S.SFUNC,        SF.SPECTACULAR, 0,\r
+                               ".empty",       S.SFUNC,        SF.EMPTY,       0,\r
+                               ".bye",         S.SFUNC,        SF.BYE,         0,\r
+                               ".time",        S.SFUNC,        SF.TIME,        0,\r
+                               ".crash",       S.SFUNC,        SF.CRASH,       0,\r
+                               ".map",         S.SFUNC,        SF.MAP,         0,\r
+                               ".exits",       S.SFUNC,        SF.EXITS,       0,\r
+                               ".converse",    S.SFUNC,        SF.CONVERSE,    0,\r
+                               "inc",          S.AFUNC,        F.INC,  0,\r
+                               "dec",          S.AFUNC,        F.DEC,  0,\r
+                               "null",         S.AFUNC,        F.NULL, 0,\r
+                               "move",         S.AFUNC,        F.MOVE, 0,\r
+                               "trans",        S.AFUNC,        F.TRANS,0,\r
+                               "set",          S.AFUNC,        F.SET,  0,\r
+                               "resetdest",    S.AFUNC,        F.RESETDEST,    0,\r
+                               "toggle",       S.AFUNC,        F.TOGGLE,       0,\r
+                               "fix",          S.AFUNC,        F.FIX,  0,\r
+                               "float",        S.AFUNC,        F.FLOAT,0,\r
+                               "destroy",      S.AFUNC,        F.DESTROY,      0,\r
+                               "create",       S.AFUNC,        F.CREATE,       0,\r
+                               "forrot",       S.AFUNC,        F.FORROT,       0,\r
+                               "backrot",      S.AFUNC,        F.BACKROT,      0,\r
+                               "expinc",       S.AFUNC,        F.EXPINC,       0,\r
+                               "expset",       S.AFUNC,        F.EXPSET,       0,\r
+                               "holdfirst",    S.AFUNC,        F.HOLDFIRST,    0,\r
+                               "holdlast",     S.AFUNC,        F.HOLDLAST,     0,\r
+                               "flipat",       S.AFUNC,        F.FLIPAT,       0,\r
+                               "retal",        S.AFUNC,        F.RETALIATE,    0,\r
+                               "ifzero",       S.AFUNC,        F.IFZERO,       0,\r
+                               "testsex",      S.AFUNC,        F.TESTSEX,      0,\r
+                               "ifobjcount",   S.AFUNC,        F.IFOBJCOUNT,   0,\r
+                               "ifprop",       S.AFUNC,        F.IFPROP,       0,\r
+                               "ifpropinc",    S.AFUNC,        F.IFPROPINC,    0,\r
+                               "ifpropdec",    S.AFUNC,        F.IFPROPDEC,    0,\r
+                               "ifrprop",      S.AFUNC,        F.IFRPROP,      0,\r
+                               "ifrlevel",     S.AFUNC,        F.IFRLEVEL,     0,\r
+                               "ifr",          S.AFUNC,        F.IFR,          0,\r
+                               "noifr",        S.AFUNC,        F.NOIFR,        0,\r
+                               "ifberserk",    S.AFUNC,        F.IFBERSERK,    0,\r
+                               "unlessberserk",        S.AFUNC,        F.UNLESSBERSERK,        0,\r
+                               "ifwiz",        S.AFUNC,        F.IFWIZ,        0,\r
+                               "ifill",        S.AFUNC,        F.IFILL,        0,\r
+                               "unlessill",    S.AFUNC,        F.unlessILL,    0,\r
+                               "ifdeaf",       S.AFUNC,        F.IFDEAF,       0,\r
+                               "ifblind",      S.AFUNC,        F.IFblind,      0,\r
+                               "ifparalysed",  S.AFUNC,        F.IFparalysed,  0,\r
+                               "ifdumb",       S.AFUNC,        F.IFdumb,       0,\r
+                               "unlesswiz",    S.AFUNC,        F.UNLESSWIZ,    0,\r
+                               "unlessrlevel", S.AFUNC,        F.UNLESSRLEVEL, 0,\r
+                               "flush",        S.AFUNC,        F.FLUSH,        0,\r
+                               "unlessprop",   S.AFUNC,        F.UNLESSPROP,   0,\r
+                               "incdestroy",   S.AFUNC,        F.INCDESTROY,   0,\r
+                               "destroytrans", S.AFUNC,        F.DESTROYTRANS, 0,\r
+                               "floatdestroy", S.AFUNC,        F.FLOATDESTROY, 0,\r
+                               "decdestroy",   S.AFUNC,        F.DECDESTROY,   0,\r
+                               "destroydec",   S.AFUNC,        F.DESTROYDEC,   0,\r
+                               "decifzero",    S.AFUNC,        F.DECIFZERO,    0,\r
+                               "swap",         S.AFUNC,        F.SWAP,         0,\r
+                               "unlessin",     S.AFUNC,        F.UNLESSIN,     0,\r
+                               "unlessobjis",  S.AFUNC,        F.UNLESSOBJIS,  0,\r
+                               "ifobjis",      S.AFUNC,        F.IFOBJIS,      0,\r
+                               "unlessinsis",  S.AFUNC,        F.UNLESSINSIS,  0,\r
+                               "ifinsis",      S.AFUNC,        F.IFINSIS,      0,\r
+                               "unlessobjplayer",      S.AFUNC,        F.UNLESSOBJPLAYER,      0,\r
+                               "ifobjplayer",  S.AFUNC,        F.IFOBJPLAYER,  0,\r
+                               "ifsmall",      S.AFUNC,        F.IFSMALL,      0,\r
+                               "unlesssmall",  S.AFUNC,        F.UNLESSSMALL,  0,\r
+                               "testsmall",    S.AFUNC,        F.TESTSMALL,    0,\r
+                               "transwhere",   S.AFUNC,        F.TRANSWHERE,   0,\r
+                               "ifin",         S.AFUNC,        F.IFIN,         0,\r
+                               "exp",          S.AFUNC,        F.EXP,          0,\r
+                               "stamina",      S.AFUNC,        F.STAMINA,      0,\r
+                               "staminadestroy",       S.AFUNC,        F.STAMINADESTROY,       0,\r
+                               "loseexp",      S.AFUNC,        F.LOSEEXP,      0,\r
+                               "losestamina",  S.AFUNC,        F.LOSESTAMINA,  0,\r
+                               "injure",       S.AFUNC,        F.INJURE,       0,\r
+                               "writein",      S.AFUNC,        F.WRITEIN,      0,\r
+                               "enable",       S.AFUNC,        F.ENABLE,       0,\r
+                               "suspend",      S.AFUNC,        F.SUSPEND,      0,\r
+                               "delaymove",    S.AFUNC,        F.DELAYMOVE,    0,\r
+                               "disenable",    S.AFUNC,        F.DISENABLE,    0,\r
+                               "unlessdisenable",      S.AFUNC,        F.UNLESSDISENABLE,      0,\r
+                               "ifdisenable",  S.AFUNC,        F.IFDISENABLE,  0,\r
+                               "ifenabled",    S.AFUNC,        F.IFENABLED,    0,\r
+                               "unlessenabled",        S.AFUNC,        F.UNLESSENABLED,        0,\r
+                               "unlessgot",    S.AFUNC,        F.UNLESSGOT,    0,\r
+                               "ifgot",        S.AFUNC,        F.IFGOT,        0,\r
+                               "ifdead",       S.AFUNC,        F.IFDEAD,       0,\r
+                               "unlessdestroyed",      S.AFUNC,        F.UNLESSDESTROYED,      0,\r
+                               "ifdestroyed",  S.AFUNC,        F.IFDESTROYED,  0,\r
+                               "ifsnooping",   S.AFUNC,        F.IFSNOOPING,   0,\r
+                               "unlesssnooping",       S.AFUNC,        F.UNLESSSNOOPING,       0,\r
+                               "iffighting",   S.AFUNC,        F.IFFIGHTING,   0,\r
+                               "unlessfighting",       S.AFUNC,        F.UNLESSFIGHTING,       0,\r
+                               "ifpropdestroy",        S.AFUNC,        F.IFPROPDESTROY,        0,\r
+                               "unlesspropdestroy",    S.AFUNC,        F.UNLESSPROPDESTROY,    0,\r
+                               "unlessdead",   S.AFUNC,        F.UNLESSDEAD,   0,\r
+                               "ifweighs",     S.AFUNC,        F.IFWEIGHS,     0,\r
+                               "unlessweighs", S.AFUNC,        F.UNLESSWEIGHS, 0,\r
+                               "ifhave",       S.AFUNC,        F.IFHAVE,       0,\r
+                               "unlesshave",   S.AFUNC,        F.UNLESSHAVE,   0,\r
+                               "ifobjcontains",        S.AFUNC,        F.IFOBJCONTAINS,        0,\r
+                               "unlessobjcontains",    S.AFUNC,        F.UNLESSOBJCONTAINS,    0,\r
+                               "iflevel",      S.AFUNC,        F.IFLEVEL,      0,\r
+                               "unlesslevel",  S.AFUNC,        F.UNLESSLEVEL,  0,\r
+                               "ifplaying",    S.AFUNC,        F.IFPLAYING,    0,\r
+                               "unlessplaying", S.AFUNC,       F.UNLESSPLAYING,        0,\r
+                               "ifself",       S.AFUNC,        F.IFSELF,       0,\r
+                               "destroydestroy", S.AFUNC,      F.DESTROYDESTROY,       0,\r
+                               "ifinc",        S.AFUNC,        F.IFINC,        0,\r
+                               "unlessinc",    S.AFUNC,        F.UNLESSINC,    0,\r
+                               "expdestroy",   S.AFUNC,        F.EXPDESTROY,   0,\r
+                               "expmove",      S.AFUNC,        F.EXPMOVE,      0,\r
+                               "incmove",      S.AFUNC,        F.INCMOVE,      0,\r
+                               "destroyinc",   S.AFUNC,        F.DESTROYINC,   0,\r
+                               "transhere",    S.AFUNC,        F.TRANSHERE,    0,\r
+                               "iflight",      S.AFUNC,        F.IFLIGHT,      0,\r
+                               "ifsex",        S.AFUNC,        F.IFSEX,        0,\r
+                               "ifinvis",      S.AFUNC,        F.IFINVIS,      0,\r
+                               "ifasleep",     S.AFUNC,        F.IFASLEEP,     0,\r
+                               "ifrstas",      S.AFUNC,        F.IFRSTAS,      0,\r
+                               "unlessrstas",  S.AFUNC,        F.UNLESSRSTAS,  0,\r
+                               "emotion",      S.AFUNC,        F.EMOTION,      0,\r
+                               "zonk",         S.AFUNC,        F.ZONK,         0,\r
+                               "dead",         S.AFUNC,        F.DEAD,         0,\r
+                               "send",         S.AFUNC,        F.SEND,         0,\r
+                               "sendeffect",   S.AFUNC,        F.SENDEFFECT,   0,\r
+                               "sendmess",     S.AFUNC,        F.SENDMESS,     0,\r
+                               "sendlevel",    S.AFUNC,        F.SENDLEVEL,    0,\r
+                               "hurt",         S.AFUNC,        F.HURT,         0,\r
+                               "sendemon",     S.AFUNC,        F.SENDEMON,     0,\r
+                               "ssendemon",    S.AFUNC,        F.SSENDEMON,    0,\r
+                               "incdec",       S.AFUNC,        F.INCDEC,       0,\r
+                               "decinc",       S.AFUNC,        F.DECINC,       0,\r
+                               "incsend",      S.AFUNC,        F.INCSEND,      0,\r
+                               "ifhere",       S.AFUNC,        F.IFHERE,       0,\r
+                               "ifheretrans",  S.AFUNC,        F.IFHERETRANS,  0,\r
+                               "unlesshere",   S.AFUNC,        F.UNLESSHERE,   0,\r
+                               "setsex",       S.AFUNC,        F.SETSEX,       0,\r
+                               "togglesex",    S.AFUNC,        F.TOGGLESEX,    0,\r
+                               "destroytogglesex",     S.AFUNC,        F.DESTROYTOGGLESEX,     0,\r
+                               "destroycreate",        S.AFUNC,        F.DESTROYCREATE,        0,\r
+                               "destroyset",   S.AFUNC,        F.DESTROYSET,   0,\r
+                               "setdestroy",   S.AFUNC,        F.SETDESTROY,   0,\r
+                               "setfloat",     S.AFUNC,        F.SETFLOAT,     0,\r
+                               "n",            S.TCOND,        0,      0,\r
+                               "none",         S.TCOND,        0,      0,\r
+                               "e",            S.TCOND,        -1,     0,\r
+                               "empty",        S.TCOND,        -1,     0,\r
+                               "f",            S.FORCED,       0,      0,\r
+                               "forced",       S.FORCED,       0,      0,\r
+                               "d",            S.DIFF,         0,      0,\r
+                               "different",    S.DIFF,         0,      0,\r
+                               "dd",           S.DD,           0,      0,\r
+                               -1)\r
+//Flags\r
+       class           =       0\r
+       mtion           =       0\r
+       object          =       0\r
+       roomflg         =       0\r
+       vocabflg        =       0\r
+       travelflg       =       0\r
+       objectflg       =       0\r
+       mapflg          =       0\r
+       hrflg           =       0\r
+       cmflg           =       0\r
+       psflg           =       0\r
+       textflg         =       0\r
+       levelsflg       =       0\r
+       demonsflg       =       0\r
+       fast            =       0\r
+$)\r
\r
+let start() be\r
+$(     let scan,save=?,?\r
+       initialise()\r
+       $(      scan:=scanner()\r
+               switchon scan into\r
+               $(      case S.ROOMS ... S.TEXT:\r
+                               save:=free.space\r
+                               out("*C*L:S ",scan.info)\r
+                               (scan!procs)()\r
+                               out("used :N",free.space-save)\r
+                               endcase\r
+                       case S.EOF:\r
+                               date:=valof $[ $DATE      AC,      0          $]\r
+                               time:=valof $[ $MSTIME      AC,      0        $]\r
+                               break\r
+                       case S.MUDNAM:\r
+                               unless scanner()=S.NAME error("illegal name for dungeon")\r
+                               for i=0 to 26 do (@mudnam)!i:=scan.info!i\r
+                               mudnam bitand:=#776777777777\r
+                               for i=1 to 6 do\r
+                               $(      let letter=(selector 7:29-((7*i) rem 35):i/5)\r
+                                       mud6:=(mud6<<6)+(letter of (@mudnam)->(((letter of (@mudnam)) bitand \#40)-#40),0)\r
+                               $)\r
+                               unless mud6 = filename error("Name in **name section :6 not same as .txt file :6*C*L", mud6, filename)\r
+                               endcase\r
+                       default:\r
+                               error("Unknown database section :s",scan.info)\r
+               $)\r
+       $)      repeat\r
+       finalise()\r
+$)\r
+and load.rooms() be\r
+$(     let room,attribute,start.list,count=?,?,0,0\r
+       checkflag(@roomflg,"Duplicate rooms sections")\r
+       unless scanner()=S.NUMBER error("No size given in rooms section")\r
+       max.room.no:=scan.info\r
+       index:=highvec(HASHSIZE)\r
+       unless fast writes(tty, "*C*L0")\r
+       for i=1 to max.room.no do\r
+       $(      unless scanner()=S.NAME error("Not enough room names")\r
+               unless fast write(tty,"*C:n",i)\r
+               room:=find.room(scan.info,true)\r
+               LH of room:=highvec(ROOMSIZE)\r
+               init.room(LH of room,RNAME of room)\r
+               room:=LH of room\r
+               RNUMB of room:=i\r
+               while scanch='*T' do\r
+               $(      unless scanner()=S.NAME error("No name read")\r
+                       attribute:=checklook.up(scan.info,S.ATTR,"Unknown attribute read :s")\r
+                       ATTRIB of room bitor_INFO of attribute\r
+                       if INFO of attribute=A.START\r
+                       $(      let temp=newvec(0)\r
+                               RH of temp_start.list\r
+                               LH of temp_room\r
+                               start.list_temp\r
+                       $)\r
+                       if INFO of attribute=A.CHAIN\r
+                       $(      let leavec = highvec(LEAVESIZE)\r
+                               unless scanner()=S.NAME error("nothing to chain to in [:6]",!room)\r
+                               INVADE of leavec _ copy(name.string)\r
+                               unless scanner()=S.NAME error("no room to chain to in [:6]",!room)\r
+                               BCHEAD of leavec _ copy(name.string)\r
+                               LEAVE of room_leavec\r
+                       $)\r
+                       if INFO of attribute=A.DMOVE\r
+                       $(      let nd,sv,len=?,?,?\r
+                               unless scanner()=S.NAME error("no room to dmove things to in [:6]",!room)\r
+                               len_LENGTH of scan.info/5\r
+                               nd_newvec(len+1)\r
+                               sv_nd+1\r
+                               for i=0 to len sv!i_scan.info!i\r
+                               LH of nd_room\r
+                               LINK of nd_rmfwdref\r
+                               rmfwdref_nd\r
+                       $)\r
+               $)\r
+               startlinech()\r
+               TITLE of room_nextroom\r
+               if scanch='*T' transfer.dsk(@nextroom, roomput, TITLE, room,true)\r
+               ROOMWD of room_nextroom\r
+               transfer.dsk(@nextroom, roomput)\r
+       $)\r
+       while rmfwdref do\r
+       $(      let rm,linker=find.room(rmfwdref+1),LINK of rmfwdref\r
+               unless rm error("forward reference for DMOVE in [:6] not satisfied",LH of rmfwdref)\r
+               DMOVE of LH of rmfwdref_LH of rm\r
+               free(rmfwdref)\r
+               rmfwdref_linker\r
+       $)\r
+       stlist,count_highvec(0),0\r
+       while start.list\r
+       $(      let temp=start.list\r
+               count+_1\r
+               !highvec(0)_LH of start.list\r
+               start.list of_ RH\r
+               free(temp)\r
+       $)\r
+       !stlist_count           //Number of random starts stored first\r
+       unless count error("No START locations defined")\r
+       unless fast writes(tty," = last room number*C*L")\r
+$)\r
\r
+and load.vocab() be\r
+$(     let word,type,word1,temp,oldword=0,0,0,0,?\r
+       checkflag(@vocabflg,"Duplicate vocabulary section")\r
+       startlinech()   scan.info:=0\r
+       $(      unless scanch='*T' then\r
+               $(      unless scanner()=S.NAME error("No vocabulary type")\r
+                       type:=look.up(scan.info)\r
+               $)\r
+               unless type test scan.info then error("Unknown vocabulary type [:s]",scan.info)\r
+               or error("No vocabulary type given at start of section")\r
+               unless scanner(true)=S.NAME error("No vocabulary word")\r
+               oldword_(PTYPE of type=S.ACTION) -> find.word(scan.info,S.FASTATN), 0   //Check it's a fast action verb.\r
+               word:=oldword -> oldword, find.word(scan.info,PTYPE of type,true)\r
+               switchon PTYPE of type into\r
+               $(      case S.MOTION:\r
+                               mtion+:1\r
+                               mvec!mtion_PNAME of word\r
+                               DREC of word:=mtion\r
+                               (byte 1:mtion) from backword_FIRSTCH of scan.info ne '$'\r
+                       case S.NOISE:\r
+                       case S.CONT:\r
+                       case S.WITH:\r
+                       case S.AT:\r
+                       case S.ALL:\r
+                       case S.IT:\r
+                       case S.HIM:\r
+                       case S.HER:\r
+                       case S.THEM:\r
+                       case S.THERE:\r
+                       case S.ME:\r
+                       case S.WHICHEVER:\r
+                               endcase\r
+                       case S.NONE:\r
+                               PTYPE of word_S.CLASS\r
+                               endcase\r
+                       case S.PERSON:\r
+                       case S.SOMETHING:\r
+                       case S.ANYTHING:\r
+                               DREC of word_P1 of type\r
+                               endcase\r
+                       case S.CLASS:\r
+                               class+:1\r
+                               DREC of word:=class\r
+                               endcase\r
+                       case S.SYN:\r
+                               scanner(true)\r
+                               word1:=checkfind.word(scan.info,0,"Unknown synonym given [:s]")\r
+                               PTYPE of word:=PTYPE of word1\r
+                               DREC of word_valof\r
+                               $(      switchon PTYPE of word into\r
+                                       $(      case S.OBJECT:\r
+                                               $(      let drc,sptr=DREC of word1,newvec(0)\r
+                                                       LINK of sptr_D7 of drc\r
+                                                       D7 of drc_sptr\r
+                                                       LH of sptr_word\r
+                                                       resultis -1\r
+                                               $)\r
+                                               case S.ACTION: case S.FASTATN:\r
+                                                       SYN of word_true\r
+                                                       if SYN of word1 word1 of_ DREC  //Each synonym points to the actual verb\r
+                                                       resultis word1\r
+                                               default:\r
+                                                       resultis DREC of word1\r
+                                       $)\r
+                               $)\r
+                               endcase\r
+                       case S.OBJECT:\r
+                               object+:1\r
+                               temp:=appenddr(word,newvec(ODRSIZE))\r
+                               D1 of temp:=object\r
+                               scanner()\r
+                               word1:=checkfind.word(scan.info,S.CLASS,"Word after object not a class [:s]")\r
+                               D2 of temp:=DREC of word1\r
+                               unless scanner()=S.NUMBER error("No weight for object [:s]",PNAME of object)\r
+                               D3 of temp:=scan.info\r
+                               unless scanner()=S.NUMBER error("No value for object [:s]",PNAME of object)\r
+                               D4 of temp:=scan.info\r
+                               D7 of temp_0\r
+                               endcase\r
+                       case S.FASTATN:\r
+                               if find.word(PNAME of word,S.ACTION) error("Action already defined as a slow action [:s].",PNAME of word)\r
+                               SAVED of word_true      //Don't need to save it to disc.\r
+                               endcase\r
+                       case S.ACTION:\r
+                               SYN of word_false       //not an action synonym.\r
+                               temp:=appenddr(word,PTYPE of word=S.ACTION->newvec(DRSIZE),highvec(DRSIZE))\r
+                               for i=0 to DRSIZE temp!i_0\r
+                               test scanner()=S.DOTNAME then\r
+                               $(      word1:=checklook.up(scan.info,S.SFUNC,"unknown Special function [:s]")\r
+                                       D7 of temp:=P1 of word1\r
+                                       scanner()\r
+                               $) or D7 of temp:=SF.ACTION\r
+                               word1:=checkfind.word(scan.info,S.CLASS,"word not a class [:s]")\r
+                               D1 of temp:=DREC of word1\r
+                               test scanner() = S.NUMBER then D2 of temp_scan.info + #400000 or\r
+                               $(      word1:=checkfind.word(scan.info,S.CLASS,"Word not a class [:s]")\r
+                                       D2 of temp:=DREC of word1\r
+                               $)\r
+                               scanner()\r
+                               word1:=checklook.up(scan.info,S.AFUNC,"Unknown action function [:s]")\r
+                               D3 of temp:=P1 of word1\r
+                               unless scanner() = S.NAME then error("object expected after action function")\r
+                               test seq(scan.info,"null") \/ seq(scan.info, "first") then D6 of temp:=0 or\r
+                               test seq(scan.info,"second") then D6 of temp_-1 or\r
+                               $(      let note=newvec(1)\r
+                                       D6 of temp_checkfind.word(scan.info, S.OBJECT, "Unknown object after function [:s]")\r
+                                       !note_forward.ref\r
+                                       1!note_temp\r
+                                       forward.ref_RH from note\r
+                               $)\r
+                               if scanner()=S.NAME then\r
+                               $(      word1:=checkfind.room(scan.info,"Unknown room specified [:s]")\r
+                                       test LH of word1 then scan.info_word1 or\r
+                                       $(      scan.info:=highvec(0)\r
+                                               randomise(0, LH, scan.info)\r
+                                       $)\r
+                               $)\r
+                               D4 of temp:=scan.info\r
+                               if scanner()=S.NAME then\r
+                               $(      word1:=checkfind.room(scan.info,"Unknown room specified [:s]")\r
+                                       test LH of word1 then scan.info_word1 or\r
+                                       $(      scan.info:=highvec(0)\r
+                                               randomise(0, LH, scan.info)\r
+                                       $)\r
+                               $)\r
+                               D5 of temp:=scan.info\r
+                               D9 of temp_-1\r
+                               while scanch='*T' nextch()\r
+                               if '0' le scanch le '9' \/ scanch='-'\/scanch='+' then\r
+                               $(      unless scanch='-'\r
+                                       $(      scanner()\r
+                                               D8 of temp_scan.info\r
+                                               while scanch='*T' nextch()\r
+                                       $)\r
+                                       if scanch='-'\r
+                                       $(      nextch()\r
+                                               scanner()\r
+                                               D9 of temp_scan.info\r
+                                       $)\r
+                               $)\r
+                               endcase\r
+               $)\r
+               startlinech()\r
+               if scanch=';' startlinech(true)\r
+       $)      repeatuntil scanch='**'\r
+$)\r
+and isaction(word) = word->PTYPE of word=S.ACTION\/PTYPE of word=S.FASTATN,false\r
+and load.travel() be\r
+$(     let room,cond,condwrd,newrm,word,type,t=?,?,?,?,?,?,?\r
+       unless roomflg/\vocabflg error("Needs predefined vocabulary and rooms")\r
+       checkflag(@travelflg,"Duplicate travel table")\r
+       unless fast writes(tty, "*C*L0")\r
+       unless scanner()=S.NAME error("travel word expected")\r
+       tverb_checkfind.word(scan.info, S.ACTION, "unknown travel action [:s]")\r
+       for i=1 to max.room.no do\r
+       $(      let ptr, tptr=0, @ptr\r
+               unless fast write(tty,"*C:n",i)\r
+               unless scanner()=S.NAME error("Can't read room name")\r
+               room:=LH of checkfind.room(scan.info,"Unknown room [:s]")\r
+               TRAVEL of room:=free.space\r
+               $(      let notted=0\r
+                       while scanch='*T' nextch()\r
+                       if scanch='~' nextch()<>notted_6\r
+                       t:=scanner()\r
+                       switchon t into\r
+                       $(      case S.NAME:\r
+                                       cond:=look.up(scan.info)\r
+                                       test cond then switchon PTYPE of cond into\r
+                                       $(      case S.TCOND:\r
+                                                       condwrd:=P1 of cond\r
+                                                       endcase\r
+                                               case S.FORCED:\r
+                                                       unless scanner()=S.NAME error("Cannot read room name")\r
+                                                       newrm:=checkfind.room(scan.info,"Room after forced not known [:s]")\r
+                                                       FORCED of room:=LH of newrm\r
+                                                       startlinech()\r
+                                                       loop\r
+                                               case S.DIFF:\r
+                                                       condwrd_4<<18\r
+                                                       endcase\r
+                                               case S.DD:\r
+                                                       condwrd_(10<<18)+valof\r
+                                                       $(      t_scanner()\r
+                                                               unless t=S.NUMBER error("number expected after DD condition")\r
+                                                               resultis scan.info\r
+                                                       $)\r
+                                                       endcase\r
+                                               default:\r
+                                                       error("Illegal condition specified [:s]",scan.info)\r
+                                       $) or\r
+                                       $(      cond:=find.word(scan.info,S.CLASS)\r
+                                               unless cond cond:=checkfind.word(scan.info,S.OBJECT,"Unknown condition [:s]")\r
+                                               test PTYPE of cond=S.CLASS then condwrd:=((1+notted)<<18)+DREC of cond or\r
+                                               $(      cond:=DREC of cond\r
+                                                       condwrd:=((2+notted)<<18)+D1 of cond\r
+                                               $)\r
+                                       $)\r
+                                       endcase\r
+                               case S.NUMBER:\r
+                                       condwrd:=((scan.info<0->9,3)<<18)+abs(scan.info)\r
+                                       endcase\r
+                               default:\r
+                                       error("Illegal condition [:s]",scan.info)\r
+                       $)\r
+                       unless t=S.NUMBER then\r
+                       test scanner()=S.NAME then\r
+                       $(      newrm:=LH of checkfind.room(scan.info,"Destination not a room [:s]")\r
+                               t_newrm\r
+                       $) or\r
+                       $(      newrm_scan.info\r
+                               LH from condwrd+_4\r
+                               t_true\r
+                       $)\r
+                       word_0\r
+                       while scanch='*T' do\r
+                       $(      switchon scanner() into\r
+                               $(\r
+                               case S.NAME:\r
+                                       word bitor_1<<(DREC of checkfind.word(scan.info,S.MOTION,"Word not a motion [:s]"))\r
+                               case S.RAND:\r
+                                       endcase\r
+                               default:\r
+                                       error("Can't read motion word")\r
+                               $)\r
+                               unless t\r
+                               $(      let nd=Newvec(1)\r
+                                       LINK of tptr_nd\r
+                                       tptr_nd\r
+                                       !nd_free.space<<18\r
+                                       1!nd_roomlist\r
+                                       roomlist_0\r
+                               $)\r
+                       $)\r
+                       getcore(2)\r
+                       !free.space:=(word<<18)\/newrm\r
+                       1!free.space:=condwrd\r
+                       free.space+:2\r
+                       startlinech()\r
+               $)      repeatwhile scanch='*T'\r
+               getcore(1)\r
+               !free.space:=-1\r
+               free.space+:1\r
+               while ptr\r
+               $(      let temp=LINK of ptr\r
+                       roomlist_ptr!1\r
+                       randomise(0, RH, LH of ptr)\r
+                       free(ptr)\r
+                       ptr_temp\r
+               $)\r
+       $)\r
+       randirs_translate(randirs)\r
+       unless fast writes(tty," = last travel number*C*L")\r
+$)\r
+and translate(ptr)=ptr->valof\r
+$(     let r, r1, ptr1=highvec(1), r+1, ptr+1\r
+       LH of r_LH of ptr\r
+       LH of r1_LH of ptr1\r
+       RH of r1_translatelist(RH of ptr1)\r
+       RH of r_translate(RH of ptr)\r
+       resultis r\r
+$), 0\r
+and translatelist(ptr)=ptr->valof\r
+$(     let r=highvec(0)\r
+       LH of r_LH of ptr\r
+       RH of r_translatelist(RH of ptr)\r
+       resultis r\r
+$), 0\r
+and load.maps() be                             //Doesn't have to be maps - any picture will do\r
+$(     let mapcnt,cdesize=0,?\r
+       unless roomflg error("needs predefined rooms")\r
+       checkflag(@mapflg,"duplicate maps section")\r
+       unless fast Writes(tty, "*C*L0")\r
+       unless scanner()=S.NUMBER Error("Number of codes defined expected")\r
+       cdesize_scan.info\r
+       codes_highvec(cdesize)\r
+       nextch() repeatuntil scanch='*L'\r
+       for i=0 to cdesize codes!i_valof\r
+       $(      let key, delim, b, count, sel=\r
+                       nextch(),nextch(),vec MSLEN/5,0,selector 7:36:b\r
+               nextch()\r
+               until scanch=delim | count=MSLEN-1 | scanch='*E'\r
+               $(      $[      $move   1,      scanch\r
+                               $Idpb   1,      sel\r
+                               $aos            count\r
+                       $]\r
+                       nextch()\r
+               $)\r
+               unless scanch=delim error("max length of delimited strings=:n",MSLEN)\r
+               until scanch='*L' nextch()\r
+               count/_5\r
+               highvec(count)\r
+               $[      $setz   2,      0\r
+                       $idpb   2,      sel\r
+                       $hrl    1,      key\r
+                       $hrrzi  3,      0(1)\r
+                       $hrl    2,      b\r
+                       $hrri   2,      0(3)\r
+                       $add    3,      count\r
+                       $blt    2,      0(3)\r
+               $]\r
+       $)\r
+       nextch()\r
+       until scanch='**'\r
+       $(      let rm, sel, byt, count,ch,lettercount,room=\r
+                       vec SCRSIZ,selector 7:36:rm, byte 7:36, SCRSIZ*5,?,?,?\r
+               mapcnt+_1\r
+               unless fast write(tty,"*C:n",mapcnt)\r
+               unless scanner()=S.NAME Error("room name expected")\r
+               room_LH of checkfind.room(scan.info,"unknown room [:s]")\r
+               nextch() repeatuntil scanch='*L'\r
+               ch, scanch_nextch(),nextch()\r
+               test ch='%' then\r
+               $(      ch_scanch\r
+                       unless scanner()=S.NAME error("room name expected after %")\r
+                       scan.info_LH of checkfind.room(scan.info,"unknown room [:s] after %")\r
+                       MAPWD of room_MAPWD of scan.info\r
+               $) or\r
+               $(      MAPWD of room_nextmap\r
+                       until scanch=ch\r
+                       $(      let coded=false\r
+                               for i=0 to cdesize if LH from codes!i=scanch\r
+                               $[      $setom          coded\r
+                                       $move   2,      codes\r
+                                       $add    2,      i\r
+                                       $move   2,      0(2)\r
+                                       $hll    2,      byt\r
+come:                                  $ildb   1,      2\r
+                                       $jumpe  1,      gone\r
+                                       $idpb   1,      sel\r
+                                       $sose           count\r
+                                       $jrst           come\r
+                                       $(      too.big()\r
+                                       $)\r
+gone:                          $]\r
+                                       unless coded\r
+                               $[      $move   1,      scanch\r
+                                       $idpb   1,      sel\r
+                                       $sose           count\r
+                                       $jrst           past\r
+                                       $(      too.big()\r
+                                       $)\r
+past:                          $]\r
+                               nextch()\r
+                       $)\r
+                       $[      $setz   1,      0\r
+                               $idpb   1,      sel\r
+                       $]\r
+                       ch_nextch() repeatuntil ch='*L'\r
+                       ch_nextch()\r
+                       lettercount_SCRSIZ*5-count\r
+                       if ~mapput\r
+                       $(      writez(mapput, rm)\r
+                               writech(mapput, '*0')\r
+                               for i=2 to 5-(lettercount rem 5) writech(mapput, '*P')\r
+                       $)\r
+                       nextmap+_lettercount/5+1\r
+               $)\r
+       $)\r
+       unless fast writes(tty, " = last map number*C*L")\r
+$)\r
+and too.big() be Error("too many characters in map - max is :n", SCRSIZ*5)\r
+and load.hours() be\r
+$(     checkflag(@hrflg, "duplicate hours section")\r
+       for i=0 to 6 times!i_0\r
+       until scanch='**'\r
+       $(      let nd, oldday, day=highvec(0),?,?\r
+               unless scanner()=S.NUMBER error("day number expected")\r
+               oldday, day_times+(scan.info+4) rem 7, !oldday\r
+               unless scanner()=S.NUMBER error("start time expected")\r
+               unless 0 le scan.info le 24 error("start time :n should be between 0 & 24", scan.info)\r
+               STIME of nd_scan.info\r
+               unless scanner()=S.NUMBER Error("finish time expected")\r
+               unless 0 le scan.info le 24 error("finish time :n should be between 0 & 24", scan.info)\r
+               unless scan.info gr STIME of nd error("time window error: :n >= :n", scan.info, STIME of nd)\r
+               FTIME of nd_scan.info\r
+               while day/\scan.info<FTIME of day\r
+               $(      oldday_day\r
+                       day of_LINK\r
+               $)\r
+               LINK of nd_day\r
+               LINK of oldday_nd\r
+               startlinech()\r
+       $)\r
+$)\r
+\r
+and load.combat() be\r
+$(     let t=?\r
+       checkflag(@cmflg, "duplicate combat section")\r
+       for i=0 to 23   //should use manifests really, but shared with dbadat\r
+       $(      unless scanner()=S.NUMBER error("No. of table entries expected")\r
+               t_highvec(scan.info/2)\r
+               tabs!i_t\r
+               LH of t_scan.info\r
+               startlinech()\r
+               for j=1 to scan.info\r
+               $(      (j rem 2->RH, LH) from t!(j/2)_nextcombat\r
+                       transfer.dsk(@nextcombat, comput, 0, 0, false)\r
+               $)\r
+       $)\r
+       unless scanch='**' error("Need 24 entries in combat section, no more")\r
+$)\r
+\r
+and load.persona() be\r
+$(     checkflag(@psflg, "duplicate persona section")\r
+       unless scanner()=S.NAME error("illegal name for persona file")\r
+       for i=1 to LENGTH of scan.info\r
+       $(      (byte 6:36-6*i) from ps6_(selector 7:29-((7*i) rem 35):i/5) of scan.info\r
+               if i=6 break\r
+       $)\r
+$)\r
+\r
+and load.objects() be\r
+$(     let room,name,obj,adj,cprop,mprop,destr,rndm,sprop,mobile,inside,drc,done\r
+               =0,0,0,0,0,0,0,0,0,0,0,0,0\r
+       and nd,oldnd,twoplace,fixd,objcnt=?,?,false,vec 26,0\r
+       unless roomflg/\demonsflg/\vocabflg error("Predefined rooms, demons and vocabulary needed")\r
+       checkflag(@objectflg,"Duplicate objects definition")\r
+       unless fast writes(tty, "*C*L0")\r
+       startlinech()\r
+       until scanch='**' do\r
+       $(      unless scanner()=S.NAME error("No object name after :s",PNAME of name)\r
+               name:=checkfind.word(scan.info,S.OBJECT,"Unknown object specified [:s]")        //if use for errors, take PNAME of name\r
+               if DREC of name=RHMASK error("synonym used for [:s] instead of object name",scan.info)\r
+               if DREC of name le class error("class name used for [:s] instead of object name",scan.info)\r
+               room_scanner()\r
+               if room=S.NUMBER\r
+               $(      mobile_highvec(MOTIONSIZE)\r
+                       MOTION of mobile_scan.info\r
+                       room_scanner()\r
+                       unless room=S.NUMBER error("instincts demon indicator for mobile object required [:s]", PNAME of name)\r
+                       if scan.info>max.demon.no error("demon no. [:n] too big for [:s]",scan.info,PNAME of name)\r
+                       INSTINCTS of mobile_demons+(DEMONSIZE+DOF)*scan.info\r
+                       room_scanner()\r
+                       unless room=S.NUMBER error("actions demon indicator for mobile object required [:s]", PNAME of name)\r
+                       if scan.info>max.demon.no error("demon no. [:n] too big for [:s]",scan.info,PNAME of name)\r
+                       ACTIONS of mobile_demons+(DEMONSIZE+DOF)*scan.info\r
+                       MOVECOUNT of mobile_0\r
+                       FIGHTS of mobile _ 0\r
+                       SNOOPERS of mobile _ 0\r
+                       room_scanner()\r
+               $)\r
+               unless room=S.NAME error("No room name")\r
+               room:=find.room(scan.info)\r
+               test room then room, inside_LH of room,0 or\r
+               $(      let prev=Checkfind.word(scan.info,S.OBJECT,"Object or room name expected for position, found [:s]")\r
+                       inside_(DREC of prev) gr #400000 -> D3 of DREC of prev,0\r
+                       unless inside error("need to have previously defined [:s] in the object section to go inside it", scan.info)\r
+                       unless CONTENTS of inside error(":s isn't a container so can't hold :s",inside,PNAME of name)\r
+               $)\r
+               if mobile test room then CURROOM of mobile_room\r
+               or error("can't have random starts for mobiles [:s]", name)\r
+               for i=0 to 26 do fixd!i_scan.info!i     //BLT would be better...\r
+               cprop:=scanner()\r
+               if seq(scan.info,fixd)/\cprop=S.NAME then twoplace:=1<>cprop:=scanner()\r
+               if cprop=S.NAME/\inside error("Can't have multi-placed objects inside containers")\r
+               while cprop=S.NAME do\r
+               $(      twoplace:=1\r
+                       nd,oldnd:=ROBJT of room,room+4\r
+                       while nd do\r
+                       $(      oldnd:=nd\r
+                               nd:=LINK of nd\r
+                       $)\r
+                       LINK of oldnd:=free.space\r
+                       room:=LH of checkfind.room(scan.info,"Undefined next room [:s]")\r
+                       cprop:=scanner()\r
+               $)\r
+               unless cprop=S.NUMBER error("No prop value given")\r
+               cprop:=scan.info\r
+               unless scanner()=S.NUMBER error("No maxprop value given")\r
+               mprop:=scan.info\r
+               unless scanner()=S.NUMBER error("no scoreprop value given")\r
+               sprop:=scan.info\r
+               rndm:=mprop<0\r
+               destr:=cprop<0\r
+               mprop,cprop:=abs mprop,abs cprop\r
+               obj:=highvec(OBJECTSIZE+mprop/2+1)\r
+               PNAME of obj:=PNAME of name\r
+               if forward.ref then\r
+               $(      let linker=@forward.ref\r
+                       until RH from !linker = 0 do\r
+                       test name = D6 of (1!!linker) then\r
+                       $(      let temp=!linker\r
+                               D6 of (1!temp)_obj\r
+                               RH from !linker_RH from !temp\r
+                               free(temp)\r
+                       $) or linker_!linker\r
+               $)\r
+               drc_name\r
+               name:=DREC of name\r
+               done_name gr #400000-> valof\r
+               $(      name_D3 of name\r
+                       resultis true\r
+               $), 0\r
+               objcnt+_1\r
+               unless fast write(tty,"*C:n",objcnt)\r
+               PTYPE of obj,P1 of obj:=(done->PTYPE,D1) of name,(done->P1,D2) of name\r
+               SCOREPROP of obj:=sprop\r
+               MOTN of obj_mobile\r
+               if mobile\r
+               $(      let mover=highvec(0)\r
+                       LH of mover_obj\r
+                       RH of mover_RH from movers\r
+                       RH from movers_mover\r
+                       mobile_false\r
+               $)\r
+               P5 of obj, P4 of obj_mprop, cprop\r
+               FIXED of obj, RANDM of obj_twoplace, rndm\r
+               WEIGHT of obj,VALUE of obj:=(done->WEIGHT,D3) of name,(done->VALUE,D4) of name\r
+               DESTROYED of obj:=destr\r
+               CONTENTS of obj_0       //for the moment - unnecessary if obj guaranteed initialised 0\r
+               while scanch='*T' test scanner()=S.NUMBER then DESTROYED of obj_scan.info or\r
+               $(      let nd=look.up(scan.info)\r
+                       unless nd error("Unknown fixed property [:s] for [:s]*C*L",scan.info,PNAME of obj)\r
+                       switchon PTYPE of nd into\r
+                       $(      case S.BRIGHT:\r
+                                       BRIGHT of obj_true\r
+                                       endcase\r
+                               case S.NOGET:\r
+                                       NOGET of obj_true\r
+                                       endcase\r
+                               case S.NOIT:\r
+                                       NOIT of obj_true\r
+                                       endcase\r
+                               case S.NOSUMMON:\r
+                                       NOSUMMON of obj_true\r
+                                       endcase\r
+                               case S.CONTAINS:\r
+                               $(      let container=highvec(CONTSIZE)\r
+                                       unless scanner()=S.NUMBER Error("No maxweight after container prop for [:s]*C*L",PNAME of obj)\r
+                                       MAXWT of container_scan.info\r
+                                       WTUSED of container_0\r
+                                       !container_0\r
+                                       CONTENTS of obj_container\r
+                                       endcase\r
+                               $)\r
+                               case S.DISGUISED:\r
+                                       unless CONTENTS of obj error("Non-containers cannot be disguised*C*L")\r
+                                       DISGUISED of CONTENTS of obj_true\r
+                                       endcase\r
+                               case S.OPENED:\r
+                                       unless CONTENTS of obj error("Non-containers cannot be opened*C*L")\r
+                                       OPENED of CONTENTS of obj_true\r
+                                       endcase\r
+                               case S.TRANSPARENT:\r
+                                       unless CONTENTS of obj error("Non-containers cannot be transparent*C*L")\r
+                                       TRANSPARENT of CONTENTS of obj_true\r
+                               default:        endcase\r
+                       $)\r
+               $)\r
+               startlinech()\r
+               while '0'<=scanch<='9' do\r
+               $(      scanner()\r
+                       unless 0<=scan.info<=mprop error("Prop description out of range [:s]",PNAME of obj)\r
+                       sprop:=selector 18:18*(scan.info rem 2):scan.info/2+OBJECTSIZE+1\r
+                       sprop of obj:=nextobj\r
+                       transfer.dsk(@nextobj, objput, sprop, obj)\r
+               $)\r
+               test inside then\r
+               $(      let insides=CONTENTS of inside\r
+                       LINK of obj_LINK of insides\r
+                       LINK of insides_obj\r
+                       WTUSED of insides+_WEIGHT of obj\r
+                       WEIGHT of inside+_WEIGHT of obj\r
+               $) or\r
+               test twoplace then\r
+               $(      nd,oldnd:=ROBJT of room,room+4\r
+                       while nd do\r
+                       $(      oldnd:=nd\r
+                               nd:=LINK of nd\r
+                       $)\r
+                       LINK of oldnd:=obj\r
+               $) or test room then\r
+               $(      LINK of obj:=ROBJT of room\r
+                       ROBJT of room:=obj\r
+               $) or unless inside randomise(0, LINK, obj, ROBJT)\r
+               test done then D3 of DREC of drc_obj or\r
+               $(      DREC of drc_highvec(DDRSIZE)\r
+                       drc_DREC of drc\r
+                       D1 of drc_D1 of name\r
+                       D2 of drc_D2 of name\r
+                       D3 of drc_obj\r
+                       $(      let sptr=D7 of name\r
+                               while sptr\r
+                               $(      let next=LINK of sptr\r
+                                       DREC of LH of sptr_drc\r
+                                       free(sptr)\r
+                                       sptr_next\r
+                               $)\r
+                       $)\r
+                       free(name)\r
+               $)\r
+       twoplace:=false\r
+       $)\r
+       if forward.ref then\r
+       $(      let linker=forward.ref\r
+               until linker=0 do\r
+               $(      out("*C*LForward reference not mentioned [:s]*C*L", PNAME of D6 of 1!linker)\r
+                       linker_RH from !linker\r
+               $)\r
+               error("unsafe to continue.")\r
+       $)\r
+       unless fast writes(tty,"= last object number*C*L")\r
+$)\r
+and load.demons() be\r
+$(     let indx,pt,token=?,?,?\r
+       unless fast writes(tty,"*C*L0")\r
+       unless vocabflg error("needs predefined vocabulary")\r
+       checkflag(@demonsflg, "Duplicate demons dection")\r
+       unless scanner()=S.NUMBER error("no demons table size given")\r
+       max.demon.no_scan.info\r
+       demons_highvec((DEMONSIZE+DOF)*(max.demon.no+1)-1)\r
+       startlinech()\r
+       while '0' le scanch le '9'\r
+       $(      let demonum=?\r
+               scanner()\r
+               unless 0 le scan.info le max.demon.no error("invalid demon number")\r
+               unless fast write(tty, "*C:N",scan.info)\r
+               indx_((DEMONSIZE+DOF)*scan.info)+demons\r
+               demonum_scan.info\r
+               unless scanner(true)=S.NAME error("no demons verb name")\r
+               token_find.word(scan.info)\r
+               unless token/\isaction(token) error("not a verb name [:s]", scan.info)\r
+               D.VERB of indx_token\r
+               unless scanner()=S.NAME error("no demons object name")\r
+               token_find.word(scan.info)\r
+               pt_PTYPE of token\r
+               unless token/\(pt=S.CLASS\/pt=S.OBJECT\/pt=S.WHICHEVER)\r
+                       error("not class or object for demon object [:s]",scan.info)\r
+               D.OBJECT of indx_pt=S.WHICHEVER->#777777, token\r
+               unless scanner()=S.NAME error("no demons instrument name")\r
+               token_find.word(scan.info)\r
+               pt_PTYPE of token\r
+               unless token/\(pt=S.CLASS\/pt=S.OBJECT\/pt=S.WHICHEVER)\r
+                       error("not class or object for demon instrument [:s]",scan.info)\r
+               D.INSTRUMENT of indx_pt=S.WHICHEVER->#777777, token\r
+               unless scanner()=S.NUMBER error("no demons time number")\r
+               D.TIME of indx_scan.info\r
+               D.OFFSET of indx_scanch='-'->valof\r
+               $(      readno(input, @scan.info)\r
+                       if D.TIME of indx ge scan.info error("demon event time range has smallest number first :n-:n*C*L",\r
+                               D.TIME of indx, scan.info)\r
+                       nextch()\r
+                       resultis scan.info-(D.TIME of indx)+1\r
+               $), 1\r
+               D.ATTRIBUTES of indx_0\r
+               while scanch='*T' test scanner()=S.NAME then\r
+                       (valof switchon PTYPE of look.up(scan.info) into\r
+                       $(\r
+                       case S.ALWAYS:  resultis D.ALWAYS       //could put D.ALWAYS in reserved insetad of S.ALWAYS?\r
+                       case S.GLOBAL:  resultis D.GLOBAL\r
+                       case S.ENABLED:\r
+                               $(      let demon, d1=longmess, demon+DOF\r
+                                       unless D.GLOBAL of indx Error("Demon must be global to be enabled")\r
+                                       longmess_LINK of demon\r
+                                       for i=0 to DEMONSIZE d1!i_indx!i\r
+                                       E.TIME of demon+_random(D.OFFSET of indx)\r
+                                       !demon_(demonum<<18) bitor gdemons\r
+                                       gdemons_demon\r
+                                       loop\r
+                               $)\r
+                       default:        Error("Name is not demon attribute [:s]*C*L")\r
+                       $) ) of indx_true\r
+               or error("Demon attribute expected [:s]*C*L")\r
+               startlinech() repeatwhile scanch=';'\r
+       $)\r
+       unless fast writes(tty," = last demon number*C*L")\r
+$)\r
+and load.levels() be\r
+$(     let dunmen,dunwomen=false,false\r
+       checkflag(@levelsflg,"Duplicate levels section")\r
+       for i=0 to 1 do\r
+       $(      let t=scanner()\r
+               t_look.up(scan.info)\r
+               unless t error("Unknown keyword [:s] in levels section",scan.info)\r
+               switchon PTYPE of t into\r
+               $(      case S.MALE:\r
+                               checkflag(@dunmen,"Duplicate male section")\r
+                               readlevels(male)\r
+                               endcase\r
+                       case S.FEMALE:\r
+                               checkflag(@dunwomen,"Duplicate female section")\r
+                               readlevels(female)\r
+                               endcase\r
+                       default:        error("Unknown level flag [:s]",scan.info)\r
+               $)\r
+       $)\r
+$)\r
+and readlevels(vector) be for i=0 to MAX.LEVEL do\r
+$(     unless scanner()=S.NAME error("Name expected in levels section")\r
+       $(      let node=find.word(scan.info, S.LEVEL, true)\r
+               vector!i_PNAME of node\r
+               DREC of node_i\r
+       $)\r
+$)\r
+and load.text() be\r
+$(     unless fast writes(tty, "*C*L0")\r
+       checkflag(@textflg,"Duplicate text section")\r
+       unless scanner()=S.NUMBER error("No text table size given")\r
+       max.message.no:=scan.info\r
+       text:=highvec(scan.info/36+1)\r
+       txtvec_highvec(scan.info/2)\r
+       startlinech()\r
+       while '0'<=scanch<='9' do\r
+       $(      scanner()\r
+               unless 0<=scan.info<=max.message.no error("Invalid text number")\r
+               unless fast write(tty,"*C:n   ",scan.info)\r
+               (selector 1:scan.info rem 36:scan.info/36) of text_valof\r
+               $(      let olds, ch=scanch, nextch()\r
+                       if ch='?' startlinech()<>resultis true\r
+                       putback(input,ch)\r
+                       scanch_olds\r
+                       (scan.info rem 2 -> LH, RH) from txtvec!(scan.info/2)_nexttext\r
+                       transfer.dsk(@nexttext, textput)\r
+                       resultis false\r
+               $)\r
+       $)\r
+       unless fast writes(tty," = last text number*C*L")\r
+$)\r
+and seq(s1,s2)=valof\r
+$(     for i=0 to (LENGTH of s1)/5 do if s1!i\=s2!i resultis false\r
+       resultis true\r
+$)\r
+and randomise(tst, sel1, dest, sel2) be\r
+$(     let res, ptr, lst=?, 0, RH from roomlist\r
+       if tst return\r
+       unless numbargs()=4 sel2_0\r
+       res_highvec(4)\r
+       test lst then\r
+       $(      res!4_0\r
+               while lst\r
+               $(      let t=LINK of lst\r
+                       ptr_highvec(0)\r
+                       LINK of ptr_res!4\r
+                       res!4_ptr\r
+                       LH of ptr_LH of lst\r
+                       free(lst)\r
+                       lst_t\r
+               $)\r
+               LH of (res+4)_LH from roomlist\r
+       $) or res!4_randoms!4\r
+       1!res_sel1\r
+       2!res_dest\r
+       3!res_sel2\r
+       LINK of res_randoms\r
+       randoms_res\r
+$)\r
+and startlinech(print) be\r
+$(     unless numbargs() print_false\r
+       until scanch='*L' do\r
+       $(      nextch()\r
+               if print writech(tty,scanch)\r
+       $)\r
+       nextch()\r
+$)\r
+and init.room(room,name) be\r
+$(     !room:=name\r
+       for i=1 to roomsize do i!room:=0\r
+       DOOR!room:=-1\r
+$)\r
+and highvec(n)=valof\r
+$(     let chunk=free.space\r
+       getcore(n+1)\r
+       free.space+:n+1\r
+       resultis chunk\r
+$)\r
+and getcore(size) be\r
+$(     let t=free.space+size\r
+       if t>>9 gr endloc unless valof\r
+       $[      $hrlz   1,      t\r
+               $core   1,      0\r
+               $jrst           fail\r
+               $move   1,      t\r
+               $lsh    1,      -9\r
+               $movem  1,      endloc\r
+               $seto   1,      0\r
+               $trna\r
+fail:          $setz   1,      0\r
+       $] Error("Out of high segment freestore - page :8", endloc)\r
+$)\r
+and read.name() be\r
+$(     let n,linev=0,vec 127\r
+       while 'a'<=(scanch bitor #40)<='z'\/'0'<=scanch<='9'\/scanch='.'\/scanch='$' do\r
+       $(      n+:1\r
+               unless n>127 linev!n:= 'A'<=scanch<='Z'->scanch+#40,scanch\r
+               nextch()\r
+       $)\r
+       !linev:=n>127->127,n\r
+       scan.info:=packstring(linev,name.string)\r
+$)\r
+and read.number() be\r
+$(     putback(input,scanch)\r
+       readno(input,@scan.info)\r
+       nextch()\r
+$)\r
+and copy(s)=valof\r
+$(     let size=(LENGTH of s)/5 and new=highvec(size)\r
+       for i=0 to size do new!i:=s!i\r
+       resultis new\r
+$)\r
+and initialise() be\r
+$(     let node,n=?,0\r
+       $[      $rescan\r
+               $inchrs         node\r
+               $setzm          node\r
+               $setz   1,      0\r
+               $setuwp 1,      0\r
+               $halt\r
+               $movei  1,      HUNG\r
+               $movem  1,      napct\r
+               $hrrei  1,      ESSEX\r
+               $movem  1,      ESXWD\r
+       $]\r
+       input_tty\r
+       test node then\r
+       $(      nextch() repeatuntil scanch='-' \/ '*L' le scanch le '*P' \/ '*E' le scanch le '*$'\r
+               unless scanch='-' filename_$6 "mud"<>break\r
+               filename_0\r
+               nextch()\r
+               while 'a' le scanch le 'z' \/ 'A' le scanch le 'Z' do\r
+                       filename_(filename<<6) bitor ((scanch bitand #137)-' ')<>nextch()\r
+               unless filename filename_$6 "mud" <> break\r
+               until filename>>30 do filename<<_6\r
+       $) repeatwhile false or filename_$6"mud"\r
+       while scanch='/'\r
+       $(      scanch_nextch() bitand \#40\r
+               switchon scanch into\r
+               $(\r
+               case 'C':\r
+                       comput_true\r
+                       endcase\r
+               case 'F':\r
+                       fast_true\r
+                       endcase\r
+               case 'M':\r
+                       mapput_true\r
+                       endcase\r
+               case 'O':\r
+                       objput_true\r
+                       endcase\r
+               case 'R':\r
+                       roomput_true\r
+                       endcase\r
+               case 'T':\r
+                       textput_true\r
+               case 'G':\r
+                       cmndput_true\r
+               default 0 ... #137:\r
+                       endcase\r
+               $)\r
+               nextch()\r
+       $)\r
+       $[      $clrbfi $]\r
+       input:=findfile($6"all",filename,$6"txt")\r
+       unless roomput roomput_createfile($6"all",filename,$6".rm",0,0,0,1)\r
+       unless textput textput_createfile($6"all",filename,$6".tm",0,0,0,1)\r
+       unless mapput\r
+       $(      mapput_createfile($6"all",filename,$6".mm",0,0,0,1)\r
+               for i=0 to 4 do writech(mapput,'*0')\r
+       $)\r
+       unless objput\r
+       $(      objput_createfile($6"all",filename,$6".om",0,0,0,1)\r
+               for i=0 to 4 do writech(objput,'*0')\r
+       $)\r
+       unless comput comput_createfile($6"all",filename,$6".cm",0,0,0,1)\r
+       unless cmndput\r
+       $(      cmndput_createfile($6"all",filename,$6".gm",0,0,#14)\r
+               writech(cmndput,0)\r
+       $)\r
+       output:=tty\r
+       nextch()\r
+       S.ROOMS!procs:=load.rooms\r
+       S.VOCAB!procs:=load.vocab\r
+       S.TRAVEL!procs:=load.travel\r
+       S.OBJECT!procs:=load.objects\r
+       S.LEVELS!procs:=load.levels\r
+       S.DEMONS!procs:=load.demons\r
+       S.MAP!procs:=load.maps\r
+       S.HOURS!procs_load.hours\r
+       S.COMBAT!procs_load.combat\r
+       S.PERSONA!procs_load.persona\r
+       S.TEXT!procs:=load.text\r
+       until reserved!n=-1 do\r
+       $(      node:=look.up(reserved!n,reserved!(n+1))\r
+               P1 of node:=reserved!(n+2)\r
+               INFO of node:=reserved!(n+3)\r
+               n+:4\r
+       $)\r
+       dictionary,n:=highvec(HASHSIZE),0\r
+       out("initialisation used :n",free.space-startloc)\r
+$)\r
+and find.room(name,creating)=valof\r
+$(     let node,hash=?,?\r
+       if name=list resultis name\r
+       if numbargs()<2 creating:=false\r
+       name:=sixbit(name)\r
+       hash:=(name>>1) rem HASHSIZE\r
+       node:=index!hash\r
+       while node do test name=RNAME of node then\r
+       $(      if creating error("Duplicate room :6", name)\r
+               resultis node\r
+       $)\r
+       or node:=LINK of node\r
+       unless creating resultis false\r
+       node:=highvec(1)\r
+       LINK of node,RNAME of node:=index!hash,name\r
+       index!hash:=node\r
+       resultis node\r
+$)\r
+and find.word(word,type,cont)=valof\r
+$(     let dec,hash=false,(!word>>1) rem HASHSIZE and node=dictionary!hash\r
+       switchon numbargs() into\r
+       $(      case 1:\r
+                       type:=0\r
+               case 2:\r
+                       cont:=0\r
+       $)\r
+       if cont test cont=-1 then dec:=true or node:=LINK of cont\r
+       while node do\r
+       $(      if seq(word,PNAME of node)/\(PTYPE of node=type\/type=0) resultis node\r
+               node:=LINK of node\r
+       $)\r
+       if dec then\r
+       $(      node:=highvec(NODESIZE)\r
+               LINK of node:=dictionary!hash\r
+               dictionary!hash:=node\r
+               PNAME of node,PTYPE of node:=copy(word),type\r
+       $)\r
+       resultis node\r
+$)\r
+and look.up(word,type)=valof\r
+$(     let hash=(!word>>1) rem HASHSIZE and node=res!hash\r
+       if numbargs()<2 type:=false\r
+       while node do\r
+       $(      if seq(word,PNAME of node) then\r
+               $(      if type error("duplicate reserved word")\r
+                       resultis node\r
+               $)\r
+               node:=LINK of node\r
+       $)\r
+       unless type resultis false\r
+       node:=newvec(2)\r
+       PTYPE of node,LINK of node:=type,res!hash\r
+       PNAME of node,res!hash:=word,node\r
+       resultis node\r
+$)\r
+and appenddr(node,dr)=valof\r
+$(     let nd,oldnd=DREC of node,?\r
+       unless nd DREC of node:=dr<>resultis dr\r
+       while nd do\r
+       $(      oldnd:=nd\r
+               nd:=LINK of nd\r
+       $)\r
+       LINK of oldnd:=dr\r
+       resultis dr\r
+$)\r
+and transfer.dsk(next, stream, sptr, obj, crlf) be\r
+$(     let lettercount, olds,lineonly,nocrlf=\r
+               0, scanch,numbargs()=5,lineonly/\crlf=0\r
+       if numbargs() ge 4\r
+       $(      let ch=nextch()\r
+               if ch='?'\r
+               $(      sptr of obj_#777777\r
+                       startlinech()\r
+                       return\r
+               $)\r
+               if ch='%'\r
+               $(      let prev=?\r
+                       nextch()\r
+                       unless scanner()=S.NAME error("Name required after %")\r
+                       test numbargs()=5 then\r
+                       $(      prev_checkfind.room(scan.info, "unknown room after % [:s]")\r
+                               sptr of obj_sptr of (LH of prev)\r
+                       $) or\r
+                       $(      prev_checkfind.word(scan.info, S.OBJECT, "unknown object after % [:s]")\r
+                               sptr of obj_sptr of (D3 of (DREC of prev))\r
+                       $)\r
+                       startlinech()\r
+                       return\r
+               $)\r
+               putback(input, ch)\r
+               scanch_olds\r
+       $)\r
+$(     let count, rcount, ocount, b,wrap=0, ?, ?, vec TTYWIDTH*50,true\r
+       while scanch='*T'\r
+       $(      nextch()\r
+               if scanch='**' unless count\r
+               $(      nextch()\r
+                       wrap_false\r
+               $)\r
+               until scanch='*C'\r
+               $(      if scanch='*T' if wrap\r
+                       $(      outs("*C*L")\r
+                               for i=0 to count outch(b!i)\r
+                               error("*C*LTab found in text.")\r
+                       $)\r
+                       b!count_scanch\r
+                       count+_1\r
+                       nextch()\r
+               $)\r
+               unless nocrlf test wrap then\r
+               $(      b!count_'*S'\r
+                       count+_1\r
+               $) or\r
+               $(      b!count, b!(count+1)_'*C', '*L'\r
+                       count+_2\r
+               $)\r
+               nextch()\r
+               nextch()\r
+               if lineonly break\r
+       $)\r
+       test wrap then\r
+       $(      for i=count to count+TTYWIDTH b!i_0\r
+               rcount_-1\r
+               ocount_0\r
+       $) or rcount, ocount_count-1, 0\r
+       $(      if wrap\r
+               $(      rcount+_TTYWIDTH\r
+                       until rcount ls ocount | b!rcount='*S' | (b!rcount ne 0 /\ nocrlf) rcount-_1\r
+                       if rcount ls ocount\r
+                       $(      unless b!ocount break\r
+                               rcount+_TTYWIDTH\r
+                       $)\r
+               $)\r
+               for i=ocount to rcount\r
+               $(      if \stream then writech(stream, (b!i))\r
+                       lettercount+_1\r
+                       unless lettercount rem 5 then !next+_1\r
+               $)\r
+               unless wrap break\r
+               unless nocrlf\r
+               $(      if \stream writech(stream,'*C')         //I know this is horrible, but I'm in a BIG hurry!\r
+                       lettercount+_1\r
+                       unless lettercount rem 5 then !next+_1\r
+                       if \stream writech(stream, '*L')\r
+                       lettercount+_1\r
+                       unless lettercount rem 5 then !next+_1\r
+               $)\r
+               ocount_rcount+1\r
+       $) repeat\r
+       if \stream\r
+       $(      writech(stream, '*0')\r
+               for i=2 to 5-(lettercount rem 5) writech(stream, '*P')\r
+       $)\r
+       !next+_1\r
+$)\r
+$)\r
+and transfer.service(select)=valof\r
+$(     let room=?\r
+       nextch()\r
+       unless scanner()=S.NAME error("Name required after %")\r
+       room:=checkfind.room(scan.info,"Room name required after %")\r
+       room:=LH of room\r
+       unless room error("Predefined room required after %")\r
+       startlinech()\r
+       resultis select of room\r
+$)\r
+and scanner(numasstring)=valof\r
+$(     switchon Numbargs()->scanch='*T'->'*T', 'A', scanch into\r
+       $(      case '*E':\r
+                       resultis S.EOF\r
+               case '*T':\r
+                       while scanch='*T' do nextch()\r
+                       loop\r
+               case '[':\r
+                       $(      let count, lst=0, 0\r
+                               nextch()\r
+                               until scanch=']'\r
+                               $(      let elmt=newvec(0)\r
+                                       unless scanner()=S.NAME error("direction expected in list")\r
+                                       count+_1\r
+                                       RH of elmt_lst\r
+                                       lst_elmt\r
+                                       LH of elmt_1<<DREC of checkfind.word(scan.info, S.MOTION, "word not a motion [:s]")\r
+                               $)\r
+                               nextch()\r
+                               LH from lst_count\r
+                               count_newvec(1)\r
+                               1!count_lst\r
+                               LH of count_free.space\r
+                               RH of count_randirs\r
+                               randirs_count\r
+                               scan.info_count\r
+                               resultis S.RAND\r
+                       $)\r
+               case '(':\r
+               case '<':\r
+                       $(      let count=0\r
+                               roomlist_0\r
+                               nextch()\r
+                               until scanch='>' \/ scanch=')'\r
+                               $(      let new, lst=scanner(), newvec(0)\r
+                                       unless new=S.NAME error("name expected in list")\r
+                                       new_LH of checkfind.room(scan.info, "list element not a room [:s]")\r
+                                       count+_1\r
+                                       LINK of lst_roomlist\r
+                                       roomlist_lst\r
+                                       LH of lst_new\r
+                               $)\r
+                               LH from roomlist_count\r
+                               scan.info_list\r
+                               nextch()\r
+                               resultis S.NAME\r
+                       $)\r
+               case '$':\r
+               case 'A' ... 'Z':\r
+               case 'a' ... 'z':\r
+                       read.name()\r
+                       resultis S.NAME\r
+               case '-':\r
+               case '+':\r
+               case '0' ... '9':\r
+                       read.number()\r
+                       resultis S.NUMBER\r
+               case ';':\r
+                       startlinech(nextch()=';')\r
+                       loop\r
+               case '**':\r
+                       nextch()\r
+                       read.name()\r
+                       resultis PTYPE of look.up(scan.info)\r
+               case '.':\r
+                       read.name()\r
+                       resultis S.DOTNAME\r
+       $)\r
+       nextch()\r
+$)     repeat\r
+and nextch() be\r
+$(     readch(input, @scanch)\r
+       if scanch='@'\r
+       $(      if getput error("nested .get files disallowed")\r
+               readch(input,@scanch)\r
+               read.name()\r
+               getput_input\r
+               input_findfile($6"all",scan.info,$6"get")\r
+               readch(input,@scanch)\r
+       $)\r
+       if scanch='*E'/\getput\r
+       $(      close(input)\r
+               input_getput\r
+               getput_0\r
+               startlinech()\r
+       $)\r
+       return\r
+$)\r
+and finalise() be\r
+$(     for i=0 to HASHSIZE     //Write the commands to disc\r
+       $(      let node,nodecopy,thisrec,nextrec=dictionary!i,?,?,?\r
+               while node\r
+               $(      if isaction(node)\r
+                       $(      nodecopy_node\r
+                               if SYN of nodecopy nodecopy of_ DREC\r
+                               test SAVED of nodecopy then DREC of node_DREC of nodecopy or\r
+                               $(      thisrec_DREC of nodecopy\r
+                                       DREC of node,DREC of nodecopy_nextcmnd,nextcmnd\r
+                                       while thisrec\r
+                                       $(      nextcmnd+_DRSIZE+1\r
+                                               nextrec_LINK of thisrec\r
+                                               if nextrec LINK of thisrec_nextcmnd\r
+                                               if \cmndput for j=0 to DRSIZE writech(cmndput,thisrec!j)\r
+                                               free(thisrec)\r
+                                               thisrec_nextrec\r
+                                       $)\r
+                               $)      SAVED of nodecopy_true\r
+                       $)\r
+                       node of_ LINK\r
+               $)\r
+       $)\r
+motvec_highvec(mtion-1)-1\r
+       for i=1 to mtion do motvec!i_mvec!i\r
+       output:=createfile("dsk","mud","dmp",0,Label(what),#14)\r
+       for i=@roomflg to @textflg unless !i error("Section missing*C*L")\r
+       for i=startloc to free.space-1 outch(!i)\r
+       close(output)\r
+       close(input)\r
+       if \roomput close(roomput)\r
+       if \textput close(textput)\r
+       if \objput close(objput)\r
+       if \mapput close(mapput)\r
+       if \comput close(comput)\r
+       if \cmndput close(cmndput)\r
+       output:=tty\r
+       out("*C*L:n class:s, :n object:s and :n motion word:s defined",\r
+               class, class=1->"", "es",\r
+               object, object=1->"", "s",\r
+               mtion, mtion=1->"", "s")\r
+       out("*C*LTotal space used :n",free.space-startloc)\r
+       run("all","mud",0,0,1)\r
+what:  write(tty, "*C*LCan't create mud.dmp*C*L")\r
+$)\r
+and error(fmt,a,b,c) be\r
+$(     writes(tty,"*C*L")\r
+       write(tty,fmt,a,b,c)\r
+       $[      L1:     $exit   1,      0\r
+                       $jrst           L1\r
+       $]\r
+$)\r
+and checkflag(lvf, err) =valof\r
+$(     if !lvf error(err)\r
+       !lvf_true\r
+$)\r
+and checklook.up(word,type,err) =valof\r
+$(     let wrd=look.up(word)\r
+       unless wrd /\(PTYPE of wrd=type) error(err,word)\r
+       resultis wrd\r
+$)\r
+and checkfind.word(word,type,err)=valof\r
+$(     let wrd=find.word(word)\r
+       unless wrd error(err, word)             //Huh? So where's the type come in?\r
+       resultis wrd\r
+$)\r
+and checkfind.room(name,err)= valof\r
+$(     let wrd=find.room(name)\r
+       unless wrd error(err,name)\r
+       resultis wrd\r
+$)\r
+and random(n)=valof            //gives random no. between 0 and n-1\r
+$[     $mstime 1,      0\r
+       $timer  2,      0\r
+       $add    1,      2\r
+       $runtim 2,      0\r
+       $sub    1,      2\r
+       $tlz    1,      #400000\r
+       $idiv   1,      n\r
+       $move   1,      2\r
+$]\r
+$[\r
+BCPL.: $JRST   ENDRIPPLE       // Jump past initial stuff when next here\r
+       $TRN    BCPL            // Here initially, also loading MBOOTS\r
+       $RESET\r
+       $JRST   #430010         // Start ripple through\r
+ENDRIPPLE:\r
+       $MOVE   ZERCAL\r
+       $MOVEI  ONE,    1\r
+       $HRRZ   P,      JBFF    // INITIAL VALUE OF P\r
+       $MOVEI  AC,     #7777(P)\r
+       $CAML   AC,     JBREL\r
+       $CORE   AC,     0       // TRY FOR 2K INITIAL CORE (MINIMUM)\r
+       $JFCL                   // IGNORE ERROR RETURN\r
+       $(      SL := JBREL\r
+               FL := #430000\r
+               $[      $MOVEM  P, STACKBASE $]\r
+               START()\r
+               FINISH\r
+       $)\r
+       $EXIT   // JUST IN CASE!\r
+ZERCAL:        $JRST   ZERO\r
+$]\r
diff --git a/DUNGEN.GET b/DUNGEN.GET
new file mode 100644 (file)
index 0000000..448e47f
--- /dev/null
@@ -0,0 +1,885 @@
+$nolist\r
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.  No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
\r
+MANIFEST\r
+$(\r
+//Environment manifests\r
+       ESSEX           =       true            //Essex University specials\r
+       LOADCHK         =       FALSE           //want to check if m/c is overloaded?\r
+       RELAXED         =       true            //want wiz's to have unrestricted powers?\r
+       BOASTNAME       =       true            //Shall we say who wrote this?\r
+       TTYWIDTH        =       79              //how wide is the terminal?\r
+       WIZVWIZ         =       false           //true if you don't want wiz's to be able to fight each other\r
+       YOULLBESORRY    =       true            //shall MUD record all entries/exits to game in MUD.LOG?\r
+       BZK             =       FALSE           //true if you allow berserkers\r
+       CORELOW         =       false           //do routines need to be cut 'cos of low core?\r
+       OTHERS          =       false           //true if there are other arch's\r
+       MPPN            =       #2600002776//#322500000001      //where to look for log files\r
+//other important manifests\r
+       WORD            =       SELECTOR        36: 0: 0\r
+       LENGTH          =       SELECTOR         7:29: 0\r
+       FIRSTCH         =       SELECTOR         7:22: 0\r
+//Room descriptor.\r
+/*\r
+       +-------------------------------+\r
+       !      Sixbit room name         !\r
+       +---------------+---------------+\r
+       !   LEAVE       !  TITLE        !\r
+       +---------------+---------------+\r
+       !          DOOR                 !\r
+       +-------------------------------+\r
+       !         ATTRIB                !\r
+       +---------------+---------------+\r
+       !   TRAVEL      !    ROBJT      !\r
+       +---------------+---------------+\r
+       !            WHO                !\r
+       +---------------+---------------+\r
+       !   RNUMB       !    FORCED     !\r
+       +---------------+---------------+\r
+       !    DMOVE      !     ROOMWD    !\r
+       +---------------+---------------+\r
+       !    MAPWD      !  (UNUSED)     !\r
+       +---------------+---------------+\r
+*/\r
+       TITLE           =       RH+1\r
+       LEAVE           =       LH+1\r
+       DOOR            =       2\r
+       ATTRIB          =       WORD+3\r
+       ROBJT           =       RH+4\r
+       TRAVEL          =       LH+4\r
+       WHO             =       5\r
+       RNUMB           =       LH+6\r
+       FORCED          =       RH+6\r
+       DMOVE           =       LH+7\r
+       ROOMWD          =       RH+7\r
+       MAPWD           =       LH+8\r
+       ROOMSIZE        =       8\r
\r
+       BCHEAD          =       LH\r
+       INVADE          =       RH\r
+       LEAVESIZE       =       0\r
+//Object descriptor.\r
+/*\r
+       +---------------+---------------+\r
+       !   (PTYPE)     !   (LINK)      !\r
+       +---------------+---------------+\r
+       !   (P1)        !    (PNAME)    !\r
+       +---------------+---------------+\r
+       !   MOTN        !   CONTENTS    !\r
+       +---------------+---------------+\r
+       !           DESTROYED           !\r
+       +---------------+---------------+\r
+       !         RSIGBF!SCPRP! P4 ! P5 !       //random,nosummon,noit,noget,bright,fixed\r
+       +---------------+---------------+\r
+       !     VALUE     !    WEIGHT     !\r
+       +---------------+---------------+\r
+*/\r
+       P2              =       RH+2\r
+       P3              =       LH+2\r
+       INFO            =       WORD+2          //P2 + P3\r
+       CONTENTS        =       RH+2\r
+       MOTN            =       LH+2\r
+       DESTROYED       =       WORD+3\r
+//     Object number,,Link to next object\r
+//     Object class,,Print name of object\r
+//     motion record if a mobile,,contents if a bag\r
+//     P5 is Maximum prop value, P4 is Current prop value\r
+       FPROP           =       LH+4    //all the fixed props\r
+       RANDM           =       selector 1:23:4\r
+       NOSUMMON        =       selector 1:22:4\r
+       NOIT            =       selector 1:21:4\r
+       NOGET           =       selector 1:20:4\r
+       BRIGHT          =       selector 1:19:4\r
+       FIXED           =       selector 1:18:4\r
+       SCOREPROP       =       selector 6:12:4\r
+       P4              =       selector 6:6:4\r
+       P5              =       selector 6:0:4\r
+       VALUE           =       LH+5\r
+       WEIGHT          =       RH+5\r
+       OBJECTSIZE      =       5\r
+/*     object format in vocab. section\r
+       <name> [ <speed> <instincts> <actions> ]? <where> <where>* <cprop> <mprop> <sprop> <stamina>?\r
+       [ bright | noget | noit | [ contains <maxwt> ] | disguised | opened | transparent ]?\r
+\r
+       cprop<0 means destroyed, mprop<0 means random prop\r
+*/\r
+//Dictionary node.\r
+/*\r
+       +---------------+---------------+\r
+       !1!2!   PTYPE   !     LINK      !       //1=SAVED, 2=SYN\r
+       +---------------+---------------+\r
+       !      P1       !     PNAME     !\r
+       +---------------+---------------+\r
+*/\r
+//Declaration record\r
+/*     +---------------+---------------+\r
+       !       D1      !       Link    !\r
+       +---------------+---------------+\r
+       !       D3      !       D2      !\r
+       +---------------+---------------+\r
+       !       D5      !       D4      !\r
+       +---------------+---------------+\r
+       !       D7      !       D6      !\r
+       +---------------+---------------+\r
+       !       D9      !       D8      !\r
+       +---------------+---------------+\r
+*/\r
+       PTYPE           =       selector 16:18:0\r
+       SYN             =       selector 1:34:0\r
+       SAVED           =       selector 1:35:0\r
+       LINK            =       RH\r
+       PNAME           =       RH+1\r
+       P1              =       LH+1\r
+       DREC            =       LH+1\r
+       DICTNODESIZE    =       3\r
+       RESERVEDSIZE    =       2\r
+       NODESIZE        =       1\r
+       D1              =       LH\r
+       D2              =       RH+1\r
+       D3              =       LH+1\r
+       D4              =       RH+2\r
+       D5              =       LH+2\r
+       D6              =       RH+3\r
+       D7              =       LH+3\r
+       D8              =       RH+4\r
+       D9              =       LH+4    //can always use 9 bits for some of these\r
+       DRSIZE          =       4\r
+       ODRSIZE         =       3\r
+       DDRSIZE         =       1\r
+//Demon node\r
+/*\r
+       +---------------+---------------+\r
+       (  E.DEMONUM    :    LINK       )\r
+       +---------------+---------------+\r
+       (     SHORT     :  (unused)     )\r
+       +---------------+---------------+\r
+       !    D.VERB     !     D.TIME    !\r
+       +---------------+---------------+\r
+       !    D.OBJECT   !  D.INSTRUMENT !\r
+       +---------------+---------------+\r
+       !   D.OFFSET    !           SPGA!       A=always, G=global, P=Plonk, S=Suspended\r
+       +---------------+---------------+       (P & S for system use)\r
+*/\r
+       DOF             =       2\r
+       DEMONSIZE       =       2\r
+       D.VERB          =       LH\r
+       D.TIME          =       RH;     E.TIME=D.TIME+DOF\r
+       D.OBJECT        =       LH+1\r
+       D.INSTRUMENT    =       RH+1\r
+       D.ALWAYS        =       selector 1:0:2\r
+       D.GLOBAL        =       selector 1:1:2\r
+       D.PLONK         =       selector 1:2:2; E.PLONK=D.PLONK+DOF\r
+       D.SUSPENDED     =       selector 1:3:2; E.SUSPENDED=D.SUSPENDED+DOF\r
+       D.ATTRIBUTES    =       RH+2\r
+       D.OFFSET        =       LH+2\r
+       E.DEMONUM       =       LH\r
+//Message block.\r
+/*\r
+       +---------------+---------------+\r
+       !    SENDER     !   (LINK)      !\r
+       +---------------+---------------+\r
+       !     SHORT     !    FUNC       !\r
+       +-------------------------------+\r
+       !            (INFO)             !\r
+       +-------------------------------+\r
+       !                               !\r
+       !                               !\r
+*/\r
+       SENDER          =       LH\r
+       SHORT           =       LH+1\r
+       FUNC            =       RH+1\r
+       //Function codes.\r
+       K.IWKU          =       1               //I want to kill you.\r
+       K.IACPT         =       2               //I accept.\r
+       K.IMDD          =       3               //I'm definitely dead.\r
+       K.ISAM          =       4               //I swung and missed.\r
+       K.ISAH          =       5               //I swung and hit.\r
+       K.TEXT          =       6               //A text message.\r
+       K.SNOP          =       7               //I want to snoop.\r
+       K.MAKE          =       8               //Do this!\r
+       K.ITTE          =       9               //I tried to enter\r
+       K.DIST          =       10              //Text message from "A distance"\r
+       K.IWSU          =       11              //I want to steal from you\r
+       K.INCI          =       12              //I'm not carrying it\r
+       K.IFYO          =       13              //I found you out\r
+       K.YSFM          =       14              //You stole from me\r
+       K.WAF           =       15              //We are fighting\r
+       K.IWTF          =       16              //I want to follow\r
+       K.IHHU          =       17              //I have hit you\r
+       K.STTE          =       18              //Something tried to enter\r
+       K.ISFY          =       19              //I've stopped following you\r
+       K.IWJY          =       20              //I want to join you\r
+       K.ISJY          =       21              //I've stopped following you\r
+       K.SJM           =       22              //Stop joining me\r
+       K.IFM           =       23              //I'm fighting a monster\r
+       K.ISAHM         =       24              //I swung and hit monster\r
+       K.ISAMM         =       25              //I swung and missed monster\r
+       K.IWGU          =       26              //I want to give to you\r
+       K.BGON          =       27              //Begone!\r
+       K.ITHM          =       28              //It's too heavy for me\r
+       K.SNPA          =       29              //Snoop packet\r
+       K.IWSS          =       30              //I want to stop snooping\r
+       K.SSNO          =       31              //Stop snooping\r
+       K.BELW          =       32              //Bellow!\r
+       K.IFFY          =       33              //I fled from you\r
+       K.TYVM          =       34              //Thank you very much!\r
+       K.SFM           =       35              //Stop following me\r
+       K.YFIM          =       36              //You're following I moved\r
+       K.SJL           =       37              //Something just left\r
+       K.SJA           =       38              //Something just arrived\r
+       K.SFO           =       39              //Something fighting object\r
+       K.OHD           =       40              //Object has died\r
+       K.IGOT          =       41              //I got object\r
+       K.IDROPT        =       42              //I dropped object\r
+       K.TTH           =       43              //Trans to here\r
+       K.IINS          =       44              //I inserted\r
+       K.IREM          =       45              //I removed\r
+       K.SHBD          =       46              //Something has been dropped\r
+       K.MESS          =       47              //Message\r
+       K.MGOT          =       48              //Monster got object\r
+       K.MDROPT        =       49              //Monster dropped object\r
+       K.TSEX          =       50              //Toggle Sex!\r
+       K.OHM           =       51              //Object has moved\r
+       K.MFM           =       52              //Monster fighting me!\r
+       K.WU            =       53              //Wake up!\r
+       K.LOUD          =       54              //Loud noise...\r
+       K.ZZZ           =       55              //Fall asleep\r
+       K.IAA           =       56              //I'm already asleep\r
+       K.IHFA          =       57              //I have fallen asleep\r
+       K.IMOF          =       58              //I'm in the middle of a fight!\r
+       K.IHWU          =       59              //I have woken up\r
+       K.GRO           =       60              //Get rid of\r
+       K.FOD           =       61              //Finger of death!\r
+       K.INH           =       62              //I'm new here\r
+       K.IGIV          =       63              //I've given an object\r
+       K.ITAK          =       64              //I've taken an object\r
+       K.ISCY          =       65              //I shall contact you\r
+       K.OHDS          =       66              //Object has done something\r
+       K.WM            =       67              //Wizard mode\r
+       K.YCSM          =       68              //You cannot summon me\r
+       K.SHBE          =       69              //Someone has been exorcised\r
+       K.IHPO          =       70              //I have passed on\r
+       K.SPEC          =       71              //Spectacular!\r
+       K.DTD           =       72              //Do this demon\r
+       K.TOLD          =       73              //Told you the message (not said it)\r
+       K.IHD           =       74              //I have died\r
+       K.IHSE          =       75              //I have shown emotion\r
+       K.IHKS          =       76              //I have kissed someone\r
+       K.PIM           =       77              //Proof it's me\r
+       K.GOWM          =       78              //Get out of wizard mode\r
+       K.IHR           =       79              //I have retaliated\r
+       K.IHCL          =       80              //I have changed level\r
+       K.LAUGH         =       81              //Laugh..!\r
+       K.SHBF          =       82              //Someone has been forced\r
+       K.IHBF          =       83              //I have been forced\r
+       K.IHA           =       84              //I have attached\r
\r
+//Mobile objects' information nodes\r
+/*\r
+       +---------------+---------------+\r
+       !  PREVROOM     !   CURROOM     !\r
+       +---------------+---------------+\r
+       !    MOVECOUNT  !     MOTION    !\r
+       +---------------+---------------+\r
+       !             FIGHTS            !\r
+       +---------------+---------------+\r
+       !            SNOOPERS           !\r
+       +---------------+---------------+\r
+       !            CHASERS            !\r
+       +---------------+---------------+\r
+       !  INSTINCTS    !   ACTIONS     !\r
+       +---------------+---------------+\r
+*/\r
+       MOTIONSIZE      =       5\r
+       CURROOM         =       RH\r
+       PREVROOM        =       LH\r
+       MOVECOUNT       =       LH+1\r
+       MOTION          =       RH+1\r
+       FIGHTS          =       WORD+2\r
+       SNOOPERS        =       WORD+3\r
+       CHASERS         =       WORD+4\r
+       INSTINCTS       =       LH+5\r
+       ACTIONS         =       RH+5\r
\r
+//Containers information nodes\r
+/*\r
+       +---------------+---------------+\r
+       !            ODT!     CONTS     !       //O=opened,D=disguised,T=transparent\r
+       +---------------+---------------+\r
+       !    MAXWT      !     WTUSED    !\r
+       +---------------+---------------+\r
+*/\r
+       CONTSIZE        =       1\r
+       TRANSPARENT     =       selector 1:18:0\r
+       DISGUISED       =       selector 1:19:0\r
+       OPENED          =       selector 1:20:0\r
+       CONTS           =       RH\r
+       MAXWT           =       LH+1\r
+       WTUSED          =       RH+1\r
\r
+//Player profile.\r
+/*\r
+       +---------------+---------------+\r
+       !  (SENDER)     !   (LINK)      !\r
+       +---------------+---------------+\r
+       !     unused    !   (PNAME)     !       //when full, use unused as a list - non-shareable stuff can be statics\r
+       +---------------+---------------+\r
+       !      (INFO)   player.bit      !\r
+       +-------------------------------+\r
+       !       STATES                  !\r
+       +---------------+---------------+\r
+       !    (JBNUM)    !   (ROBJT)     !\r
+       +-------+-------+---------------+\r
+       ! O.C   ! O.E   !  CARRY.COUNT  !       //O.C=OBJ.CARRIED, O.E=OBJ.EXTRA\r
+       +-------+-------+---------------+\r
+       !          SCORE                !\r
+       +-------------------------------+\r
+       !           STRENGTH            !\r
+       +-------------------------------+\r
+       !           STAMINA             !\r
+       +-------------------------------+\r
+       !           DEXTERITY           !\r
+       +-------------------------------+\r
+       !         GAMES.PLAYED          !\r
+       +-------------------------------+\r
+       !           STAMINAMAX          !\r
+       +-------------------------------+\r
+       !       CROOM                   !\r
+       +---------------+---------------+\r
+       !    (unused)   !  WT.EXTRA     !\r
+       +---------------+---------------+\r
+       !  6  !  M  !  y  !  n  !  a  !?!               // ? means sex (1=fem, 0=mal)\r
+       +-------------------------------+\r
+       !  m  !  e  !     !     !     !?!               // ? means dormancy (1=asleep, 0=awake)\r
+       +-------------------------------+\r
+*/\r
+       STATES          =       WORD+3\r
+       WIZARD          =       selector 1:0:3\r
+       OPR             =       selector 1:1:3\r
+       BERSERK         =       selector 1:2:3  ;       BERSERKMASK=#4\r
+       SNOOPBIT        =       selector 1:3:3\r
+       ATTED           =       selector 1:4:3\r
+       BREEF           =       selector 1:5:3\r
+       INVIS           =       selector 1:6:3  ;       NOTINVIS=#777777777677\r
+       IGNORE          =       selector 1:7:3\r
+       ISWIZ           =       selector 1:8:3  ;       WIZMASK=1<<8\r
+       JBNUM           =       LH+4\r
+       CARRY.COUNT     =       RH+5\r
+       OBJ.CARRIED     =       selector 9:18:5\r
+       OBJ.EXTRA       =       SELECTOR 9:27:5\r
+       SCORE           =       WORD+6\r
+       STRENGTH        =       WORD+7\r
+       STAMINA         =       WORD+8\r
+       DEXTERITY       =       WORD+9\r
+       GAMES.PLAYED    =       WORD+10\r
+       CROOM           =       WORD+12\r
+       WT.EXTRA        =       RH+13\r
+       STAMINAMAX      =       WORD+11\r
+       SEX             =       SELECTOR 1:0:14\r
+       ASLEEP          =       SEX+1\r
+//Various other selectors.\r
+       RNAME           =       WORD+1          //For a dictionary node.\r
+       CONDTYPE        =       LH+1            //For the travel table.\r
+       CONDVAL         =       RH+1            //For the travel table.\r
+       STIME           =       selector 9:27:0 //For start time\r
+       FTIME           =       selector 9:18:0 //For finish time\r
+//Constants (numbers not selectors)\r
+       CCTRIP          =       30              //^C's to get out divided by 10\r
+       HUNG            =       200             //hung count!\r
+       HASHSIZE        =       127             //Size of hash table.\r
+       MAXWEIGHT       =       1000            //Max weight is 1000g/strength pt\r
+       EXP.STEP        =       400             //Number doubled per experience level\r
+       DEADPTS         =       75              //Base score for killing people\r
+       FLEELOSS        =       50              //pts/level lost when fleeing\r
+       BOOSTEP         =       10              //Amount added to attributes when go up a level\r
+       MAX.LEVEL       =       9               //1 less than maximum level!\r
+       TIMEOUT         =       5               //no. of minutes to get out after closing time\r
+       NAMELENGTH      =       9               //Max length of player name.\r
+       STRINGSIZE      =       127             //Max length of string.\r
+       CHPERWORD       =       5               //Characters per word.\r
+       PACKEDSTRING    =       STRINGSIZE/CHPERWORD+1\r
+       BERSERKMAX      =       200             //Maximum str/stamina for berserkers\r
+       LHMASK          =       #777777000000   //Left hand mask\r
+       RHMASK          =       #777777         //Right hand mask\r
+       DUMPSIZE        =       10              //Size of dumplist.\r
+       WTHRESHOLD      =       20000           //Weight threshold\r
+       SNOOPROMPT      =       '|'             //Snoop prompt so know snooping\r
+       INTERVAL        =       60              //default seconds between auto-who\r
+       RNGE            =       20              //range within which diagnosed stamina lies\r
+       SDIV            =       18              //sleep divisor, 18 is ~10 secs\r
+       F.DMGE1         =       2               //Divides the original damage.\r
+       F.DMGE2         =       4               //Ditto above, differing times.\r
+       F.ENCMB         =       2000            //Encumberance affects chance to hit (bigger number is more chance)\r
+       E.DIV           =       3               //people shown emotion get\r
+       E.MULT          =       2               // mult/div times amount person showing it loses\r
+       GUESTPN         =       #2653           //PPn of guests from outside\r
+//this next lot should be selectors REALLY...\r
+       A.LIGHT         =       #1              //Room attributes.\r
+       A.WATER         =       #2              //Water is here.\r
+       A.OIL           =       #4              //Oil is here.\r
+       A.DEATH         =       #10             //This room kills you!\r
+       A.SANCTUARY     =       #20             //Score points for objects here\r
+       A.HIDEAWAY      =       #40             //Can't see objects here!\r
+       A.SMALL         =       #100            //Only 1 person can fit\r
+       A.CHAIN         =       #200            //run another MUD\r
+       A.HIDE          =       #400            //People in here can't be seen from outside\r
+       A.DMOVE         =       #1000           //die, and objects move to this room\r
+       A.NOLOOK        =       #2000           //can't look into this room from another\r
+       A.SILENT        =       #4000           //silent to loud noises.\r
+       A.START         =       #10000          //Starting room.\r
+//Tokens\r
+       S.ROOMS         =       1               //Said *Rooms.\r
+       S.VOCAB         =       S.ROOMS+1       //or *Vocabulary.\r
+       S.TRAVEL        =       S.VOCAB+1       //or *Travel.\r
+       S.OBJECT        =       S.TRAVEL+1      //*Objects or *Object.\r
+       S.LEVELS        =       S.OBJECT+1      //*Levels.\r
+       S.DEMONS        =       S.LEVELS+1      //or *Demons.\r
+       S.MAP           =       S.DEMONS+1      //or *Map or *Maps\r
+       S.HOURS         =       S.MAP+1         //or *Hours\r
+       S.COMBAT        =       S.HOURS+1       //or *Combat\r
+       S.PERSONA       =       S.COMBAT+1      //or *Persona\r
+       S.TEXT          =       S.PERSONA+1     //or *Text.\r
+       S.EOF           =       S.TEXT+1\r
+       S.NAME          =       S.EOF+1\r
+       S.NUMBER        =       S.NAME+1\r
+       S.MOTION        =       S.NUMBER+1\r
+       S.ACTION        =       S.MOTION+1\r
+       S.FASTATN       =       S.ACTION+1\r
+       S.LEVEL         =       S.FASTATN+1\r
+       S.SPECIAL       =       S.LEVEL+1\r
+       S.BRIGHT        =       S.SPECIAL+1\r
+       S.UNCONVERSE    =       S.BRIGHT+1\r
+       S.SYN           =       S.UNCONVERSE+1\r
+       S.RAND          =       S.SYN+1\r
+       S.AFUNC         =       S.RAND+1\r
+       S.SFUNC         =       S.AFUNC+1\r
+       S.TCOND         =       S.SFUNC+1\r
+       S.WITH          =       S.TCOND+1\r
+       S.CONT          =       S.WITH+1\r
+       S.FORCED        =       S.CONT+1\r
+       S.NOISE         =       S.FORCED+1\r
+       S.PLAYER        =       S.NOISE+1\r
+       S.MUDNAM        =       S.PLAYER+1\r
+       S.DOTNAME       =       S.MUDNAM+1\r
+       S.DIFF          =       S.DOTNAME+1\r
+       S.DD            =       S.DIFF+1\r
+       S.THERE         =       S.DD+1\r
+       S.IT            =       S.THERE+1\r
+       S.HIM           =       S.IT+1\r
+       S.HER           =       S.HIM+1\r
+       S.THEM          =       S.HER+1\r
+       S.ME            =       S.THEM+1\r
+       S.TRANSPARENT   =       S.ME+1\r
+       S.NOGET         =       S.TRANSPARENT+1\r
+       S.DISGUISED     =       S.NOGET+1\r
+       S.OPENED        =       S.DISGUISED+1\r
+       S.NOIT          =       S.OPENED+1\r
+       S.NOSUMMON      =       S.NOIT+1\r
+       S.ATTR          =       S.NOSUMMON+1\r
+       S.CONTAINS      =       S.ATTR+1\r
+       S.MALE          =       S.CONTAINS+1\r
+       S.FEMALE        =       S.MALE+1\r
+       S.ALWAYS        =       S.FEMALE+1\r
+       S.GLOBAL        =       S.ALWAYS+1\r
+       S.WHICHEVER     =       S.GLOBAL+1\r
+       S.ALL           =       S.WHICHEVER+1\r
+       S.CLASS         =       S.ALL+1\r
+       S.ENABLED       =       S.CLASS+1\r
+       S.AT            =       S.ENABLED+1\r
+       S.NONE          =       S.AT+1\r
+       S.PERSON        =       S.NONE+1\r
+       S.SOMETHING     =       S.PERSON+1\r
+       S.ANYTHING      =       S.SOMETHING+1\r
+//Interact function codes\r
+       I.KILL          =       1\r
+       I.TELL          =       2\r
+       I.MAKE          =       3\r
+       I.STEAL         =       4\r
+       I.FOLLOW        =       5\r
+       I.LOSE          =       6\r
+       I.JOIN          =       7\r
+       I.REFUSE        =       8\r
+       I.GIVE          =       9\r
+       I.SNOOP         =       10\r
+       I.WAKE          =       11\r
+       I.CHANGE        =       12\r
+       I.SUMMON        =       13\r
+       I.SLEEP         =       14\r
+       I.FOD           =       15\r
+//Special verb function codes.\r
+       SF.TELL         =       1\r
+       SF.SAY          =       2\r
+       SF.GET          =       3\r
+       SF.DROP         =       4\r
+       SF.KILL         =       5\r
+       SF.QUIT         =       6\r
+       SF.SCRE         =       7\r
+       SF.LOOK         =       8\r
+       SF.QOTE         =       9               //Not really a verb but (")\r
+       SF.LOG          =       10\r
+       SF.INVN         =       11\r
+       SF.DBUG         =       12\r
+       SF.FRCE         =       13\r
+       SF.GO           =       14\r
+       SF.BUG          =       15\r
+       SF.WHO          =       16\r
+       SF.CTRAP        =       17\r
+       SF.ACTION       =       18\r
+       SF.SHOUT        =       19\r
+       SF.BACK         =       20\r
+       SF.FOLLOW       =       21\r
+       SF.LOSE         =       22\r
+       SF.JOIN         =       23\r
+       SF.REFUSE       =       24\r
+       SF.UNKEEP       =       25\r
+       SF.SET          =       26\r
+       SF.SPECLOG      =       27\r
+       SF.SNOOP        =       28\r
+       SF.UNSNOOP      =       29\r
+       SF.P            =       30\r
+       SF.DIRECT       =       31\r
+       SF.WHERE        =       32\r
+       SF.BRIEF        =       33\r
+       SF.FLEE         =       34\r
+       SF.EXORCISE     =       35\r
+       SF.FREEZE       =       36\r
+       SF.UNFREEZE     =       37\r
+       SF.MOBILE       =       38\r
+       SF.HASTE        =       39\r
+       SF.SLEEP        =       40\r
+       SF.WAKE         =       41\r
+       SF.CHANGE       =       42\r
+       SF.ENCHANT      =       43\r
+       SF.RESURRECT    =       44\r
+       SF.KEEP         =       45\r
+       SF.SUMMON       =       46\r
+       SF.ATTACH       =       47\r
+       SF.DETACH       =       48\r
+       SF.INSERT       =       49\r
+       SF.REMOVE       =       50\r
+       SF.PRONOUNS     =       51\r
+       SF.EMPTY        =       52\r
+       SF.FOD          =       53\r
+       SF.BEGONE       =       54\r
+       SF.PROVOKE      =       55\r
+       SF.PURGE        =       56\r
+       SF.SAVE         =       57\r
+       SF.FLUSH        =       58              //this is just same as action fn. flush\r
+       SF.BYE          =       59\r
+       SF.TIME         =       60\r
+       SF.CRASH        =       61\r
+       SF.MAP          =       62\r
+       SF.EXITS        =       63\r
+       SF.PEACE        =       64\r
+       SF.WAR          =       65\r
+       SF.HOURS        =       66\r
+       SF.NEWHOURS     =       67\r
+       SF.SPECTACULAR  =       68\r
+       SF.AUTOWHO      =       69\r
+       SF.QUICKWHO     =       70\r
+       SF.RESET        =       71\r
+       SF.ROOMS        =       72\r
+       SF.BERSERK      =       73\r
+       SF.WEIGH        =       74\r
+       SF.VERBOSE      =       75\r
+       SF.SGO          =       76\r
+       SF.PASSWORD     =       77\r
+       SF.NOPASSWORD   =       78\r
+       SF.STAMINA      =       79\r
+       SF.HUMBLE       =       80\r
+       SF.PROOF        =       81\r
+       SF.CONVERSE     =       82\r
+       SF.DIAGNOSE     =       83\r
+       SF.DEAFEN       =       84\r
+       SF.BLIND        =       85\r
+       SF.PARALYSE     =       86\r
+       SF.DUMB         =       87\r
+       SF.CURE         =       88\r
+       SF.SGET         =       89\r
+       SF.VALUE        =       90\r
+       SF.INVIS        =       91\r
+       SF.VIS          =       92\r
+       SF.SHELVE       =       93\r
+       SF.UNSHELVE     =       94\r
+       SF.UNVEIL       =       95\r
+       SF.DEMO         =       96\r
+       SF.LAUGH        =       97\r
+       SF.IGNORE       =       98\r
+       SF.POLICE       =       99\r
\r
+//Function types for verbs (cf. 1.5 address computer!)\r
+       F.INC           =       1\r
+       F.DEC           =       F.INC+1\r
+       F.NULL          =       F.DEC+1\r
+       F.FLUSH         =       F.NULL+1\r
+       F.MOVE          =       F.FLUSH+1\r
+       F.TRANS         =       F.MOVE+1\r
+       F.SET           =       F.TRANS+1\r
+       F.TOGGLE        =       F.SET+1\r
+       F.FIX           =       F.TOGGLE+1\r
+       F.FLOAT         =       F.FIX+1\r
+       F.DESTROY       =       F.FLOAT+1\r
+       F.CREATE        =       F.DESTROY+1\r
+       F.FORROT        =       F.CREATE+1\r
+       F.BACKROT       =       F.FORROT+1\r
+       F.EXPINC        =       F.BACKROT+1\r
+       F.EXPSET        =       F.EXPINC+1\r
+       F.HOLDFIRST     =       F.EXPSET+1\r
+       F.HOLDLAST      =       F.HOLDFIRST+1\r
+       F.FLIPAT        =       F.HOLDLAST+1\r
+       F.IFOBJCOUNT    =       F.FLIPAT+1\r
+       F.IFPROP        =       F.IFOBJCOUNT+1\r
+       F.IFPROPINC     =       F.IFPROP+1\r
+       F.IFPROPDEC     =       F.IFPROPINC+1\r
+       F.IFPROPDESTROY =       F.IFPROPDEC+1\r
+       F.UNLESSPROPDESTROY     =       F.IFPROPDESTROY+1\r
+       F.IFRPROP       =       F.UNLESSPROPDESTROY+1\r
+       F.IFRLEVEL      =       F.IFRPROP+1\r
+       F.UNLESSRLEVEL  =       F.IFRLEVEL+1\r
+       F.NOIFR         =       F.UNLESSRLEVEL+1\r
+       F.IFR           =       F.NOIFR+1\r
+       F.IFBERSERK     =       F.IFR+1\r
+       F.UNLESSBERSERK =       F.IFBERSERK+1\r
+       F.IFWIZ         =       F.UNLESSBERSERK+1\r
+       F.UNLESSWIZ     =       F.IFWIZ+1\r
+       F.IFSMALL       =       F.UNLESSWIZ+1\r
+       F.UNLESSSMALL   =       F.IFSMALL+1\r
+       F.IFDEAF        =       F.UNLESSSMALL+1\r
+       F.IFBLIND       =       F.IFDEAF+1\r
+       F.IFPARALYSED   =       F.IFBLIND+1\r
+       F.IFDUMB        =       F.IFPARALYSED+1\r
+       F.UNLESSPROP    =       F.IFDUMB+1\r
+       F.IFZERO        =       F.UNLESSPROP+1\r
+       F.IFDISENABLE   =       F.IFZERO+1\r
+       F.UNLESSDISENABLE       =       F.IFDISENABLE+1\r
+       F.IFENABLED     =       F.UNLESSDISENABLE+1\r
+       F.UNLESSENABLED =       F.IFENABLED+1\r
+       F.TESTSEX       =       F.UNLESSENABLED+1\r
+       F.UNLESSIN      =       F.TESTSEX+1\r
+       F.UNLESSOBJIS   =       F.UNLESSIN+1\r
+       F.IFOBJIS       =       F.UNLESSOBJIS+1\r
+       F.UNLESSINSIS   =       F.IFOBJIS+1\r
+       F.IFINSIS       =       F.UNLESSINSIS+1\r
+       F.UNLESSOBJPLAYER       =       F.IFINSIS+1\r
+       F.IFOBJPLAYER   =       F.UNLESSOBJPLAYER+1\r
+       F.UNLESSOBJCONTAINS     =       F.IFOBJPLAYER+1\r
+       F.IFOBJCONTAINS =       F.UNLESSOBJCONTAINS+1\r
+       F.TESTSMALL     =       F.IFOBJCONTAINS+1\r
+       F.TRANSWHERE    =       F.TESTSMALL+1\r
+       F.IFIN          =       F.TRANSWHERE+1\r
+       F.EXP           =       F.IFIN+1\r
+       F.STAMINA       =       F.EXP+1\r
+       F.RESETDEST     =       F.STAMINA+1\r
+       F.STAMINADESTROY=       F.RESETDEST+1\r
+       F.LOSEEXP       =       F.STAMINADESTROY+1\r
+       F.LOSESTAMINA   =       F.LOSEEXP+1\r
+       F.INJURE        =       F.LOSESTAMINA+1\r
+       F.SUSPEND       =       F.INJURE+1\r
+       F.DELAYMOVE     =       F.SUSPEND+1\r
+       F.WRITEIN       =       F.DELAYMOVE+1\r
+       F.ENABLE        =       F.WRITEIN+1\r
+       F.DISENABLE     =       F.ENABLE+1\r
+       F.UNLESSGOT     =       F.DISENABLE+1\r
+       F.IFGOT         =       F.UNLESSGOT+1\r
+       F.UNLESSHAVE    =       F.IFGOT+1\r
+       F.IFHAVE        =       F.UNLESSHAVE+1\r
+       F.IFLEVEL       =       F.IFHAVE+1\r
+       F.IFSELF        =       F.IFLEVEL+1\r
+       F.UNLESSLEVEL   =       F.IFSELF+1\r
+       F.IFPLAYING     =       F.UNLESSLEVEL+1\r
+       F.UNLESSPLAYING =       F.IFPLAYING+1\r
+       F.IFLIGHT       =       F.UNLESSPLAYING+1\r
+       F.IFSEX         =       F.IFLIGHT+1\r
+       F.IFINVIS       =       F.IFSEX+1\r
+       F.IFILL         =       F.IFINVIS+1\r
+       F.UNLESSILL     =       F.IFILL+1\r
+       F.IFASLEEP      =       F.UNLESSILL+1\r
+       F.IFRSTAS       =       F.IFASLEEP+1\r
+       F.UNLESSRSTAS   =       F.IFRSTAS+1\r
+       F.UNLESSWEIGHS  =       F.UNLESSRSTAS+1\r
+       F.IFWEIGHS      =       F.UNLESSWEIGHS+1\r
+       F.UNLESSDEAD    =       F.IFWEIGHS+1\r
+       F.IFDEAD        =       F.UNLESSDEAD+1\r
+       F.UNLESSDESTROYED       =       F.IFDEAD+1\r
+       F.IFDESTROYED   =       F.UNLESSDESTROYED+1\r
+       F.UNLESSSNOOPING        =       F.IFDESTROYED+1\r
+       F.IFSNOOPING    =       F.UNLESSSNOOPING+1\r
+       F.IFFIGHTING    =       F.IFSNOOPING+1\r
+       F.UNLESSFIGHTING        =       F.IFFIGHTING+1\r
+       F.HURT          =       F.UNLESSFIGHTING+1\r
+       F.RETALIATE     =       F.HURT+1\r
+       F.SENDEMON      =       F.RETALIATE+1\r
+       F.SSENDEMON     =       F.SENDEMON+1\r
+       F.EMOTION       =       F.SSENDEMON+1\r
+       F.ZONK          =       F.EMOTION+1\r
+       F.DEAD          =       F.ZONK+1\r
+       F.SEND          =       F.DEAD+1\r
+       F.SENDEFFECT    =       F.SEND+1\r
+       F.SENDMESS      =       F.SENDEFFECT+1\r
+       F.SENDLEVEL     =       F.SENDMESS+1\r
+       F.INCSEND       =       F.SENDLEVEL+1\r
+       F.IFHERE        =       F.INCSEND+1\r
+       F.IFHERETRANS   =       F.IFHERE+1\r
+       F.UNLESSHERE    =       F.IFHERETRANS+1\r
+       F.SETSEX        =       F.UNLESSHERE+1\r
+       F.TOGGLESEX     =       F.SETSEX+1\r
+       F.TRANSHERE     =       F.TOGGLESEX+1\r
+       F.DESTROYTOGGLESEX      =       F.TRANSHERE+1\r
+//From here onwards the functions are double ie do both indicated things\r
+       F.INCDESTROY    =       F.DESTROYTOGGLESEX+1\r
+       F.DESTROYTRANS  =       F.INCDESTROY+1\r
+       F.FLOATDESTROY  =       F.DESTROYTRANS+1\r
+       F.DECDESTROY    =       F.FLOATDESTROY+1\r
+       F.DESTROYDEC    =       F.DECDESTROY+1          //Nothing personal Digital Electronics C.!\r
+       F.DECIFZERO     =       F.DESTROYDEC+1\r
+       F.SWAP          =       F.DECIFZERO+1\r
+       F.IFINC         =       F.SWAP+1\r
+       F.UNLESSINC     =       F.IFINC+1\r
+       F.EXPDESTROY    =       F.UNLESSINC+1\r
+       F.EXPMOVE       =       F.EXPDESTROY+1\r
+       F.INCMOVE       =       F.EXPMOVE+1\r
+       F.DESTROYDESTROY        =       F.INCMOVE+1\r
+       F.DESTROYSET    =       F.DESTROYDESTROY+1\r
+       F.SETDESTROY    =       F.DESTROYSET+1\r
+       F.SETFLOAT      =       F.SETDESTROY+1\r
+       F.DESTROYINC    =       F.SETFLOAT+1\r
+       F.DESTROYCREATE =       F.DESTROYINC+1\r
+       F.DECINC        =       F.DESTROYCREATE+1\r
+       F.INCDEC        =       F.DECINC+1\r
\r
+       B.START         =       0\r
+       B.IHIT          =       B.START+1\r
+       B.THEYMISS      =       B.IHIT+1\r
+       B.IMISS         =       B.THEYMISS+1\r
+       B.THEYHIT       =       B.IMISS+1\r
+       B.IMDEAD        =       B.THEYHIT+1\r
+       B.IMOK          =       B.IMDEAD+1\r
+       B.IHITBACK      =       B.IMOK+1\r
+       B.IMISSAGAIN    =       B.IHITBACK+1\r
+       B.VICTORY       =       B.IMISSAGAIN+1\r
\r
+       FULLBUFSIZE     =       639\r
+       BUFFERS         =       (FULLBUFSIZE+1)/5*2\r
+       WDSPERBUF       =       128\r
+/*     +-------------------------------+\r
+       !            POINTR             !\r
+       +---------------+---------------+\r
+       !       PN      !     GAMES     !\r
+       +---------------+---------------+\r
+       !             WRD1              !\r
+       +---------------+---------------+\r
+       !             WRD2              !\r
+       +---------------+---------------+\r
+       !             SCRE              !\r
+       +---------------+---------------+\r
+       ! STRN  ! DXTY  ! STNA  ! STMX  !\r
+       +---------------+---------------+\r
+       !             LSTM              !\r
+       +---------------+---------------+\r
+       !             WIZD              !\r
+       +---------------+---------------+\r
+       !             PSWD              !\r
+       +---------------+---------------+\r
+       !             UNUSED            !\r
+       +---------------+---------------+\r
+       !             UNUSED            !\r
+       +---------------+---------------+\r
+       !             UNUSED            !\r
+       +---------------+---------------+\r
+*/\r
+       POINTR          :       WORD\r
+       RECLENGTH       :       12\r
+       PN              :       LH+1\r
+       GAMES           :       RH+1\r
+       WRD1            :       WORD+2\r
+       WRD2            :       WORD+3\r
+       SCRE            :       WORD+4\r
+       STRN            :       selector 9: 27: 5\r
+       DXTY            :       selector 9: 18: 5\r
+       STNA            :       selector 9: 9: 5\r
+       STMX            :       selector 9: 0: 5\r
+       LSTM            :       WORD+6\r
+       WIZD            :       WORD+7\r
+       PSWD            :       WORD+8\r
+       DEL             :       254+WORD\r
+       FLEN            :       255+WORD\r
+       LASTREC         :       2*WDSPERBUF-RECLENGTH\r
+$)\r
+\r
+EXTERNAL\r
+$(     //Locations (as opposed to routines)\r
+       INDEX\r
+       DICTIONARY\r
+       STLIST\r
+       MAX.ROOM.NO\r
+       MAX.MESSAGE.NO\r
+       MAX.DEMON.NO\r
+       TEXT\r
+       DEMONS\r
+       TXTVEC\r
+       MOVERS\r
+       MVLOCK\r
+       DELOCK\r
+       MELTED\r
+       PEACE\r
+       FREE.SPACE\r
+       MALE\r
+       FEMALE\r
+       STARTLOC\r
+       ENDLOC\r
+       BACKWORD        :       BACKWD\r
+       TVERB\r
+       DATE\r
+       RDATE\r
+       RHOURS\r
+       TIMES\r
+       TIME\r
+       MUDNAM\r
+       MUD6\r
+       PS6\r
+       INIDR\r
+       PLAYER\r
+       PLYNUM\r
+       JOBNOS\r
+       KIPS\r
+       TABS\r
+       SHELF\r
+       GDEMONS         :       GDEMON          //GEVENTS would have been better\r
+       QUEUE           :       MQUEUE\r
+       PLAYER.NAMES    :       PNAMES\r
+       QUEUE.DOORS     :       QDOORS\r
+       PERSONA.DOOR    :       PDOOR\r
+       MESSAGE.DOOR    :       MDOOR\r
+       NAME.DOOR       :       NDOOR\r
+       REP1            :       PNAMES\r
+       ESXWD\r
+       MOTVEC\r
+       CODES\r
+       NAPCT\r
+       SUPERS\r
+       demo\r
+       randirs         :       randir\r
+       SHORTMESS\r
+       LONGMESS\r
+       MAGIC\r
+       SPECTACULAR     :       SPECT\r
+       nowiz\r
+       randoms         :       rndms\r
+       firsttime       :       ftime\r
+       deldr\r
+       active\r
+$)\r
+$list\r
\r
diff --git a/MBOOTS.MAC b/MBOOTS.MAC
new file mode 100644 (file)
index 0000000..3ae86dd
--- /dev/null
@@ -0,0 +1,1107 @@
+;Copyright (C) 1980 by\r
+;Roy Trubshaw, Richard Bartle & Brian Mallett,\r
+;Essex University, Colchester. CO4 3SQ.\r
+;\r
+;      This software is furnished on the understanding that\r
+;it may be used and or copied only with the inclusion of this\r
+;notice.  No title or ownership of this software is hereby\r
+;transferred. The information in this software is subject to\r
+;change without notice. No responsibility is assumed for the\r
+;use or reliability of this software.\r
\r
+       TITLE   BCPL\r
+       TWOSEG  400K\r
\r
+       SEARCH UUOSYM\r
+\r
+       CODE1==617022\r
+       CODE2==13731\r
+       CODE3==26262\r
\r
+       JRST    .BCPL.##        ; CATCH FALL THROUGH\r
+..BCPL::TDZA   1,      1\r
+       SETO    1,      0       ; SET UP CCL VALUE\r
+       MOVEM   1,      %CCL##  ;Store it.\r
+       MOVEM   0,      %CALLNM##       ;Save name of this game...\r
+       CAIN    .SGPPN, 75      ;Frig for 7.001 monitor - get 75 instead of ppn\r
+       MOVE    .SGPPN, 77      ;Real ppn is in 77 (part of lookup block)\r
+       MOVEM   .SGPPN, MAINTA##        ;Save as maintainer's ppn\r
+       MOVEM   .SGPPN, PATHPP  ;Save for assigning MUD:\r
+       CAIN    .SGDEV, 75      ;Same palaver for device now\r
+       MOVE    .SGDEV, 75      ;Device is 1st entry in lookup block\r
+       SKIPN           .SGDEV  ;Did he give a disc?\r
+       MOVEI   .SGDEV, 'DSK'   ;No so assume dsk...\r
+       MOVEM   .SGDEV, DISC    ;stow away...\r
+       MOVEM   .SGDEV, PATHDV  ;...again.\r
+       came    .sgdev, [       sixbit  /dsk/   ]\r
+       camn    .sgdev, [       sixbit  /all/   ]\r
+       jrst            past\r
+       camn    .sgdev, [       sixbit  /lib/   ]\r
+       jrst            past\r
+       movei   2,      4\r
+lop:   move    1,      [       xwd     3,      loc]\r
+       jobstr  1,\r
+       jrst            past\r
+       move    1,      loc\r
+       jumpe   1,      over\r
+       camn    1,      addr+1\r
+       jrst            past\r
+       movem   1,      addr(2)\r
+       addi    2,      3\r
+       jrst            lop\r
+over:  sos             2\r
+       hrli    1,      @2\r
+       hrri    1,      addr\r
+       struuo  1,\r
+       trn\r
+past:  hrri    1,      pathbk\r
+       hrli    1,      12\r
+       path.   1,\r
+       trn\r
+       RESET\r
+       setz    1,\r
+       setuwp  1,\r
+       halt\r
+       SKIPE           74\r
+       JRST    [       OUTSTR  [       ASCIZ   /\r
+If you think I'll let you DDT me you've another think coming, squire...\r
+/                              ]\r
+                       JRST    @.\r
+                       EXIT\r
+               ]\r
+       movei   1,      imrtrp\r
+       movem   1,      .jbapr\r
+       movei   1,      ap.pov+ap.ilm+ap.nxm+ap.par\r
+       aprenb  1,      0\r
+       moveI 1,vec\r
+       piini.  1,0\r
+       trn\r
+       movei 1,swint\r
+       movem 1,vec+4\r
+       movei 1,imrtrp\r
+       movem 1,vec+10\r
+       move 1,[ ps.fon+ps.fac+args]\r
+       pisys.  1,0\r
+       trn\r
+       move 1,[ ps.fon+ps.fac+args1]\r
+       pisys.  1,0\r
+       trn\r
+       skipn           esxwd##\r
+       jrst            ripple\r
+       movei   1,      2\r
+       hrli    1,      3\r
+       movei   2,      2036\r
+       seto    3,\r
+       trmno.  3,\r
+       trn\r
+       setz    4,\r
+       trmop.  1,\r
+       trn\r
+       movei   2,      2003\r
+       trmop.  1,\r
+       trn\r
+ripple:        JRST            400010  ;Start ripple through\r
+swint: movem   1,      sumadd\r
+       hrrz    1,      status\r
+       cain    1,      code1\r
+       jrst            cone\r
+       caie    1,      code2\r
+       cain    1,      code3\r
+       jrst            ctwo\r
+wally: setzm           half\r
+okok:  move    1,      sumadd\r
+       debrk.\r
+       halt\r
+cone:  setom           half\r
+       jrst            okok\r
+ctwo:  skipn           half\r
+       jrst            wally\r
+       caie    1,      code2\r
+       jrst            nice\r
+       skipe           maint##\r
+       jrst            [       outstr  [asciz  /\r
+Someone has just tried to do something magical to you nastily.\r
+/                                      ]\r
+                               jrst wally\r
+                       ]\r
+       outstr [asciz /\r
+Someone has done something magical to you, nastily...\r
+/ ]\r
+       exit\r
+       halt\r
+nice:  outstr [asciz /\r
+Someone has done something magical to you, nicely...\r
+/]\r
+       setom   ctcflg##\r
+       jrst    wally\r
+\r
+imrtrp:        movei   1,      imrext\r
+       movem   1,      .jbapr\r
+       outstr  [asciz  /\r
+Something amazingly magical has happened!\r
+/]\r
+       skipe           magic##\r
+       jrst            imrext\r
+       setom           magic##\r
+       jsp     14,     @resetgame##\r
+       subi    16,     2\r
+imrext:        exit    1,\r
\r
+reloc\r
\r
+sumadd:        block 1\r
+half:  0\r
+vec:   block 4\r
+new:   0\r
+old:   0\r
+flags: 0\r
+status:        0\r
+new1:  0\r
+old1:  0\r
+flags1:        0\r
+stats1:        0\r
\r
+args:  .pcjbi\r
+       xwd 4,0\r
+       xwd 2,0\r
+args1: .pciuu\r
+       xwd 10,0\r
+       xwd 2,0\r
\r
+pathbk:        -5\r
+       0\r
+       sixbit /MUD/\r
+       0\r
+pathdv:        exp 0, 0, 0\r
+pathpp:        exp 0, 0, 0, 0\r
+addr:  .fssrc\r
+disc:: block 1\r
+       0\r
+       0\r
+       block   ^d21                    ;should be enough for most searchlists...\r
+loc:   exp -1,0,0\r
+       END     ..BCPL\r
+\r
+\r
+\r
+\r
+\\\\\\r
+\fSUBFILE: POWER.BCL @11:29 13-NOV-1986 <477> (3816)   \r
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
+\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.  No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
+\r
+get "bcl:acs"\r
+get "bcl:scb"\r
+get "bcl:iolib"\r
+get "dungen"\r
+get "bcl:rfslib"\r
+\r
+$LDTEXT "/RUNAME:power"\r
+\r
+external "."\r
+$(     fn\r
+$)\r
+\r
+manifest\r
+$(     TREESIZE        =       RECLENGTH+2\r
+       RIGHT           =       RH | TREESIZE-1\r
+       LEFT            =       LH | TREESIZE-1\r
+       CHAIN           =       RH | TREESIZE\r
+       PPPN            =       #2011002011//MPPN\r
+$)\r
+\r
+static\r
+$(     lastblock       =       0\r
+       cbl             =       vec 1\r
+       dmpbuf          =       vec BUFFERS\r
+       cbll            =       vec 1\r
+       perputt         =       ?\r
+       dmpbuff         =       vec BUFFERS\r
+       bcntt           =       1\r
+       nextrec         =       ?\r
+       game            =       $6"mud"\r
+       rock            =       $6"rock"\r
+       blud            =       $6"blud"\r
+       perput          =       ?\r
+       rec             =       ?\r
+       gender          =       0\r
+       me              =       0\r
+       ch              =       ?\r
+       name            =       vec 1\r
+       room            =       0\r
+       tree            =       0\r
+$)\r
+\r
+let start() be\r
+$(     let bcnt=1\r
+       output:=tty\r
+       outs("The power program!*C*L")\r
+       $[      $rescan\r
+zonk:          $inchrs         1\r
+               $jrst           plonk\r
+               $caie   1,      '-'\r
+               $jrst           zonk\r
+cronk:         $inchrs         1\r
+               $jrst           plonk\r
+               $trz    1,      #40\r
+               $caie   1,      'M'\r
+               $cain   1,      'V'\r
+               $jrst           wonk\r
+               $caie   1,      'B'     //spot the hacks...\r
+               $cain   1,      'R'\r
+               $trna\r
+               $jrst           cronk\r
+               $move   2,      rock\r
+               $cain   1,      'B'\r
+               $move   2,      blud\r
+               $movem  2,      game\r
+wonk:          $inchrs         1\r
+               $trna\r
+               $jrst           wonk\r
+plonk: $]\r
+       input:=tty\r
+       Readname(name, "Password: ")\r
+       test !name=!"bushbaby" then outs("*C*LThat'll do...*C*L") or\r
+       $(      Outs("*C*LEek! Go away!*C*L")\r
+               finish\r
+       $)\r
+       $(      Outs("Frig, Start, League, Transfer, Enumerate, Password, Dot, Reveal, Mud, Kill*C*Lor One-off? ")\r
+               switchon valof\r
+               $[      $clrbfi\r
+                       $inchrw         1\r
+                       $trz    1,      #40\r
+               $] into\r
+               $(\r
+               case 'R':       outs("eveal*C*L")\r
+                               reveal()\r
+                               finish\r
+               case 'M':       outs("ud*C*L")\r
+                               run($6"dsk", $6"mud", $6"exe", PPPN)\r
+               case 'S':       outs("tart*C*L")\r
+                               strat()\r
+                               finish\r
+               case 'D':       outs("ot*C*L")\r
+                               dot()\r
+                               finish\r
+               case 'F':       outs("rig*C*L")\r
+                               break\r
+               case 'L':       outs("eague*C*L")\r
+                               league()\r
+                               finish\r
+               case 'T':       outs("ransfer*C*L")\r
+                               Transfer()\r
+                               finish\r
+               case 'E':       outs("numerate*C*L")\r
+                               Enumerate()\r
+                               finish\r
+               case 'P':       outs("assword*C*L")\r
+                               password()\r
+                               finish\r
+               case 'K':       outs("ill*C*L")\r
+                               kill()\r
+                               finish\r
+               case 'O':       outs("ne-off*C*L")\r
+                               oneoff()\r
+                               finish\r
+               default 0 ... #137:\r
+                       Outs("*C*LEh?*C*L")\r
+               $)\r
+       $) repeat\r
+       setup()\r
+       readname(name, "Name: ")\r
+       if !name =!"richard" Outs("*C*LYou're so naive...*C*L")<>finish\r
+       searchrec(name)\r
+       if rec then rec_rec rem 128+dmpbuf\r
+       test rec then\r
+       $(      let sc, sx=SCRE of rec, WRD1 of rec bitand 1\r
+               outs("Current character profile is:*C*L")\r
+               out("Name*T*T:s:s*C*Lscore*T*T:n*T:s*C*Lstrength*T:n*C*L",rec+2,WIZD of rec bitand WIZMASK -> "*TWIZ","",sc,lev(sc,sx),STRN of rec)\r
+               out("dexterity*T:n*C*Lstamina*T*T:n*T(max*T:n)*C*Lgames played*T:n*C*Lsex*T*T:smale*C*Lp/w*T:8*C*L",\r
+               dxty of rec,stna of rec,stmx of rec,games of rec, sx -> "fe", "",PSWD of rec)\r
+               dumpersona(true)\r
+               save.block()\r
+       $) or\r
+       $(      out("No current persona! I'll make one for you, :s.*C*L",name)\r
+               addrec(name)\r
+               rec_rec rem 128+dmpbuf\r
+               games of rec_1\r
+               WRD1 of rec_!name\r
+               WRD2 of rec_LENGTH of name>4 -> 1!name,0\r
+               WIZD of rec_false\r
+               dumpersona()\r
+               save.block()\r
+       $)\r
+       Close(perput)\r
+       deq(sc.channel^perput)\r
+$)\r
+and dumpersona(pw) be\r
+$(     unless numbargs() pw_false\r
+       if pw pw_ESSEX\r
+       if pw pw_appendfile($6"dsk",$6"prolog",$6"prl", MPPN,label(oops))\r
+       if pw\r
+       $(      write(pw,"POWERing :S*C*LStr.*TDex.*TSta.*TScore*TSex*TP/w*C*L",name)\r
+               write(pw,":N*T:N*T:N*T:N*T:S*T:8*C*L",STRN of rec,DXTY of rec,\r
+                       STMX of rec,SCRE of rec,((WRD1 of rec) bitand 1)->"f","m",PSWD of rec)\r
+       $)\r
+       outs("Prepare to fulfill your wildest dreams!*C*L")\r
+       outs("Strength  ?");    STRN of rec_getno(STRN)\r
+       outs("Stamina (max)     ?");    STNA of rec_getno(STMX);        STMX of rec_STNA of rec\r
+       outs("Dexterity ?");    DXTY of rec_getno(DXTY)\r
+       outs("Score             ?");    SCRE of rec_getno(SCRE)\r
+       outs("Sex               ?")\r
+       $[      $CLRBFI\r
+               $INCHRW  ch\r
+       $]\r
+       Gender_(WRD1 of rec) bitand 1\r
+       TEST ch='M'\/ch='m' THEN OUTS("ale*C*L")<>gender_0\r
+       OR if ch= 'F'\/ch='f' THEN OUTS("emale*C*L")<>\r
+               gender_1\r
+       outs("Pn                ?");    PN of rec_Getno(PN,true)\r
+       unless PN of rec PN of rec_valof $[     $getppn 1,      0       $]\r
+       WRD1 of rec_((WRD1 of rec) bitand ~1) bitor gender\r
+       LSTM of rec_valof\r
+       $[      $hrri   ac,     #11\r
+               $hrli   ac,     #53\r
+               $gettab ac,     0\r
+               $trn\r
+       $]\r
+       if pw /\ (PSWD of rec ne 0)\r
+       $(      outs("Zero p/w  ?")\r
+               if valof\r
+               $[      $clrbfi\r
+                       $inchrw         1\r
+                       $trz    1,      #40\r
+                       $caie   1,      'Y'\r
+                       $jrst           render\r
+                       $outstr         $az"es*C*L"\r
+                       $trna\r
+render:                        $setz   1,      0\r
+                       $clrbfi\r
+               $] then PSWD of rec_0\r
+       $)\r
+       if pw\r
+       $(      write(pw,":N*T:N*T:N*T:N*T:S*T:8*C*L",STRN of rec,DXTY of rec,\r
+                       STMX of rec,SCRE of rec,((WRD1 of rec) bitand 1)->"f","m",PSWD of rec)\r
+               close(pw)\r
+       $)\r
+       return\r
+oops:  Outs("*C*LI can't log this frig, so I won't do it, sorry.*C*L")\r
+$)\r
+and load.block(stream,block) be\r
+$(     if block=lastblock return\r
+       useti(perput,block)\r
+       inuuo(stream,cbl)\r
+       lastblock_block\r
+$)\r
+and save.block(block) be\r
+$(     let blk=numbargs()->block,lastblock\r
+       useto(perput,blk)\r
+       outuuo(perput,cbl)\r
+$)\r
+and searchrec(nam) = valof\r
+$(     let pnt,lrec,str=?,0,vec 1\r
+       !str_!nam\r
+       1!str_LENGTH of nam>4 -> 1!nam, 0\r
+       load.block(perput,1)\r
+       lrec_hashval(str)\r
+       rec_dmpbuf!lrec\r
+       while rec\r
+       $(      load.block(perput,rec/WDSPERBUF+1)\r
+               pnt_(rec rem WDSPERBUF)+dmpbuf\r
+               if namesame(str,2+pnt) break\r
+               lrec_rec\r
+               rec_POINTR of pnt\r
+       $)\r
+       resultis lrec\r
+$)\r
+and saverec(nam) = valof\r
+$(     searchrec(nam)\r
+       unless rec addrec(nam)\r
+       if rec          //In case addrec hasn't added them.\r
+       $(      load.block(perput,rec/WDSPERBUF+1)\r
+               dumpersona(rec rem WDSPERBUF+dmpbuf)\r
+               save.block()\r
+       $)\r
+       resultis rec    //return a value to indicate whether you've been saved.\r
+$)\r
+and deleterec(nam) be\r
+$(     let olrec,odel,lrec=?,?,searchrec(nam)\r
+       and pnt=rec rem WDSPERBUF+dmpbuf\r
+       unless rec return       //Can't find record\r
+                                               //Ok, this may look a little long-winded\r
+       load.block(perput,rec/WDSPERBUF+1)      //but it's worth it not to corrupt the persona file in case of a crash\r
+       WRD1 of pnt_0\r
+       WRD2 of pnt_0           //Zero names for purges etc.\r
+       GAMES of pnt_0          //Yawn thinks we need this, too! (WE DO! - Yawn xx)\r
+       olrec_!pnt\r
+       save.block()\r
+\r
+       load.block(perput,lrec/WDSPERBUF+1)\r
+       dmpbuf!(lrec rem WDSPERBUF)_olrec       //Old pointer to rec now points to old pointer of rec.\r
+       save.block()\r
+       \r
+       load.block(perput,1)    //Get the deleted record pointer\r
+       odel_DEL of dmpbuf\r
+       save.block()\r
+\r
+       load.block(perput,rec/WDSPERBUF+1)      //And plonk it in the record to be deleted\r
+       !pnt_odel               //Does anyone read all these comments?\r
+       save.block()\r
+\r
+       load.block(perput,1)    //Finally update the deleted record pointer to point to the newly deleted record!\r
+       DEL of dmpbuf_rec\r
+       save.block()\r
+$)\r
+and addrec(nam) be\r
+$(     let hashcont,olrec,str=?,?,vec 1\r
+       !str_!nam\r
+       1!str_LENGTH of nam>4 -> 1!nam,0\r
+       load.block(perput,1)\r
+       rec_DEL of dmpbuf\r
+       test rec then\r
+       $(      load.block(perput,rec/WDSPERBUF+1)\r
+               olrec_POINTR of (rec rem WDSPERBUF+dmpbuf)\r
+               save.block()\r
+       $) or\r
+       $(      rec_FLEN of dmpbuf\r
+               unless rec                      //No persona file exists.\r
+               $(      rec_2*WDSPERBUF\r
+                       FLEN of dmpbuf_rec      //Create hash table\r
+               $)\r
+               olrec_0                         //No deleted records\r
+               FLEN of dmpbuf+_RECLENGTH\r
+               save.block()\r
+       $)\r
+       load.block(perput,1)\r
+       DEL of dmpbuf_olrec\r
+       hashcont_dmpbuf!hashval(str)\r
+       dmpbuf!hashval(str)_rec\r
+       save.block()\r
+\r
+       load.block(perput,rec/WDSPERBUF+1)\r
+       POINTR of (dmpbuf+rec rem WDSPERBUF)_hashcont\r
+       save.block()\r
+$)\r
+and hashval(nam) =  ((!nam+1!nam)>>1) rem 253\r
+and kill() be\r
+$(     setup()\r
+       readname(name, "Name: ")\r
+       if !name =!"richard" Outs("*C*LNot Richard...*C*L")<>finish\r
+       deleterec(name)\r
+       test rec then out(":s terminated.",name)\r
+       or out(":s already dead - you can only kill people once!",name)\r
+       \r
+       Close(perput)\r
+       deq(sc.channel^perput)\r
+$)\r
+and getno(sel,octal)=valof\r
+$(     let ch=valof\r
+       $[      $clrbfi\r
+               $inchrw 1\r
+       $]\r
+       unless numbargs()=2 octal_false\r
+       unless '0' le ch le '9'\r
+       $(      $[      $clrbfi $]\r
+               resultis sel of rec\r
+       $)\r
+       putback(input,  ch)\r
+       ch_(octal->inoct,inno)()\r
+       $(      let stk=SC.PUTSTACK^input\r
+               SC.PUTSTACK^input, SC.READER^input _ !stk, stk!2\r
+               freevec(stk)\r
+       $)\r
+       resultis ch\r
+$)\r
+and inoct(nopb)=valof\r
+$(     let res=0 and ch=?\r
+       ch_inch() repeatuntil '0' le ch le '7'\r
+       while '0' le ch le '7' do\r
+       $(      res_(res<<3)-'0'+ch\r
+               ch_inch()\r
+       $)\r
+       unless numbargs() putback(input,ch)\r
+       resultis res\r
+$)\r
+and readname(nm, pr) be\r
+$(      let n,ch,linev=0,?,vec NAMELENGTH\r
+       write(tty, pr)\r
+       readch(input,@ch)\r
+       while 'a'<=(ch bitor #40)<='z' do\r
+       $(      n+:1\r
+               unless n>NAMELENGTH linev!n:='A'<=ch<='Z'->ch+#40,ch\r
+               readch(input,@ch)\r
+       $)\r
+       !linev:=n>NAMELENGTH->NAMELENGTH,n\r
+       packstring(linev,nm)\r
+       until ch='*L' do readch(input,@ch)\r
+$)      repeatuntil LENGTH of nm\r
+and dot() be\r
+$(     let stfl,no,ch=0,?,?\r
+       writes(tty,"Please enter the job number of the about to be dotted job*C*L(0 for all of them)*C*L")\r
+       writes(tty,"**")\r
+       no_rdno(tty)\r
+       $(      let res=?\r
+               writes(tty,"dotted nicely or horribly N/H? ")\r
+               $[      $clrbfi\r
+                       $inchrw  ch\r
+               $]\r
+               stfl_0\r
+               test ch='H' \/ ch='h' then stfl_#13731<>writes(tty,"orribly*C*L") or\r
+               if ch='N' \/ ch='n' then stfl_#26262<>writes(tty,"icely*C*L")\r
+               unless stfl writes(tty,"*Binvalid character*C*L")<>loop\r
+               for i=1 to 200 dispose(#617022,i)\r
+               test no then res_dispose(stfl, no)\r
+               or for i=1 to 200 if dispose(stfl, i) res_true\r
+               unless res Writes(tty, "*C*L?POWIDW - it didn't work so stop pissing around.*C*L")\r
+               finish  \r
+       $) repeat\r
+$)\r
+and dispose(stfl, no) be\r
+$[     $hrrz 2,stfl\r
+       $hrl  2,no\r
+       $calli 2,#175\r
+       $setz 1,0                       //uh?\r
+$]\r
+and namesame(nam1,nam2)=\r
+(!nam1>>1)=(!nam2>>1)/\((LENGTH of nam1<=4)\/(1!nam1>>1)=(1!nam2>>1))\r
+and strat() be\r
+$(     let resp=?\r
+       $(      writes(tty, "*C*LMud, Valley or Rock? ")\r
+               $[      $inchrw         1\r
+                       $trz    1,      ' '\r
+                       $movem  1,      resp\r
+               $]\r
+       $) repeatuntil resp='V' | resp='M' | resp='R'\r
+       write(tty, ":s*C*L", resp='R'->"ock", resp='V'->"alley", "ud")\r
+       resp_resp='R' -> $6"rock",resp='V'->$6"valley", $6 "mud"\r
+       output_createtmp(resp)\r
+       readname(name, "Name: ")\r
+       writes(tty, "*C*LRoom: ")\r
+       $[ $clrbfi      $]\r
+       for i=0 to 5 do\r
+       $(      let letter = byte 6:30-6*i\r
+               and next = valof $[ $inchrw    1 $]\r
+               if 'a' le next le 'z' next-_'a'-'A'\r
+               if next = '*C' break\r
+               letter from room _ next-' '\r
+       $)\r
+       $[ $clrbfi      $]\r
+       out(":s*^C:n*$:n*$:n",  name,\r
+                               valof $[ $mstime 1, 0 $],\r
+                               valof $[ $mstime 1, 0 $],\r
+                               room)\r
+       close(output)\r
+       run($6 "dsk", resp, $6 "exe", 0)\r
+$)\r
+\r
+and setup() be\r
+$(     !cbl_(-BUFFERS<<18)bitor(dmpbuf-1)\r
+       1!cbl_0\r
+       if false\r
+       $(\r
+dogoneit:      perput_createfile($6"dsk",game,$6".pm",PPPN,0,#17,1)\r
+               enq(SC.CHANNEL^perput)\r
+               useto(perput,2)\r
+               outuuo(perput,cbl)\r
+               close(perput)\r
+               deq(sc.channel^perput)\r
+       $)\r
+       perput_updatefile($6"dsk",game,".pm",PPPN,label(dogoneit),#17,1)\r
+       enq(sc.channel^perput)\r
+       useti(perput,1)\r
+$)\r
+and reveal() be\r
+$(     let ch, f, fil, ext=?, ?, vec 1, vec 1\r
+       readname(fil, "File part: ")\r
+       readname(ext, "Extension part: ")\r
+       f_findfile($6"dsk", fil, ext, 0, label(absent))\r
+       if false\r
+absent:        f_findfile($6"dsk", fil, ext, PPPN, label(nowhere))\r
+       input_f\r
+       ch_Inch()\r
+       while ch ne '*E'\r
+       $(      outch(ch)\r
+               ch_inch()\r
+       $)\r
+       close(f)\r
+       input_tty\r
+       return\r
+nowhere:       out("Sorry, I can't find :S.:S*C*L", fil, ext)\r
+$)\r
+\r
+and password() be\r
+$(     let num,numrecs,bcnt=?,?,3\r
+       setup()\r
+       out("*C*LOctal password: ")\r
+       num_inoct(true)\r
+       \r
+       useti(perput,1)\r
+       inuuo(perput,cbl)\r
+       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
+\r
+       useti(perput,bcnt)      //Load in the first block of records\r
+       inuuo(perput,cbl)\r
+\r
+       rec_dmpbuf\r
+       for i=1 to numrecs\r
+       $(      if WRD1 of rec /\ num=PSWD of rec\r
+                       out(":S on :N points*C*L", rec+2, SCRE of rec)\r
+               if (rec-dmpbuf)>128\r
+               $(      rec -_ 128\r
+                       bcnt +_ 1\r
+                       useti(perput,bcnt)\r
+                       inuuo(perput,cbl)\r
+               $)                      \r
+               rec+_RECLENGTH\r
+       $)\r
+\r
+       close(perput)\r
+       deq(sc.channel^perput)\r
+$)\r
+\r
+and Lev(pts, fem)=valof\r
+$(     let sc=exp.step\r
+       for i=0 to 9\r
+       $(      if sc ge pts resultis i\r
+               sc+_sc\r
+       $)\r
+       resultis 9\r
+$)!(fem!(table\r
+               (table  "novice",\r
+                       "warrior",\r
+                       "hero",\r
+                       "champion",\r
+                       "superhero",\r
+                       "enchanter",\r
+                       "sorcerer",\r
+                       "necromancer",\r
+                       "legend",\r
+                       "wizard"\r
+               ),\r
+               (table  "novice",\r
+                       "warrior",\r
+                       "heroine",\r
+                       "champion",\r
+                       "superheroine",\r
+                       "enchantress",\r
+                       "sorceress",\r
+                       "necromancess",\r
+                       "legend",\r
+                       "witch"\r
+               )\r
+       )\r
+)\r
+\r
+and Enq(chan) be\r
+$(     let addr=vec 4\r
+       !addr_#1000005\r
+       1!addr_142857\r
+       2!addr_chan\r
+       3!addr_$az"mud"+(-1<<18)\r
+       4!addr_0\r
+       Out("*C*LENQ. error code :8*C*L", valof\r
+       $[      $move   1,      addr\r
+               $enq.   1,      0\r
+               $trna\r
+               $(      return  $)\r
+       $])\r
+$)\r
+\r
+and Deq(chan) be\r
+$(     let addr=vec 1\r
+       !addr_#1000005\r
+       1!addr_142857\r
+       Out("*C*LDEQ.error code :8*C*L", valof\r
+       $[      $move   1,      addr\r
+               $hrli   1,      1\r
+               $deq.   1,      0\r
+               $trna\r
+               $(      return  $)\r
+       $])\r
+$)\r
+and transfer() be\r
+$(     let peep, bcnt, numrecs=?, 3, ?\r
+       outs("where from? (0 for everywhere) ")\r
+       peep_inoct(true)\r
+       setup()\r
+       \r
+       useti(perput,1)\r
+       inuuo(perput,cbl)\r
+       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
+\r
+       useti(perput,bcnt)      //Load in the first block of records\r
+       inuuo(perput,cbl)\r
+\r
+       rec_dmpbuf\r
+       for i=1 to numrecs\r
+       $(      if WRD1 of rec /\ (PN of rec=peep | peep=0)\r
+               $(      out(":s: [**,:8] -> ", rec+2, PN of rec)\r
+                       PN of rec_Getno(PN, true)\r
+               $)\r
+       \r
+               if (rec-dmpbuf)>128\r
+               $(      rec -_ 128\r
+                       useto(perput, bcnt)\r
+                       outuuo(perput, cbl)\r
+                       bcnt +_ 1\r
+                       useti(perput,bcnt)\r
+                       inuuo(perput,cbl)\r
+               $)\r
+               rec+_RECLENGTH\r
+       $)\r
+\r
+       close(perput)\r
+       deq(sc.channel^perput)\r
+$)\r
+\r
+and League() be\r
+$(     let numrecs,bcnt=?,3\r
+       setup()\r
+       useti(perput,1)\r
+       inuuo(perput,cbl)\r
+       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
+\r
+       useti(perput,bcnt)      //Load in the first block of records\r
+       inuuo(perput,cbl)\r
+\r
+       rec_dmpbuf\r
+       for i=1 to numrecs\r
+       $(      if WRD1 of rec tree_insert(SCRE of rec, tree)\r
+               if (rec-dmpbuf)>128\r
+               $(      rec -_ 128\r
+                       bcnt +_ 1\r
+                       useti(perput,bcnt)\r
+                       inuuo(perput,cbl)\r
+               $)                      \r
+               rec+_RECLENGTH\r
+       $)\r
+\r
+\r
+       close(perput)\r
+       deq(sc.channel^perput)\r
+       outs("Writing to LEAGUE.ENM")\r
+       output_createfile("dsk","league","enm",0)\r
+       outree(tree)\r
+       while me\r
+       $(      let p=LH of me\r
+               Out("richard*T*T[**,:8]:c*T34359738369*T9999*Tyes*TWIZARD*C*L",p, p ls #1000->'*T','*0')\r
+               me of_RH\r
+       $)\r
+       close(output)\r
+$)\r
+and today()=valof\r
+$[     $hrli   1,      #53\r
+       $hrri   1,      #11\r
+       $gettab 1,      0\r
+       $trn\r
+       $hlrz   1,      1\r
+$]\r
+and Enumerate() be\r
+$(     let now,bcnt,numrecs=today(),3,?\r
+       setup()\r
+       outs("Writing to POWER.ENM*C*L")\r
+       output_Createfile($6"dsk",$6"power",$6"enm", 0, Label(rats))\r
+       outs("Enumeration of personas as of ")\r
+       outtime()\r
+       outs(" on ")\r
+       outdate()\r
+       outs(":*C*L*L")\r
+       \r
+       useti(perput,1)\r
+       inuuo(perput,cbl)\r
+       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
+\r
+       useti(perput,bcnt)      //Load in the first block of records\r
+       inuuo(perput,cbl)\r
+\r
+       rec_dmpbuf\r
+       for i=1 to numrecs\r
+       $(      if WRD1 of rec\r
+               $(      let t, sx, wz=now-(LH from LSTM of rec), (WRD1 of rec) bitand 1, WIZD of rec\r
+                       Out("Name:*T*T:S*C*LPpn:*T*T[**,:8]*C*LScore:*T*T:N*C*LStrength:*T:N*C*LDexterity:*T:N*C*LStamina:*T:N*Tmax :N*C*L",\r
+                               rec+2,PN of rec,SCRE of rec,STRN of rec,DXTY of rec,STNA of rec,STMX of rec)\r
+                               Out("Last game:*T:N day:S ago*C*Lgames:*T*T:N*C*Lsex:*T*T:Smale*C*L",\r
+                                       t,t=1->"","s",GAMES of rec,sx->"fe","")\r
+                               if wz bitand WIZMASK Out("Mode:*T*TWI:S*C*L", sx->"TCH","ZARD")\r
+                               if wz bitand 4 Outs("Mode:*T*TBERSERK*C*L")\r
+                               Outs("*C*L*L")\r
+               $)\r
+               if (rec-dmpbuf)>128\r
+               $(      rec -_ 128\r
+                       bcnt +_ 1\r
+                       useti(perput,bcnt)\r
+                       inuuo(perput,cbl)\r
+               $)                      \r
+               rec+_RECLENGTH\r
+       $)\r
+\r
+       close(perput)\r
+       deq(sc.channel^perput)\r
+       close(output)\r
+       Writes(tty,"*C*LEnumerated in DSK:POWER.ENM*C*L")\r
+       if false\r
+rats:          Writes(tty,"*C*LCan't create DSK:POWER.ENM*C*L")\r
+$)\r
+\r
+and insert(sc, tree)=valof\r
+$(     if tree test sc ls SCRE of tree then\r
+       $(      LEFT of tree_insert(sc, LEFT of tree)\r
+               resultis tree\r
+       $) or if sc gr SCRE of tree then\r
+       $(      RIGHT of tree_insert(sc, RIGHT of tree)\r
+               resultis tree\r
+       $)\r
+       sc_Newvec(TREESIZE)\r
+       for i=0 to RECLENGTH sc!i_rec!i\r
+       sc!(RH from RIGHT)_0\r
+       if tree\r
+       $(      CHAIN of sc_CHAIN of tree\r
+               CHAIN of tree_sc\r
+               resultis tree\r
+       $)\r
+       CHAIN of sc_0\r
+       resultis sc\r
+$)\r
+\r
+and outree(tree) be if tree\r
+$(     let l, r, n, p=LEFT of tree, RIGHT of tree, tree+2, PN of tree\r
+       outree(l)\r
+       test !n=!"richard" then\r
+       $(      let m=newvec(0)\r
+               LH of m_p\r
+               RH of m_me\r
+               me_m\r
+       $) or\r
+       Out(":s:c*T[**,:8]:c*T:N*T:c:N*T:8:S:S*C*L",\r
+               n, LENGTH of n ge 8 -> '*0', '*T', p, p ls #1000->'*T','*0', SCRE of tree,SCRE of tree > 9999999 -> '*0','*t', GAMES of tree,\r
+               PSWD of tree, (WIZD of tree bitand 4)-> "*TBERSERK", "",(WIZD of tree bitand WIZMASK)->WRD1 of tree bitand 1->"*TWITCH","*TWIZARD", "")\r
+       Outree(CHAIN of tree)\r
+       outree(r)\r
+$)\r
+and Oneoff() be\r
+$(     let now,newrec,lastrec,recptr,rec2,old.lastrec,hashbuf=\r
+                       today(),0,?,?,0,?,vec 256\r
+       !cbll_(-BUFFERS<<18)bitor(dmpbuff-1)\r
+       1!cbll_0\r
+       clearvec(dmpbuff, BUFFERS)\r
+       perputt_createfile($6"dsk",game,$6"off",0,0,#17,1)\r
+       useto(perputt,1)\r
+       nextrec_dmpbuff\r
+       setup()\r
+       $(      inuuo(perput,cbl)\r
+               rec_dmpbuf\r
+               while LH of rec\r
+               $(\r
+//Do the processing between here...\r
+\r
+                       let temp,pswrd=newrec,?         //record list pointer\r
+                       newrec_newvec(RECLENGTH)        //new reclength\r
+                       !newrec_temp\r
+                       for i=0 to 7 do (2+i)!newrec_i!rec      //copy over oldrec\r
+                       for i=8 to RECLENGTH-2 do (2+i)!newrec_0        //and zero the rest\r
+                       pswrd_9!newrec\r
+                       9!newrec_(pswrd rem ((1<<20)-1))*(pswrd rem ((1<<25)-1))\r
+                       if LENGTH of (rec+1)<5 4!newrec_0\r
+                       \r
+\r
+//...and here!\r
+                       rec+_8\r
+               $)\r
+               unless rec=dmpbuf+2*WDSPERBUF-8 & rec!1 then break\r
+       $) repeat\r
+                       \r
+       \r
+       bcntt_3\r
+       for hashno=0 to 252\r
+       $(      let nextrec=newrec\r
+               out("****************HASH=:N*****************C*L",hashno)\r
+               lastrec_0\r
+               while nextrec\r
+               $(      let recptr=rec2+dmpbuff\r
+                       if hashno=hashval(nextrec+3)\r
+                       $(      out(":s :n*C*L",nextrec+3,bcntt)\r
+                               1!nextrec_lastrec\r
+                               lastrec_rec2+(bcntt-1)*WDSPERBUF\r
+                               old.lastrec_lastrec\r
+                               for i=0 to 11 i!recptr_(i+1)!nextrec\r
+                               rec2+_12\r
+                               if rec2>128\r
+                               $(      useto(perputt,bcntt)\r
+                                       outuuo(perputt,cbll)\r
+                                       bcntt+_1\r
+                                       rec2 rem_ 128\r
+                                       for i=0 to rec2-1 do i!dmpbuff_(i+12-(rec2-1))!nextrec\r
+                               $)\r
+                       $)\r
+                       nextrec_!nextrec\r
+               $)\r
+               hashno!hashbuf_lastrec\r
+       $)\r
+       useto(perputt,bcntt)            //tidy up.\r
+       outuuo(perputt,cbll)\r
+       255!hashbuf_old.lastrec+12\r
+       254!hashbuf_0\r
+\r
+       for hashno=0 to 255 hashno!dmpbuff_hashno!hashbuf\r
+\r
+       useto(perputt,1)\r
+       outuuo(perputt,cbll)            //Output hash table\r
+               \r
+       close(perput)\r
+       deq(sc.channel^perput)\r
+       close(perputt)\r
+       Writes(tty,"*C*LOne-offed in the .OFF file*C*L")\r
+$)\r
+and clearvec(vect,size) be\r
+$[     $MOVE   AC,     vect\r
+       $HRLI   B,      0(AC)\r
+       $HRRI   B,      1(AC)\r
+       $SETZM          0(AC)\r
+       $ADD    AC,     size\r
+       $BLT    B,      0(AC)\r
+$]\r
+and yes(rec, str) =valof\r
+write(tty, ":s :s", rec+1, str)<>\r
+$[     $clrbfi\r
+       $inchrw         1\r
+       $caie   1,      'y'\r
+       $cain   1,      'Y'\r
+       $jrst           ep\r
+       $cain   1,      '*C'\r
+       $jrst           yep\r
+       $clrbfi\r
+       $outstr         $az"o*C*L"\r
+       $setz   1,      0\r
+       $(      return          $)\r
+yep:   $outchr         'y'\r
+ep:    $outstr         $az"es*C*L"\r
+$]\r
+\r
+$[     fn:     $exit   1,      0\r
+               $jrst           fn\r
+$]\r
+\r
+\r
+\r
+\r
+\\\\\\r
+\fSUBFILE: DBADAT.MAC @15:11 16-AUG-1986 <477> (786)   \r
+;Copyright (C) 1980 by\r
+;Roy Trubshaw, Richard Bartle & Ronan Flood,\r
+;Essex University, Colchester. CO4 3SQ.\r
+;\r
+;      This software is furnished on the understanding that\r
+;it may be used and or copied only with the inclusion of this\r
+;notice.  No title or ownership of this software is hereby\r
+;transferred. The information in this software is subject to\r
+;change without notice. No responsibility is assumed for the\r
+;use or reliability of this software.\r
\r
+       TITLE   Database for MUD version 3\r
+       TWOSEG  400K\r
+       SALL\r
+       .DIRECTIVE      SFCOND\r
+       NOSYM\r
\r
+       MAXPLY==^D36\r
\r
+       IF2     <PRINTX Assembling Database for MUD version 3>\r
\r
+       DEFINE  FLIST(SIZE,NUM)<\r
+       EXP     .+1\r
+       REPEAT  NUM-1,<\r
+       EXP     .+SIZE\r
+       BLOCK   SIZE-1>\r
+       BLOCK   SIZE>\r
\r
+       DEFINE  VEC(SIZE,VALUE<0>)<\r
+       EXP     .+1\r
+       IFE     VALUE,  <BLOCK  SIZE>\r
+       IFN     VALUE,  <REPEAT SIZE,       <EXP       VALUE>>>\r
\r
+STARTL::EXP    .                               ;Address of start of database.\r
+INDEX:: EXP    0                               ;Room index.\r
+DICTIO::BLOCK  1                               ;Dictionary hash table.\r
+STLIST::BLOCK  1                               ;Pointer to start location list.\r
+MAX.RO::BLOCK  1                               ;Max number of rooms.\r
+MAX.DE::BLOCK  1                               ;Max number of demons.\r
+DEMONS::BLOCK  1                               ;Table of demons\r
+GDEMON::EXP    0                               ;List of global demons\r
+DATE:: BLOCK   1                               ;DECsystem 10 date of creation.\r
+RDATE::        EXP     0                               ;DECsystem 10 date of last reset\r
+RHOURS::EXP    0                               ;Accumulated time since last Reset\r
+RNDMS::        EXP     0                               ;List of room lists for randomisation\r
+FTIME::        EXP     0                               ;First time played this version?\r
+TIME:: BLOCK   1                               ;DECsystem 10 time of creation.\r
+BACKWD::BLOCK  1                               ;Says if a direction has an opposite\r
+TVERB::        BLOCK   1                               ;movement check word\r
+NAPCT::        0                                       ;number of naps before assume crash\r
+SUPERS::0                                      ;whether this is superseded by us or not\r
+DEMO:: 0                                       ;is there a demo on?\r
+RANDIR::0                                      ;random directions in travel table\r
+CODES::        BLOCK   1                               ;vdu manipulation codes.\r
+LOW1:: EXP     0                               ;overload measure\r
+LOW2:: EXP     0                               ;near-overload measure\r
+TIMES::        EXP .+1                                 ;vector of lists of playing times\r
+       BLOCK 7\r
+MOTVEC::       BLOCK   1                       ;Inverse movement no. to names\r
+MOVERS::       BLOCK   1                       ;Objects which are mobile\r
+MVLOCK::       EXP     -1                      ;So don't try to move above twice at once\r
+DELOCK::       EXP     -1                      ;Global demon lock\r
+MELTED::       EXP     -1                      ;Whether objects can move\r
+PEACE::        EXP     0                               ;whether can fight or not\r
+SPECT::        EXP     0                               ;whether there's a spectacular on\r
+MALE:: VEC     ^D10                            ;names for males\r
+                                               ;I bet I forget to alter with MAX.LEVEL...\r
+FEMALE::       VEC     ^D10                    ;names for females\r
+MUDNAM::       BLOCK   ^D27                    ;Name of dungeon as BCPL string\r
+MUD6:: EXP     0                               ;first 6 letters of above in 6bit\r
+ESXWD::        BLOCK   1                               ;memory location for manifest ESSEX constant\r
+PS6::  BLOCK   1                               ;first 6 letters of persona file\r
+MAX.ME::BLOCK  1                               ;Max number of text messages.\r
+TEXT:: BLOCK   1                               ;Table of text messages.\r
+TXTVEC::       BLOCK   1                       ;Word count for disc file\r
+INIDR:: EXP    -1                              ;Initialisation door.\r
+DELDR::        EXP     -1                              ;Delay door for timing out.\r
+ACTIVE::VEC    MAXPLY, -1                      ;To ensure you're still playing\r
+PLAYER::EXP    -1                              ;Stack pointer.\r
+       COUNT==MAXPLY+2                         ;2 is the frig factor!\r
+PLYNUM::VEC    MAXPLY,   <<COUNT=COUNT-1>>\r
+       PURGE   COUNT\r
+MQUEUE::VEC    MAXPLY                          ;Message queue.\r
+PNAMES::VEC    MAXPLY                          ;Player names.\r
+JOBNOS::VEC    MAXPLY                          ;Player job numbers. Forget locking it...\r
+KIPS:: VEC     MAXPLY                          ;Times at which people went to sleep.\r
+QDOORS::VEC    MAXPLY, -1                      ;Doors to message queues.\r
+PDOOR::        EXP     -1                              ;persona file door\r
+MDOOR:: EXP    -1                              ;Door to message freelist.\r
+NDOOR::        EXP     -1                              ;Door to name selection\r
+TABS:: VEC     ^D24                            ;Combat tables\r
+SHELF::        EXP     0                               ;Shelf for arch-wiz items\r
+SHORTM::FLIST  3,      200                     ;Short message freelist.\r
+LONGME::FLIST  20,     100                     ;Long message freelist.\r
+%RANSE::XWD    1,      -1                      ;Random number seed.\r
+MAGIC:: EXP    0                               ;If non zero u get thrown out.\r
+NOWIZ::        EXP     0                               ;true if no wiz's allowed\r
+LOCKED::EXP    0                               ;Whether the game is wizard-locked or not\r
+ENDLOC::EXP    HERE/^D512                      ;Current page\r
+FREE.S::EXP    .+1                             ;Freestore pointer\r
+       BLOCK   1\r
+HERE==.\r
+END\r
+\r
+\r
+\r
+\r
+\\\\\\r
+\f
\ No newline at end of file
diff --git a/MUD.BOX b/MUD.BOX
new file mode 100644 (file)
index 0000000..e2e3870
--- /dev/null
+++ b/MUD.BOX
@@ -0,0 +1,321 @@
+H=HARD\r
+T=TEDIOUS\r
+E=EASY\r
+L=LONG-TERM\r
+S=SUGGESTION\r
+*=ASAP\r
+!=TO BE TESTED\r
+?=VERIFY\r
+\r
+!      need %'s for maps\r
+!      make it chuck you out properly when it crashes - switch off ctrap\r
+!      make DBASE chuck out "our" names put in the database - stick in symbol table\r
+\r
+*      make POWER non-runnable from [*,2653].\r
+*      "Here stands the tomb of Maria the witch, shaped like a large button with\r
+       F1 written on the top"\r
+*      pss #121...#137, janet #22...#40\r
+*      if you snoop on someone who's forced to do something illegal, you lose\r
+       the force snoop forever\r
+*      people in ROCK can run into MUD via SGO - stop 'em. Drop the MUD6 name?\r
+*      ensure "Everything has been reser to..." starts with an E\r
+*      cabn go BACK from ktreas and dwarfs don't stop you\r
+*      I killed dan the wiz as an (unfrigged) novice\r
+*      There is a bug with zaping the grate to get back to the land\r
+       if someone is in the wardrobe then you don't teleport - ok\r
+*      still told p/w to wiz mode revealed when you quit\r
+*      wiz's are told when arch-wiz's follow them\r
+*      stroked a dead rabbit and was bitten..!\r
+*      In the cupboard (to go to the attic), I am told that you can FLEE out of\r
+       it, even when it is latched shut. I have not actually tried this myself.\r
+*      More major bug: dwarfen realm. In the King's Treasure chamber, it is possible\r
+       to get out without killing the dwarf guards by typing BACK\r
+*      At the end of a BUG or TYPO report, Thankyou is printed as one word!\r
+*      Misspelling: Overgrown grounds of mausoleum... ...sweeping down into a steep >>\r
+       >escaprment<<\r
+*      WHHY CAN'T I DECK THE HALL WITH HOLLY?!!\r
+*      catch CATCH WATER IN POT and FILL POT F STREAM etc\r
+*      put a WIZVWIZ test in CHECKOUT (mud3) before add stuff. Also, make\r
+       wiz's not be checked if they're v an arch-wiz? ie de-wiz 'em?\r
+*      stop wiz's from being killed by novices!\r
+*      zapping grate triesto take you to wardrobe - but if it's full?\r
+*      try to feed rabbit to wolf - won't let you as it's a carnivore. make it\r
+       wolf it down?\r
+*      a WHO HERE command, savesyou looking\r
+*      stop wiz's being told when arch's follow 'em\r
+*      end of BUG gives word "thankyou" not "thank you"\r
+*      Howbout a way for mortals to get rid of the rain? Say gamble with\r
+       a god against some stamina or a sacrifice of a goat.. ( or human!)\r
+*      put back TALK\r
+*      Oh and how much is a MUD sweatshirt please.\r
+*      a REPLY (R) command, which replies to the last message you were TELLed\r
+*      put wiz's in a file to check\r
+*      can't use START in power - wants a p/w\r
+*      don't let people steal things you're keeping\r
+*      WHO <level>\r
+*      only arch-wiz locks should lock out wiz's\r
+*      inventory <player>\r
+*      forbid <command> to stop it being used by non-wiz's\r
+*      drop <item> in <room> - should say the room for wiz's\r
+*      don't let you get points from stream (or poker?) above level 6.\r
+*      make screenwidth work properly\r
+*      G IVY F DIAL fails, G IVY F BBATH says concentrate on sundial\r
+*      stop people from being summoned if they're in fights\r
+*      i just cast a spell   -   it didn't work but i was in a room that would\r
+       'nt let me go to sleep  and i came back with more than my maximum endurance\r
+*      put random auto-logs for wiz's on my area\r
+*      can you set user name from inside the game?\r
+*      lightning mobile which strikes people at random as it moves about\r
+*      if play violin and drop it, still get message it's broken\r
+*      short messages for fights if you fbrief. Same as 3rd party messages to\r
+       othrs\r
+*      put TALK in access.usr\r
+*      have a MONITOR command (uses the WIZD word) which is for\r
+       whether you want trash messages to come up if you're a wiz\r
+*      have it so you can KISS/HUG with an adverb, too\r
+*      often says you7re not alone when you are\r
+*      knocking down with feathers\r
+*      when people die, say HOW they died, ie if in a fight or not (to wiz's)\r
+*      Can open brolly lots of times without closing it\r
+*      If the p command is removed....then why not the 'recite' and the 'chant' ??\r
+*      trying to FELL TREE W WAND produces u need an axe (or wand) to fell a tree\r
+*      are mobiles carrying things immbole?\r
+*      if snoop on mobiles, hear what7s said in the room? see their commands?\r
+*      stop it giving double |'s for You cannot go that way messages\r
+*      smile might be nice\r
+*      WHO LEVEL tells you who is playing at that level only\r
+*      move panel says "i see no panel" in sliding panel room\r
+*      have a SPIT command like kiss\r
+*      TELL ALL EXCEPT bbb\r
+*      make logboo and almana writeable but not as obj's, ie you have to\r
+       type READ ALMANANAC and it then types out what's written in it\r
+*      witches become wiz's if you att to them (petal does anyway!)\r
+*      put up CLIVE's VALLEY \r
+*      make it so can't go into wiz mode if more than half the number of\r
+       mortals in wizards already\r
+*      all EXITS in the steps to cellar were CELLAR - even UP!\r
+*      having taken a bag - any LOOK i do looks in the bag! whoops\r
+*      should you hurtle down th chute with the umbrella?\r
+*      time-stamp yhe time when peopl egot big scores. Make it work\r
+       right for ATTATCHED personas too.\r
+*      switch echo off via SEM first thing so p/w7s not caught\r
+*      if you try manipulate something that isn't there, then type LOOK, you\r
+       get screwedup messages. MAKE IT SO LOOK ONLY WORKS ON DEFAULT OBJECT IF\r
+       YOU TYPED ONE< IE DON'T INHERIT - or is it something else that screws it?\r
+*      have 2 bits of uranium, and if you put them in a bag together...\r
+*      when begger is zapped, get the object RAGS from store\r
+*      a tiara\r
+*      OPEN BOOKCASE doesn't work even with help!\r
+*      does it let you snoop on someone who7s already snooping?\r
+*      You should be able to cross swolen rivers if you have a boat !\r
+*      WIND to make you go BACK sometimes - screws up programs!\r
+*      put in 3rd person fights pretty soon - colourful but short descr's.\r
+*      STUN\r
+*      if someone goes into wiz mode and they're the only player, next player\r
+       gets the "changed to wiz mode" message too when they start up\r
+*      lose stamina for moving - 1 every 100 moves or so?      \r
+*      PUSH X NORTH or PUSH X:NORTH - compare strengths\r
+*      gorier fight descriptions\r
+*      if in bunker it says the tunnel is collapsed etc even when door shut\r
+*      make it so have to cook the wafers for them to work?!\r
+       in for 10 mins to cook them ... then get points for eating\r
+       them if you leave them > 20 mins say they burn + are useless\r
+*      allow people to go down the well possibly to a watery grave?\r
+*      if you ^C out when there's a noecho() it keeps noecho'ed. Make it use\r
+       SEM?\r
+*      butterfly->destroyed->caterpillar->chrysalis->bf again. T when bf\r
+       butterfly net for ^?\r
+*      when people are asleep for long periods, let them dream (demons) and\r
+       get some clues\r
+\r
+E      more interesting monsters\r
+E      there is no way of finding out stamina of ALL dwarves in 1 room\r
+E      Change laugh to I am so I am eating,proofs Polly the witch is eating !\r
+E      make fight templates change each level\r
+E      How about a Mirror for Valley ??\r
+E      have a destroydead, so can get rid of some more dead rooms\r
+E      put in a static for when you're fighting, rather than the for loop\r
+       - use a differnet name though! Also make player.names!snd a variable\r
+       in mud8\r
+E      a GAG/NOGAG command?\r
+E      a POLICE command\r
+E      have a MACRO command\r
+E      have a SEN TTY facility\r
+E      have a message sending/leaving facility using remote files\r
+E      let wiz's attach adjectives to people's names? FRED the NICE WARRIOR?\r
+       could it be made permanent?\r
+E      Can u make it so that lines about to get truncated \r
+       are split up first. eg using " or speech.\r
+E      make it so wizards only appear with a crash of thunder when they GO\r
+       somewhere, and for walking just normal stuff\r
+E      send messages to other people in the room when you're fighting\r
+E      if you add Bardsley's RUN check stuff, make sure it only checks on a\r
+       valid NEXTGAME, not LOGOUT.\r
+E      HOW ABOUT MAKING 'SWAMP' DEFAULT TO 'OUT', THUS MEANING YOU COULD TYPE SWAMP\r
+       FROM NEARLY ANYWHERE!\r
+E      when people start to play, add their names to a file, MUD.PLY on\r
+       the MUD area, which looks for the persona file name.MUD. In this file\r
+       put your name and game. WHen you do a WHO, look in the file after normal\r
+       WHO, and read out players from other games and which one they're in. Make\r
+       it a LONGWHO command?\r
+E      allow WHO WIZARDS etc to let you know who of that rank is playing.\r
+       whethr just want that rank or all above I don't know...\r
+E      Why not have in wiz mode Inventory <playername>\r
+E      island: some seagul pecks you when asleep. for this and current,\r
+       need a 'silent' mobile\r
+E      a cage with something horrible behind it, hard luck if you open it.\r
+E      a pit leading to a cave with something ghastly in it. need to kill it\r
+       to get out\r
+E      some sort of book in valley\r
+E      assume <animal>\r
+E      let the database writer at the WIZARD word of the persona, ie let 'em\r
+       give props to people. Objects with binary props too?\r
+E      garbage collect\r
+E      auto- as a prefix to anything, eg auto-save. use demons.\r
+E      a few // rooms, eg 2 upstairs in house\r
+E      more toytown treasures for beginners, esp. north sectn. less pts for\r
+       easy-to-find ones.\r
+E      bale of hay in paddock, contains a silver needle feed it to goat/horse/ox\r
+       to get the needle\r
+E      make tombs toggle on keyword. put in some new problems... split up\r
+       in the.txt file\r
+E      if someone already in under your name and pswd, attach\r
+E      switch ini eg MUD/log/name:richard/brief etc\r
+E      make dbase handle @ properly in maps - might be an escape code!\r
+E      power's LEAGUE ok in MUD\r
+E      mobiles which follow you - use .provoke mechanism? Porters\r
+E      sliding the panel warn people in bluerm and diagps and spanel\r
+E      WIZARDS prints out know wizards by walking persona file\r
+E      if flee with no paramter, pick a random direction\r
+E      some command which speeds up time, ie add some number not 1\r
+E      USE command which forces default instrument\r
+E      violin case\r
+E      current at sea - use CURRENT mobile which moves you when it arrives\r
+E      a way you can attach at start\r
+E      make keg eg blow up rost? Make cannon portable?\r
+E      if 1st whack kills something, say so & not your last one LH OF FIGHT!SND\r
+E      dwarf coin - see both sides at moment. change to tossing it and it\r
+       coming up whatever's appropriate.\r
+\r
+H      summon mobiles\r
+H      possible for a RECLAIM which gets an object back no matter where it was?\r
+       Similarily a DISPOSE\r
+H      allow initialising of A in B in C - at present only works properly\r
+       weight-wise if do A in B.\r
+H      make time-ou detach you rather than exorcise, and when you wake up you\r
+       re-attach. assumes you have auto-attach at the beginning of the game for\r
+       people who start up with the name of someone who7s detached\r
+H      let travel table print out messages as well as letting you move.\r
+       Don't need more than 1 death room if you do this - moving prints out the\r
+       message. TRANS to deadrooms can use a weaker ZONK.\r
+H      adapt E constraint in TT to have rickety steps collapsing under too much\r
+       wt. have eg  E250 to say you can do it if <250g carried\r
+H      put pattern-matcher on SAY option in mud - .response?\r
+H      when something has been destroyed, check it's not been dropped, inside\r
+       something\r
+H      MUD.DBA random access, 2 blcokc for each object etc\r
+H      messages from snooped objects which DO something using demons\r
+H      if someone you detached from gets a message, tell you?\r
+H      instead of having RAIN as a multiplaced object, have an A.OUTSIDE\r
+       property on rooms. Outside rooms always get the RAIN description, which\r
+       is turned on and off by the same demons. Opens the way for NIGHT and\r
+       DAY. SOFTWIRED ROOM PROPS NEEDED IN THE LONG RUN? ROOMS AS OBJECTS...\r
+\r
+T      have a brightindark prop for objects - will-o-wisps?\r
+T      get shut of dead rooms and have a zonk-like thing\r
+T      more rooms near cavein\r
+T      use ADJECT field of objects as ATTRIBUTE. get rid of much of the\r
+       +ve/-ve props etc and use words like fixed, random, invisible. allow the words\r
+       anyway! Only need 1 bit for things like RANDOM so get more space\r
+T      keys that don7t fit all the locks\r
+T      alpine cottage and swiss alpine horn - blow in wromg place and avalanche,\r
+       right place and get a bridge (unless blow again...).\r
+T      hot air balloon to air castle\r
+T      can have echos in database\r
+T      someehwre where help is a disadvantage\r
+T      chicken hut near house\r
+T      animals beyond the leprm\r
+T      tide going in/out (also day/night?). Room under jetty can only get to\r
+       when it's out. Undersea village? Writing in sand?\r
+\r
+L      privs\r
+L      put travel-table on disc, and vocab too\r
+\r
+S      message in a bottle\r
+S      a ciborium\r
+S      a paten\r
+S      a reliquery\r
+S      a staurotheca\r
+S      orichalcum - mixture of copper and zinc, used in roman coins\r
+S      vestibule\r
+S      owl\r
+S      flagpole\r
+S      LOOK <item> to give the standard desciption of the item (useful for the\r
+        statue, for example);\r
+S      INVENTORY <class> to list the items of that class (useful for I T to\r
+        discover which of your items are treasure);\r
+S      VALUE <class> to give a list of the items of that class and their values -\r
+        this is so that VALUE T can be used to get an idea of the total value.\r
+S      How about a pack of cards......??\r
+       So that it has props......face up.....face down....\r
+       Also.......players can look at a hand.....\r
+       +a method of putting the cards in an object called deck......\r
+S      A handerchief (germ laden) which, if picked up will cause you to\r
+       have some embarrasing disease which can be transmitted to other players\r
+       and of which you will eventually die, unless you get the medicine (or\r
+       tablets..etc),\r
+S      a room with 4 masters. prev room has 4 globes. masters are bald. If you\r
+       smash a globe, it docks the master's stamina to really low. Otherwise\r
+       they're nigh on invincible\r
+S      fog - do by a mobile\r
+S      how about having varying degrees of severity of storm, eg bolts\r
+       of lightning, and high winds\r
+S      How about a hollow tree with something exciting inside,\r
+S      truffle\r
+S      beehive containing a swarm of bees and some treasure - honey? Can't\r
+       pick it up, but usable as a treasure-conatiner, non-transparent\r
+S      hermit in valley\r
+S      some sort of event where you have a limited time to do it\r
+S      hook\r
+S      mandrake root (?) in STUNS\r
+S      butterfly fluttering by, and net\r
+S      any possibility of having day and night in MUD/VALLEY. E.g. you\r
+       could have day for an hour, night for 20 minutes, something like the rain.\r
+S      effigy\r
+S      gilt/tinsel\r
+S      pearls\r
+S      heliodor, chrysoberyl, chrysoprase, chrysocolla, chrysolite, moonstone,\r
+       beryl, tortoiseshell, malachite, coral, carbuncle, tourmaline,\r
+       turquoise, odontolite, obsidian, jasper, sardius, sardonyx, agate,\r
+       lapis lazuli, carnelian (cornelian), peridot, chalcedony, jacinth,\r
+       aquamarine, quartz, citrine, malacon, zircon, goshenite, verobyerite,\r
+       (morganite), rubicelle, pleonaste (ceylonite), spinel, grossularite,\r
+       demantoid, melanite, topazolite, hessonite, almandine, kunzite,\r
+       hiddenite, spodumene, rubellite, indicolite, siberite, schorl, achroite,\r
+       prase, cacholong, hydrophane, jadeite, sard, staurolite, chiastolite\r
+S      grove\r
+S      ghost wandering around can't kill it normally - use wand? Makes you flee?\r
+S      bar - open/closing times (keys etc), gifts on tables, cloakroom with magic\r
+       cloaks, free info from elves if buy 'em a drink, need to visit WC,\r
+       drunkenness, pts for buying warm milk instead of alcahol. Club bar with\r
+       level restrictions on who's allowed in\r
+\r
+?      if you are attacked by the ram,and win,why do you still loose some points??\r
+?      the dryad got out again\r
+?      can Z's get to FALLIN on their own?\r
+?      when snooping on someone and attach, kill who you were snooping on doesn't\r
+       work\r
+?      if you jump off the cliff and you've got something with you, where's it\r
+       end up if you didn't have a brolly?\r
+?      close doors in mausolm gives funny stuff\r
+?      put FS in pot - says it(s too full but still puts it in\r
+?      If you empty a sack of treasure in the\r
+       swamp in valley it doesn't sink and score points put remains on the \r
+       surface & can be picked up\r
+?      VAMPIRE GOT TO START IN VALLEY...\r
+?      go to room CELLAR and type UP a few times.. It doesn't get you out..\r
+       only OUT worx.. but isn't displayed in EXITS! Jez.\r
+?      Nsnoop didn't work.....!!\r
+       It said I had stopped snooping......\r
+       And then commenced to give us the prompt ...aswell...!!\r
+       But Unsnoop works.......even tho it thinks you're not snooping....!!\r
diff --git a/MUD.SUB b/MUD.SUB
new file mode 100644 (file)
index 0000000..c778120
--- /dev/null
+++ b/MUD.SUB
@@ -0,0 +1,19 @@
+mud.sub                ;This file!\r
+mud.mic                ;A mic file to compile it\r
+mud.box                ;Improvements/things to do/bugs to be found\r
+dungen.get     ;Main getfile\r
+mudlib.get     ;Another getfile\r
+dbase.bcl      ;Database loader\r
+mud0.bcl       ;Database interpreter statics\r
+mud1.bcl       ;Start, Check.stuff, parsing things\r
+mud2.bcl       ;demon stuff and Move\r
+mud3.bcl       ;general support routines\r
+mud4.bcl       ;communication parts\r
+mud5.bcl       ;Special and Action\r
+mud6.bcl       ;Drop, Get and description components\r
+mud7.bcl       ;Special's supporting routines\r
+mud8.bcl       ;Interact\r
+mudlib.bcl     ;Library routines and various other annoying bits and pieces\r
+mboots.mac     ;The start address stuff for initialisation\r
+power.bcl      ;For producing specified <name>.MUD files! Frig, Start & Dot combined\r
+dbadat.mac     ;High segment skeleton of database\r
diff --git a/MUD.TXT b/MUD.TXT
new file mode 100644 (file)
index 0000000..2b603e2
--- /dev/null
+++ b/MUD.TXT
@@ -0,0 +1,8810 @@
+;Copyright (C) 1980 by\r
+;Roy Trubshaw & Richard Bartle,\r
+;Essex University, Colchester. CO4 3SQ.\r
+;\r
+;      This software is furnished on the understanding that\r
+;it may be used and or copied only with the inclusion of this\r
+;notice. No title or ownership of this software is hereby\r
+;transferred. The information in this software is subject to\r
+;change without notice. No responsibility is assumed for the\r
+;use or reliability of this software.\r
+*name  Mud\r
+*persona       mud\r
+@txtcbt\r
+@txtlev\r
+@txthrs\r
+*rooms 420\r
+@txtrms\r
+nfrst1 light\r
+       Dense forest.\r
+       You are wandering around in some dense forest.\r
+bunker\r
+       Coal bunker.\r
+       You are in a coal bunker, just off the cellar. The only way out is\r
+       to the east, where there is the cellar doorway. The atmosphere is thick\r
+       with coal dust. To the south is a very small tunnel which you couldn't\r
+       possibly enter even if you tried. The coal dust is particularly\r
+       thick and dusty in the region near the door.\r
+rattun\r
+       Rat tunnel.\r
+splair\r
+       Spider's lair.\r
+nfrst2 light\r
+       %nfrst1\r
+       You are wandering around in some dense forest to the west of the\r
+       foothills of some tall mountains.\r
+nfrst3 light\r
+       %nfrst1\r
+       You are wandering around in some dense forest. To the west is the\r
+       entrance to a misty graveyard.\r
+nfrst4 light\r
+       %nfrst1\r
+       You are wandering around in some dense forest, to the east of a\r
+       perilous cliff.\r
+sfrst1 light\r
+       %nfrst1\r
+       You are wandering around in some dense forest, to the southwest of a\r
+       pleasant pasture, to the east of a perilous cliff and to the south of\r
+       a thundering waterfall. To the southeast is a glade in the forest.\r
+sfrst2 light\r
+       %nfrst1\r
+       You are wandering around in some dense forest, to the south of a\r
+       pleasant pasture, and to the west of a fuming swamp. To the southwest\r
+       the forest opens up onto a magical glade.\r
+glade  light\r
+       Magical glade.\r
+       You are in a magical glade, surrounded by forest. East and west it\r
+       looks inpenetrable, but in the northerly directions the trees are\r
+       less dense. In the southerly directions, the trees are of soft pine,\r
+       and through them to the southwest can be glimpsed a sundial.\r
+wabe   light\r
+       Sundial in pine forest.\r
+       This is part of a large pine forest. To the northeast, the forest opens\r
+       up onto a magical glade, but in other directions is more forest, some\r
+       of it too dense to allow passage. Before you stands an old, stone\r
+       sundial, overgrown with ivy.\r
+sett   light\r
+       Entrance to badger's sett.\r
+       You are in part of a large pine forest. Northwest, the forest opens up\r
+       onto a magical glade, and in all other directions the forest continues,\r
+       although in some the trees are too thick to permit passage. In front of\r
+       you, in the ground, a hole leads downwards into a badger's sett.\r
+insett small   nolook\r
+       Inside badger's sett.\r
+       You are inside a small sett belonging to a badger. It looks as though\r
+       the badger is hidden in a smaller hole above the entrance, but there is\r
+       no conceivable way you can reach him. The room looks the ideal place to\r
+       store objects, since the badger acts as guard. The only way out is up.\r
+pines1 light\r
+       Pine forest.\r
+       You are wandering about amongst some soft pine trees. To the north the\r
+       forest clears to become a glade, but everywhere else are more trees.\r
+       Through the foliage to the northwest can be glimpsed a sundial.\r
+pines2 light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+pines3 light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+       Eastwards, through the trees, can be glimpsed something resembling a\r
+       bandstand.\r
+sqrm   light   nolook\r
+       Squirrel part of forest.\r
+       This is the part of the forest used by squirrels, however they all\r
+       scampered off when they heard you coming. All around you is forest,\r
+       some passable, some not.\r
+sqroom light   nolook  dmove   sqrm\r
+       %sqrm\r
+       This is the part of the forest used by squirrels, and when you enter\r
+       they all come scampering up to you, very playfully. In all directions\r
+       is forest. The squirrels (all of which are red, naturally) are very\r
+       happy to see you.\r
+pines4 light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through. To\r
+       the northeast through the trees can be made out a wooden building\r
+       something like a bandstand. To the southeast there looks to be some\r
+       sort of religious shrine.\r
+pines5 light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+pines6 light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+       Through the trees to the southeast you can see what appears to be a\r
+       bandstand.\r
+pines7 light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+bstand light\r
+       Bandstand.\r
+       You are stood in a bandstand in the midst of the pine forest. All around\r
+       you are trees, denser in the easterly directions than in the westerly\r
+       ones. The bandstand hasn't been used for some time, obviously with it\r
+       being in the middle of a forest, and in places its paint is peeling, but\r
+       it is nevertheless a surprisingly fine example.\r
+gaptrm light\r
+       Golden appletree in pine forest.\r
+       This part of the forest was obviously once an orchard in years gone by,\r
+       since in among the firs can be seen appletrees, although they are\r
+       sadly fruitless. However, one tree is taller than the rest, and\r
+       coloured an enchanted golden.\r
+whroom light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+bbath  light\r
+       Bird bath in pine forest.\r
+       You are stood in amongst the trees of a pine forest. All around, the\r
+       forest continues, although in some directions the trees are too thick\r
+       to allow passage. Stood before you is an ornate stone birdbath, but\r
+       the water it contains is not drinkable.\r
+lionrm light\r
+       %pines1\r
+       You are wandering around amongst some soft pine trees. All about you\r
+       are more, some densely packed and others allowing passage through.\r
+clffst light\r
+       %nfrst1\r
+       You are wandering around in some dense forest, to the east of a\r
+       perilous cliff.\r
+wfrst1 light\r
+       %nfrst1\r
+       You are wandering around in some dense forest. To the east can be seen\r
+       the entrance to a misty graveyard.\r
+track1 light\r
+       Beaten track near cliff.\r
+       You are at the end of a rough track. There is a dangerous cliff to\r
+       the west marked "Lovers' leap".\r
+track2 light\r
+       Beaten track.\r
+       You're on a rough east - west track with a dense forest to the\r
+       north and pasture to the south.\r
+ostart light\r
+       Road opposite cottage.\r
+       You are standing on a badly paved road with a cemetery to the north\r
+       and the home of a grave-digger to the south. An inscription on the\r
+       cemetery gates reads, "RESTING PLACE OF LOST SOULS".\r
+road2  light\r
+       Narrow road.\r
+       You are on a narrow east-west road with forest to the north and\r
+       gorse scrub to the south.\r
+start  light   startrm\r
+       Narrow road between lands.\r
+       You are stood on a narrow road between The Land and whence you came.\r
+       To the north and south are the small foothills of a pair of majestic\r
+       mountains, with a large wall running round. To the west the road\r
+       continues, where in the distance you can see a thatched cottage opposite\r
+       an ancient cemetery. The way out is to the east, where a shroud of\r
+       mist covers the secret pass by which you entered The Land.\r
+wayout light   nolook  chain   valley  road4\r
+       You force yourself through the narrow, mist-covered gap...\r
+wpstre light\r
+       West pasture.\r
+       You are in comparatively pleasant pasture. To the south is a river, to\r
+       the north a track. Eastwards the pasture is seen to continue, while to\r
+       the northeast is the flower garden of a strange cottage. To the south\r
+       flows a river.\r
+clifff light\r
+       Cliff.\r
+       You are standing on the edge of a cliff surrounded by forest to the\r
+       north and a river to the south. A chill wind blows up the unclimbable and\r
+       unscaled heights. At the base of the cliff you can just make out the\r
+       shapes of jagged rocks.\r
+fallin light   dmove   beach   nolook\r
+       Falling off cliff.\r
+       You are falling off a very high cliff onto a beach.\r
+slidin nolook  dmove   uland3\r
+       Sliding down chute.\r
+       You are sliding down a slippery tunnel, twisting and turning tunnel at\r
+       great speed.\r
+epstre light\r
+       East pasture.\r
+       Around you is a delightful pasture. To the south is a fast flowing\r
+       stream. Further north and east you can see a woodman's hut and to\r
+       the north is gorse scrub. Northwestwards you can see a strange,\r
+       forbidding cottage, which you can enter via its french windows.\r
+spstre light\r
+       South pasture.\r
+       All about you is a pleasant pasture. To the north is a fast-flowing\r
+       stream, and to the south is forest. Westwards is a thundering waterfall.\r
+garden light   nolook\r
+       Flower garden.\r
+       You are in a well-kept garden. There is an unexpectedly sweet smell\r
+       here and you notice lots of flowers. To the east across a path there\r
+       is more garden.\r
+path   light\r
+       Path.\r
+       You are standing on a path which leads off a road to the north, to a\r
+       cottage south of you. To the west and east are separate gardens.\r
+patch  light\r
+       Vegetable garden.\r
+       You are standing in the middle of what was obviously a vegetable\r
+       garden. However it has not been tended for years and most of the\r
+       vegetables have run wild.\r
+gorse  light\r
+       Gorse.\r
+       You are in a tangled mass of prickly gorse.\r
+wfall  light\r
+       Waterfall.\r
+       Before you is an awe-inspiring sight; a waterfall plummets over a\r
+       cliff and explodes in a dazzling crescendo of rainbow colour on the\r
+       menacing rocks below.\r
+river1 light\r
+       River.\r
+       You are on the bank of a fast flowing river with pasture to the north\r
+       and forest to the south.\r
+river2 light\r
+       %river1\r
+       You are on the bank of a fast flowing river with pasture to the north\r
+       and forest to the south.\r
+rapids light\r
+       Rapids.\r
+       You are on the bank of some dangerous rapids. Beyond them to the east\r
+       the river goes underground; to the west it continues out of sight, and\r
+       you can hear a thundering as of falling water from that direction. To\r
+       the south can be seen (and smelled!) a fuming swamp, and southeast is a\r
+       small pond.\r
+mfrst  light\r
+       Forest near mountains.\r
+       You are in dense forest at the base of some snow-capped mountains,\r
+       wreathed in clouds. The foothills are so beautiful that you yearn to\r
+       be able to climb them and lie eternally in dew drenched grass, with\r
+       an air of inner peace and total tranquility. You realise, however, that\r
+       this is silly!\r
+cave   light\r
+       Cave.\r
+       This is a cave, wherein once dwelled a hermit in times long passed.\r
+       Above is a huge mountain towering amongst the clouds, and outside\r
+       can be seen a pasture, small cottage and a cemetery in the distance.\r
+       At the east end of the cave is a small opening in the wall.\r
+pond1  light\r
+       Pond in swamp.\r
+       This is a small, shallow freshwater pond, fed by a small brook joining it\r
+       to the river. It is too shallow to swim, and there are no edible fish\r
+       living in it. Northwest are rapids, but everywhere else is swamp.\r
+nhill1 light\r
+       Foothills.\r
+       You are in the foothills, such as they are, to a tall mountain.\r
+       To the south is an east-west road, and to the north more small hillocks.\r
+       Westwards lies a forest, but passage east is impossible because of\r
+       a huge stone wall which blocks the way, built to keep the denizens of\r
+       The Land away from the surrounding area...\r
+nhill2 light\r
+       %nhill1\r
+       You are in some higher foothills of the mountains, but the way north\r
+       and east is blocked by a huge wall. More foothills are downwards to\r
+       the south, and to the west is forest. In the distance can be seen a\r
+       small, thatched cottage, and some wide, open, pastures.\r
+shill1 light\r
+       %nhill1\r
+       These are some foothills to the tall mountains which tower above you\r
+       to the east. Travel in that direction is impossible because of a tall\r
+       stone wall, built by the locals when they learned of the creatures\r
+       dwelling within The Land... To the north runs an east-west road, and\r
+       to the west is forest. The hills rise slowly to the south.\r
+shill2 light\r
+       %nhill1\r
+       This is a small hillock atop a cave. To the north the hill slopes\r
+       downwards, but to the east and south curves a stone wall which is\r
+       impossible to scale. Below can be seen a stream cascading over another\r
+       cliff further west, and beyond that is the sea.\r
+lounge light\r
+       Lounge.\r
+       This is the lounge. Around you are some pieces of elegant troll-hide\r
+       furniture, although all the portable ones have long been stolen so\r
+       there's no point in getting any... Ahead of you to the south is the\r
+       dining area, and to the west is the hall. An archway to the east leads\r
+       to the study.\r
+dining light\r
+       Dining area.\r
+       You are standing in the dining area of a long narrow room. To the north\r
+       is the lounge, to the west is a serving hatch which, you surmise, leads\r
+       to the kitchen (although it's too small to climb through). To the south\r
+       are some french windows which open out over a pasture.\r
+kitche light\r
+       Kitchen.\r
+       Around you is all the usual paraphernalia that can found in a kitchen,\r
+       although it is firmly fixed down so you can't take any of it away.\r
+       The pantry is to the northwest, and a doorway to the hall is to the\r
+       north. East is a small serving hatch through which you can see, if not\r
+       move to, the dining room.\r
+hall   light\r
+       Hall.\r
+       You are standing in an oddly shaped hall. To the south is a doorway,\r
+       the east is an archway, and some dark forbidding stairs lead upwards\r
+       to the southeast. Immediately to the west is a fitted wardrobe, and\r
+       some eerie, granite steps to the southwest lead downwards to the cellar.\r
+study  light\r
+       Study.\r
+       This is the old study used by the gravedigger who once owned this\r
+       cottage, where he read up his craft. It is decorated in sombre colours,\r
+       and the windows are small and dirty. On the south wall is a large\r
+       bookcase reaching up to the ceiling, made of an enchanted oak.\r
+ssteps\r
+       Secret steps.\r
+       These are some secret steps leading downwards through a false wall to\r
+       the underworld. At the bottom, to the south, is darkness; at the top,\r
+       to the north, stands a large bookcase, acting as a doorway between here\r
+       and a study.\r
+zroom\r
+       Zombie room.\r
+       This is a small room at the bottom of a short flight of steps leading\r
+       up to the north. The walls are damp, and covered in fungal stains.\r
+       To the south is a narrow passage leading downwards.\r
+downps\r
+       Narrow passage.\r
+       This is a small passage leading downwards to the south. To the north\r
+       is a small room, and at the other end a door inscribed with strange\r
+       runes.\r
+sorcrm light   silent\r
+       Sorcerer's room.\r
+       You look around you in disbelief at the exotic room which you have\r
+       discovered. It seems to be a room used by some sorcerer, wherein he\r
+       bound his spells and worked his magic. The room is lit by an\r
+       illusory red light, and many of the strange objects you see defy\r
+       description. To the north is a door inscribed with strange runic\r
+       symbols, but there is no other exit.\r
+stairs light\r
+       Halfway up the stairs.\r
+       You are sitting on a step halfway up the stairs, a ghostly voice\r
+       recites a poem by A. A. Milne to itself. Further up you can make out\r
+       a landing, downwards you can see a hallway.\r
+landin light\r
+       Upstairs landing.\r
+       You are standing on the upstairs landing. There are doorways in most\r
+       directions, the stairs lead downwards and to the northwest.\r
+bathrm light   small\r
+       Bathroom.\r
+       The bathroom contains a toilet and a handbasin, and on the wall is a\r
+       shelf with "MEDICINES" written on it. The bath was removed long ago,\r
+       but the toilet and handbasin still look usable. The only exit is to the\r
+       east.\r
+cupd1  light   small\r
+       Airing cupboard.\r
+       This is a small cupboard, most of which is filled with a hot water\r
+       tank. The rest of the cupboard is filled with shelving.\r
+bdrm01 light\r
+       Large bedroom.\r
+       You are standing in a large bedroom. To the south is a window out of\r
+       which, you can see a pleasant field with a stream flowing swiftly at\r
+       the bottom of it. There is a doorway to the north.\r
+bdrm02 light\r
+       Main bedroom.\r
+       This is the main bedroom. There is a window to the north from which\r
+       you can see the road that runs past the front of the cottage. The way out\r
+       is south, onto the landing.\r
+bdrm03 light\r
+       Small bedroom.\r
+       The room appears to have been used as a nursery at some time as the\r
+       walls are covered with pictures of elves and gnomes all smiling\r
+       happily. There is a fitted cupboard to the southwest and the way out\r
+       is to the northwest.\r
+cupd2  small   light\r
+       Fitted cupboard.\r
+       The cupboard appears to be bereft of any shelving, there are scratches\r
+       on the wall but there is nothing here which can explain them.\r
+wrdbe  light   small\r
+       Fitted wardrobe.\r
+       You are inside the fitted wardrobe. The only apparent exit is to the\r
+       east, into a hallway.\r
+pantry small\r
+       Pantry.\r
+       You are standing in the pantry. Around you are some marble slabs\r
+       and shelves which are badly damaged and not worth anything, but\r
+       which have obviously once held mouthwatering delicacies of rare\r
+       and ancient types.\r
+hut    light\r
+       Woodsman's hut.\r
+       The hut is obviously the home of a woodsman. There are various pieces\r
+       of rude wooden furniture scattered about. On the walls are stuffed\r
+       fish and birds, they appear old and are fixed firmly to the wall as\r
+       if the owner has treasured them for a long time.\r
+maze1  light   nolook\r
+       You are lost in a misty graveyard.\r
+maze2  light   nolook\r
+       %maze1\r
+maze3  light   nolook\r
+       %maze1\r
+maze4  light   nolook\r
+       %maze1\r
+maze5  light   nolook\r
+       %maze1\r
+maze6  light   nolook\r
+       %maze1\r
+maze7  light   nolook\r
+       %maze1\r
+maze8  light   nolook\r
+       %maze1\r
+maze9  light   nolook\r
+       %maze1\r
+maze10 light   nolook\r
+       %maze1\r
+maze25 light   nolook\r
+       You are standing in front of a large tombstone.\r
+uswamp light   death   sanctuary\r
+       Bottom of swamp.\r
+       Isn't it short of air here, beneath all that swamp?\r
+swamp1 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       You are waylaid in a treacherous swamp.\r
+swamp2 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp3 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp4 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp5 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp6 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp8 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp9 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swampa light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swampb light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swampc light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swampd light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       %swamp1\r
+swamp7 light   nolook\r
+       You are in a drier part of the swamp.\r
+ydead3 light   death\r
+       The volatile marsh gases ignite from your light and in an instant you\r
+       are a charred corpse which is sucked unmercifully into the deep.\r
+beach  light   nolook\r
+       Rocky Beach.\r
+       You are standing on a rocky beach. Above you is a mighty cliff which\r
+       extends out to the sea on either side of you, thus forming an enclosed\r
+       cove. Behind you is a forbidding tunnel, and to the south a mighty\r
+       waterfall smashes into the rocks in another part of the beach. Out to\r
+       the west, in the sea, can be seen a wrecked galleon, trapped on some\r
+       vicious rocks.\r
+beach2 light   nolook\r
+       Bottom of waterfall.\r
+       You are stood on a sandy part of a beach, at the bottom of a\r
+       thundering waterfall which smashes into the rocks from the cliff\r
+       above. To the north is a rockier part of the beach, but otherwise\r
+       the area is cut off by the sea apart from some slippery rocks to the\r
+       south. To the west, in the sea, can be seen the wreckage of a\r
+       galleon, torn against some vicious rocks.\r
+bch1   light\r
+bch2   light\r
+srock1 light   hideaway        dmove   beach2  nolook\r
+       Slippery rocks.\r
+       You are delicately attempting to cross some slippery rocks. To the\r
+       west can be seen a wrecked galleon over the sea, to the north a beach,\r
+       and in all other directions more rocks.\r
+srock2 light   hideaway        dmove   inlet   nolook\r
+       %srock1\r
+       You are delicately attempting to cross some slippery rocks. To the west\r
+       can be seen a wrecked galleon, and in all directions are more rocks.\r
+srock3 light   hideaway        dmove   inlet   nolook\r
+       %srock1\r
+       You are delicately attempting to cross some slippery rocks. To the\r
+       west can be seen a galleon wrecked on some vicious rocks out at sea,\r
+       but all around you are slippery rocks.\r
+inlet  light\r
+       Concealed inlet.\r
+       This is a small inlet from the sea, concealed from view by some\r
+       slippery rocks to the northwest. Out at sea to the west can be seen\r
+       the wreckage of a galleon, and above you towers a mighty cliff. There\r
+       is a bird's nest above, the route to which looks climbable.\r
+nest   light\r
+       Eagle's nest.\r
+       This is the nest of an eagle, stuck firmly to the cliff overlooking the\r
+       sea. Out at sea can be seen a ship on some vicious rocks, and there\r
+       is a strong current whirling around except to the north from west of\r
+       the inlet. The cliff above here is unclimbable.\r
+sea1   light   sanctuary       nolook  dmove   beach\r
+       Sea.\r
+       You are out at sea. To the east is a beach, further out to the west\r
+       a galleon wrecked on some vicious rocks.\r
+sea2   light   sanctuary       nolook  dmove   beach2\r
+       %sea1\r
+       You are out at sea, midway between a beach to the east, some slippery\r
+       rocks to the southeast, and a wrecked galleon to the west.\r
+sea3   light   sanctuary       nolook  dmove   beach\r
+       %sea1\r
+       You are out at sea. To the east and west are rough waters, but northern\r
+       and southern directions look safe enough to take.\r
+sea4   light   sanctuary       nolook  dmove   beach2\r
+       %sea1\r
+       You are out at sea, midway between a beach to the east, some slippery\r
+       rocks to the southeast, and a wrecked galleon to the west.\r
+sea5   light   sanctuary       nolook  dmove   inlet\r
+       %sea1\r
+       You are out at sea, to the west of an inlet and to the southwest of\r
+       some slippery rocks. The waters all around you are rough, but northwards\r
+       and westwards is calm enough to sail.\r
+sea6   light   sanctuary       nolook  dmove   vrocks\r
+       %sea1\r
+       You are out at sea near some vicious rocks to the west, upon which is\r
+       wrecked a galleon. In the distance to the east can be seen a mighty\r
+       cliff and a waterfall, and to the south of that some slippery rocks.\r
+sea7   light   sanctuary       nolook  dmove   vrocks\r
+       %sea1\r
+       You are out to sea, to the southwest of some vicious rocks upon which\r
+       is wrecked a galleon.\r
+sea8   light   sanctuary       nolook  dmove   vrocks\r
+       %sea1\r
+       You are out on the high seas. Far to the north can be seen an island,\r
+       and far to the east a wrecked ship.\r
+sea9   light   sanctuary       nolook  dmove   vrocks\r
+       %sea1\r
+       You are on the high seas, far to the south of an island. the mast of a\r
+       wrecked ship can be seen on the south-eastern horizon.\r
+sea10  light   sanctuary       nolook  dmove   slope1\r
+       Small bay.\r
+       You are in a small bay, skirted by strong currents. To the north is\r
+       a steep slope, which the swirling flows about you make the only safe\r
+       place to land. The island is a huge rock, topped by a flat plateau\r
+       upon which is a huge circle of weatherbeaten stones.\r
+sea11  light   sanctuary       nolook  dmove   jetty\r
+       %sea1\r
+       You are out at sea, next to the coastline. To the west, the sea looks\r
+       still sailable, but northwards it gets rough. Eastwards is a jetty,\r
+       which juts out into the waves from a beach beyond. To the south, the\r
+       relative tranquility of these coastal waters continues.\r
+sea12  light   sanctuary       nolook  dmove   beach3\r
+       %sea1\r
+       You are at sea, close to the coastline to the east. Northwards and\r
+       northwestwards, the sea looks safe enough to navigate, and to the\r
+       southwest there is a channel around a headland protruding from the\r
+       coast. Elsewhere, however, it is rough and sailing there would probably\r
+       deposit you in Davy Jones's locker...\r
+sea13  light   sanctuary       nolook  dmove   beach3\r
+       %sea1\r
+       You are out to sea, away from the coastline. All around, except in the\r
+       southerly and easterly directions, the water is very rough, and it would\r
+       take a much larger craft than yours to travel there safely. Far beyond a\r
+       headland to the south you can see a ship wrecked on some vicious rocks,\r
+       but there is nothing but tempestuous sea beyond the cliff to the north.\r
+sea14  light   sanctuary       nolook  dmove   beach3\r
+       %sea1\r
+       You are in a narrow channel of calm water, sailing around a headland\r
+       with rough seas swirling about it, its granite rocks unfortunately\r
+       precluding any attempt at landing. Northwards is a small bay with\r
+       a jetty to its east; southwards is a larger expanse of navigable\r
+       water.\r
+sea15  light   sanctuary       nolook  dmove   inlet\r
+       %sea1\r
+       You are out at sea, to the south of some vicious rocks upon which lies\r
+       a wrecked galleon. Some way to the east can be seen an inlet at the foot\r
+       of a tall cliff, and south, through strong currents on either side, is\r
+       a small island upon which has been built a large archway.\r
+sea16  light   sanctuary       nolook  dmove   inlet\r
+       %sea1\r
+       You are sailing north of a small island in the middle of rough seas.\r
+       The only calm waters lie further north, where in the distance can be\r
+       seen a galleon, wrecked on some vicious rocks.\r
+woe1   light\r
+       North part of Isle of Woe.\r
+       You are standing on a small island, way out to sea. The waters are\r
+       relatively calm, but too far in any direction save north and they\r
+       become dangerous. A large, ancient archway straddles the island, its\r
+       faces well eroded over many thousands of years. To reach the southern\r
+       part of the island you would have to pass through it.\r
+woe2   light\r
+       South part of Isle of Woe.\r
+       You find youself stood in the southern half of a small, windswept\r
+       island, separated from the northern half by a large archway which\r
+       stands from shore to shore. The seas around here sweep swiftly\r
+       northwards, too, but are not dangerous close to the island.\r
+fslop1 light\r
+       Forest on steep slope.\r
+       You are in dense forest, sloping from the south downwards to the north.\r
+fslop2 light\r
+       %fslop1\r
+       You are in dense forest, sloping from the south downwards to the north.\r
+       To the southeast are the foothills of an enormous mountain.\r
+fslop3 light\r
+       %fslop2\r
+       You are in dense forest, sloping from the south downwards to the north.\r
+       To the west can be heard the roar of the sea, as it crashes into the\r
+       cliffs beyond the trees.\r
+sdale  light\r
+       South dale.\r
+       This is a peaceful dale, nestled at the base of a huge afforested\r
+       escarpment which slopes steeply away to the south. Northwards is\r
+       another forest, and eastwards the overgrown grounds of a mausoleum,\r
+       dwarfed by an enormous mountain which stands high above. The dale\r
+       curves away to the northwest, and westwards is a dangerous cliff.\r
+ogrnds light\r
+       Overgrown grounds of mausoleum.\r
+       This once well-tended garden has now, sadly, fallen into a state of\r
+       neglect. Stood within, its doorway to the southeast, is a cold,\r
+       bemossed mausoleum. The scene is dominated by a huge cliff to the\r
+       east, at the base of an awe-inspiring mountain which climbs away\r
+       into the clouds, its foothills sweeping down into a steep escarpment\r
+       covered in forest to the south. North is more forest, and west a dale.\r
+       To the northeast there looks to be a railway cutting.\r
+mosolm\r
+       Mausoleum.\r
+       You are stood inside a piece of history, a mausoleum which is far more\r
+       ancient than its weatherbeaten exterior would indicate. Within the\r
+       circular walls are the tombs of many, their names and heraldic designs\r
+       carved into the stones in a language which was dead before Atlantis\r
+       sank. The easiest exit from this eerie window on the past is to the\r
+       northwest. On the floor, however, is carved an inscription in an\r
+       archaic predecessor of your own language, which is readable. The floor\r
+       and ceiling do not have entrances, but the tombs seem to.\r
+ntomb\r
+       North tomb.\r
+       This is the north tomb of the mausoleum, but the bones of the dead\r
+       have long since been reduced to dust by Time. The walls are close\r
+       together, and there is no evidence of there having been a coffin\r
+       within. The exit is to the south.\r
+wtomb\r
+       West tomb.\r
+       This side-room is the west tomb of the mausoleum. An enormous\r
+       sarcophagus is lain against the back wall, and the way out is to the\r
+       east, leading back into the mausoleum entrance hall.\r
+stomb\r
+       South tomb.\r
+       This small chamber is the southern tomb of the mausoleum, which has\r
+       not been used for burial purposes. The exit is to the north, and the\r
+       walls are curiously uninteresting.\r
+swtomb\r
+       Southwest tomb.\r
+       This tomb is to the southwest of the mausoleum, and is quite richly\r
+       decorated. The walls are stained a regal purple, and the floor is a\r
+       mosaic of intricate design. The whole room has an eastern aura, and\r
+       bears many gilt symbols in a language you cannot recognise inlaid\r
+       upon the door.\r
+etomb\r
+       East tomb.\r
+       This room consists the eastern tomb of the mausoleum, and is the\r
+       oldest part of the structure. Strange cobwebs adorn the far wall,\r
+       and the light casts dancing shadows on the roof which seem to come to\r
+       life in this relic of prehistory. The only exit is to the west.\r
+setomb\r
+       Southeast tomb.\r
+       This is the southeastern tomb of the mausoleum, and has not been used\r
+       for burial purposes. The unplastered walls and uneven floor give a\r
+       sense of starkness which makes the uneasy mind wary, lest some\r
+       uncanny spirit has made the deathly room its abode.\r
+dcliff light\r
+       Dangerous cliff.\r
+       You are stood by the edge of a dangerous, partly-forested cliff,\r
+       which slopes downwards to the north. To the east and south, the forest\r
+       becomes thicker, and to the northeast the slope levels out onto a dale.\r
+       The crumbling eroded western edge of the cliff looks so liable to\r
+       collapse that no-one in their right mind would risk certain death by\r
+       leaping off.\r
+scrubs light\r
+       Scrub slope.\r
+       This is a gentle slope down westwards to a beach, covered in scrubs\r
+       and small bushes. To the south, the slope becomes much steeper, and\r
+       rises into a huge escarpment high above. Eastwards is a dale, and\r
+       northwards runs an east-west section of railway line.\r
+wdale  light\r
+       West dale.\r
+       This is a pleasant dale, hugging the slopes of a huge forest-covered\r
+       escarpment which rises to the south. East is more forest, but the\r
+       dale curves southeastwards behind it. West is a slope of scrubland,\r
+       which rolls down to the sea beyond. North is a railway line, which\r
+       runs from east to west, standard gauge.\r
+forist light\r
+       %nfrst1\r
+       You are stood in a dense forest, with a railway line to the north\r
+       and a pleasant dale to the south and west.\r
+cuttin light\r
+       Railway cutting.\r
+       You are stood on a shallow mound, which has been cut through by a\r
+       now rusting railway line, in an east-west direction to the north. To\r
+       the south is a mausoleum in overgrown grounds, the remnants of a\r
+       surrounding fence no longer preventing entry. East and west are forests,\r
+       and southwest is a dale at the bottom of a long, steep slope.\r
+efrst1 light\r
+       Forest at base of cliff.\r
+       The forest in which you stand is nestled at the base of a frighteningly\r
+       tall mountain which rises off in an unclimbable cliff to the east.\r
+       From inside it, to the north, appears to run a railway line, which\r
+       cuts through a shallow mound to the west. South stands a cold, grey\r
+       mausoleum in overgrown grounds, protected ineffectually by the remains\r
+       of a fence which long since rotted away to virtually nothing.\r
+emine  light\r
+       Entrance to mine.\r
+       This is the entrance to an underground tin mine, beneath a huge\r
+       cliff. Outside is to the west, and down to the east runs a main\r
+       passage into the mine proper. Both directions is a railway track,\r
+       overgrown enough to show it hasn't been used for many a year.\r
+main1  light\r
+       Main passage.\r
+       This is the main passage in the tin mine, running east-west. Light\r
+       comes from the west end, whereas the east delves deeper underground.\r
+       The length of the passage there runs a rusted railway track.\r
+main2  light\r
+       %main1\r
+       This is the junction on the main passage in the mine. To the west,\r
+       whence comes light, the passage rises. Also in this direction runs\r
+       a railway track, although it stops where you are now standing. To\r
+       the north is a major shaft, and upwards to the east are some roughly\r
+       hewn but well-worn steps. The passage continues to the southeast. The\r
+       floor of this room seems to be slightly wet.\r
+platfm\r
+       Platform.\r
+       This is a sort of landing at the top of some steps which lead\r
+       down to the west. To the east is a major shaft, which runs upwards,\r
+       and to the north is a makeshift shed. The platform looks well used.\r
+shed\r
+       Shed.\r
+       This is a decrepit but nevertheless rather sturdy shed, used by the\r
+       tin-miners in the old days to store their equipment. The way out is\r
+       to the south, onto a platform at the top of a staircase.\r
+valvrm\r
+       Valve on staircase.\r
+       You are halfway up (or down!) a staircase carved into the rock,\r
+       although it is well used. Fixed solidly into the wall is a rusted\r
+       wheel valve-release, of the sort used in large plumbing work. In\r
+       contrast to the stairs, it looks hardly used at all...\r
+shaft1 dmove   minor1\r
+       Vertical shaft.\r
+       This is a vertical shaft, quite long, but easy to traverse because\r
+       of the iron rungs hammered into its sides. Such shafts were used long\r
+       ago by the tin-miners to reach the faces. At the top end, to the\r
+       south, is a main passage. Similarily, there is a minor passage at the\r
+       bottom, to the east.\r
+shaft2 dmove   platfm\r
+       %shaft1\r
+       This is a vertical shaft, which you find yourself able to climb\r
+       because of the heavy iron rungs forced deep into the rock. At the\r
+       bottom end, to the west, is a main passage; at the top, however,\r
+       there is only a minor passage, to the north.\r
+main3\r
+       %main1\r
+       This is a three-way junction in the main passage. Exits are upwards\r
+       to the northwest, downwards to the southwest, or to the east.\r
+main4\r
+       %main1\r
+       You are walking down a main passage in the tin mine. To the east is\r
+       a vertical shaft, whereas the passage turns downwards to the south\r
+       and upwards to the west.\r
+shaft3 dmove   minor7\r
+       %shaft1\r
+       This is a vertical shaft leading deep underground. At the top end, to\r
+       the west, is a main passageway; at the bottom end, to the south,\r
+       there is a minor one. The shaft is climbable because of heavy\r
+       iron rungs biting into the sides, although the walls are a bit damp.\r
+main5\r
+       %main1\r
+       This is a main passage in the tin mine, running up to the northeast\r
+       and curving down to the south. There is a fair amount of rubble\r
+       around, as though there has been a cave-in nearby at some time in\r
+       the past.\r
+main7\r
+       %main1\r
+       This is a north-south main passage, which although clear at the\r
+       north end, runs into a pile of rubble to the south. It is plain that\r
+       the pit-props have given way some time, and the way through is almost\r
+       impossible. You might be able to travel south, however, if you were\r
+       to drop everything you're carrying...\r
+dpass1\r
+       Dangerous passage.\r
+       This is a dangerous passage, the description of which mortals can't\r
+       normally read! Try n or ne.\r
+dpass2\r
+       %dpass1\r
+       This is a dangerous passage, the description of which mortals can't\r
+       normally read! Try sw, s, se or ne.\r
+dpass3\r
+       %dpass1\r
+       This is a dangerous passage, the description of which mortals can't\r
+       normally read! Try n, sw or se.\r
+dpass4\r
+       %dpass1\r
+       This is a dangerous passage, the description of which mortals can't\r
+       normally read! Try nw, w or sw.\r
+dpass5\r
+       %dpass1\r
+       This is a dangerous passage, the description of which mortals can't\r
+       normally read! Try n or se.\r
+dpass6\r
+       %dpass1\r
+       This is a dangerous passage, the description of which mortals can't\r
+       normally read! Try nw or ne.\r
+sectn\r
+       Section of main passage.\r
+       This is a remaining section of the main passage, but I couldn't\r
+       care less because mortals still can't read it! Try e or nw.\r
+main6\r
+       %main1\r
+       You find yourself in a main tunnel, which although clear at the\r
+       north end, runs into a pile of rubble to the south. You could\r
+       probably negotiate the cave-in if you were to drop everthing, but\r
+       you won't be able to see if you do...\r
+minor1\r
+       Minor passage.\r
+       This is a minor passage, at the base of a shaft to the west. It\r
+       continues to the east, towards the tin face. There is a narrow\r
+       crack to the southwest, but you'd have to drop everything to be\r
+       able to pass through.\r
+minor2\r
+       %minor1\r
+       You are walking along a narrow passage, which splits three ways.\r
+       To the west, it continues upwards; to the south, it bends away\r
+       downwards; to the east, it meets the face, from where tin used\r
+       to be mined using picks.\r
+face1\r
+       Face.\r
+       This is one of the faces upon which work was proceeding when the\r
+       mine closed down. The only way out is to the west, to the previous\r
+       face, now a minor passage.\r
+minor3\r
+       %minor1\r
+       This minor passage runs upwards to the north, and downwards into a\r
+       shaft to the south. It doesn't look like is has been used very often.\r
+shaft4 dmove   tightp\r
+       %shaft1\r
+       This vertical shaft is exceedingly long, but ascent and descent is\r
+       facilitated by heavy iron rungs set into the walls. At the top end,\r
+       to the north, is a minor passage. At the bottom, to the south, is\r
+       a tight passage, which looks hardly used.\r
+tightp small\r
+       Tight passage.\r
+       This is a very small and tight passage, and it is something of an\r
+       effort to enter although no-one need drop anything to do so. To\r
+       the south is a hardly-worked tin face; indeed, it looks like work\r
+       was in progress to widen the tunnel when the mine closed. To the\r
+       east is a crack, leading into the rock.\r
+face4\r
+       %face1\r
+       This is one of the tin faces, where in years gone by the tin miners\r
+       would cut away to reach the ore. The only way out is to the north\r
+       onto a tight passage.\r
+doomrm light\r
+       Doom room.\r
+       As soon as you enter, a section of floor gives way and you find\r
+       yourself falling into a pit. The finely-balanced rock slides\r
+       back above your head, and you find yourself stuck.\r
+crrm   small\r
+       Crack room.\r
+       Hello wizard, guess what mortals can't see without help? Try ne or w.\r
+edwrlm\r
+       Entrance to dwarf realm.\r
+       You find yourself crouched in a low passage, obviously the work of\r
+       dwarfs, with a crack in the rock to the west and an ornamented\r
+       archway to the southeast. You realise that this must be the entrance to\r
+       the fabulous dwarf realm, about which there are many terrible legends.\r
+minor5\r
+       %minor1\r
+       Where you are now is a minor passage at the top of a vertical shaft to\r
+       the south. Eastwards, the passage continues, and to the north is a\r
+       side passage, which seems to have been started in error, and abandoned.\r
+minor6\r
+       %minor1\r
+       This is a minor passage, leading from the west to a tin face to the\r
+       east. South, there is a smooth-walled, vertical ventilator duct, or so\r
+       it appears. It looks particularily dangerous, however, and smells of\r
+       charcoal.\r
+face2\r
+       %face1\r
+       This is a tin face, moderately used. The exit is to the west into a\r
+       minor passage.\r
+sidpsg\r
+       Side passage.\r
+       This is the beginnings of a minor passage, but upon which work ceased\r
+       early because of the hardness of the rock. The passage proper is to\r
+       the south.\r
+minor7\r
+       %minor1\r
+       This is another minor passage in the tin mine. It starts at the base of\r
+       a shaft to the north, and continues to the south.\r
+minor8\r
+       %minor1\r
+       This minor passage continues to the north, but bends onto a face to\r
+       the east. There is one of the common roof collapses to the south,\r
+       which you could probably traverse if you weren't carrying anything.\r
+face3\r
+       %face1\r
+       This is a frequently-used tin face, by the look of things, since it\r
+       seems to have a high grade of tin, although most of it has now been\r
+       mined, of course... The way out is to the west, onto a minor passage.\r
+peril1\r
+       Perilous passage.\r
+       Hi wizards! Try n or sw.\r
+peril2\r
+       %peril1\r
+       Hi wizards! Try e or ne.\r
+peril3\r
+       %peril1\r
+       Hi wizards! Try nw or sw.\r
+peril4\r
+       %peril1\r
+       Hi wizards! Try nw or s.\r
+peril5\r
+       %peril1\r
+       Hi wizards! Try n or s.\r
+ledge1 light\r
+       Ledge.\r
+       You are stood on a ledge overlooking a fantastic sight. By light\r
+       coming from what seems to be a hole high above you, you witness an\r
+       incredible view of the fabled dwarf realm of legend. There is no way\r
+       to get down from here, although far to the southwest there seems to be\r
+       such an entrance. The ledge continues to the east.\r
+ledge2 light\r
+       %ledge1\r
+       You are stood on the ledge, high above the dwarf realm. Although\r
+       the view is awe-inspiring, you are careful to keep your footing\r
+       lest you fall the many hundreds of feet and kill yourself below. The\r
+       ledge continues to the east and west.\r
+boledg\r
+ledge3 light\r
+       %ledge1\r
+       This is the easternmost end of the ledge, which is a bit wider than\r
+       the rest of it. Below you you can see a pasture, and some forests,\r
+       but the scene is stolen by a dazzling dwarfen citadel in the centre\r
+       of the cave below, which catches the mysterious light from above and\r
+       spreads it out in a glorious cascade of sparkling colours.\r
+bldg   light   nolook\r
+       Bottom of ledge.\r
+       You are stood at the bottom of the northern wall of this strange\r
+       subterrainean domain. High above you can be seen a narrow ledge, but\r
+       there are no means by which you can climb there from here. To the\r
+       south is a pasture, now lying fallow.\r
+dwpst1 light\r
+       Dwarfen pasture.\r
+       You are strolling across a pasture, used by the dwarfs for their\r
+       crops, although now it is overgrown because it is the fallow year.\r
+       To the north is the bottom of the northern wall, high up which is a\r
+       ledge. East is a forest, and south the entrance to the dominating\r
+       citadel.\r
+befcit light\r
+       Before citadel.\r
+       You are stood before a huge marble-covered citadel, the entrance\r
+       to which is to the east. It is inset with coloured stones and\r
+       catches the sun from high above to create a glorious rainbow effect.\r
+       North and south are pastures, and to the west are steps up to a\r
+       shelf in the rock, and an archway.\r
+dwpst2 light\r
+       %dwpst1\r
+       This is a pasture to the south of the entrance to the citadel,\r
+       the as yet unripe wheat swaying to and fro' to unseen winds. To the\r
+       south and east are forests of oak.\r
+panora light\r
+       Panoramic view.\r
+       You are stood on a shelf in the rock, with a grand archway through\r
+       into a passage to the northwest. This, however, is nothing compared\r
+       to the spectacular sight to the east. You see that this is a cavern,\r
+       light coming in by what seems to be a hole in the roof high above.\r
+       Steps lead down to the base of a huge citadel, surrounded by a\r
+       wall with forests beyond. To the northeast and southeast are two\r
+       pastures, and from somewhere can be heard a running spring. The\r
+       light reflecting from the citadel's marbled walls is so breathtaking\r
+       you feel quite in awe.\r
+ufrst1 light\r
+       Underground forest.\r
+       You are stood in a pleasant oak forest, with a pasture to the west.\r
+       The forest continues to the southeast, but to the north is the cavern\r
+       wall and to the south the wall of the citadel.\r
+ufrst2 light\r
+       %ufrst1\r
+       You are walking through an oak forest, with pasture to the west.\r
+       North is the wall of the citadel, and south is the edge of the\r
+       cave.\r
+ufrst3 light\r
+       %ufrst1\r
+       This is a very agreeable oak forest through which you find yourself\r
+       walking. To the north is a wheatfield, and to the southeast can be\r
+       heard a spring.\r
+spring light\r
+       Spring.\r
+       You are stood in a leafy part of the forest. From the cave wall\r
+       comes forth a spring, which tumbles into a little pool and seeps away\r
+       again into the earth. All around is more wall, for this is a large\r
+       crack, save to the northwest where the forest continues.\r
+topcit light\r
+       Top of citadel.\r
+       This is the top of the citadel, from where you can see all the\r
+       surrounding cave. Directly above you can be seen a hole, high up in\r
+       the mountain, and it occurs to you that this citadel was so placed\r
+       as to catch the light precisely and create the wondrous effects\r
+       visible elsewhere in the cavern. There is a gateway to the east.\r
+ufrst5 light\r
+       %ufrst1\r
+       This is the forest at the back of the citadel. There is the cave\r
+       wall to the east, but the forest continues northwest and southwest.\r
+entrnc\r
+       Entrance to citadel.\r
+       You are stood at the entrance to the dwarfen citadel, at the top of\r
+       some steps which run downwards to the east. West, a gateway provides\r
+       the only other exit from the room. The walls are decorated in curious\r
+       stones and wierd etchings, but none are removable or readable.\r
+dwstep\r
+       Dwarf steps.\r
+       You are using some narrow, closely-spaced stairs, which descend in a\r
+       straight line from a room to the west to a doorway to the east. At the\r
+       top of the steps are strange decorations, presumably put there to\r
+       ward off evil presences, such as yours...\r
+dwhall\r
+       Dwarfen hall.\r
+       The room in which you stand is impressive in size, even by non-dwarf\r
+       standards. High above is a red brick ceiling, and the floor is\r
+       decorated by a colourful, if crudely-made, mosaic. There are low\r
+       passages leading off to the north and east, and a higher passage to\r
+       the south (probably so long weapons don't scratch the roof). West is\r
+       a doorway, which looks well-used.\r
+lowps1\r
+       Low passage.\r
+       You are walking down a low, well-trodden passage. To the north, the\r
+       passage continues, and to the south it opens out into a large hall.\r
+       East is what looks like a kitchen, and to the west is a doorway.\r
+lowps2\r
+       %lowps1\r
+       You are stood in a low, dwarfen passage, which runs from the south,\r
+       turns to the east, and continues. There is an opening on the north\r
+       wall into a room, and to the west is a doorway.\r
+lowps3\r
+       %lowps1\r
+       This is a low, east-west passage. At the west end, it continues on\r
+       into the dark, but at the east end it opens up onto a comparatively\r
+       large room. To the northeast is an opening, from which issues a\r
+       peculiar odour.\r
+dwfood\r
+       Food store.\r
+       This is the room the dwarfs who live here use to store their food\r
+       supplies. It is packed full of assorted vittles and foodstuffs, most\r
+       of which are in too small quantities for you to bother with. The only\r
+       way out is through a doorway to the east.\r
+dwstre\r
+       Dwarf store.\r
+       Herein, the dwarfs keep most of their equipment and tools. The walls\r
+       are hung with assorted spades, clothes, planks of wood and the like,\r
+       but most are too small for you to use. The only exit is a doorway to\r
+       the east.\r
+dwroom\r
+       Dwarf room.\r
+       This is a room which seems to have been recently constructed by the\r
+       dwarfs who inhabit this realm, for at the moment it has no furnishings\r
+       or even a door. The only way out is via an opening to the south which\r
+       leads onto the bend of a low passage.\r
+dwbog  small\r
+       Dwarf lavatory.\r
+       This is the small room the dwarfs use to excrete their waste bodily\r
+       products. Although there is no door (the exit is an opening to the\r
+       southwest), privacy is maintained by the room being on a slight\r
+       upward slant, out of the line of sight from the passage outside.\r
+       Understandably, being such a small room, there is a pungent odour here.\r
+dwcant\r
+       Canteen.\r
+       This is the room where the dwarfs partake of their meals. It is quite\r
+       large, and has a long table running down the middle, bolted to the\r
+       ground. There are two low passages leaving the room; one to the west,\r
+       and one to the south. To the southwest is a doorway, and there are no\r
+       other exits. The walls are painted in pictures of grassy pastures.\r
+dwktch\r
+       Dwarf kitchen.\r
+       You are stood in the dwarf kitchen, quite large and full of kitchen-\r
+       like utensils which are regretably too small to be of use to you. There\r
+       is a doorway to the northeast, with food stains on the floor near it,\r
+       and an opening onto a low passage to the west. North is a pit in which\r
+       refuse is thrown to decompose away.\r
+dwpit  small\r
+       Refuse pit.\r
+       This evil-smelling room is where the dwarfs toss their rubbish, from\r
+       the kitchen. All around are masses of decomposing foodstuffs, in\r
+       various states of decay, and filty, broken articles not even the\r
+       previous owners would be able to recognise. The only way out is via\r
+       a short climb to the south.\r
+lowps4\r
+       %lowps1\r
+       This is a low passage, leading from what appears to be a canteen to\r
+       the north, to a doorway at the southern end.\r
+lowps5\r
+       %lowps1\r
+       You are striding down a low passage, which forms a sort of T-junction.\r
+       To the west, it leads into a large hall, and to the east it opens up\r
+       into a room, whereas south, it carries on into the dark.\r
+dwrm1\r
+       Dwarf room.\r
+       This is a general-purpose room, used by the dwarfs for some of their\r
+       normal everyday activities. Strewn about it in a seemingly random\r
+       fashion, yet firmly fixed to the floor, are various items of furniture\r
+       and the like. There is a doorway to the north, and a low passage leading\r
+       off to the west.\r
+guard1\r
+       Dwarf guard room.\r
+       You are stood in a guard room built specifically to prevent access,\r
+       presumably to the doorway which is to the south. There are crimson\r
+       stains on the floor which have been unsuccessfully attempted to be\r
+       removed. North is an opening onto a large hall, and southeast is\r
+       another room.\r
+guard2\r
+       %guard1\r
+       This is the inner guard room. The wall is decorated in battle scenes,\r
+       all of which end in the dwarfs winning. North is a doorway, and south a\r
+       low passage. To the west is a weapon store, which it appears the room\r
+       is primarily designed to guard.\r
+wpnstr\r
+       Weapon store.\r
+       All about you is the most horrifying assortment of weapons you care to\r
+       envisage. Although they are too small for you to use in the main, the\r
+       various iron maidens, thumbscrews and racks also present show that the\r
+       dwarfs also use the room for torturing prisoners and each other. The\r
+       only exit is to the east, into a guard room.\r
+lowps7\r
+       %lowps1\r
+       You are stood in a low passage connecting two guard rooms, one to the\r
+       north and one to the south. There is a doorway to the west which is\r
+       of polished wood, and seems to be to somewhere very important.\r
+guard3\r
+       %guard1\r
+       You are in a guard room, bedecked in fine war trophies, most of which\r
+       are out of reach on the surprisingly high walls. The room is normally\r
+       reached by a low passage to the north, but to the south is a doorway\r
+       of very old oak, shined and polished to perfection. Obviously, it hides\r
+       something regarded with importance.\r
+minrm\r
+       Ministerial room.\r
+       This is the dwarfen parliament room, where the king's ministers debate\r
+       the issues of the dwarfen realm. It is richly fashioned with oak\r
+       fittings, designed to hold, say, ten or so dwarfs excluding the king\r
+       himself. There is a doorway to the east, and a guard room to the south.\r
+guard4\r
+       %guard1\r
+       This is the home of the king's guard, special, hand-picked troops of\r
+       the highest order, pledged to lay their lives down in order to save that\r
+       of their regal master. To the north is a room which seems to indicate\r
+       use as a debating forum of some kind, and from it through this room runs\r
+       a red fitted carpet to a doorway in the south wall. The doorway itself\r
+       is of heavy oak, and although elegantly finished seems to be built more\r
+       with strength in mind than ornamentation.\r
+kingrm\r
+       Throne room.\r
+       This is the throne room, the very seat of power in the dwarfen realm.\r
+       It is luxuriously carpeted, and the walls are painted gold. It is here\r
+       that the dwarfen king holds audiences and receives oaths of fealty. The\r
+       king's study is to the east, and southwest lies the royal bedroom. A\r
+       doorway in the north wall is the only other exit.\r
+kqdorm\r
+       Royal bedroom.\r
+       It is here that the dwarfen king and queen sleep. The room is furnished\r
+       with the normal bedroom paraphenalia, all dwarf-sized however so not\r
+       much good for you. The walls are a regal purple, and the floor is of\r
+       a soft, mossy material. The only exit is to the throne room, northeast.\r
+kingst\r
+       King's study.\r
+       You are stood in the room the dwarfen king uses for much of his work.\r
+       A hollow cut out into the wall is obviously used for a desk, and it\r
+       is built with comfort and practicality in mind. The throne room is\r
+       easily accessed to the west, and there is a low passage to the south.\r
+       North is a doorway, of exceptionally old oak, well-tended and polished.\r
+lowps8\r
+       %lowps1\r
+       You are in a low passage, which curves from a study to the north to end\r
+       in a doorway to the east.\r
+ktreas\r
+       King's treasure chamber.\r
+       This room is built to house the crown jewels and other assorted\r
+       treasures of the dwarfen realm. It is austere in itself, and the only\r
+       way out is through a doorway to the west.\r
+lowps6\r
+       %lowps1\r
+       You are in a low passage, which heads north to become the central\r
+       leg of a T-junction, and runs south to end in a doorway. East, it\r
+       opens up into a room.\r
+dwrm2\r
+       %dwrm1\r
+       This is a room used by the dwarfs for everyday living, mainly by the\r
+       females and children. There is a doorway to the north, and another\r
+       room to the south. Northwest, there is an opening onto a guard room.\r
+dwrm3\r
+       %dwrm2\r
+       You are stood in a very large room which the dwarfs use to manufacture\r
+       most of their goods. Dotted about all over are dozens of machines of\r
+       varying degrees of complexity, some so strange and old it is doubtful\r
+       that any of the dwarfs even know what they do. There is a thick wooden\r
+       door to the south, apparently for sound-proofing, and a low passage\r
+       leads off to the west.\r
+dwrm4\r
+       %dwrm1\r
+       You look about to find yourself in a room used mainly during the\r
+       evenings and for relaxation. The older dwarfs are the kind you'd expect\r
+       to find here, for it is surprisingly quiet and well furnished. There is\r
+       another room to the north, and a low passage to the east. South you\r
+       observe a doorway.\r
+kdorm\r
+       Children's dormitory.\r
+       This is the room where the young dwarfs sleep. The walls are decorated\r
+       in pictures of bunnies and pussies, and give the room a soft, dreamy\r
+       effect. The parents' dormitory is to the east, and to the north is a\r
+       door.\r
+pdorm\r
+       Married quarters.\r
+       You are stood in the room in which live the married dwarfs. The various\r
+       sub-rooms are discretely curtained off from each other, although the\r
+       curtains are of course firmly fixed down to prevent their being stolen.\r
+       The dormitory of their young is to the west, and northwards is a low\r
+       passage.\r
+lowps9\r
+       %lowps1\r
+       You are standing in a low passage, with three exits. West, the passage\r
+       leads into a room; south it opens into a dormitory; north, it ends in\r
+       a doorway.\r
+odorm\r
+       Officers' dormitory.\r
+       This rather smart room is used as living quarters for officers and other\r
+       high-ranking dwarfs. Its walls are painted mainly in portraits of dwarfs\r
+       which all seem to look the same, due to their large beards. To the south\r
+       is a doorway, and to the north the large dormitory of the lower dwarfs.\r
+dorm\r
+       Dormitory.\r
+       This is a large room, wherein sleep most of the unmarried dwarfs. It is\r
+       full of little hammocks upon which the dwarfs rest, sturdily fixed to\r
+       the wall to prevent their theft. To the south is the more classy\r
+       Officers' dormitory, and to the north is a heavy doorway, built to be\r
+       sound-proof.\r
+rail4  light\r
+       Railway track.\r
+       You are stood on a section of rusted railway line, which runs out\r
+       from a tin mine in the base of a huge cliff to the east. Northwards\r
+       is a paddock where the pit ponies used to be kept, and south east\r
+       forest. Southwest is a mound, which the track cuts through as it\r
+       continues to the west.\r
+rail3  light\r
+       %rail4\r
+       You are stood on a section of east-west railway line, which continues\r
+       in both directions. To the south is a mound through which the track\r
+       is cutting, and to the north are a dale, and a paddock of some kind.\r
+rail2  light\r
+       %rail4\r
+       This is an east-west railway track, running through some very pleasant\r
+       surroundings. To the north and southwest are peaceful dales, and to the\r
+       south lies a drowsy forest. A hillock to the southeast is cut through\r
+       by the track as it heads east towards the base of a mighty cliff.\r
+rail1  light\r
+       %rail4\r
+       This is the last section of a railway line. It continues to the east\r
+       where it cuts through some dales, but to the west it stops at the\r
+       beach. Northwards is a stony slope also leading to the beach, and to\r
+       the southwest is a like slope, covered in scrubs.\r
+stslop light\r
+       Stony slope.\r
+       This is a slope running down from a dale in the east to a beach in the\r
+       west. North is forest, and to the south is a section of railway line\r
+       which runs east-west.\r
+ndale  light\r
+       North dale.\r
+       You are stood in a quiet dale, at the foot of some gentle hills which\r
+       rise drowsily to the north, their slopes drenched in the emerald colour\r
+       of the trees which grow upon them. To the west the dale tails off into\r
+       a stony slope reaching down to the shore, and east is a paddock of\r
+       some description. To the south, before another forest, runs an east-\r
+       west railway track.\r
+paddck light\r
+       Paddock.\r
+       This is a paddock, where once were kept the ponies which used to haul\r
+       the heavy skips of tin from the mine down to the jetty on the beach.\r
+       They have long since gone, but the railway line along which they used\r
+       to toil is still intact, to the south. Westwards is a dale, and to\r
+       northeast a ruin of some stone building. Eastwards, travel is impossible\r
+       due to the enormous cliff which rises up into a mountain far into the\r
+       clouds.\r
+ruin   light\r
+       Ruin.\r
+       This conglomeration of stone which lies forlornly in the grass is all\r
+       that is left of the outer buildings belonging to the nearby tinmine,\r
+       before bad times fell upon it. Age and the weather have since reduced\r
+       the once proud structures to moss-covered misshapen arrangements of\r
+       rubble. To the north is a forest, and to the east an enormous cliff at\r
+       the base of a huge, snow-capped mountain. Elsewhere is a pony paddock.\r
+nfrst5 light\r
+       %nfrst1\r
+       You are stood in some dense forest, which slopes down to the south.\r
+nfrst6 light\r
+       %nfrst1\r
+       You are stood in some dense forest, which slopes down to the south.\r
+nfrst7 light\r
+       %nfrst1\r
+       You are stood in some dense forest, which slopes down to the south,\r
+       where stones and masonry indicate once stood buildings, over which the\r
+       forest has now extended.\r
+beach3 light   nolook\r
+       Stony beach.\r
+       The beach upon which you are stood is covered in stones, a legacy of\r
+       the days when mining material would fall from the skips of ore as they\r
+       were loaded aboard merchantmen. To the north, the beach continues, and\r
+       to the west is the sea. East is a slope covered in scrubs, which rises\r
+       up to a dale. On the northern part of the beach can be seen a jetty.\r
+       Southwards, however, a headland with high cliffs cuts off the way.\r
+beach4 light   nolook\r
+       %beach3\r
+       This is a beach covered in stones of irregular size. To the north the\r
+       cliffs rise, forming a cove which cuts off the area, but southwards\r
+       the beach continues. A railway line runs from the east, and to the\r
+       west a jetty forces itself out into the waves. To the southeast and\r
+       northeast, slopes rise up into dales.\r
+shrine light   small\r
+       Shrine.\r
+       You are inside a small yet sacrosanct shrine. A sense of deep\r
+       respectfulness fills this modest room. The way out, into a pine forest,\r
+       is to the northwest. It is obvious that the shrine was meant to be used\r
+       for quiet meditation, like similar chambers.\r
+osanct light   small   silent\r
+       Outer sanctum.\r
+       You find yourself in the outer sanctum of some strange, holy temple.\r
+       All about you, the walls seem to be a hazy, formless blackness, but\r
+       there is a visible opening to the north from whence comes an errie,\r
+       golden light.\r
+isanct light   small   silent\r
+       Inner sanctum.\r
+       This is the inner sanctum of a most reverend shrine. Thousands of\r
+       years it has existed, with only the highest of high priests permitted to\r
+       enter this hallowed room. The walls are a strange, misty black, and\r
+       golden light comes from an indeterminate source high above. An opening\r
+       to the south leads to the outer sanctum, but the bizarre walls may lead\r
+       elsewhere, too...\r
+jetty  light\r
+       Jetty.\r
+       This is a wooden jetty, which forces itself out into the sea. To the\r
+       east is the beach, but otherwise all around is the sea.\r
+hdland light\r
+       Headland.\r
+       This is a small headland, jutting out of the island in a southeasterly\r
+       direction. All around the peninsula is rough sea, except to the\r
+       northwest, where a thicket is situated, and northwards where is a\r
+       sandy cove.\r
+cove   light\r
+       Cove.\r
+       You are stood in a sandy, windswept cove to the east of the island.\r
+       South is a barren headland, and southwest a thicket. To the north is\r
+       forest, and to the northwest a clearing, near which the indigenous\r
+       birds of the island refuse to fly. Eastwards is the rough sea.\r
+ifrst1 light\r
+       Arcane forest.\r
+       You are stood in the awful hideousness of an arcane forest, its trees\r
+       misshapen collections of charred and splintered branches. All around\r
+       to the west rages the savage sea, and to the north the forest\r
+       continues. Eastwards, it has been cleared where it becomes a steep\r
+       slope.\r
+ifrst2 light\r
+       %ifrst1\r
+       This ancient forest in which you are stood looks to have been laid\r
+       to waste millennia ago, by some immense fire-breathing creation of the\r
+       evil gods. To the west, the relentless bombardment of the sea\r
+       continues, and to the east is a steep slope. South, the forest\r
+       is the same, but northwards it becomes foliated again.\r
+ifrst3 light\r
+       Oak forest.\r
+       This is a forest of oak trees, in the northwest corner of the island.\r
+       To the south the forest has been ravaged by some diabolic evil, and\r
+       to the east is normal forest sloping upwards. West and north, the\r
+       rough sea batters away at the rugged coastline.\r
+ifrst4 light\r
+       Sloping forest.\r
+       This is a sparse forest, which slopes from the south upwards to the\r
+       north. At the south end is a cove, which meets the rough sea that\r
+       is to the east. Southwest is an evil place, where such wildlife as\r
+       inhabits the island does not dare travel. To the west the forest\r
+       clears, and to the north is a clearing, upon which you can see a\r
+       ring of huge stones.\r
+ifrst6 light\r
+       %ifrst4\r
+       This is a forest on a steep hill, leading from an oak forest to the\r
+       west upwards to a clearing containing a huge ring of stones to the\r
+       north. Southwards the trees also end, and to the north the rough\r
+       sea crashes against the island.\r
+ifrst5 light\r
+       Thicket.\r
+       This is a thicket, straddling the island. To the southeast it isolates\r
+       a barren headland, and to the east is a windswept cove. West is\r
+       wilderness which slopes up northwards, and to the north is level\r
+       ground, but over which hangs an aura of intense danger.\r
+slope1 light\r
+       Steep slope.\r
+       This is a steep slope, running upwards to the north. Beyond more\r
+       slopes, at the top of the rock, a huge ring of stones can be seen,\r
+       a scene which dominates the whole island. To the east is a thicket, and\r
+       to the west an arcane forest. Southwards, the slope meets the sea in\r
+       a bay which looks just about calm enough to sail a small craft.\r
+fring  light   nolook\r
+       Fairy ring.\r
+       You are stood in a desolate spot. The only noise is the howling wind\r
+       as it comes off the sea beyond a cove to the southeast. In the\r
+       centre of this wilderness is a fairy ring, a circle etched out by\r
+       toadstools many centuries before. No animals or birds of the island\r
+       will go in the area, although it it large enough for a human to enter.\r
+       North and west are slopes leading upwards to a plateau at the top of the\r
+       rock of an island, and northeast is forest.\r
+slope2 light\r
+       %slope1\r
+       You are stood on a steep slope, leading upwards to the north. At the\r
+       top, there levels out a plateau on the top of the rock which is this\r
+       island. East is forest, south and west more wilderness.\r
+slope3 light\r
+       %slope1\r
+       This is a cleared piece of wilderness which slopes up northeastwards.\r
+       All around is more of the same, except to the west where is a strange\r
+       and arcane forest.\r
+slope4 light\r
+       %slope1\r
+       This is a stretch of wilderness sloping upwards to the east onto a\r
+       plateau surmounted by a druidic ring of stones. North is s forest,\r
+       and west the slope levels out into a forest of oak.\r
+rost   light\r
+       Ring of stones.\r
+       You find yourself overawed by the huge ring of stones which encircle\r
+       this, the highest part of the island rock. As the wind sweeps over from\r
+       the rugged cliffs to the east and north, the whistling is broken only\r
+       by the lonely cries of the ravens which hover above. To the south and\r
+       west are steep slopes downwards. Far, far away in the distance on the\r
+       southeast horizon can be glimpsed the sail of a wrecked ship. In the\r
+       centre of the ring of stones is a large, heavy, bloodstained, slate,\r
+       sacrificial slab. Many people have been killed here.\r
+brost  light\r
+       Beneath ring of stones.\r
+       You are underneath the ring of stones, in a druidic chamber not entered\r
+       these past two thousand years until today. Light comes from the way out,\r
+       which is above. The walls of the chamber are stained red with the blood\r
+       from the sacrifices above. Steps lead down to the southwest.\r
+dtest1 light   nolook\r
+       Steps down.\r
+       As you go down, an axe swings out from above, but with a swish of your\r
+       magic sword you deflect it to one side. The way from here is a\r
+       downward climb, which you won't be able to climb back up, or the way\r
+       you came from the steps to the northeast. The floor is carpeted in a\r
+       heavy mist, so you cannot see your feet.\r
+dtest2 light   nolook\r
+       Niche room.\r
+       You start your descent, and the rocky walls change into clayy earth.\r
+       Suddenly, a clod comes loose from a tricky section, and you fall back.\r
+       With amazing speed you hook out with your sickle and it digs into the\r
+       wall, saving you from falling. You get to the bottom safely. There is\r
+       no exit, only a niche in the wall, to put things into. The floor is\r
+       covered in mist.\r
+dtest3 light   nolook\r
+       Druid room.\r
+       This most ancient of rooms is the old temple of the druids who once\r
+       lived upon this island. It is bare, the druids having taken their\r
+       paraphenalia with them when they fled The Land. Written onto the\r
+       wall in blue daub reads, "With the fork of gold eat the sprig of\r
+       pearls." There is a doorway to the north, and no apparent light\r
+       source although the room is illuminated.\r
+dtreas light   nolook\r
+       Druidical treasure chamber.\r
+       The room in which you find yourself is the most wonderous you have\r
+       ever glimpsed, its walls impregnated with starstones and the air\r
+       thickly scented with the drowsy aromatic sweetness of mistletoe.\r
+       The way out is via a rectangular hole in the roof.\r
+dead20 light   death\r
+       An unseen strong current suddenly drags hold of your little craft and\r
+       sucks it underwater. You splash about, but eventually drown. Sigh.\r
+vrocks light\r
+       Vicious rocks.\r
+       You are landed by some vicious rocks out at sea. A strong current\r
+       flows past at alarming speed round the tattered, half-submerged\r
+       wreckage of a galleon stuck forlornly on them. You can cross to the\r
+       deck of the ship by going northwards, but its front half is underwater.\r
+       To the east in the distance can be seen a beach and cliff. Quite a way\r
+       to the south there looks to be a small island, dominated by a huge\r
+       archway which stands astride it.\r
+deck   light\r
+       Deck.\r
+       You are stood on the deck of a wrecked galleon. To the south are some\r
+       vicious rocks. Upwards, the main mast, still unbroken, leads to the\r
+       crow's nest; to the east are steps to the poop deck, and to the\r
+       northeast is the Captain's cabin. Downwards is the hold.\r
+crow   light   small\r
+       Crow's nest.\r
+       You are perched in the crow's nest, high above the sea where it juts\r
+       out from the deck below. Far, far to the northwest can be glimpsed a\r
+       mysterious island, and to the east over the sea are cliffs.\r
+stpoop light   small\r
+       Steps.\r
+       You are on some shakey steps leading from the deck upwards to the poop.\r
+poop   light\r
+       Poop deck.\r
+       You are on the poop deck of the wrecked galleon. Westwards, steps lead\r
+       down to the deck. The wheel of the ship is stiffened and will not move\r
+       an inch. A name carved into it reads, "H.M.S. Essex".\r
+capt   light\r
+       Captain's cabin.\r
+       This cabin was once occupied by the captain of the ship. Most of the\r
+       contents have been washed away, and all that remains is driftwood. To\r
+       the southwest is an opening leading to the deck, and a hole in the\r
+       floor leads downwards to the galley.\r
+galley light   nolook\r
+       Galley.\r
+       This used to be the kitchen of the galleon, but all the utensils have\r
+       been washed away. A hole in the floor leads to the powder room, and\r
+       one in the roof leads to the captain's cabin.\r
+proom  light\r
+       Powder room.\r
+       The smell of sulphur fills the air as you look around you in the\r
+       storage place for gunpowder. Most of the kegs have been broken by the\r
+       elements, and are now useless. There was a way down but it is flooded.\r
+       Upwards is an opening in the ceiling to the galley.\r
+hold   light\r
+       Hold.\r
+       This is what remains of the hold which is unflooded. The walls are\r
+       stained black with the pitch used for waterproofing. The only\r
+       exit is upwards to the deck.\r
+dead23 light   death\r
+       You enter the powder room, and smell sulphurous fumes just before\r
+       igniting the powder ingrained in the wooden walls, and blowing\r
+       yourself to kingdom come. At least you went with a bang!\r
+bwfall small   light   nolook\r
+       Behind waterfall.\r
+       You are in a small room behind a thundering waterfall. Above and\r
+       around you is a mighty cliff, and the walls of the cave glitter as\r
+       they catch the fractured light from outside. A spiral staircase to\r
+       the east leads upwards into the rock.\r
+spiral small\r
+       Spiral staircase.\r
+       This is a spiral staircase, carved into the rock. Above, the steps\r
+       stop and a vertical section of steps follows. Below can be heard a\r
+       thundering crescendo of noise, and the sea can be smelled.\r
+vert   small   dmove   spiral\r
+       Vertical staircase.\r
+       This is a tight vertical climb, the steps hewn into the rocks in a\r
+       ladder-like arrangement. Above is a small room whence a hum ensues,\r
+       and below is a spiral staircase leading downwards.\r
+revrm  small\r
+       Reverberating room.\r
+       The walls around you in this small, oval room are humming as the\r
+       crashing of the waterfall outside resonates through the cliff. The\r
+       way out is a vertical climb leading downwards to the west, and another\r
+       passage runs northwards on the same level.\r
+revps  small   light\r
+       Reverberating passage.\r
+       This passage also reverberates with the crashing of the waterfall\r
+       outside, but not so much as the reverberating room to the south.\r
+       Light comes from an opening onto a room to the north.\r
+grotto light\r
+       Grotto.\r
+       This is a grotto, high up in the cliffs, but concealed from the beach by\r
+       an overhang. Out to sea can be seen a wrecked ship, tossed by some\r
+       fearful storm onto a pincushion of vicious rocks. Above is the cliff.\r
+fossrm small\r
+       Fossil room.\r
+       This ancient room has not been visited in centuries until this day. Its\r
+       walls are studded with ancient fossils of creatues belonging to a bygone\r
+       era. An eerie sense of awe and wonder permeates the timeless cave.\r
+fortun light\r
+       Forbidding tunnel.\r
+       You are in a forbidding tunnel underneath a mighty cliff. Light comes\r
+       from the western end, from which can also be heard the sound of the\r
+       sea. At the eastern end the rock becomes harder and the sea has not\r
+       eroded it. However, there are support braces for a heavy iron grate\r
+       there, in the roof.\r
+smuggl\r
+       Smugglers' cave.\r
+       The irregularily-shaped room in which you find yourself is an old\r
+       cave, initially opened up by the sea but since enlarged upon by man.\r
+       Years ago, it was used as a hiding place by smugglers. In the floor\r
+       is a heavy iron grate, and below is a forbidding tunnel.\r
+oglair\r
+       Ogre's lair.\r
+       This is a large room used as a home by an ogre. The floor is littered\r
+       with the bones of the dead, licked clean by the monster. A dark passage\r
+       exits to the north, and there is a small opening to the south. The\r
+       smell in the room is reminiscent of animals, and of the grave...\r
+ydead8 light   death\r
+       The ogre picks up his club and pounds you into the ground.\r
+leprm  small\r
+       Leprechaun room.\r
+       This is a small but pretty room owned by a leprechaun. The furniture\r
+       and ornaments are much too small to be of use to a human, however. The\r
+       only way out is to the north, whence a rotting smell ensues.\r
+befidl light\r
+yrdead light   death\r
+       You are splattered over a very large area, or at least most of you\r
+       is. The rest of your remains are, even now, being eaten by the\r
+       seagulls (especially your eyes). If you'd have looked properly before\r
+       you leaped you might have decided not to jump!\r
+outhut light\r
+       In front of hut.\r
+       You are standing in front of a ramshackle hut. Behind you is a field\r
+       of gorse. Further on to the south you can see a fast flowing river.\r
+       To the east you can see a range of mountains wreathed in mist and\r
+       to the west is a small cottage.\r
+root   light\r
+       Root room.\r
+       You are in a room of tangled yew roots. There appears to be a passable\r
+       gap to the north from whence emanates a dim light; to the south has\r
+       been hewn a smooth tunnel. Light comes from a hollow tree stump above.\r
+rtun1  light\r
+       Root tunnel.\r
+       You are in an underground tunnel, with dry roots hanging from the\r
+       walls, and littering the floor. As you walk, you feel the twigs\r
+       snapping under your feet. The tunnel runs north to south, with a\r
+       dim light coming from the northern end, and a room of roots to the\r
+       south.\r
+rtun2  light\r
+       Northern part of root tunnel.\r
+       You are in the northern part of a subterranean tunnel, its walls and\r
+       ceiling a mass of dangling, dry root from the tree above. There is a\r
+       dim light to the north, where the tunnel opens up. To the south, the\r
+       tunnel continues.\r
+ydead1 light   death\r
+       As you push your way through the hanging roots, the tinder dry wood\r
+       catches fire from your burning torch. The flames leap rapidly from\r
+       root to root, and soon you are surrounded by a raging fire. You feel\r
+       your body charring as you fall to the ground in utter agony...\r
+dead10 light   death\r
+       When you drop your torch, the tinder dry wood ignites from the\r
+       flame and an instant later you are burned to a frazzle as the\r
+       sparks flash across the roots. Serves you right for playing with\r
+       fire...\r
+altar  light\r
+       Sacred room.\r
+       You are standing in a room faced with smooth marble. The central\r
+       feature is a large, immobile block, out of which springs a tall flame,\r
+       throwing the empty corners of the room into vague, flickering shadow.\r
+       To the east is a dark tunnel, and to the south the only other entrance.\r
+antech small   light\r
+       Ante chamber.\r
+       You are standing in a small chamber carved out of the earth. To the\r
+       west is a tunnel, out of which emanates a dim glow. A mysterious\r
+       doorway is to the east, painted in a deep crimson colour.\r
+hchamb\r
+       Hallowed chamber.\r
+       This is a sanctified, hallowed chamber, set off from the main temple by\r
+       an opening to the south. A faint smell of bitter incense still hangs\r
+       silently in the cold air. Most of the treasures which were once to be\r
+       found here have been stolen.\r
+temple\r
+       Temple.\r
+       You are in a silent, sinister temple, its walls and a doorway to the\r
+       west painted in a deep crimson colour. The scent of stale incense\r
+       still lingers on, although the temple has remained unused for some\r
+       time and most of its trappings have been removed. A sliding chute\r
+       leads down to here from the east, but it is impossible to ascend.\r
+       In the north wall is an opening to a small chamber.\r
+tunnel\r
+       Earth tunnel.\r
+       Before you is a convoluted earth tunnel. It seems to have been made\r
+       by a gang of cheery dwarves. Then again it might not have been. The\r
+       only exits appear to be to the north and southeast.\r
+lgrm\r
+       Large room.\r
+       This is a very large room, at least 60 feet in diameter and some 20\r
+       feet high. There are no apparent doors, but the walls are so full of\r
+       nooks and crannies that you might be able to go in any direction if\r
+       you tried. The only obvious exit is to the northwest.\r
+wolfrm\r
+       Wolf room.\r
+       The evil stench of death hangs heavy on the wind in this most noxious\r
+       of rooms. The walls and floor are coated with the crusted excrement of\r
+       some massive hound, including the bones of brave men, licked clean\r
+       in some ghastly display of macabre carnage. There is an exit to the\r
+       west, and a deathly passage leading down...\r
+deathp\r
+       Deathly passage.\r
+       This passage carries the scent of death, as it slants down from the\r
+       west to deep underground at the east. A stream of dried blood meanders\r
+       from the room at the top, and at the bottom the passage levels off.\r
+cinder nolook\r
+       Cindered room.\r
+       The floor on which you stand is deep in cinders, and its walls are\r
+       blackened with soot from some incredible fire which must have once\r
+       raged here in some lost time. The walls beneath the soot are\r
+       glass-like, fused together by the radiant energy of the inferno.\r
+       To the west is a passage leading upwards, and to the east a strange\r
+       portal...\r
+diamnd nolook\r
+       Diamond room.\r
+       When you enter the room, you feel a sudden sense of change around\r
+       you, although you cannot pinpoint the exact reason behind the\r
+       instinct. You soon forget this, however, as your eyes catch sight\r
+       of the floor: it is studded with diamonds! You leap down to pick them\r
+       up, but most are solidly fused in place. Looking around you, you see\r
+       a deathly passage sloping upwards to the west, and a strange doorway\r
+       to the east...\r
+firept light   hideaway\r
+       Fiery pit.\r
+       A narrow ledge here is the only safe place to tread, as a bubbling\r
+       pit of fiery tar and sulphur is on either side. The only exit is to\r
+       the west, into a passage still heated by the flames from the pit.\r
+       Breathing is difficult, but you can still get enough oxygen, albeit\r
+       with discomfort.\r
+estlpl\r
+       East side of still pool room.\r
+       You are in a vaguely circular room with a high ceiling. The\r
+       way west is interposed by a large pool, but east is a hole in the wall.\r
+wstlpl\r
+       West side of still pool room.\r
+       You are on the west side of the still pool room. There appear to\r
+       be no exits.\r
+tombrm\r
+       Tomb room.\r
+       Above you, a set of narrow stairs lead upwards out of the tomb. To the\r
+       south is a scraped-out passage, above which is scrawled in crimson,\r
+       "EMERALD AND RED HAVE VALUE". The rest of the walls appear devoid of any\r
+       markings and there appears to be no other exit apart from the passage to\r
+       the south.\r
+rottrm\r
+       Rotting room.\r
+       You are in a room of badly hollowed-out earth. The floor is littered\r
+       with rotting debris as if some evil feast of saphrophitic carnage\r
+       had been interrupted by your arrival. The only ways out from this\r
+       foul-smelling hole seem to be to the west and north.\r
+cavein\r
+       Caved-in grave.\r
+       You are underneath a caved-in grave, although there is no way up\r
+       to the surface from here. Most of the corpse from the grave appears\r
+       to have been devoured so perhaps the cave-in was no accident...\r
+       To the west is a small chute which leads downwards, but you won't\r
+       be able to come back if you take it, or carry anything with you.\r
+befgte light\r
+       Before Gate.\r
+       You are standing in front of a huge oaken gate, rotted through over\r
+       the ages so passage is easy. To the north is a narrow ledge over a deep\r
+       pit, and to the south a dark passage whence drifts the scent of animals.\r
+       The scene is visible by light beyond a smallish hole in the west wall.\r
+       You can travel through the gate, to the east.\r
+bef1\r
+       Before idol.\r
+       You are stood in front of a huge idol of a cyclops, hewn into the\r
+       rock face and towering above you. To the west is a large doorway but\r
+       the door has long since rotted away. Stairs run up the side of the idol\r
+       to an opening at the mouth, and beyond. To the north is a small opening.\r
+crypt\r
+       Ancient crypt.\r
+       As you crawl out through the room, a sense of reverence comes over you,\r
+       for you find you are in a crypt. It has obviously not been entered for\r
+       a long time, and is stark and sparse save for a marble block in the\r
+       centre of the room, which is immobile.\r
+ydead5 light   death\r
+       As you leap, you suddenly realise that you are about to be splattered\r
+       all over the floor. Sure enough, you are.\r
+ydead4 light   death\r
+       As you start to cross the narrow ledge, the ox, nervous because of the\r
+       tremendous drop, is reluctant to follow and gives you a nudge with\r
+       its nose. You are knocked off balance and plummet downwards, breaking\r
+       into little pieces when you finally hit the bottom.\r
+saltar small\r
+       Small altar room.\r
+       You are in a small room with an altar in front of you. Apart from the\r
+       narrow ledge there is no way out.\r
+mthidl\r
+       Outside mouth of idol.\r
+       You are stood by the mouth of a large and ancient idol of a cyclops.\r
+       To the west, lower down, can be seen a tall but rotted gate. Above\r
+       are the nose and eye of the colossus.\r
+inmth\r
+       Inside mouth of idol.\r
+       You are stood in the opening at the mouth of the idol. The walls are\r
+       blacked with the incense of ages passed. An opening to the east leads\r
+       deeper into the rock, whereas the mouth of the idol is to the west.\r
+hollow\r
+       Hollowed-out passage.\r
+       This is an east-west passage, carved through the granite of the\r
+       mountain. At the west end is an opening to a small room, and at\r
+       the east a junction with some roughly hewn steps going downwards,\r
+       and the rest of the passage. The steps downwards curve away to the left.\r
+rsteps\r
+       Roughly hewn steps.\r
+       You are on a spiral staircase, curving downwards into the bowels\r
+       of the mountain. The walls are solid rock, and the staircase is\r
+       narrow.\r
+Rockps\r
+       Rock passage.\r
+       This is a passage carved into the rock, running east-west. At the\r
+       west end the passage continues, and makes a junction with some\r
+       steps leading downwards. At the east end the passage opens into\r
+       a chamber of some description.\r
+chambr\r
+       Ancient chamber.\r
+       This is a ghostly chamber, its aged walls decorated with strange\r
+       glyphs and ancient runes which you cannot understand. To the west\r
+       is an opening to a passage. The eerie shadows cast by your light\r
+       add to the feeling of time and wonder you sense around you.\r
+uland1\r
+       Staircase landing.\r
+       You are stood in a small open area, which makes a junction a spiral\r
+       staircase leading both up and down. The steps down are much more\r
+       worn than those up, and the landing shows signs of recent use. To\r
+       the north is a battle-scarred oaken doorway.\r
+guadrm\r
+       Guard room.\r
+       You are in a plain room of sanded granite, with seats set into the\r
+       wall which are well worn. To the south is an oaken doorway.\r
+wstep1\r
+       Worn steps.\r
+       You are on a worn spiral staircase leading both up and down.\r
+wstep2\r
+       %wstep1\r
+       You are on a worn spiral staircase leading both up and down.\r
+wstep3\r
+       %wstep1\r
+       You are on a worn spiral staircase leading both up and down.\r
+uland2\r
+       Bottom of worn steps.\r
+       You have reached the bottom of some worn steps, and find yourself in\r
+       a roughly-made room. The steps lead upwards, and to the west is an\r
+       exit to a natural cavern.\r
+natcav\r
+       Natural Cavern.\r
+       This is a large natural cavern, caused by fissures in the rocks eons\r
+       ago. There is a well-worn path leading east-west, although the\r
+       cavern is bedded with granite. At the east end are steps to a landing;\r
+       at the west the cavern joins a north-south passage.\r
+passg1\r
+       Passage.\r
+       You are in a narrow, north-south passage which continues in both\r
+       directions. To the west is a doorway, and to the east is an entrance\r
+       to a natural cavern.\r
+passg2\r
+       %passg1\r
+       This is a narrow north-south passage. At the north end is a doorway,\r
+       and to the south the passage continues.\r
+passg3\r
+       %passg1\r
+       This is a narrow north-south passage. At the south end is a doorway,\r
+       and to the north the passage continues.\r
+passg4\r
+       %passg1\r
+       This is a narrow east-west passage. At the east end is a doorway, at\r
+       the west an opening to a room.\r
+passg5\r
+       %passg1\r
+       This is a narrow east-west passage. At the east end is a doorway, at\r
+       the west an opening to a room.\r
+passg6\r
+       %passg1\r
+       You are in a narrow north-south passage. At the south end is a doorway,\r
+       at the north an opening to a room.\r
+passg7\r
+       %passg1\r
+       You are in a narrow north-south passage, opening to a room at either\r
+       end.\r
+passg8\r
+       %passg1\r
+       This is a narrow east-west passage, with a doorway at the west and and\r
+       an opening to a room at the east.\r
+passg9\r
+       %passg1\r
+       You are in a narrow east-west passage. To the east are steps leading\r
+       upwards, and to the west the passage curves away to the left as you\r
+       look at it. In the north wall is a doorway.\r
+pass10\r
+       %passg1\r
+       This is a narrow stretch of passage running east-west. At the east end\r
+       it joins a crooked passage, and at the west it stops. There is an\r
+       opening in the north wall at the west end leading to a long passage, and\r
+       one in the south wall at the west end leading into a room.\r
+gob1\r
+       Goblin lair.\r
+       This is a filthy room, vaguely square, with a doorway in the south wall\r
+       and an opening to a passage in the west.\r
+gob2\r
+       %gob1\r
+       This is a filthy room, roughly square-shaped, with a doorway on the\r
+       west wall and openings to passages in the north, east and south.\r
+gob3\r
+       %gob1\r
+       This dirty room is roughly square-shaped, with a doorway on the north\r
+       wall and an opening to a passage on the east.\r
+gob4\r
+       %gob1\r
+       This is an unclean room, rectangular in shape, with an opening to the\r
+       south and a doorway to the north. There doesn't appear to be any way\r
+       of opening or unlocking the door from this side.\r
+gob5\r
+       %gob1\r
+       This disgusting room is square-shaped. In the east wall is a doorway,\r
+       and to the south is an opening to a passage. There is a steep chute\r
+       in the north wall, leading down, but if taken you won't be able to\r
+       get back up through it.\r
+treasc\r
+       Treasure chamber.\r
+       You find yourself in a room decked out in all manner of fabulous\r
+       valuables hoarded by the goblins over the years. Most of them,\r
+       however, are fabulous only in the eyes of goblins and there mightn't\r
+       be any you'd consider as treasure yourself. To the south in this room\r
+       is a doorway, and there is also a chute leading upwards, but it's\r
+       impossible to ascend.\r
+ewstep\r
+       East-west steps.\r
+       You are on a staircase running down to the west and up to the east. At\r
+       the top is a room, at the bottom a passage.\r
+curve\r
+       Curved passage.\r
+       This is a semi-circular passage, which bends to the east onto a passage\r
+       at the north end, and to the northeast onto a diagonal passage at the\r
+       southernmost end. If looked at from above, with north at the top and\r
+       south at the bottom, it could be described as the left half of a circle.\r
+diagps\r
+       Diagonal passage.\r
+       This is a narrow passage, running diagonally from the southwest to the\r
+       northeast. At the southwest end, it comes onto a passage which curves\r
+       away to the right, and at the northeast end is space for a vertically\r
+       sliding panel.\r
+spanel\r
+       Sliding panel room.\r
+       In this room you find space for a vertically sliding panel in the east\r
+       wall, but apart from that there are no interesting features. The only\r
+       exit is to the west where steps lead downwards. The place where the\r
+       panel goes has solid rock behind it.\r
+bluerm small\r
+       Blue room.\r
+       This is a smallish room, painted in a bright royal blue for some reason,\r
+       from the ceiling to the floor. The way out is to the southwest, behind\r
+       where a vertically sliding panel is obviously intended to go.\r
+longps\r
+       Long passage.\r
+       You are in a long, narrow, north-south passage. At the north end it\r
+       goes into a room, at the south it joins a crooked passage running\r
+       east-west.\r
+crookp\r
+       Crooked passage.\r
+       This is a crooked passage running essentially east-west. At the west\r
+       end it straightens out, and at the east are narrow steps leading down.\r
+       There is an opening in the north wall leading onto a long passage.\r
+nstep1 small\r
+       Narrow steps.\r
+       You are on some narrow steps, running a long way downwards from west to\r
+       east.\r
+nstep2 small\r
+       %nstep1\r
+       You are on some narrow steps, running up from east to west. The steps\r
+       are old, and look rarely used.\r
+nstep3 small\r
+       %nstep1\r
+       You are on some narrow steps, running up from east to west. The steps\r
+       are old, and look rarely used.\r
+uland3\r
+       Bottom of stairs.\r
+       You are in a small landing, deep in the bowels of the earth. The only\r
+       way out looks to be by some steps at the west end which run upwards. In\r
+       the northwest corner of this oval-shaped room is a widish, polished\r
+       chute, but it runs upwards and is slippery, so you cannot take it. Don't\r
+       know why I bothered mentioning it, actually!\r
+lsp1\r
+       Long sloping passage.\r
+       This is a long, sloping passage, running from the south upwards to the\r
+       north, with openings at both ends.\r
+lsp2\r
+       %lsp1\r
+       This is a long, sloping passage, running from the south upwards to the\r
+       north, with openings at both ends.\r
+lsp3\r
+       %lsp1\r
+       This is a long, sloping passage, running from the south upwards to the\r
+       north, where can be seen a dim light.\r
+river3 light\r
+       Underground river.\r
+       You are on the banks of a fast-flowing river. High above is an opening\r
+       in the mountain, whence comes daylight, but it is impossible to reach\r
+       it. The river flows east-west, but underground at either end so you\r
+       cannot follow it. There is a slight bank to the north of you, and a\r
+       passage sloping downwards to the south.\r
+nbank  small   light\r
+       North bank of underground river.\r
+       This is the north bank of the river, and is slightly muddy but not bad\r
+       enough to make you slip. Light comes from the opening high above.\r
+cannrm\r
+       Cannon room.\r
+       You are in a square-shaped room. To the north is an opening onto a\r
+       passage, and to the south is a doorway. In the room, facing the\r
+       doorway, is an old ship's cannon.\r
+fowrm  light   small\r
+       Fountain room.\r
+       An unmistakable sense of magic pervades this small room. In one corner\r
+       is a marvellous fountain, sprinkling sparkling water 6 feet into the\r
+       air. To the north is an opening to a larger room, but there are no\r
+       other exits.\r
+eyedol small\r
+       Nose and eye of idol.\r
+       You are at the top of the idol. The stairs go no further.\r
+attic  light\r
+       Attic.\r
+       This is attic, or the loft. Dust of ages past lies here, barely\r
+       disturbed for generations. The thatched roof of the cottage adds\r
+       to the generally musty smell, and sense of mystery and excitement.\r
+       You can see because a thinning section of thatch lets the light in.\r
+cuptop nolook\r
+       Top of cupboard.\r
+       You are stood at the top of the ladder in the cupboard. The walls\r
+       are old and the plaster is cracking, especially at the join with\r
+       the cupboard's ceiling. The ladder is very firm and steady.\r
+dead11 light   death\r
+       The cupboard is very small, and as you ascend the ladder you suddenly\r
+       realise that you are running out of air! Try as you might, you cannot\r
+       break your way out of the place, although you bash at all the walls,\r
+       and the ceiling and floor. Eventually you suffocate. Now you know how\r
+       the scratch marks on the wall were made!\r
+laddrm light   small   dmove   uhut\r
+       Ladder Shaft.\r
+       You are on a ladder, halfway between a hut and an underground room\r
+       dug into the earth. The inside of the hut can be observed through\r
+       holes in the floorboard, and it appears to have walls decorated with\r
+       animal trophies and other assorted items.\r
+uhut\r
+       Underground Room.\r
+       This is an underground room, once used as a den by some forester,\r
+       perhaps. Its floor is covered with a soft moss, and it is surprisingly\r
+       comfortable, with evidence of once having an easy chair, and a fire\r
+       underneath a shaft (for ventilation). The shaft leads upwards and\r
+       contains a ladder affixed to the walls. To the west is a very small\r
+       tunnel, which you can squeeze into but won't be able to turn in.\r
+stun1  small\r
+       Small tunnel.\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       north to the east.\r
+stun2  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       west to the south.\r
+stun3  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       northwest to the east.\r
+stun4  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       south to the southeast.\r
+stun5  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       southwest to the north.\r
+stun6  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       northwest to the northeast.\r
+stun7  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       west to the southeast.\r
+stun8  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       north to the east.\r
+stun9  small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       northwest to the south.\r
+stun10 small\r
+       %stun1\r
+       You are in a small, claustrophobic, earthen tunnel, curving from the\r
+       north to the southeast.\r
+dsteps light\r
+       Steps to cellar.\r
+       You are on some granite steps leading downwards to the cellar. There\r
+       is a hallway above to the northeast, and below is a dank cellar.\r
+cellar light\r
+       Cellar.\r
+       This is a dank, murky cellar, its granite-faced walls stained with\r
+       mould and dust. Upwards to the northeast are steps, whence comes\r
+       light enough to see by. To the south is a crack in the wall, leading\r
+       to a small, earthen tunnel, although it looks very cramped and you\r
+       might not be able to turn round and come back were you to enter it.\r
+       To the west is the doorway to the coal bunker.\r
+dead15 light   death\r
+       As you attempt to move in a direction other than along the passage,\r
+       the soft earthen wall starts to crumble. You try to pack it back,\r
+       but the effect increases until the whole tunnel is falling about\r
+       your ears. Desperately, you claw your way through the disintigrating\r
+       passage, but the roof caves down and you are trapped, buried alive\r
+       under the huge weight of soil. A terrible way to go...\r
+dead16 light   death\r
+       You smash yourself into the rocks below and are consequently killed.\r
+sloptn small\r
+       Sloping tunnel.\r
+       This is a small tunnel sloping from the north down to the south. Its\r
+       walls are earthy but hardened, and only about two feet apart.\r
+level\r
+       Level room.\r
+       The floor of this square-shaped room lies on bedrock, and has been\r
+       chiselled painstakingly so as to be perfectly level. To the north is\r
+       a narrow passage, sloping upwards, and to the south is a short flight\r
+       of steps leading down to a muddy room.\r
+mudrm\r
+       Mud room.\r
+       In this room, a large amount of reddish mud lies on the floor. The\r
+       floor is otherwise of unchiselled bedrock. A short flight of steps\r
+       to the north leads upwards into a square room with a level floor.\r
+schamb\r
+       Small chamber.\r
+       You are in a small chamber with dry, earthy walls. The only exit is\r
+       to the west where you can see a room, its floor is deep in reddish mud.\r
+hotpas light\r
+       Hot passage.\r
+       You are in a hot passage running east-west. At the west end is a\r
+       strange doorway, and at the east is a fiery pit, which makes the\r
+       atmosphere clammy, and thick with sulphurous fumes.\r
+dead19 light   death\r
+       Kingdom come.\r
+       You find yourself blown to kingdom come. Not really the ideal place\r
+       to spend the rest of your life, especially when you're dead. Next\r
+       time you'll know to put a fuse in and blast with the keg instead of\r
+       trying to burn it...\r
+dead27 light   death\r
+       The ox, afraid of the thundering waterfall, nudges you with its snout\r
+       as you walk under. You trip, and are drowned by the waters, held\r
+       underneath the surface by the falling torrent. Glug glug.\r
+dead28 light   death\r
+       The die comes up one. For an instant, it seems to glow a hellish red,\r
+       then there is an ear-splitting crack, as if the very fabric of the\r
+       universe had been rent. The die explodes into uncountable shards, and\r
+       you are killed by the blast. The goddess of luck must really dislike\r
+       you...\r
+dead29 light   death\r
+       Mistletoe is poisonous, simpleton! Don't you know ANYTHING?\r
+dead30 light   death\r
+       You try to set sail, but the seas are much rougher than you had\r
+       anticipated. Desperately, you try to make your way back to the shore,\r
+       realising that death is inevitable. You are right, and inevitably die.\r
+dead31 light   death\r
+       Off you jump, safe in the knowledge that your pseudo-parachute will\r
+       save you from certain death. Unfortunately, the strong winds coming\r
+       off the sea blow it out of your hands! Guess what happens next..?\r
+dead33 light   death\r
+       You poison yourself, simpleton.\r
+dead34 light   death\r
+       You start to move, and suddenly the squirrels start acting very\r
+       viciously. They scamper about you scratching and clawing, then, as\r
+       one, they leap at you and start gnawing at your flesh with their\r
+       sharp incisors. You try to beat them off, but they are too many and\r
+       are incensed by something into a maddened rage. Eventually you are\r
+       torn to pieces. I wonder what it is you did? Or didn't do?\r
+dead37 light   death\r
+       >-KABOOM-<\r
+dead39 light   death\r
+       You walk out of the coal bunker, but the coal dust by the door ignites\r
+       from your brand, and an instant later you find you aren't.\r
+dead40 light   death\r
+       All of a sudden the lit torch you are carrying sets fire to your boat,\r
+       and within seconds the wood is in flames. You look about in horror as\r
+       your little craft burns to nothing before your very eyes. Glug glug ()\r
+       glug ().\r
+dead41 light   death\r
+       All of a sudden, from out of nowhere, comes a wall of water, crashing\r
+       towards you with immense power! You are hopelessly trapped, and although\r
+       you try your best you've no time to react. To cut a long story short,\r
+       you get buffeted against the floor and pounded to death. And if you'd\r
+       have survived that you'd have drowned, too...\r
+dead43 light   death\r
+       You leap off, hoping that for some reason you won't kill yourself\r
+       when you land. Where you got that idea from I'll NEVER know...\r
+@txtmap\r
+START\r
+/\r
+     <> [Forest]<>     [Foot]  |\r
+                       [Hills] | [wall]\r
+                               |\r
+- - - - ------------------------6 - - - -\r
+             Narrow Road         [Way Out]\r
+- - - - ------------------------5 - - - -\r
+                               |\r
+                       [Foot]  | [wall]\r
+     <> [Forest]<>     [Hills] |\r
+/\r
+ROAD2\r
+/\r
\r
+            <> [Forest]<>\r
\r
+- - - - ------------------------- - - - -\r
+             Narrow Road\r
+- - - - ------------------------- - - - -\r
\r
+[Veg.\r
+Garden         Gorse]       <> [Forest]<>\r
+/\r
+OSTART\r
+/\r
+<> [Forest]<>  |                  |     <> [Forest]<>\r
+            |  [Cemetery]   |\r
+            |             |\r
+- - - - -----6----     ----6----- - - - -\r
+[Beaten Track] Narrow Road\r
+- - - - ---------5     4--------- - - - -\r
+                |     |\r
+[Flower]                | [Path]|      [Veg.\r
+Garden]                 |     |        [Garden]\r
+/\r
+HOME\r
+/\r
+[ROOT          MAZE1           INMTH]          Also    [START] out\r
+                                                       [STORE] in\r
+       4------------------5                            [SWAMP] swamp\r
+[CAPT]    |    HOME       |    [NATCAV                 ROST]   jump\r
+       3------------------6                            [BDRM]  up\r
+                                                       [CANNRM]        down\r
+[BEACH]             <> [GLADE]<>               [CAVE]\r
+/\r
+STORE\r
+/\r
+       4---------------5\r
+       |               |\r
+       |     STORE     8       [your guess is as good as mine]\r
+       |               |\r
+       3---------------6\r
\r
+/\r
+LIMBO\r
+/\r
\r
\r
+               LIMBO\r
\r
\r
+/\r
+NFRST1\r
+/\r
+<> [Forested Slope]<>     <> [Forested Slope]<>\r
\r
+<> [Forest]<>     <> Forest<>     <> [Forest]<>\r
\r
+<> [Forest]<>     <> [Forest]<>     <> [Forest]<>\r
+/\r
+NFRST4\r
+/\r
+       |    <> [Forested Slope]<>\r
+       |\r
+   [cliff]|    <> Forest<>     <> [Forest]<>\r
+       |\r
+       |    <> [Forest]<>     <> [Forest]<>\r
+/\r
+@txtvoc\r
+       links\r
+       chip\r
+       oven\r
+       chair\r
+       triumph\r
+       burner\r
+       prod\r
+       rivet\r
+       onledge\r
+       greengem\r
+       herring\r
+       gateway\r
+       wvol\r
+       height\r
+       springh2o\r
+       mpoint\r
+       fitting\r
+       dwarfs\r
+       ore\r
+       duct\r
+       torrent\r
+       pickaxe\r
+       lantern\r
+       wheel\r
+       csselesu\r
+       sink\r
+       cord\r
+       arachnid\r
+       tooth\r
+       sandstone\r
+       coffin\r
+       corpse\r
+       carving\r
+       tombs\r
+       ratstop\r
+       spstop\r
+       cricket\r
+       anthracite\r
+       fish\r
+       commode\r
+       vermin\r
+       plaything\r
+       trumpet\r
+       nut\r
+       cup\r
+       scythe\r
+       signpost\r
+       clanger\r
+       fungus\r
+       sword\r
+       killer\r
+       ivory\r
+       sprig\r
+       pottery\r
+       time\r
+       tubes\r
+       creeper\r
+       paw\r
+       guardian\r
+       relic\r
+       fruit\r
+       pegasus\r
+       bird\r
+       onyx\r
+       pan\r
+       crystal\r
+       symbols\r
+       case\r
+       lookingglass\r
+       scarab\r
+       bunny\r
+       enemy\r
+       fissure\r
+       coat\r
+       warren\r
+       rings\r
+       ball\r
+       paper\r
+       cannon\r
+       spray\r
+       goblin\r
+       rodents\r
+       charm\r
+       enclave\r
+       utensil\r
+       sliding\r
+       cloth\r
+       fuse\r
+       curse\r
+       book\r
+       tome\r
+       adventurer\r
+       keg\r
+       boat\r
+       pen\r
+       marble\r
+       iron\r
+       infection\r
+       tub\r
+       earth\r
+       head\r
+       trapdoor\r
+       slidingwall\r
+       trpdoor\r
+       monster\r
+       fairy\r
+       crock\r
+       rock\r
+       necklace\r
+       knife\r
+       beast\r
+       view\r
+       eview\r
+       tview\r
+       wretch\r
+       stradivarius\r
+       pointer\r
+       violinbow\r
+       hound\r
+       wood\r
+       shell\r
+       bone\r
+       map\r
+       sheepskin\r
+       band\r
+       block\r
+       disk\r
+       animal\r
+       lake\r
+       ice\r
+       limb\r
+       idol\r
+       bedclothes\r
+       headstone\r
+       glove\r
+       birdofprey\r
+       any\r
+       lizard\r
+       switch\r
+       crucifix\r
+       oneway\r
+       slate\r
+       ram\r
+       ladder\r
+       secretdoor\r
+       drawbridge\r
+       rum\r
+       biscuit\r
+       magic\r
+       skeleton\r
+       toy\r
+       antidote\r
+       flower\r
+       trunk\r
+       parachute\r
+       haunt\r
+       rug\r
+       urn\r
+       veil\r
+       brass\r
+       man\r
+       woman\r
+       recorder\r
+       bangle\r
+       frog\r
+       nanny\r
+       china\r
+       platter\r
+       mace\r
+       metal\r
+       archway\r
+@txtcsy\r
+       sheets  bedclothes      ;these and the rest here might as well be for objects\r
+       covers  bedclothes\r
+       nuts    nut\r
+       bough   sprig\r
+       wedgewood       pottery\r
+       trophy  head\r
+       rodent  rodents\r
+       undead  enemy\r
+;;vocabulary objects\r
+@txtobj\r
+       chain   links   4000    40\r
+       mosaic  chip    10      5\r
+       stove   oven    0       0\r
+       trophy  triumph 1000    35\r
+       throne  chair   60000   200\r
+       forge   flame   0       0\r
+       poker   prod    3000    20\r
+       icicle  ice     1000    0\r
+       pot     container       2000    0\r
+       wandvolume      wvol    0       0\r
+       fur     coat    15000   7       \r
+       potty   container       1000    0\r
+       baton   pointer 60      0\r
+       violin  stradivarius    300     20\r
+       bow     violinbow       1000    0\r
+       stethoscope     tubes   750     12\r
+       emerald greengem        30      60\r
+       objonledge      onledge 100000  0\r
+       cliff   height  100000  0\r
+       bolt    rivet   1000    15\r
+       disc    disk    30      22\r
+       gate    gateway 100000  0\r
+       springwater     springh2o       100000  0\r
+       medpoint        mpoint  100000  0\r
+       dwarf   dwarfs  70000   25\r
+       tin     ore     2000    15\r
+       ventilator      duct    100000  0\r
+       uranium metal   1000    92\r
+       arch    archway 100000  0\r
+       flood   torrent 100000  0\r
+       pick    pickaxe 5000    0\r
+       lamp    lantern 1000    0\r
+       osselesu        csselesu        100000  0\r
+       valve   wheel   100000  0\r
+       filling tooth   1       10\r
+       sarcophagus     coffin  0       0\r
+       body    corpse  75000   58\r
+       inscription     carving 0       0\r
+       horn    trumpet 400     46\r
+       tomb1   tombs   0       0\r
+       tomb2   tombs   0       0\r
+       tomb3   tombs   0       0\r
+       tomb4   tombs   0       0\r
+       tomb5   tombs   0       0\r
+       tomb6   tombs   0       0\r
+       vase    china   4000    49\r
+       sceptre mace    200     48\r
+       rstop   ratstop 0       0\r
+       sptrap  spstop  0       0\r
+       coal    anthracite      1000    15\r
+       squirrels       rodents 0       117\r
+       slab    slate   100000  0\r
+       locket  charm   20      57\r
+       niche   enclave 0       0\r
+       fork    utensil 30      68\r
+       fleece  sheepskin       2000    50\r
+       headband        band    1000    175\r
+       skull   ram     100     175\r
+       acorn   nut     5       0\r
+       chalice cup     1500    25\r
+       sickle  scythe  1250    25\r
+       sign    signpost        15000   19\r
+       bell    clanger 3000    25\r
+       broadsword      sword   2250    163\r
+       longsword       killer  2250    0\r
+       sabre   sword   2250    0\r
+       rapier  sword   2250    0\r
+       epee    sword   2250    0\r
+       cutlass sword   2250    0\r
+       foil    sword   2250    0\r
+       scimitar        sword   2250    0\r
+       flute           recorder        750     20\r
+       effigy  sandstone       1550    41\r
+       bat     cricket 1250    15\r
+       toadstool       fungus  10      0\r
+       die     ivory   20      20\r
+       mistletoe       sprig   30      0\r
+       lever   switch  0       0\r
+       chart   map     300     0\r
+       mirror  lookingglass    1000    30\r
+       amulet  scarab  50      20\r
+       oracle  treasure        1200    10\r
+       ornament        pottery 10      71\r
+       sundial time    0       16\r
+       ivy     creeper 0       0\r
+       kipper  herring 52      7\r
+       foot    paw     30      5\r
+       apple   fruit   150     17\r
+       horse   pegasus 40000   48\r
+       gull    bird    1500    69\r
+       birdbath        sink    0       0\r
+       lion    onyx    1800    17\r
+       pancake pan     2000    7\r
+       crystals        crystal 100     0\r
+       bottle  rum     3000    49\r
+       wafer   biscuit 5       0\r
+       runes   symbols 100000  0\r
+       bookcase        case    0       0\r
+       libram  tome    3000    10\r
+       magazine        adventurer      300     31\r
+       rabbit  bunny   2000    7\r
+       rat     vermin  10000   8\r
+       hole    warren  0       0\r
+       scroll  paper   40      0\r
+       sphere  ball    20000   51\r
+       gun     cannon  0       0\r
+       ballview        view    0       0\r
+       fountain        spray   0       500\r
+       goblins goblin  20000   17\r
+       zombie  enemy   30000   18\r
+       skeleton        enemy   40000   25\r
+       magbar  any     0       0\r
+       panel   sliding 0       0\r
+       egg     curse   100     102\r
+       brick   block   0       0\r
+       naughty toggles 0       0\r
+       wardrobe        fitting 0       0\r
+       earrings        rings   20      15\r
+       silk    cloth   5000    28\r
+       string  fuse    10      0\r
+       logbook book    0       0\r
+       powder  keg     10000   0\r
+       coracle boat    10500   0\r
+       raft    boat    10500   0\r
+       quill   pen     5       6\r
+       moose   head    7500    40\r
+       grate   iron    0       0\r
+       barrel  tub     40000   0\r
+       mud     earth   0       0\r
+       portcullis      drawbridge      0       0\r
+       icon    relic   2000    300\r
+       golem   guardian        70000   60\r
+       beggar  wretch  45000   22\r
+       wolf    hound   140000  165\r
+       dragon  lizard  256000  1000\r
+       shark   fish    70000   120\r
+       dryad   wood    70000   50\r
+       pillar  marble  50000   30\r
+       conch   shell   300     23\r
+       fossil  bone    30      0\r
+       bracelet        bangle  100     70\r
+       plate   platter 500     85\r
+       prince  man     75000   50\r
+       beauty  woman   60000   50\r
+       toad    frog    1500    0\r
+       goat    nanny   20000   20\r
+       web     cord    0       32\r
+       spider  arachnid        20000   65\r
+       crack   fissure 0       0\r
+       tdoor   trapdoor        0       0\r
+       trpdor  trpdoor 0       0\r
+       sliwal  slidingwall     0       0\r
+       doll    plaything       2000    15\r
+       chest   infection       20000   15\r
+       ogre    monster 100000  35\r
+       leprechaun      fairy   10000   37\r
+       gold    crock   10000   50\r
+       granite rock    0       0\r
+       pendant necklace        700     75\r
+       pool    lake    0       0\r
+       pendview        view    0       0\r
+       leg     limb    5000    0\r
+       ox      beast   40000   75\r
+       blade   knife   0       0\r
+       eyeview eview   0       0\r
+       rootview        tview   0       0\r
+       tunview tview   0       0\r
+       eye     idol    100     39\r
+       statue  decoration      5000    19\r
+       cupboard        oneway  0       0\r
+       stepladder      ladder  100000  0\r
+       sdoor   secretdoor      0       0\r
+       wand    magic   500     0        \r
+       umbrella        parachute       1200    0        \r
+       parasol parachute       700     14\r
+       rattle  toy     100     0\r
+       bed     bedclothes      0       11\r
+       tree    trunk   0       0\r
+       grave   headstone       0       0\r
+       gauntlet        glove   2600    22\r
+       eagle   birdofprey      50000   79\r
+       tomb    haunt   0       0\r
+       potatoes        victuals        2500    40\r
+       wolfsbane       antidote        100     -200\r
+       hyacinth        flower  50      15\r
+       cross   crucifix        100     60\r
+       carpet  rug     7000    35\r
+       incense urn     1500    20\r
+       curtain veil    1200    20\r
+       ring    brass   20      110\r
+@txtosy\r
+       guard   dwarf\r
+       cookie  wafer\r
+       ss      stethoscope\r
+       coals   fire\r
+       icicles icicle\r
+       post    sign\r
+       lib     libram\r
+       library libram\r
+       vent    ventilator\r
+       ma      magazine\r
+       mad     magazine\r
+       hc      hyacinth\r
+       hiacynth        hyacinth\r
+       stump   tree\r
+       stiff   body\r
+       ming    china\r
+       floor   inscription\r
+       cadavre body\r
+       cadaver body    ;be kind to yanks week\r
+       rats    vermin\r
+       z       zombie\r
+       crescent        sickle\r
+       berries mistletoe\r
+       gnomon  brand\r
+       grail   chalice\r
+       seed    acorn\r
+       bs      broadsword\r
+       ls      longsword\r
+       brolly  umbrella\r
+       cocaine naughty\r
+       saphire sapphire\r
+       pond    lake\r
+       mushroom        toadstool\r
+       lid     tomb\r
+       fiddle  violin\r
+       dial    sundial\r
+       stallion        horse\r
+       seagull gull\r
+       projectile      sphere\r
+       platinum        sphere\r
+       gunpowder       powder\r
+       rope    string\r
+       wick    string\r
+       strand  string\r
+       feather quill\r
+       dog     wolf\r
+       frankincense    incense\r
+       drape   curtain\r
+       amber   pendant\r
+       finger  fossil\r
+       taties  potatoes\r
+       jade    ox\r
+       ruby    eye\r
+       rod     wand\r
+       staff   wand\r
+       yew     tree\r
+       spuds   potatoes\r
+       herb    wolfsbane\r
+       wolvesbane      wolfsbane\r
+       squirrel        squirrels\r
+       begger  beggar\r
+       skin    fleece\r
+       sheep   ram\r
+       pelt    fleece\r
+       pc      portcullis\r
+       bc      bookcase\r
+       bk      bookcase\r
+       lep     leprechaun\r
+       butt    barrel\r
+       club    ogre\r
+       earring earrings\r
+@txtmtn\r
+fastatn        get\r
+       drop\r
+       kill\r
+       wave\r
+       blast\r
+       fix\r
+       $alter\r
+       $arch1\r
+       $arch2\r
+       $arch3\r
+       $arch4\r
+       $blast\r
+       $blind\r
+       $brewing\r
+       $brewing1\r
+       $bump\r
+       $burn\r
+       $change\r
+       $check\r
+       $clear\r
+       $cure\r
+       $cured\r
+       $dead\r
+       $deaf\r
+       $devour\r
+       $dprovoke\r
+       $dragon\r
+       $drunk\r
+       $drunk1\r
+       $drunk2\r
+       $emerge\r
+       $exp\r
+       $fall\r
+       $fdevour\r
+       $firework\r
+       $flood\r
+       $flush\r
+       $fprovoke\r
+       $land\r
+       $message\r
+       $move\r
+       $null\r
+       $dumb\r
+       $out\r
+       $out1\r
+       $paralyse\r
+       $plonk\r
+       $poison\r
+       $poison1\r
+       $poison2\r
+       $pouring\r
+       $pouring1\r
+       $provoke\r
+       $play\r
+       $ratty\r
+       $reseagle\r
+       $smash\r
+       $spider\r
+       $snake\r
+       $snow\r
+       $snow1\r
+       $snow2\r
+       $snow3\r
+       $snow4\r
+       $summer\r
+       $summer1\r
+       $suspend\r
+       $trans\r
+       $uranium\r
+       $winter\r
+       $written\r
+       $zzz\r
+\r
+;;vocabulary actions\r
+action fell    none    none    ifin    null    ufrst1  722\r
+       fell    none    none    ifin    null    ufrst2  722\r
+       fell    none    none    ifin    null    ufrst5  722\r
+       fell    none    none    ifin    null    ufrst3  722\r
+       drop    none    none    holdfirst       null    0       0\r
+       drop    none    none    flipat  null    0       0\r
+       drop    bird    container       unlessprop      null    1       768\r
+       drop    .provoke        birdofprey      container       null    null    1106    0\r
+       drop    fairy   container       null    null    769     0\r
+       drop    pottery container       null    null    770     0\r
+       drop    china   container       null    null    770     0\r
+       drop    boat    container       null    null    772     0\r
+       drop    nut     container       null    null    773     0\r
+       drop    sprig   container       null    null    774     0\r
+       drop    killer  container       null    null    1088    0\r
+       drop    parachute       container       ifprop  null    0       815\r
+       drop    anthracite      flame   destroy null    584     0\r
+       summon  none    none    ifin    null    slidin  961\r
+       summon  none    none    ifin    null    fallin  961\r
+       fix     nanny   none    ifprop  null    1       673\r
+       fix     nanny   none    unlessgot       goat    674     0\r
+       fix     nanny   none    ifhave  egg     675     0\r
+       fix     nanny   none    ifin    null    firept  677\r
+       fix     .drop   nanny   none    unlessinc       null    swamp1  678     ;NB doesn't catch rest of swamps\r
+       fix     .drop   nanny   none    exp     null    90      679\r
+       get     none    none    ifhave  egg     255     0\r
+       get     anything        person  ifobjis coracle 593     0\r
+       get     anything        person  ifobjis raft    593     0\r
+       get     anything        person  ifobjis mirror  460     0\r
+       get     .get    anything        person  ifobjis uranium 0       0       -51\r
+       get     .get    anything        person  ifberserk       null    0       0\r
+       get     anything        person  ifobjis longsword       1087    0\r
+       get     anything        container       ifprop  null    1       816\r
+       get     .remove anything        container       ifobjis uranium 0       0       -51\r
+       make    bedclothes      none    ifprop  null    1       1035\r
+       make    bedclothes      none    inc     null    104     1036\r
+@txttop\r
+       toll    clanger none    ifprop  null    1       986     987\r
+       toll    clanger none    null    null    926     0       927\r
+       listen  tubes   none    null    null    1068    0\r
+       plant   flower  none    null    null    897     0\r
+       press   flower  book    destroy null    898     0\r
+       press   flower  tome    destroy null    898     0\r
+       hints   none    none    null    null    15      0\r
+       wake    herring none    null    null    1113    0\r
+       wake    woman   none    null    null    4       0\r
+       wake    dwarfs  none    ifprop  null    2       1022\r
+       wake    dwarfs  none    ifprop  null    3       1022\r
+       wake    dwarfs  none    dec     null    1023    1022\r
+       fill    cup     none    null    null    529     0\r
+       fill    rum     none    ifprop  null    1       859\r
+       fill    rum     torrent unlessprop      second  1       860\r
+       fill    rum     torrent inc     null    861     0\r
+       fill    rum     stream  inc     null    861     0\r
+       fill    rum     lavatory        inc     null    861     0\r
+       fill    rum     spray   inc     null    861     0\r
+       fill    rum     sink    inc     null    861     0\r
+       fill    rum     tub     null    null    864     0\r
+       fill    rum     weather unlessprop      rain    1       867\r
+       fill    rum     weather inc     null    861     0\r
+       fill    rum     none    ifin    null    estlpl  864     0\r
+       fill    none    h2o     unlessobjis     bottle  876     0\r
+       fill    none    h2o     inc     bottle  861     0\r
+       fill    rum     none    null    null    860     0\r
+       pull    limb    none    null    null    1038    0\r
+       pull    switch  none    trans   null    slidin  464     -24\r
+       pull    cord    none    ifprop  null    1       936\r
+       pull    cord    none    set     null    1       935     -27\r
+       examine switch  none    null    null    465     0\r
+       prise   rivet   none    ifprop  null    0       720\r
+       prise   rivet   pickaxe dec     null    706     0\r
+       prise   rivet   utensil destroy second  707     0\r
+       prise   rivet   sword   dec     null    706     0\r
+       prise   rivet   killer  dec     null    706     0\r
+       prise   rivet   prod    dec     null    706     0\r
+       prise   rivet   scythe  dec     null    706     0\r
+       prise   rivet   tool    unlesslevel     null    3       845\r
+       prise   rivet   tool    dec     null    706     0\r
+       prise   rivet   torch   null    null    708     0\r
+       prise   rivet   magic   null    null    709     0\r
+       prise   rivet   none    null    null    710     0\r
+       prise   ore     none    ifprop  null    0       720\r
+       prise   ore     pickaxe dec     null    717     0\r
+       prise   ore     sword   dec     null    718     0\r
+       prise   ore     killer  dec     null    718     0\r
+       prise   ore     prod    dec     null    718     0\r
+       prise   ore     tool    unlesslevel     null    3       845\r
+       prise   ore     tool    dec     null    718     0\r
+       prise   ore     none    null    null    719     0\r
+       sharpen torch   sword   destroy null    711     0\r
+       sharpen torch   killer  destroy null    711     0\r
+       sharpen torch   knife   destroy null    711     0\r
+       sharpen torch   tool    destroy null    711     0\r
+       sharpen magic   none    null    null    712     0\r
+       sharpen torch   none    null    null    713     0\r
+       untether        nanny   none    dec     null    689     690\r
+       bath    bird    none    unlessin        null    bbath   402\r
+       bath    bird    none    inc     null    403     404\r
+       bath    birdofprey      none    unlessin        null    bbath   402\r
+       bath    .provoke        birdofprey      none    null    null    1106    0\r
+       pluck   bird    none    ifzero  null    411     412\r
+       pluck   .provoke        birdofprey      none    null    null    1106    0\r
+       toss    pan     none    expdestroy      null    376     0\r
+       smell   none    crystal ifobjis naughty 371     0\r
+       smell   .sleep  crystal none    destroytogglesex        null    367     368\r
+       smell   flower  none    null    null    899     0\r
+       smell   antidote        none    null    null    1081    0\r
+       climb   space   none    ifin    null    hut     330\r
+       climb   space   none    ifin    null    ufrst5  753\r
+       climb   space   none    ifin    null    ufrst1  753\r
+       climb   space   none    ifin    null    ufrst2  753\r
+       climb   space   none    dead    null    1042    0\r
+       climb   archway none    null    null    1084    0\r
+       kiss    frog    none    ifsex   null    0       336\r
+       kiss    frog    none    destroycreate   prince  337     0\r
+       kiss    man     none    ifsex   null    0       338\r
+       kiss    man     none    expdestroy      null    339     0\r
+       kiss    woman   none    ifsex   null    1       346\r
+       kiss    woman   none    expdestroy      null    347     0\r
+       kiss    person  sprig   emotion null    100     788\r
+       kiss    dwarfs  none    ifprop  null    0       1026\r
+       kiss    dwarfs  none    null    null    1027    0\r
+       kiss    beast   none    toggle  null    117     117     699\r
+       kiss    nanny   none    null    null    671     0\r
+       kiss    wretch  none    null    null    1067    0\r
+       prime   cannon  keg     ifprop  powder  1       274\r
+       prime   cannon  keg     decdestroy      powder  275     0\r
+       load    cannon  ball    ifprop  null    2       280\r
+       load    cannon  ball    decdestroy      sphere  276     0       ;snakes and ladders joke if using in laddrm and snakes's there?\r
+       roll    .drop   ball    none    inc     null    281     282\r
+       roll    .drop   ivory   none    ifrprop null    5       497\r
+       roll    .drop   ivory   none    ifprop  null    4       498\r
+       roll    .drop   ivory   none    ifprop  null    3       499\r
+       roll    .drop   ivory   none    ifprop  null    2       500\r
+       roll    .drop   ivory   none    ifprop  null    1       501\r
+       roll    ivory   none    destroytrans    null    dead28  0\r
+       slide   slate   none    null    null    538     0\r
+       enter   spray   none    expinc  null    285     286\r
+       enter   brass   none    unlessprop      null    2       516\r
+       enter   brass   none    trans   null    garden  514\r
+       enter   fitting none    trans   null    wrdbe   0\r
+       enter   lizard  none    null    null    686     0\r
+       enter   none    none    null    null    513     0\r
+       leave   spray   none    null    null    302     0\r
+       leave   none    none    null    null    565     0\r
+       unfix   .get    head    space   swap    tdoor   193     0\r
+       unfix   head    none    ifprop  null    1       194\r
+       swim    none    none    ifin    null    pond1   341\r
+       swim    none    lake    ifzero  null    160     159\r
+       swim    none    none    unlessin        null    main2   140\r
+       swim    none    none    ifprop  flood   0       738\r
+       swim    none    none    null    null    737     0\r
+       draw    veil    none    ifprop  null    2       224\r
+       draw    veil    none    ifpropdec       null    1       850\r
+       draw    veil    none    set     null    1       851     -7\r
+       att     fuse    keg     destroydec      powder  254     0\r
+       lie     none    bedclothes      null    null    173     0\r
+       ride    beast   none    null    null    176     0\r
+       ride    nanny   none    null    null    668     0\r
+       sit     chair   none    null    null    1001    0\r
+       sit     beast   none    null    null    176     0\r
+       sit     nanny   none    null    null    668     0\r
+       sit     none    web     ifprop  null    1       941\r
+       ride    none    web     ifprop  null    1       941\r
+       beat    none    web     ifprop  null    1       941\r
+       fly     none    web     ifprop  null    1       941\r
+       ride    beast   none    null    null    176     0\r
+       ride    nanny   none    null    null    668     0\r
+       ride    pegasus none    unlessgot       null    399     0\r
+       ride    pegasus none    ifhave  mistletoe       400     0\r
+       ride    pegasus none    trans   null    <wfall  sfrst2> 398\r
+       ride    none    rug     ifprop  null    1       4\r
+       ride    none    rug     ifin    null    attic   12\r
+       ride    none    rug     ifhave  mistletoe       4       0\r
+       ride    none    rug     trans   null    <temple antech> 211\r
+       beat    rug     none    ifprop  null    1       4\r
+       beat    rug     none    ifin    null    attic   12\r
+       beat    rug     none    ifhave  mistletoe       4       0\r
+       beat    rug     none    trans   null    <cavein maze4>  211\r
+       sit     none    rug     ifprop  null    1       4\r
+       sit     none    rug     ifin    null    attic   12\r
+       sit     none    rug     ifhave  mistletoe       4       0\r
+       sit     none    rug     trans   null    <attic  bdrm01> 211\r
+       fly     beast   none    null    null    688     0\r
+       fly     nanny   none    null    null    688     0\r
+       fly     rug     none    ifprop  null    1       4\r
+       fly     rug     none    ifin    null    attic   12\r
+       fly     rug     none    ifhave  mistletoe       4       0\r
+       fly     rug     none    trans   null    <beach  jetty>  211\r
+       fly     pegasus none    unlessgot       null    399     0\r
+       fly     pegasus none    ifhave  mistletoe       400     0\r
+       fly     pegasus none    ifin    null    glade   379\r
+       fly     pegasus none    trans   null    <glade  bstand> 398\r
+       fly     rug     none    ifprop  null    1       4\r
+       fly     rug     none    ifin    null    attic   12\r
+       fly     rug     none    ifhave  mistletoe       4       0\r
+       fly     rug     none    trans   null    <beach  jetty>  211\r
+       fly     none    rug     ifprop  null    1       4\r
+       fly     none    rug     ifin    null    attic   12\r
+       fly     none    rug     ifhave  mistletoe       4       0\r
+       fly     none    rug     trans   null    <beach  jetty>  211\r
+       fly     none    none    unlessgot       horse   430     0\r
+       fly     none    treasure        null    null    400     0\r
+       fly     none    none    ifhave  mistletoe       4       0\r
+       fly     none    none    ifin    null    glade   379\r
+       fly     none    none    trans   null    <glade  bstand> 398\r
+       gallop  pegasus none    null    null    621     0\r
+       canter  pegasus none    null    null    622     0\r
+       roll    tombs   none    null    null    623     0\r
+       sit     none    pegasus unlessgot       null    399     0\r
+       sit     none    pegasus ifhave  mistletoe       400     0\r
+       sit     none    pegasus trans   null    <nhill2 shill2> 398\r
+       freeze  lake    ice     null    null    222     4\r
+       melt    ice     flame   destroy null    178     0\r
+       melt    something       lantern null    null    740     0\r
+       melt    ice     torch   destroy null    178     0\r
+       melt    ice     none    unlessin        null    firept  310\r
+       melt    ice     none    destroy null    178     0\r
+       melt    none    pool    ifprop  null    0       179\r
+       worship none    idol    floatdestroy    eyeview 124     125\r
+       worship none    eview   null    null    142     142\r
+       worship none    none    null    null    141     0\r
+       piss    rum     none    testsex null    875     872\r
+       piss    container       none    null    null    879     0\r
+       rape    corpse  none    unlesslevel     null    8       644\r
+       rape    corpse  none    iflevel null    9       644\r
+       rape    corpse  none    testsex null    647     648\r
+       rape    woman   none    ifsex   null    1       475\r
+       rape    woman   none    expdestroy      null    476     0\r
+       rape    beast   none    null    null    473     0\r
+       rape    .provoke        nanny   none    null    null    670     0\r
+       rape    pegasus none    null    null    473     0\r
+       rape    bunny   none    testsex null    477     478\r
+       rape    .provoke        enemy   none    null    null    479     0\r
+       rape    .provoke        goblin  none    null    null    480     0\r
+       rape    wretch  none    null    null    481     0\r
+       rape    hound   none    null    null    473     0\r
+       rape    familiar        none    ifprop  null    9       485\r
+       rape    vermin  none    null    null    581     0\r
+       rape    man     none    testsex null    482     483\r
+       rape    frog    none    testsex null    334     478\r
+       milk    beast   none    null    null    641     0\r
+       milk    .provoke        nanny   none    null    null    658     0\r
+       conduct none    none    unlessgot       baton   803     0\r
+       conduct none    none    null    null    804     0\r
+       climb   none    ladder  null    null    164     4\r
+       unlatch none    oneway  ifprop  cupboard        0       165\r
+       unlatch none    ladder  null    null    162     0\r
+       unlatch none    oneway  swap    sdoor   161     4\r
+       latch   none    oneway  ifprop  cupboard        1       166\r
+       latch   none    oneway  swap    sdoor   163     4\r
+       unlock  access  none    ifin    null    cannrm  283\r
+       unlock  access  none    ifin    null    downps  349\r
+       unlock  access  yale    ifin    null    gob4    288\r
+       unlock  access  none    ifin    null    gob4    287\r
+       unlock  none    goblin  null    null    292     0\r
+       unlock  none    enemy   null    null    324     0\r
+       unlock  access  bone    null    null    656     0\r
+       lock    access  none    ifin    null    cannrm  283\r
+       lock    access  bone    null    null    656     0\r
+       read    none    none    ifblind null    1       1069\r
+       read    time    none    ifprop  null    1       383\r
+       read    time    none    unlessprop      rain    0       385\r
+       read    .time   time    none    expinc  null    384     0\r
+       read    tome    none    iflight null    462     305\r
+       read    adventurer      none    iflight null    1092    305\r
+       read    paper   none    iflight null    304     305\r
+       read    map     none    iflight null    484     305\r
+       read    book    none    iflight null    548     305\r
+       read    symbols none    iflevel null    7       964\r
+       read    symbols none    dead    null    1043    0\r
+       read    carving none    iflight null    610     305\r
+       read    veil    none    iflight null    857     305\r
+       read    signpost        none    iflight null    923     305\r
+       read    guardian        none    null    null    1037    0\r
+       read    anything        none    ifobjis sundial 965     0\r
+       tame    hound   none    null    null    234     0\r
+       wave    none    cord    ifprop  null    1       942\r
+       wave    medication      none    null    null    576     0\r
+       wave    clanger none    ifprop  null    1       986     987\r
+       wave    clanger none    null    null    926     0       927\r
+       wave    torch   none    ifprop  null    1       4\r
+       wave    torch   none    inc     null    174     4\r
+       wave    toy     none    iflevel null    2       261\r
+       wave    toy     none    toggle  rstop   102     102     -17\r
+       wave    pointer none    unlessgot       null    798     0\r
+       wave    pointer none    ifhave  mistletoe       4       0\r
+       wave    pointer none    ifhave  ox      4       0\r
+       wave    pointer none    ifhave  pillar  4       0\r
+       wave    pointer none    ifhave  carpet  4       0\r
+       wave    pointer none    ifhave  goat    4       0\r
+       wave    pointer none    ifhave  horse   4       0\r
+       wave    pointer none    ifhave  barrel  4       0\r
+       wave    .drop   pointer none    transwhere      bow     799     837\r
+       wave    violinbow       none    unlessgot       null    798     0\r
+       wave    violinbow       none    ifhave  mistletoe       4       0\r
+       wave    violinbow       none    ifhave  ox      4       0\r
+       wave    violinbow       none    ifhave  pillar  4       0\r
+       wave    violinbow       none    ifhave  carpet  4       0\r
+       wave    violinbow       none    ifhave  goat    4       0\r
+       wave    violinbow       none    ifhave  horse   4       0\r
+       wave    violinbow       none    ifhave  barrel  4       0\r
+       wave    .drop   violinbow       none    transwhere      baton   805     837\r
+       wave    .drop   magic   none    ifheretrans     osselesu        sorcrm  728\r
+       wave    magic   none    unlessgot       null    562     0\r
+       wave    none    none    unlessgot       wand    236     0\r
+       wave    none    none    unlessobjis     wand    561     0\r
+       wave    none    marble  dead    null    1044    0\r
+       wave    none    sprig   null    null    502     0\r
+       wave    none    rug     null    null    235     0\r
+       wave    .drop   magic   none    trans   null    sorcrm  128\r
+       tidy    bedclothes      none    ifprop  null    1       1035\r
+       tidy    bedclothes      none    inc     null    104     1036\r
+       unmake  bedclothes      none    unlessprop      null    1       1034\r
+       unmake  bedclothes      none    expset  null    2       126\r
+       wear    glove   none    unlessgot       null    798     0\r
+       wear    glove   none    transhere       eagle   1110    1111\r
+       wear    .sleep  band    none    null    null    571     0\r
+       wear    coat    none    null    null    938     0\r
+       wear    necklace        none    null    null    247     0\r
+       light   curse   flame   null    null    259     0\r
+       light   anthracite      flame   destroy null    584     0\r
+       light   pointer flame   null    null    800     0\r
+       light   stradivarius    flame   destroy null    801     0\r
+       light   violinbow       flame   destroy null    802     0\r
+       light   keg     flame   destroytrans    null    dead19  0\r
+       light   torch   lizard  dec     null    589     4\r
+       light   lantern none    ifprop  null    2       908\r
+       light   lantern flame   dec     null    741     4       -19\r
+       light   lantern lizard  zonk    null    742     0       743\r
+       light   paper   flame   destroy null    306     0\r
+       light   parachute       flame   destroy null    601     0\r
+       light   map     flame   destroy null    491     0\r
+       light   tome    flame   null    null    494     0\r
+       light   adventurer      flame   destroy null    1093    0\r
+       light   urn     flame   destroy null    1083    0\r
+       light   something       lantern unlessprop      second  0       744\r
+       light   something       lantern null    null    745     0\r
+       light   something       sword   null    null    963     0\r
+       light   something       killer  null    null    963     0\r
+       light   something       oven    null    null    1010    0\r
+       light   urn     torch   destroy null    1083    0\r
+       light   trunk   torch   ifzero  null    181     182\r
+       light   signpost        none    null    null    918     0\r
+       light   lantern torch   dec     null    741     4       -19\r
+       light   wood    torch   expdestroy      null    72      0\r
+       light   parachute       torch   destroy null    601     0\r
+       light   cord    torch   ifpropdestroy   null    0       962\r
+       light   cord    torch   expdestroy      null    939     0\r
+       light   wood    none    null    null    558     0\r
+       light   keg     torch   destroytrans    null    dead19  0\r
+       light   torch   none    ifin    null    firept  241\r
+       light   creeper none    null    null    437     0\r
+       light   paper   torch   destroy null    306     0\r
+       light   map     torch   destroy null    491     0\r
+       light   tome    torch   destroy second  492     0\r
+       light   adventurer      torch   destroy null    1093    0\r
+       light   book    torch   destroy null    493     0\r
+       light   time    torch   inc     null    390     389\r
+       light   anthracite      torch   destroy null    584     0\r
+       light   parachute       torch   destroy null    495     0\r
+       light   case    torch   null    null    496     0\r
+       light   infection       torch   destroy null    506     0\r
+       light   sheepskin       torch   destroyinc      skull   569     0\r
+       light   medication      torch   destroy null    572     0\r
+       light   corpse  torch   destroy null    1080    0\r
+       light   corpse  flame   destroy null    1080    0\r
+       light   pointer torch   null    null    800     0\r
+       light   stradivarius    torch   destroy null    801     0\r
+       light   violinbow       torch   destroy null    802     0\r
+       bath    money   none    dec     null    372     373\r
+       douse   lantern none    unlessprop      null    0       4\r
+       douse   lantern none    set     null    1       746     -21\r
+       fold    adventurer      none    iflevel null    3       1095\r
+       fold    adventurer      none    exp     null    3       1095\r
+       tap     none    none    ifin    null    grotto  466\r
+       tap     trunk   none    null    null    106     0\r
+       tap     earth   none    ifzero  null    70      69\r
+       tap     flame   prod    iflevel null    2       1000\r
+       tap     flame   prod    exp     null    50      1000\r
+       tap     none    none    unlessin        null    downps  360\r
+       tap     none    none    trans   null    sorcrm  361\r
+       cook    bunny   oven    ifprop  null    2       1011\r
+       cook    bunny   oven    destroy null    321     0\r
+       cook    bunny   torch   ifprop  null    2       326\r
+       cook    bunny   torch   destroy null    321     0\r
+       cook    bunny   flame   ifprop  null    2       326\r
+       cook    bunny   flame   destroy null    321     0\r
+       cook    bunny   none    null    null    639     0\r
+       kick    .provoke        wretch  none    iflevel null    2       118\r
+       kick    wretch  none    exp     null    1       118\r
+       fell    wood    tool    expdestroy      null    71      0\r
+       fell    .kill   wood    none    null    null    0       0\r
+       fell    cord    tool    null    null    943     0\r
+       fell    cord    sword   ifpropdestroy   null    0       982\r
+       fell    cord    sword   expdestroy      null    978     0\r
+       fell    cord    killer  ifpropdestroy   null    0       982\r
+       fell    cord    killer  expdestroy      null    978     0\r
+       fell    something       sword   null    null    564     0\r
+       fell    something       killer  null    null    564     0\r
+       fell    something       cricket null    null    605     0\r
+       fell    something       pickaxe null    null    734     0\r
+       fell    block   none    null    null    136     0\r
+       fell    signpost        tool    dec     null    919     920\r
+       fell    trunk   tool    ifprop  null    0       135\r
+       fell    trunk   tool    decifzero       null    105     136\r
+       fell    trunk   none    ifhave  axe     600     0       ;not the jewelled one\r
+       fell    trunk   none    null    null    190     0\r
+       fell    access  tool    ifin    null    cannrm  89\r
+       fell    access  tool    ifin    null    downps  89\r
+       fell    access  tool    ifin    null    gob4    89\r
+       fell    access  tool    ifin    null    treasc  89\r
+       fell    access  tool    ifin    null    fowrm   89\r
+       fell    access  tool    ifin    null    sorcrm  89\r
+       fell    access  mace    ifin    null    cannrm  89\r
+       fell    access  mace    ifin    null    downps  89\r
+       fell    access  mace    ifin    null    gob4    89\r
+       fell    access  mace    ifin    null    treasc  89\r
+       fell    access  mace    ifin    null    fowrm   89\r
+       fell    access  mace    ifin    null    sorcrm  89\r
+       fell    access  mace    destroy null    643     0\r
+       fell    access  pickaxe null    null    735     0\r
+       fell    case    tool    null    null    489     0\r
+       fell    case    mace    null    null    489     0\r
+       fell    oneway  tool    destroy null    783     0\r
+       fell    oneway  mace    destroy null    783     0\r
+       fell    none    none    unlessin        null    wfrst1  797\r
+       fell    none    none    ifzero  tree    795     796\r
+       feed    something       rum     ifprop  second  0       931\r
+       feed    nanny   pan     null    null    681     0\r
+       feed    nanny   victuals        destroy second  682     0\r
+       feed    nanny   antidote        destroy second  682     0\r
+       feed    nanny   flower  destroy second  682     0\r
+       feed    nanny   fungus  destroydestroy  toadstool       683     0\r
+       feed    nanny   limb    null    null    684     0\r
+       feed    nanny   corpse  null    null    684     0\r
+       feed    nanny   sprig   destroydestroy          mistletoe       685     0\r
+       feed    nanny   frog    null    null    684     0\r
+       feed    nanny   bird    null    null    684     0\r
+       feed    nanny   birdofprey      null    null    684     0\r
+       feed    nanny   rodents null    null    684     0\r
+       feed    nanny   bunny   null    null    684     0\r
+       feed    nanny   vermin  null    null    684     0\r
+       feed    nanny   familiar        null    null    684     0\r
+       feed    nanny   herring destroy second  682     0\r
+       feed    nanny   serpent null    null    684     0\r
+       feed    nanny   nut     destroy second  682     0\r
+       feed    nanny   pen     destroy second  682     0\r
+       feed    nanny   parachute       destroy second  682     0\r
+       feed    nanny   money   destroy second  682     0\r
+       feed    nanny   gem     destroy second  682     0\r
+       feed    nanny   liquid  destroy second  682     0\r
+       feed    nanny   rum     null    null    930     0\r
+       feed    nanny   medication      destroy second  682     0\r
+       feed    nanny   paper   destroy second  682     0\r
+       feed    nanny   map     destroy second  682     0\r
+       feed    nanny   tome    destroy second  682     0\r
+       feed    nanny   adventurer      null    null    1094    0\r
+       feed    nanny   book    destroy second  682     0\r
+       feed    nanny   biscuit destroy second  682     0\r
+       feed    nanny   none    null    null    687     0\r
+       feed    rodents none    unlessin        null    sqroom  531\r
+       feed    rodents nut     unlessgot       acorn   532     0\r
+       feed    rodents nut     expdestroy      acorn   533     533\r
+       feed    rodents none    ifhave  acorn   557     0\r
+       feed    rodents none    null    null    534     0\r
+       feed    bird    none    unlessprop      null    0       406\r
+       feed    bird    nut     destroy second  530     0\r
+       feed    bird    rum     null    null    931     0\r
+       feed    .provoke        birdofprey      bunny   ifprop  second  1       0\r
+       feed    birdofprey      bunny   set     second  1       1108\r
+       feed    birdofprey      vermin  destroy second  1104    0\r
+       feed    birdofprey      bird    destroy second  1105    0\r
+       feed    .provoke        birdofprey      none    null    null    1106    0\r
+       feed    enemy   limb    expdestroy      null    343     0\r
+       feed    enemy   rum     null    null    932     0\r
+       feed    enemy   corpse  ifprop  null    0       634\r
+       feed    enemy   corpse  expdestroy      null    633     0\r
+       feed    lizard  anthracite      destroy second  895     0       -15\r
+       feed    lizard  rum     destroy second  933     0\r
+       feed    monster none    unlessprop      null    0       148\r
+       feed    monster limb    incdestroy      leg     146     0\r
+       feed    fairy   fungus  null    null    518     0\r
+       feed    beast   none    unlessprop      null    0       134\r
+       feed    beast   pan     ifzero  null    122     134\r
+       feed    beast   rum     ifzero  null    930     134\r
+       feed    hound   flower  null    null    885     0\r
+       feed    hound   antidote        unlessgot       second  525     0\r
+       feed    hound   rum     null    null    930     0\r
+       feed    .provoke        hound   antidote        ifprop  second  1       453\r
+       feed    hound   antidote        expdestroy      null    231     0       703\r
+       feed    bunny   flower  null    null    885     0\r
+       feed    bunny   antidote        destroy second  313     0\r
+       feed    bunny   rum     null    null    930     0\r
+       feed    bunny   victuals        null    null    314     0\r
+       feed    bunny   biscuit destroy second  1064    0\r
+       feed    wretch  biscuit null    null    1063    0\r
+       feed    biscuit wretch  null    null    1063    0\r
+       feed    wretch  victuals        inc     potatoes        167     747\r
+       feed    victuals        wretch  inc     potatoes        167     747\r
+       feed    .provoke        wretch  rum     null    null    934     0\r
+       feed    wretch  none    null    null    319     0\r
+       feed    frog    fungus  null    null    520     0\r
+       feed    something       nut     null    null    528     0\r
+       feed    something       fungus  null    null    517     0\r
+       feed    something       sprig   null    null    521     0\r
+       feed    monster none    null    null    147     0\r
+       feed    beast   victuals        null    null    122     0\r
+       feed    beast   biscuit null    null    122     0\r
+       feed    beast   pan     null    null    122     0\r
+       feed    beast   flower  null    null    885     0\r
+       feed    beast   antidote        null    null    123     0\r
+       feed    bird    none    null    null    405     0\r
+       feed    fairy   none    null    null    150     0\r
+       feed    hound   none    null    null    233     0\r
+       feed    familiar        bird    destroy second  777     0\r
+       feed    bunny   none    null    null    320     0\r
+       dig     none    tview   ifprop  null    0       599\r
+       dig     none    tview   set     null    0       597\r
+       stroke  money   none    dec     null    372     373\r
+       stroke  bunny   none    ifprop  null    2       1040\r
+       stroke  bunny   none    iflevel null    2       1040\r
+       stroke  bunny   none    exp     null    1       1041\r
+       stroke  beast   none    ifprop  null    2       763\r
+       stroke  beast   none    toggle  null    117     117     699\r
+       stroke  nanny   none    null    null    671     0\r
+       stroke  pegasus none    unlessgot       null    401     0\r
+       stroke  pegasus none    ifhave  mistletoe       401     0\r
+       stroke  pegasus none    trans   null    jetty   1079\r
+       unfurl  parachute       none    dec     null    107     107\r
+       furl    parachute       none    inc     null    108     108\r
+       prise   tombs   none    null    null    612     0\r
+       prise   haunt   none    ifin    null    mosolm  612\r
+       prise   haunt   none    dec     null    111     112\r
+       prize   none    haunt   null    null    113     0\r
+       play    stradivarius    none    unlessgot       null    819     0\r
+       play    stradivarius    none    unlessgot       bow     820     0\r
+       play    stradivarius    none    ifhere  baton   821     0\r
+       play    .freeze stradivarius    none    ifpropinc       null    0       821     825     -2\r
+       play    .unfreeze       stradivarius    none    dec     null    821     0       825\r
+       play    none    vermin  ifgot   flute   1074    0\r
+       play    recorder        none    ifin    null    bstand  1070\r
+       play    recorder        none    transhere       rat     1071    1072    1073\r
+       diagnose        familiar        none    ifprop  null    0       1099\r
+       diagnose        familiar        none    ifprop  null    9       1100\r
+       diagnose        familiar        none    null    null    1101    0\r
+       diagnose        bunny   none    ifprop  null    1       1102\r
+       diagnose        bunny   none    null    null    1103    0\r
+       diagnose        .diagnose       none    tubes   null    null    0       0\r
+       climb   trunk   none    ifzero  null    137     116\r
+       drink   rum     none    ifprop  null    0       866\r
+       drink   rum     none    set     null    0       868     -8\r
+       drink   .sleep  none    springh2o       iflevel null    5       1114\r
+       drink   .sleep  none    springh2o       exp     null    5       721\r
+       drink   none    tub     ifprop  null    0       301\r
+       drink   none    none    ifin    null    bbath   429\r
+       drink   none    none    ifhere  pool    863     0       -1\r
+       eat     nut     none    null    null    527     0\r
+       eat     chip    none    null    null    1019    0\r
+       eat     fungus  none    destroytrans    null    dead33  0\r
+       eat     sprig   utensil destroytrans    null    dtreas  0\r
+       eat     sprig   none    destroytrans    null    dead33  0\r
+       eat     rodents none    ifin    null    sqroom  536\r
+       eat     .provoke        birdofprey      none    null    null    1106    0\r
+       eat     bird    none    ifprop  null    1       409\r
+       eat     bird    none    destroy null    410     0\r
+       eat     pan     none    null    null    377     0\r
+       eat     crystal none    destroy null    369     0\r
+       eat     sprig   none    destroytrans    null    dead29  0\r
+       eat     limb    none    destroy null    86      0\r
+       eat     corpse  none    ifprop  null    0       634\r
+       eat     corpse  none    destroy null    632     0\r
+       eat     beast   none    null    null    180     0\r
+       eat     nanny   none    null    null    669     0\r
+       eat     bunny   none    ifprop  null    2       326\r
+       eat     bunny   none    ifprop  null    0       317\r
+       eat     bunny   none    destroy null    318     0\r
+       eat     flower  none    destroy null    886     0\r
+       eat     antidote        none    destroy null    818     0\r
+       eat     cord    none    ifprop  null    1       944\r
+       eat     cord    none    set     null    1       945     -27\r
+       eat     herring none    expdestroy      null    1112    0\r
+       eat     biscuit none    staminadestroy  null    40      1065\r
+       smoke   links   none    null    null    1086    0\r
+       smoke   container       none    ifobjis pot     761     0\r
+       smoke   flower  none    destroy null    887     0\r
+       smoke   antidote        none    expset  null    0       209\r
+       ding    clanger none    null    null    986     0       987\r
+       dong    clanger none    null    null    926     0       927\r
+       kill    lantern none    unlessprop      null    0       4\r
+       kill    lantern none    set     null    1       746     -21\r
+       kill    headstone       none    null    null    824     0\r
+       kill    clanger none    ifprop  null    1       988     987\r
+       kill    clanger none    null    null    928     0       927\r
+       kill    curse   none    null    null    258     0\r
+       kill    access  tool    ifin    null    cannrm  89\r
+       kill    access  tool    ifin    null    downps  89\r
+       kill    access  tool    ifin    null    gob4    89\r
+       kill    access  tool    ifin    null    treasc  89\r
+       kill    access  tool    ifin    null    fowrm   89\r
+       kill    access  tool    ifin    null    sorcrm  89\r
+       kill    access  mace    ifin    null    cannrm  89\r
+       kill    access  mace    ifin    null    downps  89\r
+       kill    access  mace    ifin    null    gob4    89\r
+       kill    access  mace    ifin    null    treasc  89\r
+       kill    access  mace    ifin    null    fowrm   89\r
+       kill    access  mace    ifin    null    sorcrm  89\r
+       kill    access  mace    destroy null    643     0\r
+       kill    access  pickaxe null    null    735     0\r
+       kill    case    tool    null    null    489     0\r
+       kill    case    mace    null    null    489     0\r
+       kill    oneway  tool    destroy null    783     0\r
+       kill    oneway  mace    destroy null    783     0\r
+       kill    drawbridge      none    null    null    785     0\r
+       kill    earth   none    null    null    66      0\r
+       kill    .drop   tub     none    ifprop  null    1       64\r
+       kill    .drop   tub     none    ifinc   null    level   62\r
+       kill    .drop   tub     none    unlessinc       null    mudrm   61\r
+       kill    .drop   tub     none    swap    mud     63      64\r
+       kill    lookingglass    none    unlesssnooping  null    448     0\r
+       kill    .unsnoop        lookingglass    none    set     null    1       447\r
+       kill    ball    cricket null    null    642     0\r
+       kill    rum     none    destroy null    865     0\r
+       kill    slate   none    null    null    847     0\r
+       kill    .kill   wood    torch   ifprop  second  1       0\r
+       kill    wood    torch   expdestroy      null    72      0\r
+       kill    cord    tool    null    null    943     0\r
+       kill    cord    sword   ifpropdestroy   null    0       982\r
+       kill    cord    sword   expdestroy      null    978     0\r
+       kill    cord    killer  ifpropdestroy   null    0       982\r
+       kill    cord    killer  expdestroy      null    978     0\r
+       kill    person  pickaxe hurt    null    10      0       -4\r
+       kill    person  sword   hurt    null    30      0       -4\r
+       kill    person  links   hurt    null    20      0       -4\r
+       kill    person  killer  hurt    null    25      0       -4\r
+       kill    person  prod    hurt    null    15      0       -4\r
+       kill    person  cricket hurt    null    16      606     -4\r
+       kill    person  rum     hurt    null    5       0       -4\r
+       kill    person  scythe  hurt    null    5       0       -4\r
+       kill    person  utensil hurt    null    3       0       -4\r
+       kill    person  mace    hurt    null    15      0       -4\r
+       kill    person  magic   hurt    null    20      0       -4\r
+       kill    dwarfs  none    ifpropdestroy   null    1       1025\r
+       kill    dwarfs  pickaxe hurt    null    32      0\r
+       kill    enemy   limb    expdestroy      null    343     0       -4\r
+       kill    enemy   corpse  ifprop  body    0       634\r
+       kill    enemy   corpse  expdestroy      null    633     0       -4\r
+       kill    vermin  familiar        ifprop  second  9       583\r
+       kill    vermin  familiar        expdestroy      null    582     0       -4\r
+       kill    rodents none    ifin    null    sqrm    531\r
+       kill    rodents none    trans   null    dead34  0\r
+       kill    pegasus none    null    null    395     0\r
+       kill    bird    none    ifprop  null    1       407\r
+       kill    bird    familiar        destroy null    779     0       -4\r
+       kill    bird    none    destroy null    408     0       -4\r
+       get     .provoke        birdofprey      none    unlessgot       gauntlet        0       0\r
+       kill    man     none    destroy null    340     0\r
+       kill    frog    none    null    null    334     0\r
+       kill    wretch  sword   hurt    null    60      0\r
+       kill    wretch  links   hurt    null    60      0\r
+       kill    wretch  cricket hurt    null    60      607\r
+       kill    woman   tool    hurt    null    15      348\r
+       kill    woman   pickaxe hurt    null    10      348\r
+       kill    woman   sickle  hurt    null    5       348\r
+       kill    woman   sword   hurt    null    30      348\r
+       kill    woman   links   hurt    null    20      348\r
+       kill    woman   killer  hurt    null    45      348\r
+       kill    woman   prod    hurt    null    15      348\r
+       kill    woman   cricket null    null    608     0\r
+       kill    woman   rum     hurt    null    10      348\r
+       kill    .kill   woman   none    null    null    348     0\r
+       kill    monster none    ifprop  null    2       263\r
+       kill    monster sword   set     null    2       526\r
+       kill    monster killer  set     null    2       526\r
+       kill    monster tool    set     null    2       145\r
+       kill    monster pickaxe set     null    2       736\r
+       kill    monster magic   set     null    2       149\r
+       kill    monster none    trans   null    ydead8  0\r
+       kill    fairy   none    null    null    151     0\r
+       kill    signpost        tool    dec     null    919     920\r
+       kill    signpost        none    null    null    921     0\r
+       kill    trunk   tool    ifprop  null    0       135\r
+       kill    trunk   tool    decifzero       null    105     136\r
+       kill    trunk   none    null    null    190     0\r
+       kill    beast   none    ifprop  null    2       133\r
+       kill    beast   none    ifprop  null    3       133\r
+       kill    beast   knife   set     null    3       121\r
+       kill    bunny   none    ifprop  null    2       326\r
+       kill    bunny   none    ifprop  null    1       316\r
+       kill    bunny   none    inc     null    312     0       -4\r
+       kill    wood    tool    expdestroy      null    71      0\r
+       kill    beast   none    set     null    2       130\r
+       kill    corpse  none    null    null    645     0\r
+       kill    .reset  knob    none    ifobjcount      null    uswamp  50      0\r
+       kill    guardian        sword   hurt    null    8       990\r
+       kill    guardian        links   hurt    null    30      1090\r
+       kill    guardian        killer  hurt    null    12      990\r
+       kill    hound   killer  hurt    null    45      0       -4\r
+       kill    .provoke        guardian        cricket destroy second  991     0\r
+       kill    .provoke        guardian        rum     destroy second  991     0\r
+       kill    .provoke        guardian        pickaxe destroy second  991     0\r
+       kill    .provoke        guardian        scythe  destroy second  991     0\r
+       kill    .provoke        guardian        utensil destroy second  991     0\r
+       kill    .provoke        guardian        mace    destroy second  991     0\r
+       kill    .provoke        guardian        torch   destroy second  991     0\r
+       kill    .provoke        guardian        prod    destroy second  991     0\r
+       kill    guardian        magic   transwhere      dwarf   992     4\r
+       kill    something       sword   hurt    null    40      0       -4\r
+       kill    something       links   hurt    null    30      0       -4\r
+       kill    something       killer  hurt    null    60      0       -4\r
+       kill    something       prod    hurt    null    20      0       -4\r
+       kill    something       cricket hurt    null    22      609     -4\r
+       kill    something       rum     hurt    null    10      0       -4\r
+       kill    something       pickaxe hurt    null    15      0       -4\r
+       kill    something       scythe  hurt    null    10      0       -4\r
+       kill    something       utensil hurt    null    5       0       -4\r
+       kill    something       mace    hurt    null    20      0       -4\r
+       kill    something       torch   hurt    null    15      0       -4\r
+       kill    something       magic   hurt    null    30      0       -4\r
+       disect  corpse  none    null    null    646     0\r
+       flee    none    lizard  zonk    null    592     0\r
+       flee    none    enemy   null    null    704     0\r
+       flee    none    dwarfs  ifprop  null    3       1014\r
+       flee    none    dwarfs  ifprop  null    2       1091\r
+       flee    none    none    ifin    null    sea1    585\r
+       flee    none    none    ifin    null    sea2    585\r
+       flee    none    none    ifin    null    sea3    585\r
+       flee    none    none    ifin    null    sea4    585\r
+       flee    none    none    ifin    null    sea5    585\r
+       flee    none    none    ifin    null    sea6    585\r
+       flee    none    none    ifin    null    sea7    585\r
+       flee    none    none    ifin    null    sea8    585\r
+       flee    none    none    ifin    null    sea9    585\r
+       flee    none    none    ifin    null    sea10   585\r
+       flee    none    none    ifin    null    sea11   585\r
+       flee    none    none    ifin    null    sea12   585\r
+       flee    none    none    ifin    null    sea13   585\r
+       flee    none    none    ifin    null    sea14   585\r
+       flee    none    none    ifhave  egg     587     0\r
+       flee    none    none    ifberserk       null    814     0\r
+       flee    .flee   none    none    ifhave  ornament        662     0\r
+       flee    .flee   none    none    unlesshave      vase    0       0\r
+       flee    .flee   none    none    destroy         vase    661     0\r
+       retaliate       pickaxe none    retal   null    5       0\r
+       retaliate       sword   none    retal   null    15      0\r
+       retaliate       links   none    retal   null    10      0\r
+       retaliate       killer  none    retal   null    12      0\r
+       retaliate       prod    none    retal   null    8       0\r
+       retaliate       cricket none    retal   null    8       0\r
+       retaliate       rum     none    retal   null    3       0\r
+       retaliate       scythe  none    retal   null    3       0\r
+       retaliate       utensil none    retal   null    1       0\r
+       retaliate       mace    none    retal   null    8       0\r
+       retaliate       magic   none    retal   null    10      0\r
+       sail    none    boat    unlessgot       null    789     0\r
+       sail    .go     none    none    null    null    0       0\r
+       launch  none    boat    null    null    790     0\r
+       unbeach none    boat    null    null    790     0\r
+       move    sliding none    unlessin        null    spanel  294\r
+       move    sliding none    swap    magbar  295     0\r
+       move    slate   none    null    null    538     0\r
+       move    iron    none    toggle  null    358     357\r
+       move    case    none    ifin    null    ssteps  838\r
+       move    case    none    toggle  null    356     355\r
+       tell    time    none    ifprop  null    1       383\r
+       tell    time    none    unlessprop      rain    0       385\r
+       tell    .time   time    none    expinc  null    384     0\r
+       tell    anything        none    ifobjis sundial 965     0\r
+       get     .remove anything        dwarfs  ifobjis uranium 0       0       -51\r
+       get     .remove anything        oven    ifobjis uranium 0       0       -51\r
+       get     .remove anything        dwarfs  null    null    0       0\r
+       get     .remove anything        oven    null    null    0       0\r
+       get     anything        lantern ifprop  second  2       913\r
+       get     anything        lantern ifzero  second  910     912\r
+       get     block   none    null    null    563     0\r
+       get     knife   none    null    null    1075    0\r
+       get     cord    none    ifprop  null    1       936\r
+       get     cord    none    set     null    1       935     -27\r
+       get     signpost        none    ifprop  null    1       924\r
+       get     nanny   none    ifprop  null    1       657\r
+       get     monster none    ifprop  null    2       680\r
+       get     monster none    null    null    567     0\r
+       get     .provoke        vermin  none    null    null    580     0\r
+       get     rodents none    ifin    null    sqroom  537\r
+       get     rodents none    null    null    531     0\r
+       get     nut     none    ifin    null    sqroom  535\r
+       get     .get    metal   none    null    null    0       0       -51\r
+       get     .get    ram     none    unlesshere      fleece  0       0\r
+       get     ram     none    dead    null    1045    0\r
+       get     cannon  none    null    null    848     0\r
+       get     none    vermin  null    null    579     0\r
+       get     antidote        none    ifhere  wolf    522     0\r
+       get     .get    sword   none    set     null    0       0\r
+       get     .get    killer  none    ifprop  null    0       0\r
+       get     killer  none    unlesslevel     null    5       1049\r
+       get     .get    killer  none    set     null    0       1021\r
+       get     creeper none    null    null    437     0\r
+       get     .get    rivet   none    ifprop  null    0       0\r
+       get     .get    rivet   pickaxe dec     null    706     0\r
+       get     rivet   utensil destroy second  707     0\r
+       get     .get    rivet   sword   dec     null    706     0\r
+       get     .get    rivet   killer  dec     null    706     0\r
+       get     .get    rivet   prod    dec     null    706     0\r
+       get     .get    rivet   scythe  dec     null    706     0\r
+       get     rivet   tool    unlesslevel     null    3       845\r
+       get     .get    rivet   tool    dec     null    706     0\r
+       get     rivet   torch   null    null    708     0\r
+       get     rivet   magic   null    null    709     0\r
+       get     rivet   none    null    null    710     0\r
+       get     .get    ore     none    ifprop  null    0       0\r
+       get     .get    ore     pickaxe dec     null    717     0\r
+       get     .get    ore     sword   dec     null    718     0\r
+       get     .get    ore     killer  dec     null    718     0\r
+       get     .get    ore     prod    dec     null    718     0\r
+       get     ore     tool    unlesslevel     null    3       845\r
+       get     .get    ore     tool    dec     null    718     0\r
+       get     ore     none    null    null    719     0\r
+       get     none    none    ifin    null    doomrm  727\r
+       get     .get    fruit   none    inc     null    0       0\r
+       get     .get    tome    none    inc     null    0       0\r
+       get     beast   none    ifgot   horse   401     0\r
+       get     pegasus none    ifgot   ox      394     0\r
+       get     beast   none    ifgot   goat    664     0\r
+       get     nanny   none    ifgot   ox      665     0\r
+       get     pegasus none    ifgot   goat    666     0\r
+       get     nanny   none    ifgot   horse   667     0\r
+       get     .get    familiar        none    unlesshave      gull    0       0\r
+       get     .get    familiar        none    ifprop  gull    1       0\r
+       get     familiar        none    null    null    434     0\r
+       get     .get    bird    none    ifprop  null    1       0\r
+       get     bird    none    ifhave  cat     435     0\r
+       get     .get    stradivarius    none    ifhave  cat     984     0\r
+       get     .get    pegasus none    null    null    397     0       705\r
+       get     liquid  none    null    null    366     0\r
+       get     pan     none    null    null    374     0\r
+       get     book    none    null    null    322     0\r
+       get     man     none    null    null    333     0\r
+       get     frog    none    null    null    334     0\r
+       get     .get    ball    none    unlessprop      sphere  0       0\r
+       get     .get    ball    none    incdestroy      ballview        0       0\r
+       get     goblin  none    null    null    289     0\r
+       get     enemy   none    unlesswiz       null    327     0\r
+       get     none    enemy   unlesswiz       null    586     0\r
+       get     .get    head    space   swap    tdoor   193     0\r
+       get     head    none    ifprop  null    1       194\r
+       get     .get    necklace        none    incdestroy      pendview        0       0\r
+       get     .get    beast   none    ifzero  null    144     0\r
+       get     .get    veil    none    set     null    2       0\r
+       get     treasure        none    ifin    null    leprm   225\r
+       get     treasure        none    ifin    null    gob1    438\r
+       get     treasure        none    ifin    null    gob2    438\r
+       get     treasure        none    ifin    null    gob3    438\r
+       get     treasure        none    ifin    null    gob4    438\r
+       get     treasure        none    ifin    null    gob5    438\r
+       get     treasure        none    ifhere  pancake 594     0\r
+       get     brass   none    ifprop  null    2       515\r
+       get     brass   none    ifprop  null    0       226\r
+       get     bedclothes      none    null    null    170     0\r
+       get     crock   none    ifprop  leprechaun      0       152\r
+       get     .get    fairy   none    set     null    1       153\r
+       get     idol    none    ifprop  null    0       197\r
+       get     rug     none    ifprop  null    0       210\r
+       get     earth   none    null    null    69      0\r
+       get     .get    bangle  none    togglesex       null    331     332\r
+       get     .get    greengem        none    inc     null    0       0\r
+       get     treasure        none    ifin    null    treasc  507\r
+       get     none    none    ifin    null    swamp2  1039    -49\r
+       get     none    none    ifin    null    swamp3  1039    -49\r
+       get     none    none    ifin    null    swamp4  1039    -49\r
+       get     none    none    ifin    null    swamp5  1039    -49\r
+       get     none    none    ifin    null    swamp6  1039    -49\r
+       get     none    none    ifin    null    swamp8  1039    -49\r
+       get     none    none    ifin    null    swamp9  1039    -49\r
+       get     none    none    ifin    null    swampa  1039    -49\r
+       get     none    none    ifin    null    swampb  1039    -49\r
+       get     none    none    ifin    null    swampc  1039    -49\r
+       get     none    none    ifin    null    swampd  1039    -49\r
+       drop    .insert curse   dwarfs  null    null    0       0\r
+       drop    .drop   curse   person  null    null    0       0\r
+       drop    curse   lizard  null    null    649     0\r
+       drop    none    none    ifin    null    fallin  893\r
+       drop    none    none    ifin    null    slidin  893\r
+       drop    .drop   curse   none    ifwiz   null    0       0\r
+       drop    curse   none    unlessin        null    firept  256\r
+       drop    .drop   curse   none    expdestroy      null    257     0\r
+       drop    none    none    ifhave  egg     262     0\r
+       drop    .insert something       dwarfs  null    null    0       0\r
+       drop    .drop   cup     enclave trans   null    dtest3  551\r
+       drop    treasure        enclave null    null    555     0\r
+       drop    sprig   enclave null    null    4       0\r
+       drop    enclave enclave null    null    651     0\r
+       drop    something       enclave destroy null    547     0\r
+       drop    anything        container       ifprop  null    1       816\r
+       drop    sheepskin       container       null    null    766     0\r
+       drop    lookingglass    container       ifsnooping      null    767     0\r
+       drop    treasure        none    ifin    null    firept  487     ;this and things like it don't cover the oracle\r
+       drop    corpse  coffin  ifprop  null    0       634\r
+       drop    corpse  coffin  null    null    631     0\r
+       drop    something       coffin  null    null    630     0\r
+       drop    anthracite      flame   destroy null    584     0\r
+       drop    .drop   veil    none    unlessin        null    temple  0\r
+       drop    .drop   veil    none    set     null    2       856\r
+       drop    something       oven    ifprop  second  1       1004\r
+       drop    .insert keg     oven    null    null    1012    0       -46\r
+       drop    .insert chip    oven    null    null    1019    0\r
+       drop    .insert something       oven    null    null    1005    0\r
+       drop    boat    none    ifin    null    sea1    248\r
+       drop    boat    none    ifin    null    sea2    248\r
+       drop    boat    none    ifin    null    sea3    248\r
+       drop    boat    none    ifin    null    sea4    248\r
+       drop    boat    none    ifin    null    sea5    248\r
+       drop    boat    none    ifin    null    sea6    248\r
+       drop    boat    none    ifin    null    sea7    248\r
+       drop    boat    none    ifin    null    sea8    248\r
+       drop    boat    none    ifin    null    sea9    248\r
+       drop    boat    none    ifin    null    sea10   248\r
+       drop    boat    none    ifin    null    sea11   248\r
+       drop    boat    none    ifin    null    sea12   248\r
+       drop    boat    none    ifin    null    sea13   248\r
+       drop    boat    none    ifin    null    sea14   248\r
+       drop    something       person  ifobjis longsword       1089    0\r
+       drop    .drop   something       person  sendemon        second  51      0\r
+       drop    .drop   something       person  null    null    0       0\r
+       drop    .drop   sword   none    destroy null    524     0\r
+       drop    .drop   pegasus none    ifin    null    whroom  0\r
+       drop    .drop   pegasus none    ifin    null    swamp1  953\r
+       drop    pegasus none    move    null    whroom  396\r
+       drop    .drop   pottery none    ifin    null    swamp1  0\r
+       drop    .drop   pottery none    ifin    null    swamp2  0\r
+       drop    .drop   pottery none    ifin    null    swamp3  0\r
+       drop    .drop   pottery none    ifin    null    swamp4  0\r
+       drop    .drop   pottery none    ifin    null    swamp5  0\r
+       drop    .drop   pottery none    ifin    null    swamp6  0\r
+       drop    .drop   pottery none    ifin    null    swamp8  0\r
+       drop    .drop   pottery none    ifin    null    swamp9  0\r
+       drop    .drop   pottery none    ifin    null    swampa  0\r
+       drop    .drop   pottery none    ifin    null    swampb  0\r
+       drop    .drop   pottery none    ifin    null    swampc  0\r
+       drop    .drop   pottery none    ifin    null    swampd  0\r
+       drop    pottery none    destroy null    442     0\r
+       drop    .drop   china   none    ifin    null    swamp1  0\r
+       drop    .drop   china   none    ifin    null    swamp2  0\r
+       drop    .drop   china   none    ifin    null    swamp3  0\r
+       drop    .drop   china   none    ifin    null    swamp4  0\r
+       drop    .drop   china   none    ifin    null    swamp5  0\r
+       drop    .drop   china   none    ifin    null    swamp6  0\r
+       drop    .drop   china   none    ifin    null    swamp8  0\r
+       drop    .drop   china   none    ifin    null    swamp9  0\r
+       drop    .drop   china   none    ifin    null    swampa  0\r
+       drop    .drop   china   none    ifin    null    swampb  0\r
+       drop    .drop   china   none    ifin    null    swampc  0\r
+       drop    .drop   china   none    ifin    null    swampd  0\r
+       drop    china   none    destroy null    655     0\r
+       drop    .drop   flower  headstone       ifprop  second  7       1076\r
+       drop    .drop   flower  headstone       null    null    902     0\r
+       drop    .drop   flower  h2o     null    null    903     0\r
+       drop    .drop   flower  torrent null    null    903     0\r
+       drop    flower  rum     destroy null    904     0\r
+       drop    flower  liquid  destroy null    904     0\r
+       drop    flower  medication      destroy null    904     0\r
+       drop    flower  lake    destroy null    904     0\r
+       drop    flower  man     null    null    900     0\r
+       drop    flower  woman   null    null    901     0\r
+       drop    wretch  victuals        inc     potatoes        167     747\r
+       drop    victuals        wretch  inc     potatoes        167     747\r
+       drop    wretch  something       null    null    119     0\r
+       drop    something       wretch  null    null    119     0\r
+       drop    .drop   flower  china   destroy second  905     0\r
+       drop    .drop   bird    none    ifprop  null    1       0\r
+       drop    bird    none    ifin    null    nest    413\r
+       drop    bird    none    ifin    null    firept  414\r
+       drop    bird    none    ifin    null    swamp1  415\r
+       drop    bird    none    ifin    null    swamp2  415\r
+       drop    bird    none    ifin    null    swamp3  415\r
+       drop    bird    none    ifin    null    swamp4  415\r
+       drop    bird    none    ifin    null    swamp5  415\r
+       drop    bird    none    ifin    null    swamp6  415\r
+       drop    bird    none    ifin    null    swamp8  415\r
+       drop    bird    none    ifin    null    swamp9  415\r
+       drop    bird    none    ifin    null    swampa  415\r
+       drop    bird    none    ifin    null    swampb  415\r
+       drop    bird    none    ifin    null    swampc  415\r
+       drop    bird    none    ifin    null    swampd  415\r
+       drop    .drop   birdofprey      none    ifin    null    nest    1107    -71\r
+       drop    .provoke        birdofprey      none    ifin    null    firept  0\r
+       drop    .drop   onyx    none    ifin    null    maze1   417\r
+       drop    .drop   onyx    none    ifin    null    maze2   418\r
+       drop    .drop   onyx    none    ifin    null    maze3   419\r
+       drop    .drop   onyx    none    ifin    null    maze4   420\r
+       drop    .drop   onyx    none    ifin    null    maze5   421\r
+       drop    .drop   onyx    none    ifin    null    maze6   422\r
+       drop    .drop   onyx    none    ifin    null    maze7   423\r
+       drop    .drop   onyx    none    ifin    null    maze8   424\r
+       drop    .drop   onyx    none    ifin    null    maze9   425\r
+       drop    .drop   onyx    none    ifin    null    maze10  426\r
+       drop    .drop   onyx    none    ifin    null    swamp1  807     ;other swamps too if you like\r
+       drop    .drop   onyx    none    null    null    416     0\r
+       drop    .drop   bangle  none    togglesex       null    331     332\r
+       drop    .drop   ball    none    inc     null    281     282\r
+       drop    .drop   money   spray   null    null    1097    0\r
+       drop    .drop   something       spray   null    null    1098    0\r
+       drop    torch   lavatory        incmove null    bwfall  827\r
+       drop    something       lavatory        move    null    bwfall  827\r
+       drop    torch   stream  incmove null    bwfall  835\r
+       drop    something       stream  move    null    bwfall  835\r
+       drop    something       height  delaymove       null    beach   12      -10\r
+       drop    .drop   pickaxe gateway dec     second  715     0       716\r
+       drop    bird    sink    null    null    427     0\r
+       drop    bird    none    ifin    null    bbath   427\r
+       drop    .drop   ice     none    ifin    null    pond1   1078\r
+       drop    .drop   ice     lake    destroydec      pool    138     4\r
+       drop    .drop   ice     h2o     null    null    1078    0\r
+       drop    keg     flame   destroytrans    null    dead19  0\r
+       drop    .drop   bunny   warren  ifprop  null    1       315\r
+       drop    .drop   bunny   warren  ifprop  null    2       568\r
+       drop    bunny   warren  expmove null    lgrm    311\r
+       drop    .drop   bunny   none    unlessin        null    swamp1  0\r
+       drop    bunny   none    destroy null    345     0\r
+       drop    .drop   tub     none    ifprop  null    1       64\r
+       drop    .drop   tub     none    ifinc   null    level   62\r
+       drop    .drop   tub     none    unlessinc       null    mudrm   61\r
+       drop    .drop   tub     none    swap    mud     63      64\r
+       drop    lookingglass    none    ifsnooping      null    449     0\r
+       drop    none    none    ifin    null    vert    73\r
+       drop    .drop   none    none    ifin    null    firept  240\r
+       drop    .drop   nut     none    unlessin        null    sqroom  0\r
+       drop    .drop   nut     none    exp     null    350     533\r
+       drop    treasure        none    ifgot   horse   954     0\r
+       drop    .drop   none    onledge unlessgot       emerald 0       0\r
+       drop    something       duct    destroy null    726     0\r
+       drop    .drop   clanger none    null    null    929     0\r
+       drop    none    onledge move    emerald bldg    723     ;NB move expects an objct, ie it ignores the fn. parameter\r
+       drop    .drop   none    none    unlessin        null    laddrm  0\r
+       drop    none    none    move    null    uhut    207\r
+       turn    wheel   none    ifpropdec       flood   1       731\r
+       turn    wheel   none    ifdisenable     null    5       731\r
+       turn    wheel   none    null    null    729     0       730     -5\r
+       re      none    none    unlessin        null    mosolm  4\r
+       re      none    none    ifprop  tomb1   0       625\r
+       re      none    none    set     tomb1   0       617\r
+       dundee  none    none    unlessin        null    mosolm  4\r
+       dundee  none    none    ifprop  tomb2   0       626\r
+       dundee  none    none    set     tomb2   0       618\r
+       432     none    none    unlessin        null    mosolm  4\r
+       432     none    none    ifprop  tomb3   0       627\r
+       432     none    none    set     tomb3   0       619\r
+       cqywri  none    none    unlessin        null    mosolm  4\r
+       cqywri  none    none    ifprop  tomb4   0       628\r
+       cqywri  none    none    set     tomb4   0       620\r
+       eb      none    none    unlessin        null    mosolm  4\r
+       eb      none    none    ifprop  tomb5   0       635\r
+       eb      none    none    set     tomb5   0       636\r
+       1152921504606846976     none    none    unlessin        null    mosolm  4\r
+       1152921504606846976     none    none    ifprop  tomb6   0       652\r
+       1152921504606846976     none    none    set     tomb6   0       653\r
+       curses  none    none    null    null    776     0\r
+       summon  .flush  none    none    unlessgot       horn    691     0       -50\r
+       summon  none    none    unlesslevel     null    4       692\r
+       summon  none    none    ifprop  horn    1       694\r
+       summon  .summon none    none    inc     horn    693     0       698\r
+       blow    trumpet none    ifin    null    bstand  794     ;could combine BLOW and PLAY?\r
+       blow    trumpet none    unlessin        null    revrm   695\r
+       blow    trumpet none    dec     crack   757     758     759\r
+       blow    shell   none    ifin    null    bstand  794\r
+       blow    shell   none    unlessin        null    revrm   74\r
+       blow    shell   none    dec     crack   75      76      697\r
+       blow    none    vermin  ifgot   flute   1074    0\r
+       blow    recorder        none    ifin    null    bstand  1070\r
+       blow    recorder        none    transhere       rat     1071    1072    1073\r
+       snoop   none    none    unlessgot       mirror  445     0\r
+       snoop   none    none    ifprop  mirror  1       4\r
+       snoop   none    none    unlesslevel     null    8       452\r
+       snoop   .snoop  none    none    null    null    446     0\r
+       l       lookingglass    none    ifinvis null    1       1085\r
+       l       lookingglass    none    null    null    450     0\r
+       l       bedclothes      none    create  potty   878     663\r
+       l       none    none    ifenabled       null    8       1077\r
+       l       none    none    ifin    null    dtest1  549\r
+       l       none    none    ifin    null    dtest2  550\r
+       l       none    none    ifin    null    doomrm  732\r
+       l       .look   none    parachute       ifprop  null    0       0\r
+       l       .look   none    height  null    null    378     0\r
+       make    .flush  none    none    unlessgot       amulet  454     0\r
+       make    .flush  none    none    unlesslevel     null    7       455\r
+       make    .make   none    none    destroy amulet  456     0\r
+       where   none    none    unlessgot       oracle  457     0\r
+       where   none    none    ifprop  oracle  0       458\r
+       where   none    none    unlesslevel     null    6       459\r
+       where   .where  none    none    dec     oracle  0       0\r
+       blast   access  cannon  ifprop  gun     2       277\r
+       blast   access  cannon  ifprop  gun     1       278\r
+       blast   access  cannon  destroyset      gun     2       279     700\r
+       blast   cannon  none    ifprop  null    2       277\r
+       blast   cannon  none    ifprop  null    1       278\r
+       blast   cannon  access  setdestroy      second  2       279     700\r
+       blast   cannon  none    set     null    2       303     700\r
+       blast   access  keg     ifprop  powder  1       250\r
+       blast   access  keg     destroydestroy  powder  251     0       701\r
+       blast   something       keg     ifzero  powder  252     253\r
+       blast   none    none    unlessgot       wand    229     0\r
+       blast   none    none    unlesslevel     null    6       243\r
+       blast   none    none    ifgot   longsword       1032    0\r
+       blast   none    stone   destroy wand    228     0\r
+       blast   person  none    hurt    null    20      0\r
+       blast   monster none    ifprop  null    2       263\r
+       blast   monster none    set     null    2       149     -61\r
+       blast   wall    none    null    null    439     0\r
+       blast   guardian        none    transwhere      dwarf   992     4\r
+       blast   .sleep  haunt   none    destroy wand    624     0\r
+       blast   .sleep  tombs   none    destroy wand    624     0\r
+       blast   marble  none    dead    null    1046    0\r
+       blast   fairy   none    incdestroy      null    154     4       -61\r
+       blast   hound   none    destroy wand    232     0\r
+       blast   wood    none    expdestroy      null    77      0       -61\r
+       blast   arachnid        none    expdestroy      null    946     0       -61\r
+       blast   cord    none    destroy null    947     0       -61\r
+       blast   wretch  none    expdestroy      null    78      0       -61\r
+       blast   dwarfs  none    unlessprop      null    0       1015\r
+       blast   dwarfs  none    expdestroy      null    786     0       -61\r
+       blast   trunk   none    ifprop  null    0       1082\r
+       blast   trunk   none    set     null    0       87      -61\r
+       blast   signpost        none    expdestroy      null    922     0       -61\r
+       blast   beast   none    destroy null    237     0       -61\r
+       blast   nanny   none    destroy null    672     0       -61\r
+       blast   goblin  none    expdestroy      null    293     0       -61\r
+       blast   enemy   none    expdestroy      null    323     0       -61\r
+       blast   fish    none    expdestroy      null    817     0       -61\r
+       blast   birdofprey      none    expdestroy      null    1109    0       -61\r
+       blast   lizard  none    zonk    null    787     0\r
+       blast   familiar        none    expdestroy      null    966     0       -61\r
+       blast   serpent none    expdestroy      null    972     0       -61\r
+       blast   sliding none    destroydestroy  magbar  300     0       -61\r
+       blast   access  none    ifin    null    sorcrm  967\r
+       blast   access  none    ifin    null    downps  967\r
+       blast   access  none    ifin    null    cannrm  4\r
+       blast   access  none    destroy null    127     0       -61\r
+       blast   oneway  none    destroy null    784     0\r
+       blast   drawbridge      none    destroytrans    null    <srock2 srock3> 238     -61\r
+       blast   iron    none    destroytrans    null    <cupd2  wrdbe>  239     -61\r
+       blast   none    none    unlessin        null    cannrm  4\r
+       blast   none    none    trans   null    <sfrst1 swamp1> 284\r
+       roll    rug     none    inc     null    216     217\r
+       unroll  rug     none    dec     null    218     219\r
+       open    oven    none    dec     null    1006    1007\r
+       open    trapdoor        none    null    null    1033    0\r
+       open    access  none    ifin    null    cannrm  283\r
+       open    access  none    ifin    null    downps  349\r
+       open    access  none    ifin    null    gob4    287\r
+       open    case    none    null    null    350     0\r
+       open    parachute       none    dec     null    107     107\r
+       open    container       none    ifobjis pot     808     0\r
+       open    charm   none    unlesshave      broadsword      541     0\r
+       open    charm   none    unlesshave      sickle  542     0\r
+       open    charm   none    unlesshave      chalice 543     0\r
+       open    charm   none    unlesshave      mistletoe       544     0\r
+       open    charm   none    null    null    545     0\r
+       open    haunt   none    ifin    null    mosolm  611\r
+       open    haunt   triumph null    null    1002    0\r
+       open    haunt   none    null    null    79      0\r
+       open    infection       none    dead    null    1047    0\r
+       open    none    goblin  null    null    292     0\r
+       open    none    enemy   null    null    324     0\r
+       open    veil    none    ifprop  null    2       224\r
+       open    veil    none    dec     null    850     852\r
+       open    sliding none    ifprop  null    0       296\r
+       open    sliding none    unlessin        null    spanel  294\r
+       open    sliding none    swap    magbar  298     298\r
+       open    slate   none    ifzero  null    553     538\r
+       open    iron    2       dec     null    80      81\r
+       open    iron    none    null    null    84      0\r
+       open    case    2       dec     null    351     352\r
+       open    none    oneway  ifprop  cupboard        0       165\r
+       open    none    ladder  null    null    162     0\r
+       open    drawbridge      2       dec     null    202     203\r
+       open    drawbridge      none    null    null    204     0\r
+       open    none    oneway  swap    sdoor   161     4\r
+       open    access  bone    ifprop  null    2       656\r
+       open    tombs   none    null    null    611     0\r
+       open    coffin  none    ifprop  null    3       614\r
+       open    coffin  none    ifpropinc       null    2       629\r
+       open    coffin  none    setfloat        body    3       613\r
+       open    rug     none    dec     null    218     219\r
+       open    wheel   none    ifprop  flood   1       951\r
+       open    wheel   none    ifenabled       null    5       951\r
+       open    wheel   none    null    null    729     0       730     -5\r
+       open    gateway pickaxe dec     null    1017    1018\r
+       open    gateway none    ifzero  null    1018    1024\r
+       close   oven    none    inc     null    1008    1009\r
+       close   trapdoor        none    null    null    1033    0\r
+       close   gateway none    inc     null    998     999\r
+       close   access  none    ifin    null    cannrm  283\r
+       close   container       none    ifobjis pot     808     0\r
+       close   veil    none    ifprop  null    2       224\r
+       close   veil    none    ifprop  null    1       853\r
+       close   veil    none    set     null    1       851     -7\r
+       close   sliding none    ifprop  null    1       297\r
+       close   sliding none    unlessin        null    spanel  294\r
+       close   sliding none    swap    magbar  299     299\r
+       close   slate   none    ifzero  null    538     554\r
+       close   iron    2       inc     null    82      83\r
+       close   iron    none    null    null    84      0\r
+       close   case    2       inc     null    353     354\r
+       close   case    none    null    null    350     0\r
+       close   drawbridge      none    inc     null    205     206\r
+       close   none    oneway  ifprop  cupboard        1       166\r
+       close   none    oneway  swap    sdoor   163     4\r
+       close   access  none    ifprop  null    2       187\r
+       close   tombs   none    null    null    611     0\r
+       close   coffin  none    ifprop  null    0       616\r
+       close   coffin  none    ifprop  null    2       616\r
+       close   coffin  none    set     null    2       615\r
+       close   parachute       none    ifin    null    fallin  894\r
+       close   parachute       none    inc     null    108     108\r
+       close   haunt   none    ifin    null    mosolm  611\r
+       close   haunt   none    inc     null    598     4\r
+       close   wheel   none    ifpropdec       flood   1       731\r
+       close   wheel   none    ifdisenable     null    5       731\r
+       close   wheel   none    null    null    952     0\r
+       write   none    none    unlessgot       quill   244     0\r
+       write   none    none    ifgot   scroll  309     0\r
+       write   none    none    ifgot   libram  461     0\r
+       write   book    none    writein null    246     0       -48\r
+       sick    none    none    ifdisenable     null    8       871\r
+       fix     none    none    ifhave  egg     832     0\r
+       fix     signpost        none    null    null    925     0\r
+       fix     torch   lavatory        incmove null    bwfall  827\r
+       fix     something       lavatory        move    null    bwfall  827\r
+       fix     torch   stream  incmove null    bwfall  835\r
+       fix     something       stream  move    null    bwfall  835\r
+       fix     .drop   cup     enclave trans   null    dtest3  551\r
+       fix     treasure        enclave null    null    555     0\r
+       fix     sprig   enclave null    null    4       0\r
+       fix     enclave enclave null    null    651     0\r
+       fix     something       enclave destroy null    547     0\r
+       fix     torch   time    ifprop  sundial 0       386\r
+       fix     torch   time    ifprop  null    0       387\r
+       fix     torch   time    destroydec      sundial 388     0\r
+       fix     magic   time    null    null    380     0\r
+       fix     pointer time    null    null    806     0\r
+       fix     flower  time    null    null    906     0\r
+       fix     treasure        time    null    null    440     0\r
+       fix     bird    sink    null    null    427     0\r
+       fix     keg     cannon  ifprop  null    1       274\r
+       fix     keg     cannon  destroydec      gun     275     0\r
+       fix     ball    cannon  ifprop  gun     2       280\r
+       fix     ball    cannon  destroydec      gun     276     0\r
+       fix     head    space   unlessin        null    hut     329\r
+       fix     head    space   ifprop  null    1       192\r
+       fix     ram     space   ifin    null    hut     570\r
+       fix     triumph space   null    null    1003    0\r
+       fix     .drop   head    space   swap    tdoor   191     0\r
+       fix     .insert veil    container       null    null    0       0\r
+       fix     veil    none    unlessin        null    temple  854\r
+       fix     veil    none    unlessprop      null    2       855\r
+       fix     .drop   veil    none    set     null    0       856\r
+       fix     something       oven    ifprop  second  1       1004\r
+       fix     .insert keg     oven    null    null    1012    0       -46\r
+       fix     .insert chip    oven    null    null    1019    0\r
+       fix     .insert something       oven    null    null    1005    0\r
+       fix     fuse    keg     destroydec      powder  254     0\r
+       fix     fuse    lantern ifprop  second  0       910\r
+       fix     fuse    lantern destroyset      lamp    1       911     -22\r
+       fix     brass   bone    ifprop  null    2       516\r
+       fix     bone    brass   ifprop  second  2       516\r
+       fix     brass   bone    incdestroy      fossil  227     0\r
+       fix     bone    brass   destroyinc      ring    227     0\r
+       fix     .drop   bunny   warren  ifprop  null    1       315\r
+       fix     bunny   warren  expmove null    lgrm    311\r
+       fix     anything        container       ifprop  null    1       816\r
+       fix     sheepskin       container       null    null    766     0\r
+       fix     lookingglass    container       ifsnooping      null    767     0\r
+       fix     .drop   flower  headstone       ifprop  second  7       1076\r
+       fix     .drop   flower  headstone       null    null    902     0\r
+       fix     .drop   flower  h2o     null    null    903     0\r
+       fix     .drop   flower  torrent null    null    903     0\r
+       fix     flower  lake    destroy null    904     0\r
+       fix     flower  liquid  destroy null    904     0\r
+       fix     flower  rum     destroy null    904     0\r
+       fix     flower  medication      destroy null    904     0\r
+       fix     flower  china   destroy second  905     0\r
+       fix     .drop   money   spray   null    null    1097    0\r
+       fix     .drop   something       spray   null    null    1098    0\r
+       fix     killer  rock    ifprop  null    1       1029\r
+       fix     .drop   killer  rock    set     null    1       1030\r
+       fix     .provoke        birdofprey      container       null    null    1106    0\r
+       fix     bird    container       unlessprop      null    1       768\r
+       fix     fairy   container       null    null    769     0\r
+       fix     pottery container       null    null    770     0\r
+       fix     china   container       null    null    770     0\r
+       fix     boat    container       null    null    772     0\r
+       fix     nut     container       null    null    773     0\r
+       fix     sprig   container       null    null    774     0\r
+       fix     parachute       container       ifprop  null    0       815\r
+       fix     container       bedclothes      unlessobjis     potty   948     0\r
+       fix     container       bedclothes      destroy null    950     0\r
+       meditate        .sleep  none    none    ifin    null    chambr  993     -44\r
+       meditate        .sleep  none    none    ifin    null    hchamb  993     -45\r
+       meditate        none    mpoint  trans   null    <paddck rail2>  997\r
+       meditate        none    none    unlessin        null    shrine  994\r
+       meditate        none    none    unlessdisenable null    44      995\r
+       meditate        none    none    unlessdisenable null    45      995\r
+       meditate        none    none    trans   null    osanct  996\r
+       go      .go     none    none    iflevel null    10      0       ;let berserk wizards, too\r
+       go      none    dwarfs  ifprop  null    3       1014\r
+       go      none    dwarfs  ifprop  null    2       1091\r
+       go      none    enemy   null    null    676     0\r
+       back    .back   none    none    iflevel null    10      0       ;let berserk wizards, too\r
+       back    none    dwarfs  ifprop  null    3       1014\r
+       back    none    dwarfs  ifprop  null    2       1091\r
+       back    none    enemy   null    null    676     0\r
+       move    .go     none    none    iflevel null    10      0\r
+       move    none    dwarfs  ifprop  null    3       1014\r
+       move    none    enemy   null    null    676     0\r
+       sleep   none    none    ifin    null    slidin  1096\r
+       sleep   none    none    ifin    null    fallin  1096\r
+       value   antidote        none    null    null    1051    1051\r
+       value   ivory   none    null    null    1051    1051\r
+@txtbtm\r
+       shake   wave\r
+       rap     tap\r
+       knock   tap\r
+       poke    tap\r
+       witches wizards\r
+       zap     blast\r
+       shoot   blast\r
+       tie     tether\r
+       untie   untether\r
+       free    untether\r
+       loose   untether\r
+       sound   toll\r
+       yank    pull\r
+       tug     pull\r
+       sniff   smell\r
+       snort   smell\r
+       hone    sharpen\r
+       whittle sharpen\r
+       pray    worship\r
+       mount   ride\r
+       sound   blow\r
+       hoot    blow\r
+       fart    blow\r
+       honk    blow\r
+       clean   bath\r
+       wash    bath\r
+       hint    hints\r
+;;vocabulary demon actions\r
+action $play   .unfreeze       none    none    destroy violin  839     0\r
+       $smash  .vis    none    none    unlessin        null    rost    0\r
+       $smash  .vis    none    none    dec     slab    539     0\r
+       $flood  none    none    incsend flood   dead41  0\r
+       $trans  none    none    ifin    null    cavein  0\r
+       $trans  none    none    trans   null    cavein  858\r
+       $drunk  none    none    ifasleep        null    1       0       -8\r
+       $drunk  .sleep  none    none    ifr     null    40      870     -8\r
+       $drunk  none    none    ifr     null    66      877     -9\r
+       $drunk  .sleep  none    none    ifr     null    50      870\r
+       $drunk  none    none    sendmess        null    883     884     -11\r
+       $drunk1 .back   none    none    null    null    0       0       -8\r
+       $drunk2 none    none    ifr     null    10      0       -8\r
+       $drunk2 none    none    sendmess        null    883     884     -11\r
+       $message        none    none    null    null    880     0\r
+       $plonk  none    none    null    null    881     0       881\r
+       $fall   none    none    trans   null    fallin  890     -14\r
+       $land   none    none    unlessin        null    fallin  0\r
+       $land   none    none    trans   null    beach   891\r
+       $dragon none    none    ifdead  dragon  0       0\r
+       $dragon none    none    expdestroy      dragon  896     896     896\r
+       $exp    none    none    exp     null    1       0\r
+       $check  none    none    enable  null    18      0\r
+       $out    none    none    ifgot   lamp    909     0       -20\r
+       $out    none    none    set     lamp    2       0\r
+       $out1   none    none    set     lamp    2       0\r
+       $suspend        none    none    suspend null    18      0\r
+       $clear  none    none    ifdisenable     null    18      0\r
+       $bump   none    none    ifin    null    slidin  916     -25\r
+       $emerge none    none    unlessin        null    slidin  0\r
+       $emerge none    none    trans   null    uland3  915\r
+       $move   none    none    set     sptrap  0       0\r
+       $spider .provoke        something       none    ifdestroyed     web     0       0\r
+       $spider none    none    dead    null    1048    0\r
+       $devour none    vermin  destroy null    977     0\r
+       $fdevour        none    vermin  destroy null    1104    0\r
+       $fdevour        none    bird    unlessprop      null    0       0\r
+       $fdevour        none    bird    destroy null    1105    0\r
+       $fdevour        none    bunny   ifprop  null    1       0\r
+       $fdevour        none    bunny   set     null    1       1108\r
+       $burn   none    none    ifprop  stove   0       0\r
+       $burn   none    none    destroy stove   1013    0       1013\r
+       $zzz    none    none    ifin    null    slidin  1031\r
+       $zzz    none    none    ifin    null    fallin  1031\r
+       $zzz    .sleep  none    none    null    null    171     0\r
+       $written        none    none    expdestroy      quill   0       0\r
+       $uranium        none    none    unlessgot       uranium 0       0\r
+       $uranium        none    none    ifasleep        null    1       0       -51\r
+       $uranium        none    none    losestamina     null    2       1066    -51\r
+       $ratty  none    none    ifasleep        null    1       0\r
+       $ratty  none    none    ifwiz   null    0       0\r
+       $ratty  none    none    ifgot   cat     0       0\r
+       $ratty  none    none    ifgot   flute   0       0\r
+       $ratty  .provoke        something       none    ifrstas null    0       0       -4\r
+       $blast  none    none    ifprop  wandvolume      1       0       702\r
+       $arch1  none    none    ifinvis null    1       0\r
+       $arch1  none    none    ifenabled       null    63      0\r
+       $arch1  .invis  none    none    null    null    0       0       -63\r
+       $arch2  none    none    ifinvis null    0       0\r
+       $arch2  .vis    none    none    null    null    0       0\r
+       $arch3  none    none    trans   null    woe2    0       -62\r
+       $arch4  none    none    trans   null    woe1    0       -62\r
+       $dprovoke       .vis    none    none    ifinvis null    1       0\r
+       $dprovoke       none    none    ifasleep        null    1       0\r
+       $dprovoke       .provoke        something       none    null    null    0       0       -4\r
+       $fprovoke       none    none    ifinvis null    1       0\r
+       $fprovoke       none    none    ifwiz   null    0       0\r
+       $fprovoke       none    none    ifgot   gauntlet        0       0\r
+       $fprovoke       .provoke        something       none    null    null    0       0       -4\r
+       $reseagle       none    none    resetdest       eagle   200     0\r
+@txtdac\r
+*demons        71\r
+@txtdmn\r
+2      $play   stradivarius    none    60      always\r
+5      $flood  none    none    15      global\r
+7      $trans  none    none    15\r
+8      $drunk  none    none    30-60\r
+9      $drunk1 none    none    -1\r
+10     $message        none    none    -1\r
+11     $drunk2 none    none    2\r
+12     $plonk  none    none    8\r
+13     $fall   none    none    -1\r
+14     $land   none    none    8\r
+;don't make $dragon either global or always - i want a full 20 minutes, and\r
+;points to be accredited.\r
+15     $dragon none    none    1200-1800\r
+17     $exp    none    none    -1\r
+18     $out    none    none    1800    global\r
+19     $check  none    none    -1\r
+20     $out1   none    none    -1\r
+21     $suspend        none    none    -1\r
+22     $clear  none    none    -1\r
+24     $bump   none    none    10\r
+25     $emerge none    none    10-20\r
+26     $spider whichever       none    -1\r
+27     $move   none    none    10      global\r
+43     $devour none    none    -1      global\r
+;so just about possible to meditate in 2 places at once\r
+44     $null   none    none    15      global\r
+45     $null   none    none    15      global\r
+46     $burn   none    none    900     global\r
+47     $zzz    none    none    -1\r
+48     $written        none    none    -1\r
+51     $uranium        none    none    10-20\r
+60     $ratty  whichever       none    -1\r
+61     $blast  none    none    -1\r
+62     $arch1  none    none    -1\r
+63     $arch2  none    none    30-450\r
+64     $arch3  none    none    -1\r
+65     $arch4  none    none    -1\r
+66     $dprovoke       whichever       none    -1\r
+67     $fdevour        none    none    -1      global\r
+;no. 68 is spare\r
+69     $fprovoke       whichever       none    -1\r
+;no. 70 is spare\r
+71     $reseagle       none    none    -1      global\r
+*objects\r
+chain  hotpas  0       0       0\r
+0      The links of a valuable gold chain glister in front of you.\r
+pin    store   0       0       0\r
+0      A shiny new pin lies at your feet!\r
+almanac        store   0       0       1\r
+0      ?\r
+bouquet        store   0       0       0\r
+0      A beautiful bouquet of fragrant flowers has been placed at your feet.\r
+sphere nbank   0       2       1\r
+0      A platinum-plated sphere rests on the bank.\r
+1      A platinum-plated sphere is here.\r
+2      An iron ball is here.\r
+web    ruin    ruin    0       1       1\r
+0      There is a thick, silver-looking cord here, coated in a strange,\r
+       clear substance.\r
+1      You are trapped in an enormous spider's web!\r
+spider 20      0       26      splair  0       0       0       110     noget\r
+0      An enormous spider stands before you!\r
+baton  bstand  0       0       1\r
+0      A conductor's baton lies on the floor.\r
+bow    <study  lounge  attic>  0       0       1\r
+0      A violin bow has been put here.\r
+violin attic   0       1       0\r
+0      A priceless violin is at your feet.\r
+bolt   rail2   1       1       0\r
+0      There is a golden bolt here.\r
+1      A golden bolt has been hammered into one of the railway sleepers.\r
+disc   cavein  0       0       0\r
+0      A golden disc is here, bearing the design of a red eye.\r
+coal   bunker  0       0       0\r
+0      A polished piece of carved anthracite has been left here.\r
+wandvolume     store   0       1       2       noget   noit\r
+0      The wand is on low volume.\r
+1      The wand is on high volume.\r
+toilet bathrm  0       0       1       noget   noit\r
+toilet dwbog   0       0       1       noget   noit\r
+river  river1  0       0       1       noget   noit\r
+river  river2  0       0       1       noget   noit\r
+river  river3  0       0       1       noget   noit\r
+river  rapids  0       0       1       noget   noit\r
+river  nbank   0       0       1       noget   noit\r
+cliff  wfall   0       0       1       noget   noit\r
+cliff  clifff  0       0       1       noget   noit\r
+cliff  track1  0       0       1       noget   noit\r
+cliff  clffst  0       0       1       noget   noit\r
+cliff  nfrst4  0       0       1       noget   noit\r
+cliff  sfrst1  0       0       1       noget   noit\r
+basin  bathrm  0       0       1       noit    noget\r
+;what follows means that there's fresh water there...\r
+water  river1  0       0       1       noget   noit\r
+water  river2  0       0       1       noget   noit\r
+water  river3  0       0       1       noget   noit\r
+water  rapids  0       0       1       noget   noit\r
+water  nbank   0       0       1       noget   noit\r
+water  bbath   0       0       1       noget   noit\r
+water  bathrm  galley  bwfall  fowrm   0       0       1       noget   noit\r
+water  wfall   0       0       1       noget   noit\r
+water  beach2  0       0       1       noget   noit\r
+water  pond1   0       0       1       noget   noit\r
+water  spring  0       0       1       noget   noit\r
+water  main2   0       0       1       noget   noit\r
+water  kitche  0       0       1       noget   noit\r
+water  jetty   0       0       1       noget   noit\r
+trees  forist  0       0       1       noget   noit\r
+trees  ifrst5  0       0       1       noget   noit\r
+trees  clffst  nfrst4  sfrst1  0       0       1       noget   noit\r
+trees  mfrst   fslop1  fslop2  fslop3  ifrst1  ifrst2  ifrst3  ifrst4  ifrst6  dcliff  pines1  pines2  pines3  pines4  pines5  pines6  pines7  wabe    whroom  bbath   gaptrm  lionrm  sett    bstand  nfrst1  nfrst2  nfrst3  sfrst2  efrst1  0       0       1       noget   noit\r
+trees  sqrm    0       0       1       noget   noit\r
+trees  sqroom  0       0       1       noget   noit\r
+trees  ufrst1  0       0       1       noget   noit\r
+trees  ufrst2  0       0       1       noget   noit\r
+trees  ufrst3  0       0       1       noget   noit\r
+trees  ufrst5  0       0       1       noget   noit\r
+arch   woe1    0       0       1       noget   noit\r
+arch   woe2    0       0       1       noget   noit\r
+medpoint       isanct  osanct  0       0       1       noget   noit\r
+squirrels      sqrm    sqroom  0       0       0       noit\r
+slab   rost    1       1       2       noget\r
+0      The slate slab has been swung open, revealing a chamber below.\r
+1      The slate slab obviously conceals something below, but is too heavy\r
+       for you to slide over. It is obviously meant to be used for sacrificing\r
+       human beings...\r
+filling        <ntomb  wtomb   swtomb  setomb  stomb>  0       0       0\r
+0      A golden filling from some unfortunate glints here.\r
+sarcophagus    wtomb   wtomb   0       3       4\r
+0      The sarcophagus is closed.\r
+1      The sarcophagus is open.\r
+2      The sarcophagus is closed.\r
+3      The sarcophagus is open.\r
+body   wtomb   wtomb   0       1       1\r
+1      There is a severely dead body slumped here.\r
+vase   <ntomb  wtomb   swtomb  setomb  stomb>  0       0       0\r
+0      A delicate china vase, with fine jade detail, rests here.\r
+jewels <ntomb  wtomb   swtomb  setomb  stomb>  0       0       0\r
+0      Some fabulous jewels here make you catch your breath in awe!\r
+sceptre        <ntomb  wtomb   swtomb  setomb  stomb>  0       0       0\r
+0      A magnificent sceptre lies resplendent here!\r
+horn   <ntomb  wtomb   swtomb  setomb  stomb>  0       1       0\r
+0      A mighty hunting horn lies here!\r
+1      A hunting horn lies here.\r
+inscription    mosolm  mosolm  0       0       1       noit\r
+tomb1  mosolm  mosolm  1       1       2       noit\r
+0      The north tomb is open.\r
+1      Written on the north tomb is "lundio edra el ?".\r
+tomb2  mosolm  mosolm  1       1       2       noit\r
+0      The west tomb is open.\r
+1      Written on the west tomb is "315121859=sutton, 33183150=blackpool,\r
+       3361795=leeds, 357383407=?".\r
+tomb3  mosolm  mosolm  1       1       2       noit\r
+0      The south tomb is open.\r
+1      Written on the south tomb is "18 108 945 162 243 405 513 972 135 351 ?".\r
+tomb4  mosolm  mosolm  1       1       2       noit\r
+0      The east tomb is open.\r
+1      On the east tomb is written "tqxxmkhac qi zlnio vtut ny zom sqkbldl wo\r
+       jxnqfhdhj vzonhtt (one word is repeated)".\r
+tomb5  mosolm  mosolm  1       1       2       noit\r
+0      The southeast tomb is open.\r
+1      On the southeast tomb is "ls b sp cl h tcr oc bs ma lg q nhg hp sb wc\r
+       ea na wa ?".\r
+tomb6  mosolm  mosolm  1       1       2       noit\r
+0      The southwest tomb is open.\r
+1      On the southwest tomb is "2 to the power of 60".\r
+locket brost   0       0       0\r
+0      A charming locket catches the light, near your boots.\r
+niche  dtest2  dtest2  0       0       1       noget\r
+fork   dtest3  0       0       0\r
+0      Placed here is a golden fork of very early design.\r
+starstone      dtreas  0       0       0\r
+0      A loose starstone has fallen here.\r
+topaz  dtreas  0       0       0\r
+0      At your feet is a large topaz.\r
+bloodstone     dtreas  0       0       0\r
+0      To one side, a deep-red bloodstone catches your eye.\r
+amethyst       dtreas  0       0       0\r
+0      Glinting in the light, nearby, is a polished amethyst.\r
+fleece dtreas  0       0       0\r
+0      Left in a corner is a scented fleece.\r
+clasp  dtreas  0       0       0\r
+0      A silver clasp has been dropped on the ground nearby you.\r
+headband       dtreas  0       0       0\r
+0      A fabulous druidic headband, an inch across and solid gold, makes you\r
+       gasp when you espy it!\r
+skull  dtreas  0       1       1\r
+0      The skull of a ram is on the floor.\r
+1      A valuable ram's skull is on the floor here.\r
+acorn  ifrst3  0       0       1\r
+0      On the ground here lies an acorn.\r
+sickle <ifrst6 ifrst5> 0       0       0\r
+0      A golden sickle lies untarnished at your feet.\r
+chalice        ifrst6  0       0       0\r
+0      A chalice of extraordinary beauty has been dropped here.\r
+bell   slope3  0       0       0\r
+0      A magnificent bell lies by your feet.\r
+broadsword     <cove   ifrst2  rost>   1       -1      0       bright  nosummon\r
+0      A marvellous broadsword lies shining in front of you!\r
+1      A fearsome broadsword lies in front of you, a marvel to behold!\r
+longsword      sea14   1       1       2       bright  nosummon\r
+0      A murderous, blood-stained longsword lies here.\r
+1      Thrust deep into a rock is a murderous longsword!\r
+granite        sea14   0       0       1       noit    noget\r
+sabre  store   0       0       1\r
+0      A bloodstained, menacing sabre lies at your feet!\r
+rapier store   0       0       1\r
+0      A lengthy, vicious rapier has been dropped here!\r
+epee   store   0       0       1\r
+0      A dangerous, mean-looking epee has been placed on the ground here!\r
+cutlass        store   0       0       1\r
+0      Lying to one side is a mighty cutlass!\r
+foil   store   0       0       1\r
+0      You espy a springy, well-balanced, yet sturdy foil nearby!\r
+scimitar       store   0       0       1\r
+0      A deadly-sharp scimitar catches the light at your feet!\r
+bat    attic   0       0       0\r
+0      A fine willow cricket bat is propped up here.\r
+toadstool      fring   0       0       1\r
+0      A lone red and white toadstool grows here.\r
+die    guadrm  0       -5      6\r
+0      A die, made of solid ivory, has been rolled here.\r
+1      A die, made of solid ivory, has been rolled here.\r
+2      A die, made of solid ivory, has been rolled here.\r
+3      A die, made of solid ivory, has been rolled here.\r
+4      A die, made of solid ivory, has been rolled here.\r
+5      A die, made of solid ivory, has been rolled here.\r
+mistletoe      lsp1    0       0       1\r
+0      A sprig of mistletoe lies here.\r
+stethoscope    sorcrm  0       0       0\r
+0      On the ground lies a stethoscope.\r
+mirror sorcrm  0       1       1\r
+0      There is a lookingglass here. On the back is written the following:\r
+       "If you have sufficient magical power, you may WATCH people. Break the\r
+        mirror to stop."\r
+1      There is a solid silver lookingglass here.\r
+amulet sorcrm  0       0       0\r
+0      An ancient amulet is here. Upon its reverse is inscribed: "with me,\r
+       strong warlocks may FORCE people to do things."\r
+oracle sorcrm  7       7       0\r
+7      An oracle here speaks: "You may ask me WHERE things are, seven times".\r
+6      An oracle here speaks: "You may ask me WHERE things are, six times".\r
+5      An oracle here speaks: "You may ask me WHERE things are, five times".\r
+4      An oracle here speaks: "You may ask me WHERE things are, four times".\r
+3      An oracle here speaks: "You may ask me WHERE things are, thrice".\r
+2      An oracle here speaks: "You may ask me WHERE things are, twice."\r
+1      An oracle here speaks: "You may ask me WHERE things are, once."\r
+0      An oracle here speaks: "I shall answer no more."\r
+banger xmasbx  0       0       0\r
+0      A firework marked "banger" lies at your feet.\r
+banger xmasbx  0       0       0\r
+0      %banger\r
+banger xmasbx  0       0       0\r
+0      %banger\r
+banger xmasbx  0       0       0\r
+0      %banger\r
+rocket xmasbx  0       0       0\r
+0      A rocket (firework variety) has been discarded here.\r
+rocket xmasbx  0       0       0\r
+0      %rocket\r
+rocket xmasbx  0       0       0\r
+0      %rocket\r
+rocket xmasbx  0       0       0\r
+0      %rocket\r
+sparkler       xmasbx  1       1       1       bright\r
+0      There is a sparkling sparkler here, its pretty, glittering flecks of\r
+       light cascading around it!\r
+1      There is an unlit sparkler here.\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+sparkler       xmasbx  1       1       1       bright\r
+0      %sparkler\r
+1      %sparkler\r
+holly  xmasbx  0       0       0\r
+0      A branch of festive holly is not decking the hall here.\r
+xmastree       xmasbx  0       0       0       bright\r
+0      A beautiful Christmas tree is here, decorated in pretty lights and\r
+       baubles.\r
+bell   xmasbx  1       1       1\r
+1      A Christmas bell plays its old familiar carols here.\r
+mousse xmasbx  0       0       0\r
+0      The heady aroma of a shocking-pink mousse here tempts your palate!\r
+mouse  xmasbx  0       0       0\r
+0      A not-quite-enchanted sugar mouse is here.\r
+candle xmasbx  0       0       0       bright\r
+0      A candle shines here.\r
+snowman        xmasbx  0       0       0\r
+0      A jolly snowman tries very hard not to melt nearby.\r
+cracker        xmasbx  0       0       0\r
+0      A Christmas cracker lies here, minding its own business.\r
+carolbook      xmasbx  0       0       0\r
+0      There is a Christmas Carol book here, full of Christmas carols (not the\r
+       story). You know the sort of thing I mean, "Once in Royal boughs of\r
+       holly", "I saw three french hens come sailing by", "oh silent night of\r
+       first noel", things like that.\r
+reindeer       20      0       6       xmasbx  0       0       0       bright  noget\r
+0      A sturdy reindeer lumbers past you nearby.\r
+santaclaus     0       0       6       xmasbx  0       0       0       noget\r
+0      Ho ho ho, Father Christmas here again, with your Christmas gifts!\r
+mincepies      xmasbx  0       0       0\r
+0      Some delicious mince pies sit sumptiously on the floor, if you like\r
+       mince pies which it happens I don't but never mind, who am I to spoil\r
+       the Season of Goodwill and all that?\r
+plumpudding    xmasbx  0       0       0\r
+0      There is some plum pudding here, with a thumb-hole in it.\r
+turkey 5       0       6       xmasbx  0       0       0       50      noget\r
+0      A turkey in a mad panic flees for its very life here.\r
+sleigh xmasbx  0       0       0\r
+0      A sleigh without a rosebud on it rests here.\r
+ivy    bbath   0       0       1       noget\r
+snake  25      0       40      rail2   0       0       0       90\r
+0      A viper slithers by your feet...\r
+cat    1       43      0       sorcrm  0       9       9\r
+9      A dead cat has been left here.\r
+8      A mound of sliced and beaten matted fluff before you appears to be a\r
+       still-living cat.\r
+7      Before you you recognise that a pile of red fur is in fact a cat, still\r
+       breathing...\r
+6      A nearly-dead cat bleeds before you. It thinks it's purring but it\r
+       sounds more like a whistle with no pea in it.\r
+5      A bloodied cat lies here, its once black fur matted with red gore.\r
+4      A heavily bloodstained cat is here, coughing up innards as it purrs.\r
+3      A severely cut up cat is here, purring with great difficulty.\r
+2      A decidedly ill cat is here, purring sort of groggily.\r
+1      A rather ruffled black cat is here which doesn't look at all well.\r
+0      A sleek, black cat sits here, purring happily to itself.\r
+cat    store   10      10      0       200\r
+10     A sleek, black cat sits here, purring happily to itself.\r
+rstop  rattun  1       1       2       noit    noget\r
+sptrap splair  1       1       2       noit    noget\r
+sundial        wabe    1       1       0       noget\r
+0      In the sundial has been fixed a brand as a gnomon.\r
+1      The sundial has no gnomon, so cannot tell the time.\r
+garnet grotto  0       0       0\r
+0      You notice a curiously-carven piece of garnet by your feet.\r
+lever  grotto  0       0       1       noget\r
+0      Embedded in the east wall is a lever.\r
+chart  capt    0       0       1\r
+0      An ancient chart lies in its frame here.\r
+foot   sett    0       0       0\r
+0      A lucky rabbit's foot is here!\r
+buckle insett  0       0       0\r
+0      A shiny buckle has somehow found its way here.\r
+apple  gaptrm  0       1       1\r
+0      Growing on the tree is a golden apple!\r
+1      A golden apple lies here, lustrously.\r
+horse  whroom  0       0       0\r
+0      A white, winged stallion stands majestically before you.\r
+gull   0       0       6       beach   0       1       1\r
+0      A seagull flutters about you, aimlessly.\r
+1      A lifelike golden seagull is here!\r
+birdbath       bbath   0       0       1       noget\r
+lion   lionrm  0       0       0\r
+0      An onyx lion has been placed here. Upon its base is the legend: "Drop\r
+       me in the garden of death to learn the path."\r
+pancake        pantry  0       0       0\r
+0      A pancake in a pan lies on the shelf.\r
+runes  downps  0       0       1       noget\r
+runes  sorcrm  0       0       1       noget\r
+crystals       sorcrm  0       0       1\r
+0      Some coloured crystals give off a heavy vapour here.\r
+uranium        face3   0       0       0       bright\r
+0      A strange metal glows uncannily over to one side.\r
+naughty        store   0       0       1       noit\r
+wardrobe       hall    0       0       1       noit    noget\r
+potion sorcrm  0       1       1\r
+0      A vial of clear green potion has been left here.\r
+1      A vial of cloudy green potion has been left here.\r
+scroll wrdbe   0       0       1\r
+0      An aged scroll has been placed here.\r
+fur    wrdbe   0       0       0\r
+0      A moth-eaten fur coat lies strewn at your feet.\r
+goat   3       0       6       wdale   1       1       2       110\r
+0      There is a nanny goat here.\r
+1      A nanny goat is tethered here.\r
+rabbit 10      0       6       nhill1  0       1       0\r
+0      A playful rabbit snuffles round your feet.\r
+1      A savagely slaughtered rabbit lies pitifully at your feet.\r
+rabbit store   2       2       0\r
+2      A playful rabbit snuffles round your feet.\r
+flute  treasc  0       0       0\r
+0      There lies a silver flute by your feet.\r
+gate   entrnc  topcit  1       1       2       noget\r
+0      The gateway is open.\r
+1      The gateway is closed. Upon it is written, "Drop the key on me and I\r
+       shall open".\r
+springwater    spring  0       0       1       noget   noit\r
+dwarf  3       0       6       dwpst1  0       1       0       15      noget   contains        15000   transparent     opened  disguised\r
+0      A stocky dwarf eyes you up and down with suspicion.\r
+1      A dwarf sleeps here.\r
+tin    face1   1       1       0\r
+0      Some useful tin ore lies here.\r
+1      In the face there looks to be some tin ore.\r
+tin    face4   1       1       0\r
+0      %tin\r
+1      %tin\r
+tin    face2   1       1       0\r
+0      %tin\r
+1      %tin\r
+tin    face3   1       1       0\r
+0      %tin\r
+1      %tin\r
+tin    dwarf   0       0       0\r
+0      %tin\r
+tin    sectn   0       0       0\r
+0      %tin\r
+tin    dwstre  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+tin    ktreas  0       0       0\r
+0      %tin\r
+dwarf  dorm    1       1       0       40      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+1      %dwarf\r
+dwarf  dorm    1       1       0       30      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+1      %dwarf\r
+dwarf  dorm    1       1       0       50      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+1      %dwarf\r
+dwarf  odorm   1       1       0       40      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+1      %dwarf\r
+dwarf  odorm   1       1       0       35      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+1      %dwarf\r
+dwarf  pdorm   1       1       0       45      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+1      %dwarf\r
+dwarf  19      0       6       dwpst2  0       0       0       95      noget   contains        95000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  17      0       6       dwpst2  0       0       0       85      noget   contains        85000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  13      0       6       dwpst2  0       0       0       65      noget   contains        65000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  11      0       6       dwpst2  0       0       0       55      noget   contains        55000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  7       0       6       dwpst2  0       0       0       35      noget   contains        35000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  5       0       6       dwpst2  0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  20      0       6       dwrm3   0       0       0       45      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  21      0       6       dwrm3   0       0       0       35      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  22      0       6       dwbog   0       0       0       55      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  10      0       6       kdorm   0       0       0       10      noget   contains        25000   transparent     opened  disguised\r
+0      A young dwarf is here, smiling happily.\r
+dwarf  11      0       6       kdorm   0       0       0       10      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  12      0       6       dwrm2   0       0       0       10      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  13      0       6       dwrm2   0       0       0       11      noget   contains        25000   transparent     opened  disguised\r
+0      A cherry dwarf is here, smiling happily.\r
+dwarf  20      0       6       dwrm2   0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      There is a female dwarf here.\r
+dwarf  21      0       6       dwrm2   0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  22      0       6       dwrm2   0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  23      0       6       dwrm3   0       0       0       35      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  24      0       6       pdorm   0       0       0       35      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  25      0       6       dwcant  0       0       0       35      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  26      0       6       dwcant  0       0       0       45      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  27      0       6       dwktch  0       0       0       45      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  23      0       6       dwrm4   0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      There is an old dwarf here.\r
+dwarf  40      0       6       dwrm4   0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      %dwarf\r
+dwarf  45      0       6       dwrm4   0       0       0       25      noget   contains        25000   transparent     opened  disguised\r
+0      There is an old female dwarf here.\r
+dwarf  50      0       6       dwrm4   0       0       0       20      noget   contains        25000   transparent     opened  disguised\r
+0      There is an old female dwarf here.\r
+dwarf  7       0       6       dwrm4   0       0       0       20      noget   contains        25000   transparent     opened  disguised\r
+0      There is a sprightly old female dwarf here.\r
+dwarf  guard1  3       3       3       50      noget   contains        25000   transparent     opened  disguised\r
+3      A stocky dwarf guard blocks your way.\r
+dwarf  guard1  3       3       3       50      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard1  3       3       3       50      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard2  3       3       3       60      noget   contains        25000   transparent     opened  disguised\r
+3      A hefty dwarf guard blocks your way.\r
+dwarf  guard2  3       3       3       60      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard2  3       3       3       60      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard3  3       3       3       90      noget   contains        25000   transparent     opened  disguised\r
+3      A burly dwarf guard blocks your way.\r
+dwarf  guard3  3       3       3       85      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard3  3       3       3       95      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard4  3       3       3       90      noget   contains        25000   transparent     opened  disguised\r
+3      A surly dwarf guard blocks your way.\r
+dwarf  guard4  3       3       3       90      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  guard4  3       3       3       90      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  ktreas  3       3       3       65      noget   contains        25000   transparent     opened  disguised\r
+3      A thickset dwarf guard blocks your way.\r
+dwarf  ktreas  3       3       3       70      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  ktreas  3       3       3       75      noget   contains        25000   transparent     opened  disguised\r
+3      %dwarf\r
+dwarf  pdorm   1       1       0       30      noget   contains        25000   transparent     opened  disguised\r
+0      There is a female dwarf here.\r
+1      A female dwarf sleeps here.\r
+dwarf  kdorm   1       1       0       10      noget   contains        25000   transparent     opened  disguised\r
+0      A mewling baby dwarf bawls here incessantly. \r
+1      A baby dwarf sleeps here.\r
+dwarf  kingst  2       2       2       110     noget   contains        25000   transparent     opened  disguised\r
+2      The dwarfen king is here!\r
+dwarf  kqdorm  0       0       0       40      noget   contains        25000   transparent     opened  disguised\r
+0      The dwarfen queen is here!\r
+coin   sidpsg  0       0       0\r
+0      A gold coin lies here, bearing on one side the image of a dwarf, on\r
+       the reverse a picture of a body of water.\r
+ventilator     minor6  0       0       1       noget\r
+;let 'em off from flood in topcit - adds air of mystery...\r
+flood  shaft1  main2   main3   main4   shaft3  main5   main6   main7   dpass1  dpass2  dpass3  dpass4  dpass5  dpass6  sectn   minor1  minor2  face1   crrm    doomrm  minor3  shaft4  tightp  face4   edwrlm  minor7  minor8  face3   peril1  peril2  peril3  peril4  peril5  ledge1  ledge2  ledge3  bldg    dwpst1  ufrst1  panora  befcit  ufrst5  dwpst2  ufrst2  ufrst3  spring  0       1       2       noget   noit\r
+1      The area is flooded with water.\r
+pick   shed    0       0       1\r
+0      A smallish, woodworm-riddled pickaxe has been dropped here.\r
+pick   entrnc  0       0       1\r
+0      %pick\r
+mosaic dwhall  0       0       0\r
+0      A loose chip of mosaic lies by your feet.\r
+stove  dwktch  1       1       2       bright  noget   contains        11000   disguised\r
+0      A hot stove stands here with its door open.\r
+1      A hot stove stands here with its door closed.\r
+trophy guard3  0       0       0\r
+0      A war trophy depicting a dwarfen battle scene lies at your feet.\r
+throne kingrm  0       0       0\r
+0      A gloriously bejewelled throne stands here, majestically.\r
+forge  dwrm3   0       0       1       bright  noget   contains        256000  disguised\r
+0      A mighty forge of glowing coals dominates the centre of the room.\r
+poker  dwrm3   0       0       0\r
+0      There is a finely-worked poker here.\r
+lamp   shed    1       2       3       bright\r
+0      There is a shining safety lamp here.\r
+1      There is an unlit safety lamp here.\r
+2      There is a safety lamp here without a wick.\r
+valve  valvrm  0       0       1       noget\r
+osselesu       sectn   0       0       1       noget   noit\r
+pot    jetty   0       0       1       contains        2000    transparent     opened\r
+0      There is a lobster pot here.\r
+sack   smuggl  0       0       1       contains        5000\r
+0      There is a sack here.\r
+bag    attic   0       1       2       contains        7000    opened\r
+0      A musty old carpet bag is here, open.\r
+1      A musty old carpet bag is here, closed.\r
+potty  bdrm01  0       0       1       -1      contains        1000    transparent     opened\r
+0      There is a potty here.\r
+jet    potty   0       0       0\r
+0      A piece of jet has been secreted here.\r
+coinval        store   0       -1      2       noget\r
+0      Someone tossed a heads.\r
+1      Someone tossed a tails.\r
+off    store   0       0       1       noget\r
+curiosity      store   0       0       1       noget\r
+sesame store   0       0       1       noget\r
+starstone      ktreas  0       0       0\r
+0      By your feet is a gorgeous starstone.\r
+topaz  ktreas  0       0       0\r
+0      A large topaz lies on the ground nearby.\r
+garnet ktreas  0       0       0\r
+0      A garnet of unusual beauty lies here.\r
+beads  stun6   0       0       0\r
+0      Some smoked-glass beads are strewn by your feet.\r
+hole   shill1  0       0       1       noget\r
+0      There is a small hole in the ground, about 5 inches across. It bends too\r
+       sharply for you to see anything down it.\r
+gun    cannrm  2       2       3       noget\r
+0      The cannon is primed and loaded.\r
+1      The cannon is primed.\r
+2      The cannon is unloaded and unprimed.\r
+ballview       river3  0       0       0       noit    noget\r
+0      On the opposite bank of the river rests a fabulous platinum-plated\r
+       sphere.\r
+door   cannrm  1       1       2       noget\r
+1      The doorway to the south is shut off by a robust door.\r
+door   kitche  hall    2       2       3\r
+0      The kitchen door is open.\r
+1      The kitchen door is closed.\r
+2      The kitchen door is locked shut.\r
+door   hotpas  cinder  diamnd  2       2       3\r
+0      The strange door is open.\r
+1      The strange door is closed.\r
+2      The strange door is locked shut.\r
+door   temple  antech  1       2       3\r
+0      The crimson door is open.\r
+1      The crimson door is closed.\r
+2      The crimson door is locked shut.\r
+door   guadrm  uland1  2       2       3\r
+0      The oaken door is open.\r
+1      The oaken door is closed.\r
+2      The oaken door is locked shut.\r
+door   guard4  kingrm  2       2       3\r
+0      The oak door is open\r
+1      The oak door is closed.\r
+2      The oak door is locked shut.\r
+door   dwrm3   dorm    2       2       3\r
+0      The heavy door is open.\r
+1      The heavy door is closed.\r
+2      The heavy door is locked shut.\r
+door   shed    platfm  2       2       3\r
+0      The shed door is open.\r
+1      The shed door is closed.\r
+2      The shed door is locked shut.\r
+door   passg1  passg4  2       2       3\r
+0      The door is open.\r
+1      The door is closed.\r
+2      The door is locked shut.\r
+door   sorcrm  downps  store   2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   gob1    passg2  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   passg3  passg9  1       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   gob2    passg5  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   gob3    passg6  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   treasc  gob4    dtest3  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   cellar  bunker  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   gob5    passg8  1       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   dwstep  dwhall  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   dwfood  lowps1  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   dwstre  lowps2  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   dwktch  dwcant  0       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   lowps4  dwrm1   1       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   lowps6  dwrm2   0       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   odorm   lowps9  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   dwrm4   kdorm   0       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   guard1  guard2  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   minrm   lowps7  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   guard3  kingst  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+door   lowps8  ktreas  2       2       3\r
+0      %door\r
+1      %door\r
+2      %door\r
+fountain       fowrm   0       1       0       noget\r
+0      The fountain glows blue with its magical power. Below it, transcribed\r
+       in fiery runes, is the legend "Enter me and know" .\r
+1      The fountain glows yellow.\r
+zombie 20      0       6       store   0       0       0       15\r
+0      A horrifying zombie blocks your way!\r
+zombie etomb   0       0       0       30\r
+0      %zombie\r
+zombie 20      0       6       store   0       0       0       15\r
+0      %zombie\r
+zombie 40      0       6       store   0       0       0       20\r
+0      %zombie\r
+zombie 40      0       6       store   0       0       0       20\r
+0      %zombie\r
+zombie 60      0       6       store   0       0       0       40\r
+0      %zombie\r
+zombie zroom   0       0       0       25\r
+0      %zombie\r
+skeleton       20      0       6       fossrm  0       0       0       80\r
+0      An animated skeleton bars your way.\r
+skeleton       500     0       6       store   0       0       0       100\r
+0      %skeleton\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      An evil black rat bares its razor-sharp incisors at you.\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      cellar  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      cellar  0       0       0       10\r
+0      %rat\r
+rat    0       0       60      cellar  0       0       0       20\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       20\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       50\r
+0      %rat\r
+rat    0       0       60      bunker  0       0       0       50\r
+0      %rat\r
+rat    1       0       60      cellar  0       0       0       200\r
+0      An enormous, evil black rat bares its razor-sharp incisors at you.\r
+goblins        gob1    1       1       1       20\r
+1      Several evil-looking goblins glare at you madly as you look around.\r
+goblins        gob2    1       1       1       80\r
+1      %goblins\r
+goblins        gob3    1       1       1       20\r
+1      %goblins\r
+goblins        gob4    1       1       1       20\r
+1      %goblins\r
+goblins        gob5    1       1       1       20\r
+1      %goblins\r
+gauntlet       uland3  0       0       0\r
+0      By your feet lies a studded leather gauntlet.\r
+eagle  0       67      69      spring  0       0       0       200\r
+0      Above, watching you, hovers a large, golden eagle.\r
+magbar ewstep  0       1       2       noit    noget\r
+brick  altar   0       1       2       noit    noget\r
+brick  crypt   0       1       2       noit    noget\r
+plate  treasc  0       0       0\r
+0      A solid gold plate lies untarnished here.\r
+bracelet       treasc  0       0       0\r
+0      A bejewelled bracelet sparkles at your feet.\r
+toad   pond1   0       0       1\r
+0      A bloated toad croaks incessantly by the side of the water.\r
+prince pond1   0       0       0       -1      noget\r
+0      A handsome prince is here, smiling charmingly.\r
+beauty crypt   0       0       0       100     noget\r
+0      A sleeping beauty is lying entrancingly on the marble slab.\r
+panel  spanel  diagps  bluerm  1       1       2\r
+0      The sliding panel is raised.\r
+1      The sliding panel is lowered.\r
+kipper pantry  0       0       0\r
+0      An aging kipper lies to one side.\r
+sapphire       bluerm  0       0       0\r
+0      A deep blue sapphire attracts your gaze nearby.\r
+ornament       bluerm  0       0       0\r
+0      An ornament of Wedgewood pottery lies here.\r
+ogre   oglair  0       2       3       noget\r
+0      The ogre is here, with a large club beside him!\r
+1      The ogre is here, chewing happily at a rotting leg.\r
+2      A dead ogre lies mangled up nearby.\r
+earrings       crow    0       0       0\r
+0      The golden earrings of some forgotten pirate lie here.\r
+egg    nest    0       0       0\r
+0      A golden egg is here, hallmarked with the sign of a flame.\r
+effigy woe2    0       0       0\r
+0      There lies a fine, sandstone effigy here.\r
+silk   hold    0       0       0\r
+0      Lying on the floor is some fine silk.\r
+string poop    0       0       1\r
+0      A strand of worn rope has been dropped here.\r
+logbook        capt    0       0       1       noget\r
+0      ?\r
+libram study   0       1       1\r
+0      On the bookcase lies a single tome: "Articles of magic".\r
+1      There is a heavy libram here, entitled "Articles of magic".\r
+magazine       attic   0       0       0\r
+0      You find yourself almost standing on an ancient, faded copy of the\r
+       magazine "Micro Adventurer".\r
+powder proom   1       1       2\r
+0      A keg of dry gunpowder is here with a fuse fixed firmly to it.\r
+1      A keg of dry gunpowder is dangerously nearby.\r
+raft   hold    0       0       1\r
+0      A raft, large enough to carry one person, has been left here.\r
+coracle        inlet   0       0       1\r
+0      A sailable coracle large enough for one has been beached (?) here.\r
+quill  capt    0       0       0\r
+0      An inky quill-pen has been left here.\r
+diamond        diamnd  0       0       0\r
+0      A diamond weighing about an ounce is glinting here!\r
+leprechaun     leprm   0       1       1\r
+0      An impudent leprechaun is sitting here.\r
+1      A sulking leprechaun is complaining here.\r
+gold   leprm   0       0       0\r
+0      A crock of gold has been put here!\r
+grate  smuggl  fortun  1       1       2\r
+0      The iron grate is slid open.\r
+1      The iron grate is slid closed.\r
+doubloons      sack    0       0       0\r
+0      A pile of doubloons glitters here!\r
+pieces smuggl  0       0       0\r
+0      Some pieces of eight lie scattered around you.\r
+bottle smuggl  1       1       0\r
+0      There is an empty bottle here.\r
+1      There is a bottle of rum here.\r
+wafer  galley  0       0       1\r
+0      A wafer biscuit lies here.\r
+wafer  store   0       0       1\r
+0      %wafer\r
+wafer  store   0       0       1\r
+0      %wafer\r
+wafer  dwktch  0       0       1\r
+0      A wafer biscuit of dwarfen make has been dropped on the floor.\r
+wafer  guard4  0       0       1\r
+0      %wafer\r
+wafer  dwcant  0       0       1\r
+0      By your feet lies an aged, yet edible, wafer biscuit.\r
+wafer  dwfood  0       0       1\r
+0      %wafer\r
+button ledge3  0       0       1       noget\r
+0      A reset button is embedded in the wall.\r
+groats kitche  1       1       0\r
+0      Some golden coins lie here!\r
+1      Some worthless, dirtied groats have been dropped here.\r
+crown  swamp7  0       0       0\r
+0      Gleaming in front of you is a magnificent crown!\r
+crown  store   0       0       1\r
+0      Gleaming in front of you is a magnificent crown!\r
+statue tombrm  0       -4      4\r
+0      There is a golden statue here with red eyes!\r
+1      There is a golden statue here with blue eyes!\r
+2      There is a golden statue here with green eyes!\r
+3      There is a golden statue here with yellow eyes!\r
+4      There is a golden statue here with emerald eyes!\r
+medicine       bathrm  0       1       0\r
+0      There is some medicine here.\r
+1      There is some partially-drunk medicine here.\r
+moose  uhut    0       1       0\r
+0      A highly valuable stuffed moose's head grins lopsidedly at you nearby.\r
+pillar uhut    0       0       0\r
+0      A magnificent, ancient, marble pillar has been stolen and dropped here!\r
+portcullis     inmth   mthidl  1       1       2\r
+0      A raised portcullis is above an east-west link into the mouth of the\r
+       idol.\r
+1      A portcullis prevents passage east-west between the mouth of the\r
+       idol and the opening to the outside.\r
+wall   hut     0       0       1       noget   noit\r
+wall   nhill1  0       0       1       noget   noit\r
+wall   nhill2  0       0       1       noget   noit\r
+wall   shill1  0       0       1       noget   noit\r
+wall   shill2  0       0       1       noget   noit\r
+wall   ufrst1  0       0       1       noget   noit\r
+wall   ufrst5  0       0       1       noget   noit\r
+wall   ufrst2  0       0       1       noget   noit\r
+objonledge     ledge1  0       0       1       noget   noit\r
+objonledge     ledge2  0       0       1       noget   noit\r
+objonledge     ledge3  0       0       1       noget   noit\r
+emerald        ledge3  0       1       1\r
+0      A fabulous emerald lies loosely among the rock.\r
+1      A fabulous emerald has been dropped here!\r
+tdoor  hut     laddrm  1       1       2       noit\r
+0      Fixed on the wall less firmly than the rest is a valuable moose's head.\r
+       A trapdoor is open in the floor connecting the hut and a steep shaft\r
+       containing a ladder.\r
+1      An empty space on the wall is marked, in an unsteady but loving hand,\r
+       by the word "MOOSE".\r
+painting       attic   0       0       0\r
+0      Catching your attention is a beautiful painting of a crown in a swamp.\r
+doll   attic   0       0       0\r
+0      A child's antique doll is here, cast carelessly to the floor.\r
+candlestick    attic   0       0       0\r
+0      A richly ornamented brass candlestick lies on the ground.\r
+chest  attic   0       0       0\r
+0      A heavy chest is here, its padlock long since rusted away. Burned onto\r
+       the lid is a mark, shaped like a black rose.\r
+pendant        wstlpl  0       1       1\r
+0      A beautiful amber pendant catches your eye glistening by the iced pool.\r
+1      A beautiful amber pendant catches your eye nearby.\r
+pendview       estlpl  0       0       1       noit    noget\r
+0      On the opposite bank of the pool you can see a beautiful pendant!\r
+rootview       root    altar   ydead1  rtun1   rtun2   0       1       2       noit\r
+1      The way through the tunnel is blocked after a fire caused a cave-in.\r
+tunview        stun1   stun2   stun3   stun4   stun5   stun6   stun7   stun8   stun9   stun10  cellar  uhut    dead15  0       1       2       noit\r
+1      The tunnel has collapsed and cannot be entered.\r
+pool   wstlpl  estlpl  1       1       2\r
+0      The still pool has been frozen and the way across is easy.\r
+1      The still pool looks very deep and has a mysteriousness about it. A\r
+       shallow mist hangs over it, and the room is stuffy and warm.\r
+leg    cavein  0       0       1\r
+0      There lies nearby the rotting leg of a recently-dead corpse.\r
+icicle         altar   0       0       1\r
+0      Some icicles cool the air around you.\r
+cross  <maze25 maze10> 0       0       0\r
+0      You have found a small silver cross, battered and misshapen from some\r
+       enormous heat. On it is inscribed, "Carry me with you."\r
+wand   <cave   lgrm    pantry  sorcrm  nhill2  beach4> 0       0       1\r
+0      There is an ebony staff here without a rusty star on the end.\r
+wand   store   0       0       1\r
+0      There is an ebony staff here with a shiny star on the end.\r
+wand   sectn   0       0       0\r
+0      Hey, how'd you get to read this description?\r
+ox     50      0       6       epstre  0       4       1\r
+0      A sturdy ox lumbers past you nearby.\r
+1      There is a highly valuable jade statue of an ox here!\r
+2      There lies the carcass of a murdered ox nearby.\r
+3      There lies a dead ox off to one side.\r
+4      There is a worthless jade statue of an ox here.\r
+brand  nfrst1  1       1       2       bright\r
+0      There is a burning fire brand here.\r
+1      There is a large stick on the ground.\r
+brand  ifrst3  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  nfrst5  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  nfrst7  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  fslop1  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  forist  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  store   0       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  store   0       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  ufrst5  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  nfrst3  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  nfrst4  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  cellar  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  temple  0       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  capt    1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+umbrella       wrdbe   1       1       2\r
+0      There is an unfurled umbrella here.\r
+1      There is a furled umbrella here.\r
+parasol        <bdrm02 bstand  wabe>   1       1       0\r
+0      A pretty, oriental parasol lies unfurled here.\r
+1      A neatly furled parasol is propped up close by.\r
+potatoes       patch   0       1       1\r
+0      There are some potatoes here.\r
+1      There are some golden potatoes here!\r
+rattle bdrm03  0       1       2\r
+0      Nearby lies a toy rattle.\r
+rain   ndale   paddck  grotto  ruin    wdale   forist  cuttin  rail1   rail2   rail3   rail4   stslop  scrubs  beach3  beach4  jetty   sdale   ogrnds  epstre  spstre  nhill1  nhill2  shill1  shill2  ostart  track1  track2  road2   start   clifff  wpstre  garden  path    beach   beach2  patch   gorse   wfall   river1  river2  rapids  outhut  sea1    sea2    sea3    sea4    sea5    sea6    sea7    sea8    sea9    sea10   sea11   sea12   sea13   sea14   sea15   sea16   woe1    woe2    srock1  srock2  srock3  inlet   crow    deck    stpoop  hdland  cove    ifrst5  slope1  slope2  slope3  slope4  pond1   river3  nbank   nest    glade   vrocks  poop    0       2       3       noit\r
+1      It is raining.\r
+2      It is snowing.\r
+conch  bwfall  0       0       0\r
+0      A beautiful conch glistens pearl-like in the light.\r
+fossil fossrm  0       0       1\r
+0      The fossilised remains of a small finger bone lie here.\r
+crack  revrm   fossrm  1       1       2       noit    noget\r
+0      A crack in the wall permits east-west passage with another room.\r
+curtain        temple  0       2       2\r
+0      A curtain patterned with writing hangs loosely by the opening to the\r
+       north.\r
+1      A curtain patterned with writing has been drawn closed covering the\r
+       opening to the north.\r
+2      A curtain patterned with writing lies strewn at your feet.\r
+incense        hchamb  0       0       0\r
+0      An urn of rare frankincense stands majestically nearby.\r
+ring   chambr  0       1       1\r
+0      A brass finger-ring lies in one corner.\r
+1      An astonishingly beautiful ring nearby makes you gasp in amazement!\r
+ring   fring   2       2       3       noget\r
+wolfsbane      garden  0       -1      2\r
+0      A curious herb gives off a sweet odour nearby.\r
+1      A curious herb gives off a sweet odour nearby.\r
+wolfsbane      slope2  0       0       1\r
+0      A curious herb gives off a sweet odour nearby.\r
+hyacinth       garden  0       0       0\r
+0      A gorgeous hyacinth has been picked and left here.\r
+key    <dining lounge  study>  0       0       1\r
+0      A set of rusty keys can be seen here.\r
+key    <cupd1  hut     attic>  0       0       1\r
+0      %keys\r
+key    <passg1 passg2  platfm  uland1  uland2  wstep3> 0       0       1\r
+0      %keys\r
+key    zroom   0       0       1\r
+0      %keys\r
+key    store   0       0       0\r
+0      A set of shiny keys can be seen here.\r
+key    store   0       0       0\r
+0      %keys\r
+axe    <hut    uhut    gorse>  0       -1      2\r
+0      A mighty woodsman's axe lies on the ground here.\r
+1      A mighty woodsman's axe shines on the ground here.\r
+axe    guadrm  0       0       0\r
+0      A stout axe nearby gleams in the light.\r
+axe    store   0       0       1\r
+0      The axe of a mighty woodsman lies on the ground here.\r
+tree   wfrst1  3       3       4       noget\r
+0      There is a felled yew tree here. You can see that the hollow stump\r
+       leads down to the depths.\r
+1      There is a mighty yew tree here, with large chunks chopped off.\r
+2      There is a mighty yew tree here, with axe-marks on the trunk.\r
+3      There is a mighty yew tree here.\r
+sign   slope1  1       1       0\r
+0      There is a chopped down signpost here.\r
+1      Fixed into the ground is a signpost.\r
+bed    bdrm01  0       2       1       noget\r
+0      A bed with the bedclothes in disarray stands solidly in the centre\r
+       of the room.\r
+1      There is a neatly made bed here.\r
+2      A bed with the bedclothes unmade stands solidly in the centre\r
+       of the room\r
+fire   lounge  1       -1      2       contains        256000  noget   disguised\r
+0      A fire is burning merrily in its grate. The flickering flames are a\r
+       joy to behold as you warm your hands from the glowing coals.\r
+1      There is a fire burning merrily in the grate, its cheerful glare\r
+       spreads a delightful air of homeliness.\r
+fire   altar   1       1       2       bright  contains        256000  noget   disguised\r
+fire   store   0       0       1       bright  contains        256000  noget   disguised\r
+0      A roaring fire is burning in the grate, spreading a cosy feeling\r
+       around the room.\r
+fire   kingst  1       -1      2       contains        256000  noget   disguised\r
+0      A merry fire here casts a cheery glow around the room.\r
+1      A cheerful fire here casts a merry glow around the room.\r
+tomb   maze25  tombrm  1       1       2\r
+1      A voice, speaking inside your head, seems to say, "A prize will open\r
+       the tomb."\r
+0      The tomb is open.\r
+tomb   mosolm  0       0       1       noget\r
+bookcase       ssteps  study   1       1       2\r
+0      The bookcase has been shifted aside to allow passage behind it.\r
+1      The bookcase stands flush against the wall.\r
+stepladder     cupd2   0       0       1       noget\r
+0      A heavy stepladder leads upwards to the ceiling.\r
+sdoor  cuptop  attic   0       1       2       noit\r
+0      There is a secret door open between the cupboard and the attic.\r
+cupboard       bdrm03  cupd2   1       1       2\r
+0      The cupboard is unlatched.\r
+1      The cupboard is latched shut.\r
+grave  maze1   maze2   maze3   maze4   maze5   maze6   maze7   0       -41     100\r
+0      There is a grave here. The name on the headstone reads, "Roy Trubshaw".\r
+1      There is a long forgotten gravestone here inscribed, "Nigel Roberts".\r
+2      There is a tomb here; the name inscribed reads, "Polly the Witch".\r
+3      On a huge grave is the name, "Evil the Wizard".\r
+4      Graffiti on a nearby grave reads, "Visit Murrell's balloon emporium".\r
+5      Inscribed on a nearby grave is the name of some body.\r
+6      A headstone lies on its side nearby; the name on it is unreadable.\r
+7      Inscribed on a modestly austere tombstone here is the name, "Richard\r
+       the Wizard".\r
+8      On a nearby tomb is the name of someone dead.\r
+9      You can just make out the name on this tombstone.\r
+10     Over to your right is an unmarked grave belonging to Brian Mallett.\r
+11     On a grave close by reads, "Gwyn the Wizard lies only a few feet from\r
+       here".\r
+12     Before you looms an obsidian vault, insculpt "Shadow the Wizard".\r
+13     Before you stands a granite tomb, topped with a garden Gnome.\r
+14     A tombstone here reads, "Here rest the immortal remains of 'Merrick',\r
+       R.I.M. - he came to study Computing, but got waylaid in the MUD".\r
+15     Two tombstones to your left read, "Helmut the Wizard".\r
+16     A tombstone here bears the epitaph, "Fenwyn (Wizard".\r
+17     The tomb of Jock the Wizard rises before you, inscribed, "But for a\r
+       devaluation of the point, he would have been here three weeks earlier".\r
+18     A small rock to one side marks the grave of Foxy the Wizard.\r
+19     The grave of Denise the Witch lies to one side, covered in footprints\r
+       where Egor the Wizard has danced.\r
+20     The headstone of Gorpli the Wizard stands here, with nothing significant\r
+       on it.\r
+21     Hacked into a tombstone before you is the epitaph, "Madmax the Wizard".\r
+22     The tomb before you bears the name, "Roddy the Wizard", which has\r
+       obviously been painted on very quickly.\r
+23     The romanesque tomb of Lacrima the Witch stands here, amid a small pool\r
+       of salt water.\r
+24     Here stands the grave of Clive the Wizard, QED.\r
+25     The tombstone of Paula the witch stands here, reading, "Kissing has lots\r
+       of good points".\r
+26     Entombed here lies Innocence the Witch, her epitaph, reading, "The\r
+       mortals' favourite immortal", having been raised by public subscription.\r
+27     Alan the wizard is virtually buried here.\r
+28     Christian the wizard is buried here, beneath a tombstone reading, "A\r
+       legend in his own lifetime" four times.\r
+29     You see what looks like the tomb of Petal the witch before you, but\r
+       realise it's Gnot.\r
+30     Inscribed on a headstone to your left are the words, "Saavik, a wizard\r
+       at kissing and making up".\r
+31     Before you stands the grave of Balastor the wizard, made without any\r
+       help whatsoever from Egor the Wizard...\r
+32     The mass grave of Bwian, Faratol, Frobozz, Paysul, Bytor, Snieker\r
+       and Dan the wiz's is here, until they can be exhumed to more suitable\r
+       private accommodation.\r
+33     A Celtic cross here bears the inscription, "Here is the body of Planxty\r
+       the Wizard, in his favourite position (horizontal)".\r
+34     Gripper the wizard's aerial-bearing tombstone nearby reads "heavy\r
+       drinking got me here".\r
+35     The tomb of Mugsanon the wizard stands before you, inscribed\r
+       "IItt''ss eeaassyy wwhheenn yyoouu kknnooww hhooww..".\r
+36     Here stands the gravestone of Crab the wiz, it doesn't say much, but\r
+       then, that's showbiz!\r
+37     The carefully constructed tomb of Morgwyn the witch stands here, ringed\r
+       by a variety of footprints.\r
+38     A Reliable tombstone stands before you.\r
+39     Here stands the tomb of Maria the witch, vaguely resembling a large\r
+       button and bearing the inscription, "f1".\r
+40     Scrawled over the top of a crossing out on a tombstone here are the\r
+       words, "Jon the wizard".\r
+41     This is the tombstone of Achetus the wizard, but his bones are lost in\r
+       the swamp.\r
+grave  maze8   maze9   maze10  0       -41     100\r
+0      The grave to your left reads, "In memory of Ulin Smith, BSc, RIP".\r
+1      A nearby epitaph reads, "I didn't know marsh-gas was explosive"\r
+2      A broken headstone lies scattered about you.\r
+3      An inscription nearby reads, "Coming here was a grave mistake".\r
+4      On a headstone to your right reads the inscription, "Rather here than\r
+       carrying the egg".\r
+5      A headstone to the east bears the inscription, "OK, so maybe the dragon\r
+       WAS a bit of a handful...".\r
+6      A nearby headstone bears the legend, "I wonder what happens if I eat\r
+       the toadstool?".\r
+7      A grave to your left bears the words, "One who forgot to unfurl the\r
+       umbrella lies here".\r
+8      The grave of Nic the Wizard is eventually here.\r
+9      The grave of Andy the Wizard is somehow here.\r
+10     The grave of Eric the Wizard was here until you started playing.\r
+11     The tomb of Ridicule the Wizard has been gradually built up here.\r
+12     Here is the final resting place of Gizmo the Witch, who hasn't ordered\r
+       her tombstone yet...\r
+13     The grave of Zardoz the Wizard is here - "Forgotten but not gone".\r
+14     Felicity the witch is buried here: her tombstone bears the epitaph,\r
+       "A spectacular life led me here".\r
+15     You smell the grave of Conn the Wizard some way to one side.\r
+16     Siona the Witch rests uneasily here, in a morbid black shirt.\r
+17     The tomb of Zaphod the Wizard is here, marked "Do not open until 2am".\r
+18     By a highly baroque, gaudy and ostentatious tomb here is a single\r
+       Rosebud.\r
+19     The grave of the unknown wizard stands before you, beneath which lies\r
+       entombed Egor the Wizard.\r
+20     The hastily-erected grave of Endora the Witch is said to stand here...\r
+21     To one side lies the securely water-proofed grave of Cesil the Wizard.\r
+22     The grave of Tremble the Wizard is here, made almost entirely of old\r
+       logs.\r
+23     Before you stands the grave of Thor the wizard, marked, "Stopped Press".\r
+24     The open grave of a witch yawns before you.\r
+25     The tombstone of Rudy the wizard stands here, marked, "Gone before his\r
+       time".\r
+26     Nick the wizard is buried here. The tombstone has been removed for the\r
+       words on it to be cleaned.\r
+27     Elric the wizard is buried here beneath a tomb reading, "See where\r
+       helping other people gets you".\r
+28     A headstone before you reads, "Azax the wizard lies here". The word\r
+       "lies" has been underlined several times.\r
+29     You are standing on the plot where Simone the Witch would be buried had\r
+       she been killed en route to witch.\r
+30     A tombstone before you reads, "Here lies the body of Kronos, a witch\r
+       through no fault of her own".\r
+31     Six feet below you lie the remains of Happy the Wizard, "deep in\r
+       meditation".\r
+32     Far to the east is the grave of Limhongch the Wizard.\r
+33     A black monolith before you encases the body of Vulnax the Wizard.\r
+34     The grave of Jason the whinging Wizard stands here, insculpt "He\r
+       had his cake and ate it".\r
+35     Before you stands the mighty statue of a centaur, guarding the grave of\r
+       Chester the Wizard.\r
+36     Here stands the tomb of Shrayer the Witch, closely resembling a prince.\r
+37     Etched onto the grave of Dan the Wizard here are the words, "I got\r
+       by with a litle help from my friends".\r
+38     The double-size grave of Fazz the Wizard here bears the sentence,\r
+       "T for two".\r
+39     The wind, whistling above this forsaken spot, seems to whisper the\r
+       words, "Well, Qbert, what do you want on your tombstone?".\r
+40     Here stands the tomb of Vivian the Wizard, "A sufferer of swamp\r
+       fever".\r
+41     The proud marble headstone of Tixy the Wizard stands before you,\r
+       manufactured in Essex by Vivian's Patent Philanthropic Enterprises.\r
+blade  saltar  0       0       1       noget\r
+0      A bloodstained sacrificial blade is chained to the altar.\r
+eyeview        bef1      0       0       1     noit    noget\r
+0      High up the idol, embedded in its forhead, is a dazzling ruby for an\r
+       eye! It seems to have remained there fixed for several centuries.\r
+eye    eyedol  eyedol  0       1       1\r
+0      The idol's eye is a dazzling ruby!\r
+1      There is a dazzling ruby here!\r
+carpet guadrm  1       1       1\r
+0      There is an unrolled carpet here.\r
+1      There is a rolled-up carpet here.\r
+beggar 100     0       6       sfrst1  0       0       0       50      noget\r
+0      A deaf, dumb, blind, lame beggar sits despondently nearby.\r
+wolf   wolfrm  1       1       1       150     noget\r
+1      A ravenous, terrifying wolf dribbles and licks its lips as it watches\r
+       you intently.\r
+dragon 20      0       66      ifrst1  0       0       0       800     noget\r
+0      Beating its enormous wings above you is an immense, fire-breathing\r
+       dragon!\r
+shark  0       0       6       sea1    0       0       0       125     noget\r
+0      A shark fin can be seen cutting through the water around you.\r
+dryad  20      0       6       clffst  0       0       0       80      noget\r
+0      In amongst the trees is an evil-looking dryad, scowling menacingly.\r
+icon   isanct  0       0       0\r
+0      A beautiful icon depicting a hallowed chamber lies here.\r
+icon   isanct  0       0       0\r
+0      A valuable icon depicting a shrine lies here.\r
+icon   isanct  0       0       0\r
+0      A glorious icon depicting an ancient chamber lies here.\r
+icon   isanct  0       0       0\r
+0      A marvellous icon depicting the inner sanctum lies here.\r
+golem  osanct  1       1       1       120     noget\r
+1      A golem of solid iron stands here as guardian of the inner sanctum.\r
+barrel level   0       1       2\r
+0      A large barrel containing putrid, reddish water stands here.\r
+1      A broken, empty barrel lies here.\r
+mud    schamb  mudrm   1       1       2\r
+0      The mud which prevented east-west passage between the mud room and\r
+       the small chamber has been removed.\r
+1      The walls of the room are caked in a rock-hard covering of dry, \r
+       porous mud.\r
+firestone      schamb  0       0       0       bright  nosummon\r
+0      A beautiful, iridescent firestone glows nearby.\r
+firestone      <ntomb  etomb   stomb   wtomb>  0       0       0       bright  nosummon\r
+0      An iridescent, beautiful firestone glows nearby.\r
+firestone      store   0       0       0       bright  nosummon\r
+0      A beautiful, glowing firestone iridesces nearby.\r
+firestone      store   0       0       0       bright  nosummon\r
+0      A glowing, beautiful firestone iridesces nearby.\r
+*travel        go\r
+ostart n       road2   e       o\r
+       n       maze1   n\r
+       n       nfrst3  ne\r
+       n       path    s\r
+       beast   garden  sw\r
+       nanny   garden  sw\r
+       pegasus garden  sw\r
+       rug     garden  sw\r
+       marble  garden  sw\r
+       tub     garden  sw\r
+       torch   garden  sw\r
+       fungus  fring   sw\r
+       n       garden  sw\r
+       n       patch   se      swamp\r
+       n       track2  w\r
+       n       wfrst1  nw\r
+home   n       start   o\r
+       n       rost    jump\r
+       n       maze1   n\r
+       n       root    nw\r
+       n       swamp1  swamp\r
+       n       glade   s\r
+       n       capt    w\r
+       n       bch1    sw\r
+       n       cave    se\r
+       n       inmth   ne\r
+       n       store   in\r
+       n       natcav  e\r
+       n       bdrm03  u\r
+       n       cannrm  d\r
+store  door    <sorcrm rapids  rost    vrocks  main1   cave    chambr> o       in      n       ne      e       se      s       sw      w       nw      u       d       swamp\r
+limbo  door    limbo   o\r
+nfrst1 n       nfrst4  w\r
+       n       nfrst2  e       se      swamp   o\r
+       n       nfrst3  s\r
+       n       wfrst1  sw\r
+       n       fslop1  n       d\r
+       n       fslop2  ne\r
+       n       fslop3  nw\r
+nfrst4 n       nfrst1  e       o\r
+       n       clffst  swamp   sw\r
+       n       wfrst1  s\r
+       n       nfrst3  se\r
+       beast   474     jump\r
+       wood    0       jump\r
+       ~parachute      beach   jump\r
+       -13     jump\r
+       n       fslop1  ne\r
+       n       fslop3  n\r
+       51      nw\r
+       52      w\r
+nfrst2 n       nfrst1  nw\r
+       n       nfrst3  w\r
+       wood    0       sw      s       se      swamp   o       e       ne      u\r
+       n       road2   sw\r
+       n       start   s       se      swamp   o\r
+       n       nhill1  e\r
+       n       nhill2  ne      u\r
+       n       fslop2  n       d\r
+nfrst3 wood    0       sw      o       s       se      w       swamp\r
+       n       ostart  sw      o       swamp\r
+       n       nfrst2  e       ne\r
+       n       nfrst1  n\r
+       n       nfrst4  nw\r
+       n       maze1   w\r
+       n       road2   s       se\r
+clffst n       wfrst1  e\r
+       n       nfrst4  n       nw      ne\r
+       wood    0       s       sw      swamp   se      o       jump\r
+       n       track1  s       sw\r
+       n       track2  swamp   se      o\r
+       beast   474     jump\r
+       ~parachute      beach   jump\r
+       -13     jump\r
+       52      w\r
+wfrst1 n       nfrst4  nw      n\r
+       n       nfrst1  ne\r
+       wood    0       sw      s       swamp   se      o       d       e\r
+       n       track1  sw\r
+       n       track2  s\r
+       n       ostart  swamp   se      o\r
+       tree    root    d\r
+       n       clffst  w\r
+       n       maze1   e\r
+       116     u       jump\r
+track1 n       clifff  s       sw\r
+       n       track2  e       o\r
+       n       clffst  n\r
+       n       wfrst1  ne\r
+       n       wpstre  swamp   se\r
+       beast   474     jump\r
+       ~parachute      beach   jump\r
+       -13     jump\r
+       52      w\r
+track2 n       track1  w\r
+       n       wfrst1  n       ne\r
+       n       clffst  nw\r
+       n       clifff  sw\r
+       n       wpstre  s       swamp\r
+       beast   garden  se\r
+       nanny   garden  se\r
+       pegasus garden  se\r
+       rug     garden  se\r
+       marble  garden  se\r
+       tub     garden  se\r
+       torch   garden  se\r
+       fungus  fring   se\r
+       n       garden  se\r
+       n       ostart  e       o\r
+road2  n       ostart  w\r
+       n       nfrst2  ne\r
+       n       nfrst3  n       nw\r
+       n       start   e       o\r
+       n       gorse   s       swamp\r
+       n       mfrst   se\r
+       n       patch   sw\r
+start  n       mfrst   sw\r
+       n       road2   w\r
+       n       nfrst2  nw\r
+       n       nhill1  n       ne      u\r
+       n       shill1  s       swamp   se\r
+       e       wayout  e       o\r
+       591     e       o\r
+wayout e       start   w       in\r
+clifff n       track1  nw      n\r
+       n       track2  ne      o\r
+       n       wpstre  e\r
+       n       wfall   s       sw\r
+       n       river1  se      swamp\r
+       beast   474     jump\r
+       ~parachute      beach   jump\r
+       -13     jump\r
+       52      w\r
+fallin e       bch1    d\r
+       e       bch2    jump\r
+       e       fallin  n       e       s       w\r
+       892     d       jump\r
+slidin 917     d       jump\r
+wpstre n       clifff  w\r
+       n       track1  nw\r
+       n       track2  n\r
+       beast   garden  ne\r
+       nanny   garden  ne\r
+       pegasus garden  ne\r
+       rug     garden  ne\r
+       marble  garden  ne\r
+       tub     garden  ne\r
+       torch   garden  ne\r
+       fungus  fring   ne\r
+       n       garden  ne\r
+       n       epstre  e       o\r
+       n       river1  s       sw\r
+       n       river2  se      swamp\r
+garden n       clifff  w\r
+       n       track2  nw\r
+       n       ostart  n       ne      o\r
+       n       wpstre  s       swamp   sw      sw\r
+       n       path    e       se\r
+path   n       hall    s       in\r
+       n       ostart  n       ne      nw      o\r
+       beast   garden  w       sw\r
+       nanny   garden  w       sw\r
+       pegasus garden  w       sw\r
+       rug     garden  w       sw\r
+       marble  garden  w       sw\r
+       tub     garden  w       sw\r
+       torch   garden  w       sw\r
+       fungus  fring   w       sw\r
+       n       garden  w       sw\r
+       n       patch   e       se      swamp\r
+patch  n       path    w\r
+       n       ostart  n       nw      o\r
+       n       road2   ne\r
+       n       epstre  s       sw\r
+       n       gorse   e       se      swamp\r
+gorse  n       patch   w       nw\r
+       n       epstre  sw      se      swamp\r
+       n       outhut  s\r
+       n       mfrst   e\r
+       n       road2   ne      n       o\r
+mfrst  n       start   n       ne      o\r
+       n       road2   nw\r
+       n       gorse   w\r
+       n       rapids  s\r
+       n       outhut  sw\r
+       n       cave    se      swamp\r
+       n       shill1  e       u\r
+wfall  n       clifff  nw      n       ne      out\r
+       n       river1  e       swamp\r
+       beast   474     jump\r
+       ~parachute      beach   jump\r
+       -13     jump\r
+       55      s       sw      se\r
+       52      w\r
+river1 n       wfall   w\r
+       n       river2  e       swamp\r
+       n       clifff  nw\r
+       n       wpstre  n       ne      out\r
+       parachute       spstre  s       se      sw\r
+       boat    spstre  s       se      sw\r
+       rain    spstre  s       se      sw\r
+       120     s       se      sw\r
+river2 n       river1  w\r
+       n       rapids  e       swamp\r
+       n       wpstre  n       nw\r
+       n       epstre  ne      out\r
+       parachute       spstre  s       sw      se\r
+       boat    spstre  s       sw      se\r
+       rain    spstre  s       sw      se\r
+       120     s       sw      se\r
+rapids n       river2  w\r
+       n       epstre  nw      n       out\r
+       n       cave    ne      u\r
+       torch   ydead3  s       se      swamp\r
+       spark   ydead3  s       se      swamp\r
+       n       swamp1  s       swamp\r
+       n       pond1   se\r
+       n       spstre  sw\r
+       196     e\r
+cave   n       epstre  w\r
+       n       rapids  sw      s       swamp\r
+       n       mfrst   n       nw\r
+       n       shill2  ne      u       out\r
+       n       befgte  e       in\r
+nhill2 n       nfrst2  w       swamp   sw\r
+       n       nhill1  s       se      d       out\r
+       n       fslop2  nw\r
+       54      n       ne      e       u\r
+nhill1 n       nhill2  n       ne      u\r
+       n       fslop2  nw\r
+       n       nfrst2  w\r
+       n       start   se      s       sw      d       out     swamp\r
+       54      e\r
+shill1 n       start   n       ne      nw      d       out\r
+       n       mfrst   w\r
+       n       shill2  se      u\r
+       n       cave    sw      swamp   s\r
+       54      e\r
+shill2 n       shill1  n       ne      nw      d       out\r
+       n       cave    w       sw      swamp\r
+       54      e       se      s\r
+hut    n       outhut  n       out     swamp\r
+       beast   199     d       in\r
+       nanny   659     d       in\r
+       pegasus 441     d       in\r
+       tdoor   laddrm  d       in\r
+laddrm bird    428     u       out\r
+       tdoor   hut     u       out\r
+       195     u       out\r
+       n       uhut    d       in\r
+uhut   marble  200     w       in\r
+       tub     60      w       in      u       out\r
+       n       laddrm  u       out\r
+       tunview stun1   w       in\r
+       208     w       in\r
+stun1  tunview 342     e       n       out\r
+       d       uhut    e       out\r
+       d       stun2   n\r
+       198     e       out     n\r
+       n       dead15  ne      nw      se      sw      s\r
+stun2  tunview 342     s       w\r
+       d       stun1   s\r
+       d       stun3   w\r
+       198     s       w\r
+       n       dead15  n       ne      e       se      sw      nw\r
+stun3  tunview 342     e       nw\r
+       d       stun2   e\r
+       d       stun4   nw\r
+       198     e       nw\r
+       n       dead15  n       ne      se      s       sw      w\r
+stun4  tunview 342     s       se\r
+       d       stun3   se\r
+       d       stun5   s\r
+       198     s       se\r
+       n       dead15  n       ne      e       sw      w       nw\r
+stun5  tunview 342     n       sw\r
+       d       stun4   n\r
+       d       stun6   sw\r
+       198     n       sw\r
+       n       dead15  ne      e       se      s       w       nw\r
+stun6  tunview 342     nw      ne\r
+       d       stun5   ne\r
+       d       stun7   nw\r
+       198     ne      nw\r
+       n       dead15  n       e       w       s       se      sw\r
+stun7  tunview 342     se      w\r
+       d       stun6   se\r
+       d       stun8   w\r
+       198     se      w\r
+       n       dead15  n       ne      e       s       sw      nw\r
+stun8  tunview 342     e       n\r
+       d       stun7   e\r
+       d       stun9   n\r
+       198     e       n\r
+       n       dead15  ne      se      s       sw      w       nw\r
+stun9  tunview 342     s       nw\r
+       d       stun10  nw\r
+       d       stun8   s\r
+       198     nw      s\r
+       n       dead15  n       ne      e       se      sw      w\r
+stun10 tunview 342     n       out     se\r
+       d       cellar  n       out\r
+       d       stun9   se\r
+       198     n       se      out\r
+       n       dead15  ne      e       s       sw      w       nw\r
+dsteps vermin  cellar  u       ne      out     swamp\r
+       n       hall    u       ne      out     swamp\r
+       n       cellar  d       sw      in\r
+xmasbx n       xmasbx  n\r
+cellar n       dsteps  u       ne      out     swamp\r
+       pegasus 441     s\r
+       beast   199     s\r
+       nanny   659     s\r
+       marble  201     s\r
+       tub     60      s\r
+       tunview stun10  s\r
+       208     s\r
+       door    bunker  w       in\r
+       50      w       in\r
+bunker torch   dead39  e       out\r
+       vermin  rattun  s       in\r
+       door    cellar  e       out\r
+       595     s       in\r
+       50      e       out\r
+rattun rstop   hall    out\r
+       n       bunker  in\r
+outhut bird    428     s       in\r
+       n       hut     in      s\r
+       n       gorse   n       nw      out\r
+       n       epstre  sw      w\r
+       n       mfrst   e       ne\r
+       n       cave    se\r
+       n       rapids  s       swamp\r
+befgte n       cave    w       out     swamp\r
+       n       befidl  e       in\r
+       beast   ydead4  n\r
+       n       saltar  n\r
+       n       oglair  s\r
+saltar beast   ydead4  s\r
+       n       befgte  s       out     swamp\r
+oglair n       befgte  n       out     swamp\r
+       ogre    ydead8  s       in\r
+       n       leprm   s       in\r
+leprm  n       oglair  n       out     swamp\r
+bef1   forced  ydead5\r
+       n       mthidl  e       u\r
+       n       befgte  w       out     swamp\r
+       tub     60      n       in\r
+       pegasus 441     n       in\r
+       beast   199     n       in\r
+       nanny   659     n       in\r
+       marble  201     n       in\r
+       n       crypt   n       in\r
+crypt  n       befidl  s       out     swamp\r
+befidl forced  bef1\r
+mthidl n       eyedol  u\r
+       n       befidl  w       d       out     swamp\r
+       beast   474     jump\r
+       parachute       befidl  jump\r
+       portcullis      inmth   e       in\r
+       n       bef1    jump\r
+inmth  portcullis      mthidl  w       out\r
+       n       hollow  e       in\r
+hollow n       inmth   w       out\r
+       n       rockps  e       in\r
+       n       rsteps  d\r
+rockps n       hollow  w       out\r
+       n       chambr  e       in\r
+chambr n       rockps  w       out\r
+rsteps n       hollow  u       out\r
+       n       uland1  d       in\r
+uland1 n       rsteps  u       out\r
+       door    guadrm  n       in\r
+       220     n       in\r
+       n       wstep1  d\r
+guadrm door    uland1  s       out\r
+       220     s       out\r
+wstep1 n       uland1  u       out\r
+       n       wstep2  d       in\r
+wstep2 n       wstep1  u       out\r
+       n       wstep3  d       in\r
+wstep3 n       wstep2  u       out\r
+       n       uland2  d       in\r
+uland2 n       wstep3  u       out\r
+       n       natcav  w       in\r
+natcav n       uland2  e       out\r
+       n       passg1  w       in\r
+passg1 n       passg2  n       in\r
+       n       natcav  e       out\r
+       n       passg3  s\r
+       door    passg4  w\r
+       50      w\r
+passg2 door    gob1    n       in\r
+       n       passg1  s       out\r
+       50      n       in\r
+passg3 n       passg1  n       out\r
+       door    passg9  s       in\r
+       50      s\r
+passg4 n       gob2    w       in\r
+       door    passg1  e       out\r
+       50      e\r
+passg5 n       gob3    w       in\r
+       door    gob2    e       out\r
+       50      e       out\r
+passg6 n       gob4    n       in\r
+       door    gob3    s       out\r
+       50      s       out\r
+passg7 n       gob5    n       in\r
+       n       gob2    s       out\r
+passg8 n       gob1    e       out\r
+       door    gob5    w       in\r
+       50      w\r
+passg9 door    passg3  n       out\r
+       n       ewstep  e       u       in\r
+       n       curve   w       sw\r
+       50      n       out\r
+pass10 n       crookp  e       out\r
+       n       lsp1    n       nw      u\r
+       n       cannrm  s       sw      in\r
+gob1   goblins passg8  w       in\r
+       door    passg2  s       out\r
+       50      s       out\r
+       291     w       in\r
+gob2   goblins passg7  n\r
+       goblins passg4  e       out\r
+       goblins longps  s       in\r
+       door    passg5  w\r
+       50      w\r
+       291     n       e       s       in\r
+gob3   door    passg6  n       in\r
+       goblins passg5  e       out\r
+       50      n       in\r
+       291     e       out\r
+gob4   door    treasc  n       in      ne\r
+       goblins passg6  s       out\r
+       50      n       in      ne\r
+       291     s       out\r
+gob5   door    passg8  e       out\r
+       goblins passg7  s\r
+       goblins treasc  n       d       in      nw\r
+       50      e       out\r
+       291     n       s       d       in\r
+treasc door    gob4    s       sw      out\r
+       213     u\r
+       50      s       sw      out\r
+ewstep magbar  passg9  d       w       out\r
+       n       spanel  u       e       in\r
+       271     d       w       out\r
+curve  n       passg9  e       n       out\r
+       n       diagps  ne      s       in\r
+diagps n       curve   sw      out     w\r
+       panel   bluerm  ne      in      e       n\r
+       270     ne      in      e       n\r
+spanel n       ewstep  w       d       out\r
+bluerm panel   diagps  sw      out     w       s\r
+       270     sw      out     w       s\r
+longps n       gob2    n       out\r
+       n       crookp  s       in\r
+crookp sprig   503     n       out\r
+       n       longps  n       out\r
+       n       pass10  w       in\r
+       n       nstep1  e       d\r
+lsp1   n       pass10  s       out     d\r
+       n       lsp2    n       in      u\r
+lsp2   n       lsp1    s       out     d\r
+       n       lsp3    n       in      u\r
+lsp3   n       lsp2    s       out     d\r
+       n       river3  n       in      u\r
+river3 n       lsp3    s       out     d\r
+       rain    nbank   n       ne      nw      in      jump\r
+       120     n       ne      nw      in\r
+       272     w       e\r
+nbank  rain    river3  s       sw      se      out     jump\r
+       120     s       sw      se      out\r
+       272     w       e\r
+cannrm n       pass10  n       ne      out\r
+       door    fowrm   s       sw      in\r
+       273     s       sw      in\r
+fowrm  n       cannrm  n       ne      out\r
+eyedol n       mthidl  d       out     swamp\r
+       143     u\r
+       beast   474     jump\r
+       parachute       befidl  jump\r
+       n       bef1    jump\r
+nstep1 n       crookp  w       u       out\r
+       n       nstep2  e       d       in\r
+nstep2 n       nstep1  u       w       out\r
+       n       nstep3  e       d       in\r
+nstep3 n       nstep2  u       w       out\r
+       n       uland3  e       d       in\r
+uland3 n       nstep3  u       w       out\r
+       463     nw\r
+epstre n       wpstre  w\r
+       n       dining  nw      in\r
+       n       outhut  n\r
+       n       mfrst   ne      out\r
+       n       rapids  s       se      swamp\r
+       n       river2  sw\r
+       n       cave    e       u\r
+sfrst1 55      nw      n\r
+       n       spstre  ne      out\r
+       n       sfrst2  e       swamp\r
+       51      s\r
+       ~parachute      beach2  jump\r
+       -13     jump\r
+       52      w       sw\r
+       n       glade   se\r
+sfrst2 n       spstre  nw      n\r
+       n       sfrst1  w\r
+       n       rapids  ne      out\r
+       torch   ydead3  e       swamp\r
+       spark   ydead3  e       swamp\r
+       n       swamp1  e       swamp\r
+       51      se\r
+       n       glade   sw      s\r
+glade  n       sfrst2  n       ne      out     swamp\r
+       n       sfrst1  nw\r
+       n       wabe    sw\r
+       n       pines1  s\r
+       n       sett    se\r
+       51      e       w\r
+wabe   n       glade   ne      out     swamp\r
+       n       pines1  e       se\r
+       n       pines7  sw      s\r
+       n       bbath   w\r
+       51      n       nw\r
+sett   n       glade   nw      out     swamp\r
+       n       pines1  w       sw\r
+       nut     sqroom  e\r
+       n       sqrm    e\r
+       n       pines6  se      s\r
+       51      n       ne\r
+       paw     insett  d       in\r
+       stone   insett  d       in\r
+       392     d       in\r
+pines1 n       glade   n       out     swamp\r
+       n       sett    ne\r
+       n       pines6  e\r
+       n       pines3  se      s\r
+       n       pines2  sw\r
+       n       pines7  w\r
+       n       wabe    nw\r
+bbath  n       wabe    e       out     swamp\r
+       n       pines7  s       se\r
+       n       lionrm  nw\r
+       51      n       ne      sw      w\r
+lionrm n       bbath   se      out     swamp\r
+       51      n       ne      e       s       sw      w       nw\r
+sqrm   n       sett    nw      w       out     swamp\r
+       n       pines6  sw      s\r
+       51      n       ne      e       se      in\r
+sqroom nut     dead34  n       ne      e       se      s       sw      w       nw      out     in      swamp\r
+       n       sett    nw      w       out     swamp\r
+       n       pines6  sw      s\r
+       51      n       ne      e       se      in\r
+pines7 n       bbath   n       out     swamp\r
+       n       wabe    ne\r
+       n       pines1  e\r
+       n       pines2  se\r
+       n       pines5  s\r
+       51      sw      w       nw\r
+pines6 nut     sqroom  n\r
+       n       sqrm    n\r
+       n       sett    nw      out     swamp\r
+       n       pines1  w\r
+       n       pines3  sw\r
+       n       pines4  s\r
+       n       bstand  se      in\r
+       51      e       ne\r
+pines2 n       pines1  ne      n       out     swamp\r
+       n       pines3  e\r
+       n       whroom  se\r
+       n       pines5  s       sw\r
+       n       pines7  w       nw\r
+pines3 n       pines1  n       nw      out     swamp\r
+       n       pines6  ne\r
+       n       pines4  se\r
+       n       whroom  s       sw\r
+       n       pines2  w\r
+       n       bstand  e       in\r
+pines5 n       pines7  n       out     swamp\r
+       n       pines2  ne\r
+       n       whroom  e\r
+       n       gaptrm  sw\r
+       51      se      s       w       nw\r
+pines4 n       pines6  n       out     swamp\r
+       n       pines3  nw\r
+       n       whroom  w\r
+       n       bstand  ne      in\r
+       n       shrine  se\r
+       51      e       s       sw\r
+shrine n       pines4  nw      o       swamp\r
+osanct golem   isanct  n       in\r
+       989     n       in\r
+       n       vrocks  ne      e       se      s       sw      w       nw      o       swamp   jump\r
+isanct n       osanct  s       in      o\r
+       n       vrocks  n       ne      e       se      sw      w       nw      swamp   jump\r
+gaptrm n       pines5  ne      out     swamp\r
+       51      n       nw      w       sw      s       se      e\r
+insett n       sett    u       out     swamp\r
+whroom n       pines3  n       ne      out     swamp\r
+       n       pines4  e\r
+       n       pines2  nw\r
+       n       pines5  w\r
+       51      sw      s       se\r
+bstand n       pines6  nw      o       swamp\r
+       n       pines3  w\r
+       n       pines4  sw\r
+       51      n       ne      e       se      s\r
+spstre n       sfrst1  sw\r
+       n       sfrst2  s       e\r
+       55      w\r
+       parachute       river2  n       out\r
+       parachute       river1  nw\r
+       boat    river2  n       out\r
+       boat    river1  nw\r
+       rain    river2  n       out\r
+       rain    river1  nw\r
+       n       rapids  ne\r
+       torch   ydead3  se      swamp\r
+       spark   ydead3  se      swamp\r
+       n       swamp1  se      swamp\r
+       120     n       out     nw\r
+hall   n       path    n       out     swamp\r
+       n       lounge  e\r
+       door    kitche  s       in\r
+       50      s       in\r
+       n       stairs  se      u\r
+       n       dsteps  sw      d\r
+       n       wrdbe   w\r
+wrdbe  n       hall    e       out     swamp\r
+lounge n       hall    out     w\r
+       n       dining  s       swamp\r
+       n       study   e       in\r
+study  n       lounge  w       out     swamp\r
+       bookcase        ssteps  s       in      d\r
+ssteps bookcase        study   n       out     swamp   u\r
+       n       zroom   in      d       s\r
+zroom  n       ssteps  u       n       out     swamp\r
+       n       downps  d       s       in\r
+downps n       zroom   u       out     swamp   n\r
+       door    sorcrm  s       in      d\r
+       50      s       in      d\r
+sorcrm door    downps  n       u       out     swamp\r
+       50      n       u       out     swamp\r
+dining n       lounge  n       ne      nw      in\r
+       n       epstre  s       se      sw      out     swamp\r
+       53      w\r
+kitche door    hall    n       out     swamp\r
+       50      n       out     swamp\r
+       53      e\r
+       n       pantry  nw      d       in\r
+pantry n       kitche  u       s       se      out     swamp\r
+stairs n       hall    d       n       nw      out     swamp\r
+       n       landin  u       s       se      in\r
+landin n       stairs  d       nw      out     swamp\r
+       n       bathrm  sw      w\r
+       n       cupd1   e       ne\r
+       n       bdrm03  se\r
+       n       bdrm01  s\r
+       n       bdrm02  n\r
+bathrm n       landin  out     swamp   ne      e\r
+cupd1  n       landin  w       sw      out     swamp\r
+bdrm01 n       landin  n       out     swamp\r
+       beast   474     jump\r
+       parachute       epstre  s       jump    d\r
+       129     s       jump    down\r
+bdrm02 n       landin  s       out     swamp\r
+       155     n       d       jump\r
+bdrm03 n       landin  nw      out     swamp\r
+       cupboard        cupd2   sw      in\r
+cupd2  cupboard        bdrm03  n       out     swamp   ne\r
+       torch   dead11  up      in\r
+       n       cuptop  up      in\r
+attic  rug     791     d       out     swamp\r
+       sdoor   cuptop  d       out     swamp\r
+cuptop n       cupd2   d       out     swamp\r
+       sdoor   attic   u       in\r
+maze1  n       maze2   se\r
+       n       ostart  out     s\r
+       n       maze1   n       ne      e       w       sw      nw\r
+maze2  n       maze3   nw\r
+       grave   ostart  out\r
+       n       maze2   n       ne      e       s       w       sw      se\r
+maze3  n       maze4   s\r
+       grave   ostart  out\r
+       n       maze3   n       ne      e       se      w       sw      nw\r
+maze4  n       maze5   n\r
+       grave   ostart  out\r
+       n       maze4   se      ne      e       s       w       sw      nw\r
+maze5  n       maze6   ne\r
+       grave   ostart  out\r
+       n       maze5   n       se      e       s       w       sw      nw\r
+maze6  n       maze7   sw\r
+       grave   ostart  out\r
+       n       maze6   n       ne      e       s       w       se      nw\r
+maze7  n       maze8   w\r
+       grave   ostart  out\r
+       n       maze7   n       ne      e       s       se      sw      nw\r
+maze8  n       maze9   e\r
+       grave   ostart  out\r
+       n       maze8   n       ne      se      s       w       sw      nw\r
+maze9  n       maze10  n\r
+       grave   ostart  out\r
+       n       maze9   se      ne      e       s       w       sw      nw\r
+maze10 n       maze25  s\r
+       grave   ostart  out     swamp\r
+       n       maze10  n       ne      e       w       sw      nw      se\r
+maze25 n       ostart  n       ne      e       s       w       sw      nw      se      swamp   out\r
+       tomb    tombrm  d       in\r
+uswamp n       swamp1  o       u       swamp\r
+swamp1 n       swamp2  [se     sw      s       ne]\r
+       n       swamp1  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp2 n       swamp3  [se     sw      s       ne]\r
+       n       swamp1  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp3 n       swamp4  [se     sw      s       ne]\r
+       n       swamp1  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp4 n       swamp5  [se     sw      s       ne]\r
+       n       swamp2  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp5 n       swamp6  [se     sw      s       ne]\r
+       n       swampa  [se     sw      s       ne]\r
+       n       swamp2  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp6 n       swamp8  [se     sw      s       ne]\r
+       n       swamp1  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp8 n       swamp9  [se     sw      s       ne]\r
+       n       swampa  [se     sw      s       ne]\r
+       n       swamp3  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp9 n       swampb  [se     sw      s       ne]\r
+       n       swampa  [se     sw      s       ne]\r
+       n       swamp4  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swampa n       swamp4  [se     sw      s       ne]\r
+       n       swamp2  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swampb n       swampc  [se     sw      s       ne]\r
+       n       swamp4  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swampc n       swampd  [se     sw      s       ne]\r
+       n       swamp5  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swampd n       swamp7  [se     sw      s       ne]\r
+       n       swamp3  se      sw      s       ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       dd      1050    d       jump\r
+       490     swamp\r
+swamp7 n       swamp1  se      s       sw      ne\r
+       n       spstre  nw\r
+       n       pond1   e       out\r
+       n       rapids  n\r
+       n       sfrst2  w\r
+       114     d       jump\r
+       490     swamp\r
+pond1  n       rapids  nw      out\r
+       torch   ydead3  n       ne      e       se      s       sw      w       in      swamp\r
+       n       swamp1  n       ne      e       se      s       sw      w       in      swamp\r
+beach  forced  yrdead\r
+       n       fortun  in      e\r
+       n       bch2    s\r
+       214     n\r
+       pegasus 467     w       sw      nw\r
+       tub     468     w       sw      nw\r
+       marble  469     w       sw      nw\r
+       rug     470     w       sw      nw\r
+       beast   471     w       sw      nw\r
+       nanny   660     w       sw      nw\r
+       boat    sea1    nw      w       sw\r
+       215     nw      w       sw\r
+fortun n       bch1    out     w\r
+       grate   smuggl  u       e       in\r
+       85      u       e       in\r
+smuggl grate   fortun  d       w       out\r
+       85      d       w       out\r
+bch1   forced  beach\r
+bch2   forced  beach2\r
+beach2 forced  dead16\r
+       n       bch1    n\r
+       pegasus 467     w       sw      nw\r
+       tub     468     w       sw      nw\r
+       marble  469     w       sw      nw\r
+       rug     470     w       sw      nw\r
+       beast   471     w       sw      nw\r
+       nanny   660     w       sw      nw\r
+       boat    sea1    w       sw      nw\r
+       n       srock1  s\r
+       215     nw      w       sw\r
+       pegasus 472     e       in\r
+       beast   dead27  e       in\r
+       parachute       bwfall  e       in\r
+       dd      1052    e       in\r
+sea1   rain    sea2    n       nw      w       sw      s\r
+       fish    sea2    e       se      ne      sw      s\r
+       rain    bch2    e\r
+       rain    srock1  se\r
+       rain    bch1    ne\r
+       dd      1053    n       ne      e       se      s       sw      w       nw\r
+sea2   rain    sea1    ne      e\r
+       rain    sea3    n       nw\r
+       rain    sea4    w       sw      s\r
+       fish    sea4    se\r
+       rain    srock2  se\r
+       dd      1053    n       ne      e       se      s       sw      w       nw\r
+sea3   rain    sea2    e       se\r
+       rain    sea4    s\r
+       rain    sea6    sw\r
+       fish    sea2    e       se      s       sw      n\r
+       rain    sea14   n\r
+       n       dead20  nw      w       ne\r
+       dd      1053    e       se      s       sw      n\r
+sea4   rain    sea6    w\r
+       rain    sea3    n\r
+       fish    sea2    se\r
+       rain    srock3  se\r
+       rain    sea5    s\r
+       rain    sea2    e       ne\r
+       n       dead20  nw      sw\r
+       dd      1053    n       ne      e       se      s       sw      w       nw\r
+sea5   fish    sea4    e       ne\r
+       rain    inlet   e\r
+       rain    srock3  ne\r
+       rain    sea4    n\r
+       rain    sea6    nw\r
+       rain    sea15   w\r
+       n       dead20  sw      s       se\r
+       dd      1053    n       ne      e       nw      w\r
+sea6   rain    sea4    e\r
+       rain    sea3    ne\r
+       rain    sea5    se\r
+       rain    sea15   sw\r
+       fish    sea4    w\r
+       rain    vrocks  w\r
+       n       dead20  n       s       nw\r
+       dd      1053    e       w       ne      se      sw\r
+sea7   rain    vrocks  ne\r
+       rain    sea8    nw\r
+       rain    sea15   se\r
+       n       dead20  n       e       s       sw      w\r
+       dd      1053    ne      nw      se\r
+sea8   torch   dead40  n       ne      e       se      s       sw      w       nw\r
+       rain    sea7    se\r
+       rain    sea9    ne\r
+       n       dead20  n       nw      e       s       sw      w\r
+       dd      1053    se      ne\r
+sea9   rain    sea8    sw\r
+       rain    sea10   n\r
+       n       dead20  ne      e       se      s       w       nw\r
+       dd      1053    sw      n\r
+sea10  rain    sea9    s\r
+       rain    slope1  n\r
+       n       dead20  ne      e       se      sw      w       nw\r
+       dd      1053    s       n\r
+sea11  rain    beach4  ne      out\r
+       rain    beach3  se\r
+       rain    jetty   e\r
+       rain    sea12   s       sw\r
+       rain    sea13   w       nw\r
+       rain    dead20  n\r
+       dd      1053    n       ne      e       se      s       sw      w       nw      out\r
+sea12  rain    beach3  e       se      ne      out\r
+       rain    sea11   n\r
+       rain    sea13   nw      w\r
+       rain    sea14   sw\r
+       rain    dead20  s\r
+       dd      1053    n       ne      e       se      s       sw      w       nw      out\r
+sea13  rain    sea11   e       ne      out\r
+       rain    sea12   se\r
+       rain    sea14   s       sw\r
+       rain    dead20  n       w       nw\r
+       dd      1053    n       ne      e       se      s       sw      w       nw      out\r
+sea14  rain    sea13   n\r
+       rain    sea12   ne      out\r
+       rain    sea3    s\r
+       rain    dead20  e       se      sw      w       nw\r
+       dd      1053    n       ne      s       out\r
+sea15  fish    sea5    n       nw\r
+       rain    vrocks  n\r
+       rain    sea7    nw\r
+       rain    sea6    ne\r
+       rain    sea5    e\r
+       rain    sea16   s\r
+       n       dead20  se      sw      w\r
+       dd      1053    n       nw      ne      e       s\r
+sea16  fish    sea15   s\r
+       rain    sea15   n\r
+       rain    woe1    s\r
+       dd      1053    n       s\r
+       n       dead20  ne      e       se      sw      w       nw\r
+woe1   -64     s\r
+       pegasus 467     n       ne      e       se      sw      w       nw\r
+       tub     468     n       ne      e       se      sw      w       nw\r
+       marble  469     n       ne      e       se      sw      w       nw\r
+       rug     470     n       ne      e       se      sw      w       nw\r
+       beast   471     n       ne      e       se      sw      w       nw\r
+       nanny   660     n       ne      e       se      sw      w       nw\r
+       boat    sea16   n       ne      e       se      sw      w       nw\r
+       511     n       ne      e       se      sw      w       nw\r
+woe2   -65     n\r
+       pegasus 467     ne      e       se      s       sw      w       nw\r
+       tub     468     ne      e       se      s       sw      w       nw\r
+       marble  469     ne      e       se      s       sw      w       nw\r
+       rug     470     ne      e       se      s       sw      w       nw\r
+       beast   471     ne      e       se      s       sw      w       nw\r
+       nanny   660     ne      e       se      s       sw      w       nw\r
+       boat    sea16   ne      e       se      s       sw      w       nw\r
+       511     ne      e       se      s       sw      w       nw\r
+beach3 n       scrubs  e       u       out     swamp   ne\r
+       n       beach4  n\r
+       214     s       se\r
+       pegasus 467     nw      w       sw\r
+       tub     468     nw      w       sw\r
+       marble  469     nw      w       sw\r
+       rug     470     nw      w       sw\r
+       beast   471     nw      w       sw\r
+       nanny   660     nw      w       sw\r
+       boat    sea11   nw\r
+       boat    sea12   w       sw\r
+       604     nw      w       sw\r
+beach4 n       beach3  s\r
+       n       scrubs  se      out     swamp\r
+       n       rail1   e\r
+       n       stslop  ne      u\r
+       214     n\r
+       n       jetty   w\r
+       pegasus 467     nw      sw\r
+       tub     468     nw      sw\r
+       marble  469     nw      sw\r
+       rug     470     nw      sw\r
+       beast   471     nw      sw\r
+       nanny   660     nw      sw\r
+       boat    sea11   nw      sw\r
+       604     nw      sw\r
+jetty  n       beach4  e       ne      se      out     swamp\r
+       pegasus 467     nw      w       sw      n       s\r
+       tub     468     nw      w       sw      n       s\r
+       marble  469     nw      w       sw      n       s\r
+       rug     470     nw      w       sw      n       s\r
+       beast   471     nw      w       sw      n       s\r
+       nanny   660     nw      w       sw      n       s\r
+       boat    sea11   nw      w       sw      n       s\r
+       604     nw      sw      w       s       n\r
+fslop1 n       nfrst1  s       u       out     swamp\r
+       n       nfrst2  se\r
+       n       fslop2  e\r
+       n       fslop3  w\r
+       n       nfrst4  sw\r
+       wood    0       n       ne      nw      d\r
+       n       sdale   n       ne      nw      d\r
+fslop2 n       nfrst2  s       u       out     swamp\r
+       n       fslop1  w\r
+       n       nfrst1  sw\r
+       wood    0       n       ne      nw      d       se\r
+       n       ogrnds  ne      n       d\r
+       n       sdale   nw\r
+       n       nhill2  se\r
+       51      e\r
+fslop3 n       nfrst4  sw      s       u       swamp\r
+       n       nfrst1  se      out\r
+       n       fslop1  e\r
+       wood    0       ne\r
+       n       sdale   ne\r
+       n       dcliff  n       nw      d\r
+       51      w\r
+sdale  n       fslop1  u       s       out     swamp\r
+       n       fslop2  se\r
+       n       ogrnds  e\r
+       n       cuttin  ne\r
+       n       forist  n\r
+       n       wdale   nw\r
+       n       dcliff  w\r
+       n       fslop3  sw\r
+ogrnds n       fslop2  sw      s       u       out     swamp\r
+       n       mosolm  se      in\r
+       602     e\r
+       n       efrst1  ne      n\r
+       n       cutting nw      d\r
+       n       sdale   w\r
+mosolm n       ogrnds  nw      out     swamp   u\r
+       tomb1   ntomb   n\r
+       tomb2   wtomb   w\r
+       tomb3   stomb   s\r
+       tomb4   etomb   e\r
+       tomb5   setomb  se\r
+       tomb6   swtomb  sw\r
+ntomb  n       mosolm  s       o       swamp\r
+wtomb  n       mosolm  e       o       swamp\r
+stomb  n       mosolm  n       o       swamp\r
+etomb  n       mosolm  w       o       swamp\r
+setomb n       mosolm  nw      o       swamp\r
+swtomb n       mosolm  ne      o       swamp\r
+dcliff 51      sw\r
+       52      w\r
+       wood    0       jump    e       ne      n       d       nw\r
+       beast   474     jump\r
+       parachute       beach3  jump\r
+       603     jump\r
+       n       fslop3  se      s       out     swamp   u\r
+       n       sdale   e\r
+       n       wdale   ne\r
+       n       scrubs  n       d       nw\r
+scrubs n       dcliff  s       se      u       out     swamp\r
+       n       wdale   e       ne\r
+       n       rail1   n\r
+       n       beach4  nw      d\r
+       n       beach3  w       sw\r
+wdale  n       sdale   s       se      out     up      swamp\r
+       n       forist  e\r
+       n       rail2   ne\r
+       n       rail1   n       nw\r
+       n       scrubs  w       d\r
+       n       dcliff  sw\r
+forist n       sdale   out     up      s       swamp   se      sw\r
+       n       cuttin  e\r
+       n       rail3   ne\r
+       n       rail2   n\r
+       n       rail1   nw\r
+       n       wdale   w       d\r
+cuttin n       ogrnds  s       se      u       out     swamp\r
+       n       efrst1  e\r
+       n       rail4   ne\r
+       n       rail3   n       d\r
+       n       rail2   nw\r
+       n       forist  w\r
+       n       sdale   sw\r
+efrst1 n       ogrnds  s       sw      u       out     swamp\r
+       n       rail4   n\r
+       602     se      e       ne\r
+       n       rail3   nw\r
+       n       cuttin  w       d\r
+rail1  n       wdale   s       out     swamp   u\r
+       n       forist  se\r
+       n       rail2   e\r
+       n       ndale   ne\r
+       n       stslop  n\r
+       n       beach4  nw      w       d\r
+       n       scrubs  sw\r
+rail2  n       forist  s       u       out\r
+       n       cuttin  se\r
+       n       rail3   e\r
+       n       ndale   n       ne      nw\r
+       n       rail1   w\r
+       n       wdale   sw      swamp\r
+rail3  n       cuttin  u       s       out     swamp\r
+       n       efrst1  se\r
+       n       rail4   e\r
+       n       paddck  ne      n\r
+       n       ndale   nw\r
+       n       rail2   w\r
+       n       forist  sw\r
+rail4  n       efrst1  s       u       out     swamp\r
+       602     se      ne\r
+       n       emine   d       e       in\r
+       n       paddck  n       nw\r
+       n       rail3   w\r
+       n       cuttin  sw\r
+emine  n       rail4   w       u       out     swamp\r
+       n       main1   d       e       in\r
+main1  n       emine   w       u       out     swamp\r
+       n       main2   d       e       in\r
+main2  n       main1   w       o       swamp\r
+       flood   shaft1  n\r
+       n       valvrm  u       e\r
+       flood   main3   se      d       in\r
+       733     n       se      d       in\r
+platfm door    shed    n       in\r
+       50      n       in\r
+       n       shaft2  e       u\r
+       n       valvrm  w       d       out\r
+shed   door    platfm  s       o\r
+       50      s       o\r
+valvrm n       platfm  u       e       in\r
+       n       main2   d       w       o\r
+shaft2 n       platfm  w       o       d\r
+       n       minor5  u       n       in\r
+shaft1 n       main2   s       o       u\r
+       n       minor1  e       in      d\r
+main3  n       main2   nw      u       o\r
+       n       main4   e       in\r
+       n       main5   sw      d\r
+main4  n       main3   w       o       u\r
+       n       shaft3  e       in\r
+       n       main6   s       d\r
+shaft3 n       main4   w       u       out\r
+       n       minor7  d       s       in\r
+main5  n       main3   ne      u       o\r
+       n       main7   s       d       in\r
+main7  n       main5   u       o       n\r
+       e       dpass1  s       d       in\r
+       750     s       d       in\r
+dpass1 n       main7   u       o       n\r
+       n       dpass2  ne      in      d\r
+dpass2 n       dpass1  sw      u\r
+       n       dpass3  ne      o\r
+       n       dpass5  s       d\r
+       n       sectn   se\r
+dpass3 n       main6   n       o       u\r
+       n       dpass2  sw\r
+       n       dpass4  se\r
+sectn  e       dpass2  nw      u       in\r
+       e       dpass4  e       o       d\r
+       750     nw      u       in      e       o       d\r
+dpass5 n       dpass2  n       u       o\r
+       n       dpass6  se      in      d\r
+dpass4 n       dpass3  nw      u       o\r
+       n       dpass6  sw      in      d\r
+       n       sectn   w\r
+dpass6 n       dpass5  nw      u\r
+       n       dpass4  ne      o\r
+main6  n       main4   n       u       o\r
+       e       dpass3  s       d       in\r
+       750     s       d       in\r
+minor1 n       shaft1  w       u       o\r
+       n       minor2  d       e       in\r
+       e       crrm    sw\r
+       750     sw\r
+minor2 n       minor1  w       u       out\r
+       n       face1   e\r
+       n       minor3  d       s       in\r
+face1  n       minor2  w       u       out\r
+minor3 n       minor2  n       u       o\r
+       n       shaft4  s       d       in\r
+shaft4 n       minor3  n       u       o\r
+       n       tightp  s       d       in\r
+tightp n       shaft4  n       u       o\r
+       n       face4   s       d       in\r
+       n       edwrlm  e\r
+face4  n       tightp  n       u       o\r
+crrm   n       minor1  ne      u       o\r
+       n       doomrm  w       in      d\r
+doomrm 751     u       leap    o\r
+edwrlm n       tightp  w       u       out\r
+       n       panora  se      in      d\r
+minor5 n       shaft2  s       o       d\r
+       n       sidpsg  n\r
+       n       minor6  e       in\r
+minor6 n       minor5  w       u       out\r
+       n       face2   e\r
+       dd      1054    s       d       in\r
+face2  n       minor6  w       u       out\r
+sidpsg n       minor5  s       u       o\r
+minor7 n       shaft3  n       u       o\r
+       n       minor8  s       d       in\r
+minor8 n       face3   e\r
+       n       minor7  n       u       o\r
+       e       peril1  s       d       in\r
+       750     s       d       in\r
+face3  n       minor8  w       u       out\r
+peril1 n       minor8  n       u       o\r
+       n       peril2  sw      w       s\r
+peril2 n       peril1  n       ne      o\r
+       n       peril3  e\r
+peril3 n       peril1  n       nw      o\r
+       n       peril2  w\r
+       n       peril4  sw\r
+peril4 n       peril2  nw\r
+       n       peril1  n       o\r
+       n       peril3  ne\r
+       n       peril5  s\r
+peril5 n       peril4  n       o\r
+       n       peril3  ne\r
+       n       peril2  nw\r
+       n       ledge1  s\r
+ledge1 n       ledge2  e       in\r
+       n       bldg    leap\r
+       e       peril5  n       o\r
+       752     u\r
+       750     n       u       o\r
+ledge2 n       ledge1  w       o\r
+       n       ledge3  e       in\r
+       752     u\r
+       n       bldg    leap\r
+ledge3 n       ledge2  w       o\r
+       752     u\r
+       n       bldg    leap\r
+bldg   f       dead43\r
+       n       dwpst1  s       o\r
+       752     u       n       ne      e       se      sw      w       nw\r
+boledg f       bldg\r
+ufrst1 n       dwpst1  w       sw      o\r
+       n       ufrst5  se      e\r
+       752     nw      n       ne\r
+       753     s       u\r
+dwpst1 n       boledg  n\r
+       n       panora  sw      u       o\r
+       n       befcit  s\r
+       n       ufrst1  se      e\r
+       752     nw      ne\r
+befcit flood   dwpst1  n       ne      nw\r
+       n       topcit  e       u\r
+       flood   dwpst2  se      s\r
+       flood   panora  sw      w       nw      o\r
+       949     n       ne      nw      se      s       sw      w       nw      o\r
+dwpst2 n       befcit  n       ne\r
+       n       ufrst2  e\r
+       n       ufrst3  se      s\r
+       n       panora  nw      u       o\r
+       752     sw      w\r
+panora dwarfs  0       nw      u       o\r
+       n       edwrlm  nw      u       o\r
+       n       dwpst1  ne\r
+       n       befcit  e       in\r
+       n       dwpst2  se      d\r
+ufrst3 n       dwpst2  n       o\r
+       n       ufrst2  ne\r
+       n       spring  se\r
+       752     e       s       sw      w       nw\r
+spring n       ufrst3  nw      o\r
+       752     n       ne      e       se      s       sw      w\r
+ufrst2 n       dwpst2  w       nw      o\r
+       n       ufrst3  sw\r
+       n       ufrst5  e       ne\r
+       753     n       u\r
+       752     se      s\r
+topcit n       befcit  w       d       o       leap\r
+       gate    entrnc  e       in      u\r
+       754     e       in      u\r
+entrnc n       dwstep  e       d       in      leap\r
+       gate    topcit  w       o\r
+       754     w       o\r
+dwstep dwarfs  dwhall  e       d       in      leap\r
+       door    dwhall  e       d       in      leap\r
+       50      e       d       in      leap\r
+       n       entrnc  u       w       o\r
+dwhall n       lowps1  n\r
+       n       lowps5  e\r
+       n       guard1  s\r
+       dwarfs  dwstep  w       o       u\r
+       door    dwstep  w       o       u\r
+       50      w       o       u\r
+lowps1 n       lowps2  n\r
+       n       dwktch  e\r
+       n       dwhall  s       o\r
+       dwarfs  dwfood  w       in\r
+       door    dwfood  w       in\r
+       50      w       in\r
+lowps2 n       dwroom  n\r
+       n       lowps3  e\r
+       n       lowps1  s       o\r
+       dwarfs  dwstre  w       in\r
+       door    dwstre  w       in\r
+       50      w       in\r
+lowps3 n       dwbog   ne      u\r
+       n       dwcant  e       in\r
+       n       lowps2  w       o\r
+dwfood dwarfs  lowps1  e       o\r
+       door    lowps1  e       o\r
+       50      e       o\r
+dwstre dwarfs  lowps2  e       o\r
+       door    lowps2  e       o\r
+       50      e       o\r
+dwroom n       lowps2  s       o\r
+dwbog  n       lowps3  sw      o       d\r
+dwcant n       lowps3  w\r
+       n       lowps4  s\r
+       dwarfs  dwktch  sw      o       in\r
+       door    dwktch  sw      o       in\r
+       50      sw      o       in\r
+dwktch n       dwpit   n       in      d       leap\r
+       n       lowps1  w       o\r
+       dwarfs  dwcant  ne      in\r
+       door    dwcant  ne      in\r
+       50      ne      in\r
+dwpit  n       dwktch  u       o       s       leap\r
+lowps4 n       dwcant  n\r
+       dwarfs  dwrm1   s       o       in\r
+       door    dwrm1   s       o       in\r
+       50      s       o       in\r
+dwrm1  n       lowps5  w       o\r
+       dwarfs  lowps4  n       in\r
+       door    lowps4  n       in\r
+       50      n       in\r
+lowps5 n       dwhall  w       o\r
+       n       dwrm1   e       in\r
+       n       lowps6  s\r
+guard1 n       dwhall  n       o\r
+       n       dwrm2   se\r
+       dwarfs  dwrm2   s       in\r
+       door    guard2  s       in\r
+       50      s       in\r
+guard2 dwarfs  guard1  n       o\r
+       door    guard1  n       o\r
+       50      n       o\r
+       n       lowps7  s\r
+       n       wpnstr  w       in\r
+wpnstr n       guard2  e       o\r
+lowps7 n       guard2  n       o\r
+       n       guard3  s\r
+       dwarfs  guard2  w       in\r
+       door    minrm   w       in\r
+       50      w       in\r
+minrm  n       guard4  s       in\r
+       dwarfs  lowps7  e       o\r
+       door    lowps7  e       o\r
+       50      e       o\r
+guard4 n       minrm   n       o\r
+       dwarfs  minrm   s       in\r
+       door    kingrm  s       in\r
+       50      s       in\r
+guard3 n       lowps7  n       o\r
+       dwarfs  kingst  s       in\r
+       door    kingst  s       in\r
+       50      s       in\r
+kingrm n       kingst  e\r
+       dwarfs  kingst  n       o\r
+       door    guard4  n       o\r
+       50      n       o\r
+       n       kqdorm  sw      in\r
+kqdorm n       kingrm  ne      o       in\r
+kingst n       kingrm  w\r
+       dwarfs  kingrm  n       o\r
+       door    guard3  n       o\r
+       50      n       o\r
+       n       lowps8  s\r
+lowps8 n       kingst  n       o\r
+       dwarfs  ktreas  e       in\r
+       door    ktreas  e       in\r
+       50      e       in\r
+ktreas dwarfs  lowps8  w       o       in\r
+       door    lowps8  w       o       in\r
+       50      w       o       in\r
+lowps6 n       lowps5  n       o\r
+       n       dwrm3   e\r
+       dwarfs  dwrm2   s       in\r
+       door    dwrm2   s       in\r
+       50      s       in\r
+dwrm2  n       guard1  nw      o\r
+       dwarfs  lowps6  n       in\r
+       door    lowps6  n       in\r
+       50      n       in\r
+       n       dwrm4   s\r
+dwrm3  n       lowps6  w       o\r
+       dwarfs  dorm    s       in\r
+       door    dorm    s       in\r
+       50      s       in\r
+dorm   n       odorm   s\r
+       dwarfs  dwrm3   n       o       in\r
+       door    dwrm3   n       o       in\r
+       50      n       o       in\r
+odorm  n       dorm    n       o\r
+       dwarfs  lowps9  s       in\r
+       door    lowps9  s       in\r
+       50      s       in\r
+dwrm4  n       dwrm2   n       o\r
+       n       lowps9  e\r
+       dwarfs  kdorm   s       in\r
+       door    kdorm   s       in\r
+       50      s       in\r
+lowps9 n       dwrm4   w       o\r
+       n       pdorm   s\r
+       dwarfs  odorm   n       in\r
+       door    odorm   n       in\r
+       50      n       in\r
+kdorm  n       pdorm   e       in\r
+       dwarfs  dwrm4   n       o\r
+       door    dwrm4   n       o\r
+       50      n       o\r
+pdorm  n       lowps9  n       o\r
+       n       kdorm   w\r
+ufrst5 n       ufrst1  nw      o\r
+       n       ufrst2  sw\r
+       753     w       u\r
+       752     n       ne      e       se      s\r
+stslop n       rail1   s       se      out     swamp\r
+       n       ndale   e\r
+       n       nfrst5  ne      n       u\r
+       n       beach4  nw      w       sw      d\r
+ndale  n       rail2   s       swamp   out     d\r
+       n       rail3   se\r
+       n       paddck  e\r
+       n       nfrst7  ne\r
+       n       nfrst6  n       u\r
+       n       nfrst5  nw\r
+       n       stslop  w\r
+       n       rail1   sw\r
+paddck n       rail4   s       se\r
+       602     e\r
+       n       ruin    ne\r
+       n       nfrst7  n       u\r
+       n       nfrst6  nw\r
+       n       ndale   w\r
+       n       rail3   sw      d       swamp   out\r
+splair sptrap  ruin    o\r
+ruin   arachnid        splair  n       ne      e       se      s       sw      w       nw      u       d       in      o       swamp   jump\r
+       web     paddck  s       sw      out     swamp   d\r
+       web     nfrst7  nw      u       w       n\r
+       940     s       sw      o       swamp   d       nw      u       w       n\r
+       602     se      e       ne\r
+nfrst5 n       stslop  s       out     d       swamp\r
+       n       ndale   se\r
+       n       nfrst6  e\r
+       51      ne      n       nw      w       u\r
+       n       beach4  sw\r
+nfrst6 n       ndale   s       d       out     swamp   sw\r
+       n       paddck  se\r
+       n       nfrst7  e\r
+       51      ne      n       nw      u\r
+       n       nfrst5  w\r
+nfrst7 n       paddck  s       out     swamp   d\r
+       n       ruin    se      e\r
+       602     e       ne\r
+       51      n       nw\r
+       n       nfrst6  w\r
+       n       ndale   sw\r
+hdland n       ifrst5  nw      u\r
+       n       cove    n       d\r
+       boat    dead30  ne      e       se      s       sw      w\r
+       510     ne      e       se      s       sw      w\r
+cove   n       ifrst4  n       u\r
+       n       fring   nw      w\r
+       n       ifrst5  sw\r
+       n       hdland  s\r
+       boat    dead30  ne      e       se      d\r
+       510     ne      e       se      d\r
+ifrst1 n       ifrst2  n\r
+       n       slope1  e       ne      u\r
+       boat    dead30  se      s       sw      w       nw      d\r
+       510     se      s       sw      w       nw      d\r
+ifrst2 n       ifrst3  n\r
+       n       slope4  u\r
+       n       slope3  ne\r
+       n       slope1  e\r
+       n       ifrst1  s       d       se\r
+       boat    dead30  sw      w       nw\r
+       510     sw      w       nw\r
+ifrst3 n       ifrst6  e       u\r
+       n       slope4  se\r
+       n       ifrst2  s       d\r
+       boat    dead30  sw      w       nw      n       ne\r
+       510     sw      w       nw      n       ne\r
+ifrst4 n       rost    n       u       nw\r
+       n       cove    s       d\r
+       n       fring   sw\r
+       n       slope2  w\r
+       boat    dead30  ne      e       se\r
+       510     ne      e       se\r
+ifrst5 n       fring   n\r
+       n       cove    ne      e\r
+       n       hdland  se\r
+       n       slope1  w       nw      u\r
+       boat    dead30  s       sw      d\r
+       510     s       sw      d\r
+slope1 n       slope2  n       u\r
+       n       fring   ne\r
+       n       ifrst5  e       se\r
+       n       ifrst2  w\r
+       n       slope3  nw\r
+       n       ifrst1  sw\r
+       pegasus 467     s       d\r
+       tub     468     s       d\r
+       marble  469     s       d\r
+       rug     470     s       d\r
+       beast   471     s       d\r
+       nanny   660     s       d\r
+       boat    sea10   s       d\r
+       511     s       d\r
+fring  n       ifrst4  ne\r
+       n       cove    e       se      d\r
+       n       ifrst5  s\r
+       n       slope1  sw      w\r
+       n       slope2  n       u       nw\r
+rost   n       ifrst4  s\r
+       n       slope2  sw\r
+       lizard  slope4  d       in\r
+       slab    brost   d       in\r
+       n       slope4  d\r
+       n       ifrst6  w\r
+       512     ne      n       nw      e       se\r
+       parachute       dead31  jump\r
+       dd      1055    jump\r
+brost  n       rost    u       out\r
+       container       983     d       sw      in\r
+       pointer 983     d       sw      in\r
+       violinbow       983     d       sw      in\r
+       sword   dtest1  d       sw      in\r
+       dd      1056    d       sw      in\r
+dtest1 scythe  dtest2  d       sw      in\r
+       dd      1057    d       sw      in\r
+       n       brost   u       out     ne\r
+dtest2 546     u       out\r
+dtest3 door    treasc  n       out     in      swamp\r
+       50      n       out     in      swamp\r
+dtreas n       rost    u       out\r
+slope2 n       rost    n       ne      u\r
+       n       ifrst4  e\r
+       n       fring   se      d\r
+       n       slope1  s       sw\r
+       n       slope3  w\r
+       n       slope4  nw\r
+slope3 n       slope4  nw      n       u\r
+       n       slope2  e       ne\r
+       n       slope1  se      s\r
+       n       ifrst2  sw      w       d\r
+slope4 n       ifrst6  n       ne\r
+       n       rost    u       e\r
+       n       slope2  se\r
+       n       slope3  s\r
+       n       ifrst2  sw\r
+       n       ifrst3  w       nw      d\r
+ifrst6 n       rost    e       u       se\r
+       n       slope4  s       sw\r
+       n       ifrst3  w       d\r
+       boat    dead30  nw      n       ne\r
+       510     nw      n       ne\r
+srock1 n       bch2    n\r
+       n       srock2  s\r
+       pegasus 467     nw      w\r
+       tub     468     nw      w\r
+       marble  469     nw      w\r
+       rug     470     nw      w\r
+       beast   471     nw      w\r
+       nanny   660     nw      w\r
+       boat    sea1    nw\r
+       boat    sea2    w\r
+       dd      1058    ne      e       se      sw      w       nw\r
+srock2 n       srock1  n\r
+       n       srock3  s\r
+       pegasus 467     w       sw      nw\r
+       tub     468     w       sw      nw\r
+       marble  469     w       sw      nw\r
+       rug     470     w       sw      nw\r
+       beast   471     w       sw      nw\r
+       nanny   660     w       sw      nw\r
+       boat    sea2    nw\r
+       boat    sea4    w       sw\r
+       dd      1058    ne      e       se      sw      w       nw\r
+srock3 n       srock2  n\r
+       n       inlet   se\r
+       pegasus 467     w       sw      nw      s\r
+       tub     468     w       sw      nw      s\r
+       marble  469     w       sw      nw      s\r
+       rug     470     w       sw      nw      s\r
+       beast   471     w       sw      nw      s\r
+       nanny   660     w       sw      nw      s\r
+       boat    sea4    nw\r
+       boat    sea5    w       sw      s\r
+       dd      1058    ne      e       s       sw      w       nw\r
+inlet  n       srock3  nw      out\r
+       pegasus 467     w       sw\r
+       tub     468     w       sw\r
+       marble  469     w       sw\r
+       rug     470     w       sw\r
+       beast   471     w       sw\r
+       nanny   660     w       sw\r
+       boat    sea5    w       sw\r
+       n       nest    u       e\r
+       214     n       ne      se      s\r
+nest   n       inlet   d       jump    w       out\r
+vrocks pegasus 467     e       se      ne      out     sw      s\r
+       tub     468     e       se      ne      out     sw      s\r
+       marble  469     e       se      ne      out     sw      s\r
+       rug     470     e       se      ne      out     sw      s\r
+       beast   471     e       se      ne      out     sw      s\r
+       nanny   660     e       se      ne      out     sw      s\r
+       boat    sea6    e       se      ne      out\r
+       boat    sea7    sw\r
+       boat    sea15   s\r
+       boat    dead20  w       nw\r
+       511     e       se      ne      out     w       nw      s\r
+       dd      1058    sw\r
+       n       deck    n       u\r
+crow   n       deck    d       e       out\r
+       dd      1059    jump\r
+deck   n       stpoop  e\r
+       n       hold    d\r
+       n       vrocks  s       out\r
+       n       capt    ne      in\r
+       n       crow    u       w\r
+stpoop n       deck    d       w       out\r
+       n       poop    u       e       in\r
+poop   n       stpoop  d       w       out\r
+capt   n       deck    sw      out\r
+       n       galley  d       in\r
+galley torch   dead37  d       in\r
+       n       proom   d       in\r
+       n       capt    u       out\r
+proom  n       galley  u       out\r
+hold   n       deck    u       out\r
+bwfall parachute       bch2    out     w\r
+       dd      1052    out     w\r
+       n       spiral  e       u\r
+spiral n       bwfall  d       out     w\r
+       n       vert    u       in\r
+vert   n       spiral  d       out\r
+       n       revrm   u       in      e\r
+revrm  n       vert    d       out     w\r
+       crack   fossrm  e       in\r
+       n       revps   n       in\r
+revps  n       revrm   s       out\r
+       n       grotto  n       in\r
+grotto n       revps   s       out\r
+       ~parachute      beach   jump\r
+       -13     jump\r
+       52      w       nw      sw\r
+fossrm crack   revrm   w       out\r
+root   n       wfrst1  u       out\r
+       rootview        rtun1   n\r
+       157     n\r
+       n       tunnel  s\r
+altar  rootview        rtun2   s       out\r
+       157     s       out\r
+       n       antech  e       in\r
+rtun1  torch   ydead1  n       in      out     s\r
+       rootview        rtun2   n       in\r
+       rootview        root    s       out\r
+       156     s       n       in      out\r
+rtun2  torch   ydead1  s       n       in      out\r
+       rootview        rtun1   s       out\r
+       rootview        altar   n       in\r
+       156     s       n       in      out\r
+antech n       altar   w       out\r
+       door    temple  e       in\r
+       221     e\r
+temple door    antech  w       out\r
+       n       hchamb  in      n\r
+       213     e       u\r
+       221     w       out\r
+hchamb n       temple  s       out\r
+tunnel n       root    n       out\r
+       n       lgrm    se\r
+lgrm   n       tunnel  nw      out\r
+       n       estlpl  w\r
+       n       wolfrm  e\r
+       tub     60      s       d\r
+       n       sloptn  s       d\r
+wolfrm n       lgrm    w       out\r
+       wolf    deathp  d       in      e\r
+       230     d       in      e\r
+deathp n       wolfrm  u       out     w\r
+       crucifix        diamnd  d       e       in\r
+       n       cinder  d       e       in\r
+cinder n       deathp  u       w       out\r
+       door    hotpas  e       in\r
+diamnd n       deathp  u       w       out\r
+       door    hotpas  e       in\r
+hotpas door    cinder  w       out\r
+       n       firept  in      e\r
+firept n       hotpas  w       out\r
+       dd      1060    d       jump\r
+estlpl n       lgrm    e       out\r
+       pool    wstlpl  w       in\r
+       dd      1061    w       in\r
+wstlpl pool    estlpl  e       out\r
+       dd      1061    e       out\r
+level  tub     60      n       u       out\r
+       n       sloptn  n       u       out\r
+       n       mudrm   s       d       in\r
+mudrm  n       level   n       u       out\r
+       mud     schamb  e       in\r
+sloptn n       level   s       d\r
+       n       lgrm    n       u       out\r
+schamb mud     mudrm   w       out\r
+tombrm tomb    maze25  u       out\r
+       statue  rottrm  s       in\r
+       dd      1062    s       in\r
+rottrm n       tombrm  n       out\r
+       n       cavein  w       in\r
+cavein statue  rottrm  e       out\r
+       dd      1062    e       out\r
+       e       temple  d       w\r
+       212     d       w\r
+ydead1 n       ydead3  n\r
+dead10 n       dead11  n\r
+ydead3 n       ydead4  n\r
+yrdead n       ydead1  n\r
+dead16 n       dead19  n\r
+dead11 n       dead15  n\r
+dead15 n       dead16  n\r
+ydead4 n       ydead5  n\r
+ydead5 n       ydead8  n\r
+ydead8 n       dead10  n\r
+dead19 n       dead20  n\r
+dead20 n       dead23  n\r
+dead23 n       dead27  n\r
+dead27 n       dead28  n\r
+dead28 n       dead29  n\r
+dead29 n       dead30  n\r
+dead30 n       dead31  n\r
+dead31 n       dead33  n\r
+dead33 n       dead34  n\r
+dead34 n       dead37  n\r
+dead37 n       dead39  n\r
+dead39 n       dead40  n\r
+dead40 n       dead41  n\r
+dead41 n       dead43  n\r
+dead43 n       yrdead  n\r
+*text  1600\r
+@txttxt\r
+15     *HINTS:\r
+        If you want to see underground, light a stick from a fire.\r
+        If you want to score points for treasure, drop it in the swamp.\r
+        The swamp can be found by typing SWAMP outside until you reach it.\r
+        OUT normally moves you in the direction of the start.\r
+        If you're carrying a lit stick, look out for marsh gas.\r
+        Just type the answers to the mausoleum questions straight, eg 45.\r
+        Brollies make good parachutes.\r
+        Dryads are combustible.\r
+        The shrine, hallowed chamber and ancient chamber are good places in\r
+               which to meditate.\r
+        Beggars deserve to be kicked.\r
+       If you think these hints can be improved, type SUGGESTION and say\r
+       what you think's wrong.\r
+50     The door's shut, can't you see you berk?\r
+51     The forest becomes too dense to go any farther. You give up and turn\r
+       back.\r
+52     As you approach the edge of the cliff the rock starts to crumble.\r
+       Hurriedly you retreat as you feel the ground begin to give way under\r
+       your feet!\r
+53     You can't fit through that small serving hatch!\r
+54     There's a whopping great big stone wall in the way!\r
+55     The water here is flowing too fast for you to ford the river safely.\r
+60     The barrel is too wide to fit through the opening.\r
+61     The barrel upturns and smashes, but its contents have mysteriously\r
+       disappeared...\r
+62     The reddish water splooshes out of the barrel as you drop the thing,\r
+       but seeps into the earthy walls at an alarming rate, and is soon gone.\r
+       Very little goes down the steps.\r
+63     The water splooshes out of the barrel when you let it go, and laps up\r
+       against the porous walls. You suddenly become witness to an incredible\r
+       sight as the dry mud absorbs the water incredibly quickly, and falls\r
+       off to join the general mud on the floor. A short while later, a small\r
+       chamber to the east can be seen which was previously obscured by its\r
+       bizarre covering.\r
+64     The barrel's smashed remains crash loudly to the floor.\r
+65     The east wall sounds hollow.\r
+66     The mud is incredibly hard, as if baked on, and will not yield to any\r
+       of your attempts at breaking it.\r
+69     The mud is too gooey to carry around. It's useless even if you could!\r
+70     The gooey mud makes a squelching sound...\r
+71     The dryad wails in agony as your axe bites deep into its trunk, and\r
+       flails its branches around desperately trying to keep you off. Your\r
+       chop, however, was sufficient to finish it, and it crashes to the\r
+       ground and disappears whence it came.\r
+72     The dryad instantly falls back, but too late and your torch takes\r
+       hold. A few seconds later, all that remains is the smouldering ash\r
+       that once was alive, then this, too, disappears whence it came.\r
+73     The climb is too tight and precarious for you to be able to drop\r
+       anything here.\r
+74     The conch emits a low reverberation, but it's not very loud.\r
+75     The conch emits a low reverberation, which resonates with the\r
+       sound of the waterfall. As you blow harder, it gets louder until\r
+       it becomes almost deafening, then suddenly there is a tremendous\r
+       > CRACK < and the east wall of the room splits apart to reveal\r
+       a dark, eerie room.\r
+76     The conch emits a low, but loud, reverberation.\r
+77     From the end of your wand leaps a particularly vicious bolt of\r
+       vivid green lightning, which strikes the dryad with a hollow crack.\r
+       A trice later, and nothing remains of the unfortunate creature...\r
+78     The beggar senses that you are about to zap him and leaps up to\r
+       defend himself. However, the electric glow which dances from the\r
+       end of your wand soon puts an end to his wretched life, and his\r
+       smouldering rags are the last evidence of his time in the Land...\r
+79     The tomb is too stiff to open directly.\r
+80     With your combined strength, the grate slides open.\r
+81     The grate is already open, dunderhead!\r
+82     Pushing and heaving together, you slide the grate shut.\r
+83     It's already shut! Take a look if you don't believe me!\r
+84     The grate is too difficult to open or close alone, get someone to help\r
+       you.\r
+85     The grate is slid closed, try opening it...\r
+86     Ughhh...\r
+87     From the end of your rod flashes a scarlet ray of immense power. You\r
+       shield your eyes from the incredible intensity, and when you next\r
+       look, the tree has been felled.\r
+89     The door is too strong to break, even when you use the weapon.\r
+102    You wave the rattle to and fro and it makes a rattling noise!\r
+104    With a great deal of effort you make the bed.\r
+105    Chop, chop, chop . . . >creak<  >groan< . . . >crack<\r
+       "TIMBERRRRRRRRRR" with a tremendous >CRASH< the aged tree falls\r
+       majestically to the ground. As the dust settles you notice that the\r
+       stump of the Yew is hollow, but the shadows are too deep for you to\r
+       see far down the hole. It looks descendable though...\r
+106    A hollow sound reverberates from the trunk of the tree.\r
+107    OK, it's unfurled.\r
+108    OK, it's furled.\r
+111    With the most earshattering squealling and groaning the top of the\r
+       tomb slides to one side. Revealing a staircase..\r
+112    The tomb is already open, stupid!\r
+113    The tomb shows no signs of activity.\r
+114    The ground is too hard for the swamp to swallow you up here.\r
+120    The weather has swollen the river and you cannot cross!\r
+116    You can't climb bushy trees like yews! Maybe you could from INSIDE...\r
+117    The ox mechanistically lows a loud "MOO".\r
+118    The beggar moans as your foot smashes into his face.\r
+119    The beggar wants people to feed him with food, not make token gifts\r
+       of paltry goods the wretch finds useless.\r
+167    The beggar eagerly accepts your food, then drops it in astonishment as\r
+       the individual potatoes turn to gold in his hands! "Praise the gods, a\r
+       miracle!" you think, hastily pushing the beggar out of the way and\r
+       collecting the treasure. "I preferred them before," thinks the beggar,\r
+       sorrowfully.\r
+121    The ox is dead.\r
+122    The ox isn't hungry, it just wants a bit of love.\r
+123    Oxen are renowned for their dislike of suspicious herbs...\r
+124    The eye loosens in its socket and tumbles out.\r
+125    The gods don't appear to be listening.\r
+126    With a great deal of fun you unmake the bed.\r
+127    A dazzling ray sparks in a multitude of brilliant colours from the\r
+       end of your wand, and the door is blasted to oblivion. The doorway\r
+       itself is now passable.\r
+128    Everything around you grows hazy, and merges into a swirling display\r
+       of magical colours and shapes, and you feel your wand slip from your\r
+       hand. Suddenly, the vivid chromatic opaqueness clears, and you\r
+       re-materialise...\r
+129    Just because there's a window there, it doesn't mean you have to go\r
+       jump out of it, clod!\r
+130    It was a very old ox and hadn't long to live anyway.\r
+133    It's already dead you steaming great nit!\r
+134    The ox isn't in a condition to eat at the moment...\r
+135    The tree won't chop any further. Sorry if you were trying to make\r
+       brands out of it, but it wouldn't burn anyway (it may be hollow, but\r
+       it's still got lots of resin in it).\r
+136    chop, chop, chop . . . >creak<  >groan< . . .\r
+137    The tree is felled so climbing it is rather pointless...\r
+138    The pool starts freezing over the instant your icicles make contact.\r
+       As it hardens, it expands, but not enough to do any damage. The way\r
+       across is now safe.\r
+140    In these parts, it is too dangerous to swim in flowing water. A more\r
+       likely place would be a pool, perhaps underground.\r
+141    Worship in these parts is customarily conducted near idols, usually\r
+       their eyes if there are precious stones there.\r
+142    This is a MASSIVE idol! Worshipping it from here isn't good enough! Go\r
+       up the steps you buffoon!\r
+143    THE STAIRS GO NO FURTHER! Read the description, stupid!\r
+144    The ox lows a loud "MOO" as you grab it by the horns and start\r
+       dragging it.\r
+145    The ogre leaps up to pound you with his club, but doesn't understand\r
+       axes and you hack him to pieces.\r
+146    The ogre grabs hold of the leg and starts gnawing at it ferociously.\r
+147    The ogre glares at you and snarls. Ogres only eat dead flesh...\r
+148    The ogre isn't in a mood to accept at present...\r
+149    A brilliant flash of lightning erupts from the end of your wand and\r
+       strikes the ogre in its chest. The smell of burned ogre fills the room.\r
+150    "To be sure, I'm not hungry!" quips the leprechaun.\r
+151    As you attack the leprechaun your blow goes straight through him\r
+       without so much as harming his green tunic. "Bejabers, mortal weapons\r
+       can't hurt the loikes of me!" he exclaims.\r
+152    "I hope you'll be keeping your eyes off my gold, beghorra!" says\r
+       the leprechaun, preventing your removal of his treasure.\r
+153    Kicking and screaming wildly the leprechaun attempts vainly to\r
+       escape from your grasp. "'Tis not fair!" he wails as you tuck him\r
+       under your arm out of the way.\r
+154    A dazzling red beam of light shoots from the end of your wand, and\r
+       when you look again the leprechaun has disintigrated quite noticibly!\r
+155    The windows are to provide light for you, not a vehicle for suicide\r
+       attempts! The window is much too small in this room anyway...\r
+156    You find your way blocked after a sudden fire and cave-in.\r
+157    The way is blocked after a fire lead to a cave-in, twit...\r
+159    You put your foot into the pool, but are suddenly stung with pain and\r
+       withdraw quickly. The water seems very hot, although not boiling.\r
+160    How can you swim pools frozen over solid? You have some STRANGE ideas...\r
+161    The cupboard opens off its latch.\r
+162    There isn't a latch this side of the cupboard, and you find you can't\r
+       open it! Someone outside will have to do it.\r
+163    The cupboard swings to, and latches itself shut.\r
+164    To go up or down, say u or d. Do you think we put in commands like\r
+       this for nothing?!\r
+166    The cupboard is latched already, it won't latch any more!\r
+165    The cupboard is open already if you hadn't noticed...\r
+190    You need an axe (or wand) to fell a tree.\r
+170    Try as you might, some strange magical force appears to prevent your\r
+       removing either the bed or the bedclothes, although you could\r
+       probably re-arrange the sheets if you wished.\r
+173    The mattress of the bed is very hard and uncomfortable, so you get\r
+       off it almost straight away.\r
+174    Waving the brand causes it to go out.\r
+175    Closer examination of an object does not reveal further information\r
+       about it. You'll have to use your wits!\r
+176    Oxen are beasts of burden. They leave giving rides to animals like\r
+       horses and donkeys.\r
+178    The icicle melts and soon evaporates.\r
+179    The pool is too large to melt even partly.\r
+180    The ox is very old, I'm afraid, and you soon realise that it would\r
+       be as tough as old boots were you to attempt to eat it.\r
+181    The tree has only recently been felled, so unfortunately you can't\r
+       set it alight.\r
+182    Living yew trees don't catch fire that easily above ground, I'm\r
+       afraid!\r
+191    When you put the head in place, a trapdoor opens in the floor!\r
+192    The head is already on the wall, fool.\r
+193    As you take the head, the trapdoor in the floor closes.\r
+194    The head is fixed to the wall, but you could take it off if you\r
+       said so...\r
+195    The trapdoor leading up to the hut seems to be locked by some means.\r
+196    The river flows from under the mountain here, so you can't follow it.\r
+197    The eye appears to be fixed into its socket, and refuses to come\r
+       loose.\r
+198    The tunnel is too small to turn round in, so you can only move forwards.\r
+199    You can't go in there taking along an ox!\r
+200    You can't get the pillar through there! You'll have to take the ladder.\r
+201    The pillar is too big to take with you through the crack.\r
+202    With your combined strength, the portcullis raises!\r
+203    It's already up, you imbecile!\r
+204    It's too difficult for one person to lift. You'll have to get someone to\r
+       help you, from the same side.\r
+205    Silently, the portcullis glides shut.\r
+206    It's already closed! Do you want to slam it through the floor or\r
+       something?!\r
+207    The equipment falls into the room below, and lands almost immediately.\r
+208    If the tunnel has collapsed it means you can't enter. I'm saying this\r
+       because it seems you haven't the mental capacity to understand the\r
+       description given when you LOOK. Idiot.\r
+209    What kind of an idiot ARE you? We don't have that sort of thing\r
+       going on in THIS Land! Since wolfsbane isn't designed to be smoked\r
+       you come out of it feeling pretty ill, too. Fortunately, this is a magic\r
+       herb and regenerates itself. Now this time do something sensible with\r
+       it, you dope...\r
+210    You can't pick up a carpet like that! You'll have to roll it up first.\r
+211    The carpet slowly rises into the air, and the colours of your\r
+       surroundings blend together in a flood of bright ribbons and\r
+       streaks. A second later, and you materialise once more.\r
+212    You'll have to drop everything you're holding before you can\r
+       get down that chute!\r
+213    I do beg your pardon for not making the description clearer: THE\r
+       CHUTE IS IMPOSSIBLE TO ASCEND. Better?\r
+214    The beach is cut off by the sea and cliff that way, forming a cove.\r
+215    The sea is that way, and it's too far to the wreck to swim. Looks like\r
+       you'll have to find a boat...\r
+216    Your carpet rolls up easily.\r
+217    It's already rolled up!\r
+218    Your carpet unrolls. It doesn't look as valuable in this state.\r
+219    Take another look, pal, it's already unrolled...\r
+220    The door isn't open, you blithering idiot. SOME people...\r
+221    It's a CRIMSON door, not an OPEN one.\r
+222    You can't make something freeze something else. Try dropping the\r
+       icicles into the pool instead...\r
+224    You'll have to fix it onto the wall first.\r
+225    For some strange reason you find yourself unable to get any treasure\r
+       here. There may be some confusion in this room as to whether certain\r
+       items are treasure or not (hint hint). Try getting stuff individually...\r
+226    Some magical force drags the ring back to the floor irresistibly as\r
+       you try to take it.\r
+227    The ancient fossil slides into the brass ring, and disappears as you\r
+       watch. The ring then transmutes to gold before your eyes, and becomes\r
+       incredibly beautiful. The magic holding it to the floor goes too! Looks\r
+       like you're in luck, chum!\r
+228    The wand gives a perfunctory >PHUT< and disappears. To save you from\r
+       wondering, it was the firestone it didn't like...\r
+229    You need a magic wand with which to zap things, and you've not got\r
+       one so nothing happens.\r
+230    As you attempt to enter the passage, the wolf snarls, menacingly.\r
+       Hastily you retreat, as the straggled, grey hair of the mangy beast\r
+       rises up on its neck as a sign of anger.\r
+231    The wolf shies away from you the instant you produce the herb. The\r
+       next moment, it bays a terrible "AAAOOOOOOHHHH" and disappears!\r
+232    The wolf devours your wand...\r
+233    The wolf is a carnivore, which means it's more interested in eating\r
+       YOU...\r
+234    You don't honestly believe a beast as murderous as a wolf is going\r
+       to go for walkies do you? Sigh...\r
+235    The wand waves, but nothing magical happens! Perhaps you have something\r
+       else magical which the wand dislikes? Or could it be somewhere nearby?\r
+       (I'd better not say any more or I'll be telling you what it is...).\r
+236    You wave furiously but no-one waves back...\r
+237    The ox mechanistically explodes a loud "BOOM".\r
+238    An intense white glow sprays from the end of your wand, and when\r
+       it stops you discover that the portcullis has exceptionally vapourised.\r
+       The air around you, however, seems to grow thin, and the scene fades\r
+       away as some necromantic side-effect teleports you through space, and\r
+       you re-materialise...somewhere...\r
+239    The grate glows white as an infra-red ray generated by your wand\r
+       causes it to heat immediately. A second later and it is gone - and\r
+       so are you (to the fitted cupboard).\r
+240    () GLOOP (). The fiery pit consumes anything which is dropped in it.\r
+241    The pit may be fiery, but you can't ignite anything from it because\r
+       the flames flash away too quickly.\r
+243    You've got to be or have been an Enchanter to be able to use such\r
+       a powerful magical feature of the wand. Since you're not that\r
+       experienced yet, nothing happens.\r
+244    You need a pen to be able to write.\r
+246    Your message is written into the logbook, but the pen falls apart\r
+       afterwards. You feel proud to have left your mark on The Land.\r
+247    Very pretty, I am sure...\r
+248    Fortunately, a sudden attack of common sense prevents your drowning\r
+       yourself by getting rid of the boat whilst at sea...\r
+250    How do you propose to blast something which hasn't got a fuse? Nothing\r
+       happens...\r
+251    >< KAPOW ><\r
+       The door is no more! Neither is the powder for that matter...\r
+252    The gunpowder gives a fizz but nothing else happens.\r
+253    What?! Blasting things when there's gunpowder here with no fuse in it?\r
+       You're taking a risk! Fortunately, the gods inform you of the\r
+       suicidal outcome of your act and refrain you from doing it. Good of\r
+       them, isn't it?\r
+254    The fuse fixes itself in so hard that it is impossible to remove it. It\r
+       seems to be stuck to some internal flint, so that you may be able to\r
+       blast things with the powder...\r
+255    You reach out, but suddenly the golden egg you are carrying starts to\r
+       hum, and a powerful magical force interposes between your hands and\r
+       what you wish to get. After a few seconds trying, you have to give up.\r
+256    When you attempt to drop the egg it starts to hum, and a powerful\r
+       magical force causes your fingers to grip it all the more tightly. You\r
+       find it is impossible to drop it.\r
+257    The egg hums, and falls into the pit with a happy () GLOOP ().\r
+258    This is a golden egg, not a hard-boiled one. Nothing happens.\r
+259    Nice try, but it doesn't work! If the egg is magical, it will probably\r
+       need a much greater amount of heat before it'll allow you to drop it...\r
+260    The egg starts to hum, but figures the fire isn't hot enough for its\r
+       tastes and won't let you drop it. You'll need something a little\r
+       hotter before it will let you get rid of it. Or, of course, you could\r
+       give it to someone...\r
+261    Someone who is no longer a novice, such as yourself, should find it\r
+       beneath themself to play with TOYS...\r
+262    As you attempt to let go of the object, you find to your horror that\r
+       it adheres to your fingers! Try as you might, you find you cannot drop\r
+       it or otherwise rid yourself of its presence. Maybe it's something else\r
+       you're holding which is magical? You might have to give it away...\r
+263    The ogre is already dead. Killing it again won't make the least bit of\r
+       difference.\r
+270    The way is blocked by the sliding panel.\r
+271    Some strange, invisible, magical barrier blocks the way, and you can't\r
+       get past it.\r
+272    The river goes underneath the mountains (it flows east to west) and\r
+       you cannot follow it.\r
+273    The robust door in the way easily prevents your moving in that\r
+       direction.\r
+274    The powder has to have a fuse in it before it's any use fixing it\r
+       to the cannon.\r
+275    The cannon is now primed.\r
+276    The cannon is now loaded and primed.\r
+277    You need to put gunpowder into the cannon before you can shoot it.\r
+278    Cannons require the insertion of some spherical projectile before\r
+       they'll shoot.\r
+279    Out from the end of the cannon flies the sphere, and it smashes into\r
+       the robust door with an almighty >| CRASH |< . When the smoke clears,\r
+       both door and sphere are gone...\r
+280    Don't you know ANYTHING? You have to put gunpowder in these things\r
+       first! Silly!\r
+281    The balls starts to roll away, then the platinum scrapes off and it\r
+       stops. The platinum disappears, with more than a hint at the involvement\r
+       of some sort of magic...\r
+282    the ball is magically prevented from rolling away.\r
+283    The door remains locked shut.\r
+284    A ray of intense yellow light streaks from the end of your wand. After\r
+       it stops, however, the door remains intact. You notice this as you\r
+       dematerialise...\r
+285    The fountain changes colour to yellow, and you suddenly feel more\r
+       relaxed, confident and sure of yourself than when you did before you\r
+       entered...\r
+286    You get wet.\r
+287    You can't open the door from this side! Read the description!\r
+288    There's no keyhole this side of the door...\r
+289    You can't pick up goblins!\r
+291    The goblins surround you so that you can't escape.\r
+292    The goblins surround you, and poke their fingers into you so that you\r
+       can't open anything because of the distractions.\r
+293    There are so many goblins here that it looks impossible to destroy\r
+       them. Your wand starts to throb, and to glow with a deep blue light\r
+       which turns into a flashing violet. Suddenly, a scything red ray\r
+       cuts from the end and slices through all the goblins as it bites through\r
+       the air. They fall to the ground, clawing at whatever they have left for\r
+       heads, and your wand glows black with their blood.\r
+294    You can't get a proper grip on the panel to be able to move it.\r
+295    The panel slides...\r
+296    It's already been slid open, idiot!\r
+297    I appreciate your closing doors behind you, but this one's shut already.\r
+298    The panel slides open.\r
+299    The panel slides shut.\r
+300    \ KAZAM / - the panel disappears!\r
+301    Drinking when there's a barrel of putrid water here is unwise, you\r
+       might catch something!\r
+302    OK!\r
+303    Out from the end of the cannon flies the ball, but it misses the door\r
+       and smashes into the wall. Unfortunately, the damage to the wall is\r
+       minimal, and when the smoke clears the ball has disappeared... Next\r
+       time you'll know to shoot the door with the cannon...\r
+304    *The scroll reads as follows:\r
+       "From beneath the crystal curtain,\r
+        Salt to west and hard to cross,\r
+        Go south to the death so certain,\r
+        Though follow me and have no loss...\r
+        South again, the danger stronger,\r
+        Once more, or you feel the spray,\r
+        Travel on that way no longer,\r
+        Southeast, else you slip away."\r
+305    You can't read in the dark, berk.\r
+306    The scroll ignites, and a few seconds later its ashes scatter to the\r
+       winds.\r
+309    The quill doesn't work for some reason.\r
+310    It's a pretty robust icicle. You'll have to melt it with a torch or\r
+       something.\r
+311    The bunny happily disappears into the warren, and you get a warm\r
+       feeling inside that you have done something really worthwhile.\r
+312    The bunny kicks a little, but its resistance is futile as you\r
+       bash its brains in.\r
+313    The bunny sniffs the herb, then eats it all up.\r
+314    Rabbits don't eat potatoes (well this one doesn't anyway!).\r
+315    The dead rabbit falls into the hole, but not out of reach.\r
+316    It's already been murdered!\r
+317    You can't eat LIVE animals! Ugh!\r
+318    It was a bit stringy, but not bad.\r
+319    The beggar wants to be fed with food. If you've got some, try\r
+       phrasing it differently.\r
+320    The bunny isn't hungry.\r
+321    The rabbit's fur catches fire with astonishing speed, and a second\r
+       or two later, all that is left are charred remains which you throw\r
+       away in disgust.\r
+322    'Fraid it's too heavy, old bean. These mariner types don't mess\r
+       around with itsy-bitsy sized notebooks, you know!\r
+323    Out from the end of your wand flashes a blinding scarlet bolt of\r
+       power, which atomises the fiend in no uncertain terms.\r
+324    The undead interposes itself and prevents your action.\r
+326    The bunny suddenly turns savage and you daren't.\r
+327    Berk.\r
+329    There's no place to hang it. Look for somewhere with other trophies\r
+       on the wall instead.\r
+330    You climb as far as you can, and come down again when you hit your\r
+       head on the ceiling.\r
+331    You suddenly feel all funny, there is a puff of smoke, and to your\r
+       dismay you find that you have become female.\r
+332    You begin to feel weird, there is a sudden flash of light, and to\r
+       your surprise you find you have become male.\r
+333    He doesn't want to be got.\r
+334    It dives into the pond and hides under a rock when you try to get it\r
+       and only comes back to the surface after you stop.\r
+336    It tastes of warts.\r
+337    All of a sudden there is a flash of deep blue light, and the frog\r
+       transforms into a handsome prince!\r
+338    He politely tells you to clear off before he bashes you in the face.\r
+339    There is a sudden radiance about the man, and your heart cries out\r
+       for him when suddenly he becomes hazy and disappears before you can\r
+       suggest anything else. Sobbing because of your lost love, you\r
+       nevertheless grit your teeth, forget it, and soon feel better!\r
+340    He suddenly glows, then becomes hazy and disappears before you can\r
+       clobber him one. Your swinging sword meets thin air (and doesn't kill\r
+       that, either).\r
+341    It's too shallow. Can't you read, you short-sighted loon?\r
+342    The tunnel has collapsed and you can't move.\r
+343    The creature of the night mindlessly accepts the leg, gnaws at it, then\r
+       moans a long chilling scream and disappears in a puff of green fumes.\r
+       You find the teethmarks have gone from the leg when you examine it\r
+       afterwards...\r
+345    rabbit dropped\r
+346    The sleeping beauty remains asleep, her enchantment unaffected by a\r
+       kiss from a female due to the witch who cast the spell noting that she\r
+       had many sisters and no brothers...\r
+347    The sleeping beauty's eyes start to open, she sits up, yawns, kisses\r
+       you again, then there is a flash of purple light and she disappears. You\r
+       are naturally upset by this, but the kiss was so good as for you to\r
+       feel much better as a result of the experience!\r
+348    Her eyes open, and she starts to fight back!\r
+349    The door won't open.\r
+350    It's too difficult for one person to lift, you'll have to get someone to\r
+       help you.\r
+351    With your combined strength, you slide the bookcase aside.\r
+352    It's already been opened, why don't you LOOK?\r
+353    With your combined strength, you slide the bookcase against the wall.\r
+354    It's already against the wall, take a look stupid.\r
+355    The bookcase slides aside easily revealing an opening.\r
+356    The bookcase slides up against the wall.\r
+357    The grate slides open.\r
+358    The grate slides closed.\r
+360    Tap...tap...tap...\r
+361    All of a sudden there is a swirl of magical colours, and before you\r
+       can think, a flood a bright reds and greens whirl around, then part.\r
+       You find you have been teleported somehow...\r
+366    You find that you cannot lift the vial more than a few inches. You could\r
+       just about drink some of it though... Not that I'm trying to give\r
+       you any hints.\r
+367    You sniff the heavenly vapour, then everything swirls about you, the\r
+       crystals disappear, and you black out. You'll be able to wake up in\r
+       ten seconds time - meanwhile you have become female!\r
+368    You take a whiff of the divine aroma, then the crystals vanish,\r
+       everything goes black, and you pass out. You'll be able to wake yourself\r
+       in about ten seconds, but in the meantime you have become male!\r
+369    They tasted kinda salty.\r
+371    They're COLOURED crystals, pill-head. We don't have that sort of\r
+       substance around in THIS land!\r
+372    The dirt comes off easily, and you find that the groats are really\r
+       made of gold and are very valuable!\r
+373    Rub...rub...rub... Nothing happens.\r
+376    The pancake flies into the air, spins over, and lands perfectly in\r
+       the pan, which then crumbles to dust. You get a lot of fun out of\r
+       this obvious demonstration of mankind's superiority over pancakes.\r
+374    You pick up the pan, but the further you move it, the harder it\r
+       becomes, until you have to put it down again. You can't even\r
+       get the pancake from the pan! There is something magical about\r
+       this...\r
+377    You try to pick up the pancake to take a bite, but it grows\r
+       incredibly heavy and you have to drop it before being able to\r
+       take a mouthfull (and probably contracting botulism).\r
+378    You think that were you to leap then perhaps you'd splat in the sands\r
+       below unless you had a parachute.\r
+379    The horse decides not to bother flying, since when it flies it comes\r
+       here anyway. You might try riding it instead.\r
+380    The wand doesn't fit. Perhaps something a little smaller, like a stick?\r
+383    You obviously haven't read the description...\r
+384    A curious radiance surrounds the sundial, then suddenly an amazing beam\r
+       of light scythes from it and hits you square in the chest. A feeling of\r
+       power floods through your body, and when you look again, the stick in\r
+       the dial has gone.\r
+385    The skies are too overcast to enable the sundial to cast a strong\r
+       enough shadow by which you could tell the time.\r
+386    It's already got a brand in it, birdbrain.\r
+387    You can't put a lit brand in there or you'll burn your hand!\r
+388    The brand fixes solidly into the sundial, in fact so solidly that you\r
+       won't be able to take it out. It looks like the sundial will work now.\r
+389    You can't burn sundials, stupid; they're not made out of marshmallow\r
+       you know...\r
+390    The sundial's pointer burns away with incredible speed, until there\r
+       is just the stone part of the object left.\r
+392    As you try to crawl down, something inside the sett claws at your face\r
+       and you are forced to retreat hastily back to the surface.\r
+393    As you enter the glade, your axe suddenly becomes unbearably hot, and\r
+       you stagger back out of the glade, where it magically cools within an\r
+       instant.\r
+394    The horse refuses to acquaint itself with anyone dragging along an ox.\r
+395    The stallion flies out of reach until you stop trying to kill it.\r
+396    The stallion grows hazy and transparent, then with a loud "NEIGH" flies\r
+       off back whence it came.\r
+397    The stallion neighs a loud "NEIGH" as you take it by the mane and start\r
+       dragging it.\r
+398    You get onto the back of the winged stallion, and it rears up on its\r
+       hind legs, neighs a loud "NEIGH", and flies off, passing with ease\r
+       through all interposing solid bodies. A few seconds later it lands, and\r
+       you dismount...\r
+399    You'll have to get the horse first.\r
+400    The horse won't let you get on its back, probably because of something\r
+       you're holding or which is nearby.\r
+401    The winged stallion will not let you, and rears up on its hind legs\r
+       dashing its hooves perilously close to your head until you stop.\r
+402    This isn't the proper place to bath it.\r
+403    The gull suddenly stops moving, becomes hard, and an instant later\r
+       has changed colour too and become solid gold.\r
+404    Nothing happens, since gold birds don't get too dirty.\r
+405    The bird is not hungry. Few creatures in The Land are...\r
+406    You can't feed golden birds!\r
+407    You can't kill a solid gold bird, berk!\r
+408    It wasn't much fun, really, it didn't put up much of a fight.\r
+409    Fool, you'll break your teeth if you bite gold!\r
+410    The feathers and beak weren't too tasty, but the rest was passable.\r
+411    The bird flutters out of reach every time you try to remove a feather.\r
+412    You can't pluck birds made of gold, imbecile!\r
+413    The bird refuses to be dropped in the nest of an eagle. If the owner\r
+       came back it would get ripped to bits!\r
+414    The gull refuses to allow you to drop it in such a hot place. Do you\r
+       think it's stupid or something?\r
+415    The bird doesn't fancy diving below freshwater, but it wouldn't mind\r
+       the sea if you REALLY want to get rid of it.\r
+416    The lion lands on its side, and points nowhere.\r
+417    The lion lands on its base and points southeast.\r
+418    The lion lands on its base and points northwest.\r
+419    The lion lands on its base and points south.\r
+420    The lion lands on its base and points north.\r
+421    The lion lands on its base and points northeast.\r
+422    The lion lands on its base and points southwest.\r
+423    The lion lands on its base and points west.\r
+424    The lion lands on its base and points east.\r
+425    The lion lands on its base and points north.\r
+426    The lion lands on its base and points south.\r
+427    Are you trying to kill the poor thing? It just needs bathing, not\r
+       drowning...\r
+428    The gull you are holding flaps its wings and creates such a fuss that\r
+       you can't enter the hut. It doesn't like the stuffed animals in there.\r
+429    The water isn't drinkable, loon.\r
+430    You flap you arms a bit, but cannot fly. Most normal people wouldn't\r
+       be surprised by this...\r
+434    You reach for the cat, but the bird you are holding squawks loudly\r
+       and flaps its wings about your head until you have to stop and leave\r
+       the cat where it is.\r
+435    The bird flies out of reach, and lands again when you give up. It\r
+       doesn't like cats, dead or alive...\r
+437    The ivy is stuck on tightly. You can't get it, burn it, or do anything\r
+       else to it. To be honest, it's only there to make the description\r
+       better. Concentrate on the sundial instead.\r
+438    In goblin rooms, it's difficult to define things as treasure. Get\r
+       the objects individually...\r
+439    Out from the end of your wand springs a dazzling green ray, and out\r
+       of the wall springs an equally dazzling red one. They meet in mid-air\r
+       and obliterate one another. The wall looks to be enchanted...\r
+440    It's no use fixing that there, try something more regular in shape\r
+       and more like a pointer.\r
+441    You can't go in there taking a horse with you!\r
+442    The ornament smashes into tiny shards as it strikes the floor, and\r
+       is lost forever. And don't try to pick up the shards as they're so\r
+       small you can hardly see them...\r
+445    You can't do that unless you have the magic mirror...\r
+446    The mirror fogs over, then clears and you can see through it...\r
+447    The mirror cracks, and the image fades. You look at the glass and it\r
+       clouds over, turning to solid silver!\r
+448    The mirror doesn't break. Ah well that's 7 years bad luck you won't get.\r
+449    You can't drop the mirror while using it. Break it first.\r
+450    You see your reflection...\r
+451    >>>>>SPARE<<<<<\r
+452    You aren't powerful enough yet. You must be at least a necromancer or\r
+       necromancess.\r
+453    The hound is incensed and attacks you!\r
+454    Your spell didn't work; a magic amulet would have helped.\r
+455    You need to be at least a sorcerer or sorceress to employ such a\r
+       powerful artifact.\r
+456    As you speak the final word, a demonic vibration resonates through the\r
+       amulet, and it crumbles to dust.\r
+457    Your spell didn't work; either try again, get more points, or use the\r
+       oracle...\r
+458    The oracle answers no more...\r
+459    The oracle's magic is too strong for you: only enchanters,\r
+       enchantresses and above can use the device.\r
+460    The only mirror in The Land is a magic one, which you can't steal\r
+       because of its enchantment...\r
+461    Some unseen, diabolic force prevents your hand from being able to\r
+       write. It seems to increase the nearer you are to the libram.\r
+462    *The libram is old, musty, and has many pages missing, but you can\r
+       make out some illuminated letters:\r
+       "POTION: a draught mixed with medicine is something to be experienced.\r
+        CRYSTALS: take one sniff to be something you've always wanted.\r
+        RUNES: read them to be in many places at once.\r
+        DIE:   the higher the roll, the more its value.\r
+        CAT:   do as your curiosity directs.\r
+        DOOR:  be polite when entering.\r
+       Operating instructions:\r
+        ORACLE: 'where object' eg 'where crown'.\r
+        AMULET: 'force someone: do something' eg 'force Polly: south'.\r
+        MIRROR: 'watch someone', eg 'watch Richard'. To stop, break it.\r
+        HORN: 'summon someone', eg 'summon Brian', unless they've a firestone."\r
+       Another page is about a magic wand, but it's unreadable.\r
+463    Not surprisingly, you slip back. Don't you read descriptions or\r
+       something?\r
+464    You tug at the lever, then suddenly the floor beneath you opens up,\r
+       and you fall down into a polished chute. The trap quickly resets, and\r
+       you find yourself hurtling downwards at a furious pace!\r
+465    It's immobile, but the floor below you seems hollow.\r
+466    There is a hollow echo from the floor beneath the lever.\r
+467    The horse refuses to set to sea.\r
+468    You can't carry that barrel with you, the sea currents would smash it.\r
+469    You can't take that great big marble pillar with you! You'd sink!\r
+470    The rug is too cumbersome to take, rolled or unrolled.\r
+471    The ox is too heavy to take along.\r
+472    The horse is frightened of being pounded to death by the waterfall.\r
+474    The ox is too weighty, and would crush you if you jumped with it.\r
+475    I don't mean to be a prude, but you're the wrong sex.\r
+476    Well you were SUPPOSED to kiss her, but I expect she doesn't mind... Her\r
+       eyes open, she yawns, and before you can start the act there is a\r
+       sudden flash of purple light and she disappears. This is a bit\r
+       upsetting, but you still feel better on the whole for having known\r
+       her, and soon get over it.\r
+477    This is a rather young bunny and it doesn't know what to do yet.\r
+478    You'd burst it...\r
+479    Urgh! Necrophilia! Naturally the creature attacks you...\r
+480    You can't do them all at once, and the rest attack.\r
+481    He doesn't notice...\r
+482    He may be grateful, but not THAT grateful!\r
+483    He informs you in the nicest possible way that he's a prince, not a\r
+       queen.\r
+484    The chart tells of a legendary island, once inhabited by druids of\r
+       an unspeakable evil, who worshipped demonic gods far fouler than the\r
+       mere idols of the mainland. The ship was obviously sailing towards the\r
+       island when a storm tossed it onto the rocks. Part of the chart is\r
+       damaged, but to get from the rocks to the island you should sail\r
+       southwest, northwest, then some unclear direction, then north, then\r
+       north again. To get back to the mainland from the rocks, keep sailing\r
+       east.\r
+485    Ugh! Necrophilia! Urr...I feel sick...\r
+487    Drop the treasure individually, feeblebrain, otherwise the pit\r
+       will splash fire all over you when the stuff gloops into it.\r
+489    It has been made of wood from an enchanted oak, and is\r
+       indestructible. Go vent your anger on some trees instead.\r
+490    You're already in the swamp, take a look you myopic dumbo.\r
+491    The chart goes up in flames, and soon nothing remains\r
+492    This is a magical tome, and it sends the flames back at the brand.\r
+       You hurriedly drop the burning stick as it is engulfed in its own\r
+       flames, and shortly there is nothing left of it.\r
+493    The log of Captain Oliver burns to a useless cinder.\r
+494    It's fireproof. Magic books don't burn just like that, you know!\r
+495    You burn it to nothingness. Well wasn't that just SO much fun?\r
+496    The bookcase is made of enchanted oak; enchanted oak is fireproof;\r
+       ergo the bookcase is fireproof. Hmm, seems logical enough!\r
+497    You rolled a 'six'.\r
+498    You rolled a 'five'.\r
+499    You rolled a 'four'.\r
+500    You rolled a 'three'.\r
+501    You rolled a 'two'.\r
+502    The wand does nothing magical; it fears a great evil which it can\r
+       sense nearby.\r
+503    The sprig of mistletoe you are carrying pulls back magically as you\r
+       try to leave, and with such power that it is plain you'll have to\r
+       leave it behind if you want to go that way.\r
+506    The trunk burns an extraordinarily raging flame, its contents, whatever\r
+       they were, taking hold exceptionally quickly. Shortly afterwards, all\r
+       that remains is a worthless pile of ash which you might as well ignore\r
+       (I will!).\r
+507    There could be something special about some treasure here you might not\r
+       like. Get it individually and you'll see. This has been a public\r
+       service announcement...\r
+508    There's nothing here you could light anything from!\r
+510    You haven't got a boat with you, and even if you had it would be\r
+       smashed to bits by the dangerously rough seas - and you with it.\r
+511    You need a boat, it's too far to swim.\r
+512    That way is a rugged cliff, with a sheer drop onto rocks below! You'd\r
+       kill yourself!\r
+513    Use IN if you want to enter someplace, unless it is within the area\r
+       you're in at the moment, such as a fountain or fairy ring would be...\r
+       (me? hinting?)\r
+514    There is a sudden SWOOSH of air, and you feel like your stomach has\r
+       been pumped out. When you regain your senses, you find yourself back\r
+       on the mainland...\r
+515    You can't pick up a fairy ring!\r
+516    It's not THAT sort of ring!\r
+517    Nothing native to The Land eats poisonous toadstools, I'm afraid...\r
+518    "To be sure, leprechauns don't eat fairy-ring toadstools", jests the\r
+       leprechaun, merrily.\r
+520    Toads don't eat toadstools, they sit on them. Toad-stool, it's really\r
+       pretty easy to understand. This one doesn't want to sit on it, either.\r
+       Perhaps it isn't REALLY a toad..?\r
+521    No denizens of The Land eat mistletoe, with its being poisonous and all\r
+       that...\r
+522    The wolf snarls most ferociously and won't let you get anywhere near\r
+       the herb to pick it up.\r
+523    I see no sword!\r
+524    The sword disappears.\r
+525    The wolf snarls menacingly, and you can't pick up the herb with which\r
+       to feed it!\r
+526    The ogre leaps up to pound you with his club, but an omission in his\r
+       education means he's never heard of swords and you hack him to bits.\r
+527    You put it in your mouth, but it tastes so ghastly that you have to\r
+       spit it out before you can swallow it. Maybe you should find some\r
+       creature which eats ALL sorts of nuts normally?\r
+528    Why would anything want to eat an enchanted acorn? It could change\r
+       into an oak tree inside them or something!\r
+529    The cup has some magical seal over the top which won't let any\r
+       liquid pass through it. You can easily put your hand in, though,\r
+       so it must just be the liquid it objects to...\r
+530    The bird must be one of the few creatures in The Land which will both\r
+       eat nuts and not care if they're enchanted. It devours the magic acorn\r
+       and suffers no ill effects.\r
+531    The squirrels have all scampered off, read the description. If you\r
+       don't know what scampered means, look it up in any child's\r
+       dictionary.\r
+532    The squirrels won't let you pick up the nut to feed them with it,\r
+       baring their incisors menacingly and snapping at your fingers when\r
+       you try.\r
+533    The squirrels become highly excited, and sit down pawing at the nut. They\r
+       are very affectionate towards you, and you get a lovely warm feeling\r
+       inside.\r
+534    Squirrels eat nothing but nuts.\r
+535    The squirrels won't let you touch their nut, and squeak loudly at you\r
+       when you try to take it.\r
+536    You grab hold of the nearest one, but just as you are about to\r
+       take a mouthfull, the rest leap at you and bounce about all over you\r
+       until you desist. They're more dangerous than they look!\r
+537    You pick up one of the rodents, but the little sod bites your hand\r
+       and you have to drop him. You realise it would be unwise to continue\r
+       this approach.\r
+538    It weighs a ton! You couldn't move it if you had thrice the elephants\r
+       of Carthage to help you!\r
+539    The bloodstained slab slides aside!\r
+541    An inscription inside reads: "You have not the first of the four, the\r
+       reaper of souls." The locket springs shut when you've read it.\r
+542    An inscription inside reads: "You have not the second of the four, the\r
+       crescent of the sun." The locket springs shut after you've read it.\r
+543    An inscription inside reads: "You have not the third of the four, the\r
+       empty grail." The locket springs shut after you read it.\r
+544    An inscription inside reads: "You have not the last of the four, the\r
+       holy plant of the sun." The locket springs itself shut when you've\r
+       read it.\r
+545    An inscription inside reads: "You have the four. The way to the\r
+       treasure hall is safe." The locket springs shut again, as usual.\r
+546    It's unclimbable, remember?\r
+547    The object disappears!\r
+549    To the northeast are steps up, downwards is a climb to a room below.\r
+       Light comes from the surface via the opening in the roof of the room\r
+       above. On the floor is mist, meaning you can't see any objects in the\r
+       room (although there was sufficient draught when you entered to be\r
+       able to glimpse them).\r
+550    There's nothing here, really, just this niche. No ways out at all...\r
+       The floor is covered in mist, so you can't see any objects dropped on\r
+       it. Similarily, the inside of the niche is too obscured to see if\r
+       anything has been put in it.\r
+551    There is a sudden pang of pain which shoots up your arm from the\r
+       chalice. It stops abruptly, and you see it was the effect of an\r
+       ancient teleportation spell...\r
+553    It's already opened, take a look.\r
+554    It's closed already, look at it moron!\r
+555    Put in objects individually, there may be particular treasures which\r
+       have a startling effect if fixed there by themselves...\r
+556    The squirrels eagerly take your nut and devour it amongst themselves.\r
+       You get a lovely warm feeling inside with the happiness of a deed well\r
+       done. (I don't know how I can write this stuff!).\r
+557    If you want to feed the squirrels, say FEED SQUIRRELS WITH NUT, remember\r
+       the little perishers eat the things... This has been a hint.\r
+561    Nothing happens. Watch what you're doing when you wave things, you\r
+       might wave the wand by accident...\r
+562    Wave the wand? Pick it up, first, imbecile, do you expect me to do\r
+       EVERYTHING for you?\r
+563    immobile [imObIl] adj not moving; that cannot be moved; fixed.\r
+       (Penguin English Dictionary, 3rd. edition).\r
+564    Use an axe for chopping things, not a sword; swords are for KILLING\r
+       with...\r
+565    If you want to leave a place, say OUT; LEAVE is to leave parts of\r
+       a room but not the rest, for example magic fountains... Enough\r
+       repetitions of OUT will normally lead you to the place where you\r
+       entered The Land.\r
+567    The ogre swings his club and you dodge just in time to avoid his\r
+       caving your skull in... Perhaps he ought to be killed, you think...\r
+568    The rabbit kicks and thumps with its feet, wildly. Obviously it doesn't\r
+       live here and dislikes the idea of being torn apart by something that\r
+       does!\r
+569    The fleece goes up in flames VERY quickly, doubtless due to the scented\r
+       oils which had been soaked into it. Soon nothing remains but useless\r
+       ash which crumbles away.\r
+570    The skull isn't a trophy, child, it's just treasure.\r
+571    The band is enchanted, and when you put it on a sudden weariness drains\r
+       your senses, and a deep slumber befalls you. You remove the band, but\r
+       all too late and the somnolence overwhelms you.\r
+572    The potion burns to nothingness. Fun, eh?\r
+576    It makes little difference. This medicine is so old it's just as nasty\r
+       whether shaken or not.\r
+579    The rat snarls, baring its yellowed teeth, and when you attempt to\r
+       pick up the object it intervenes so that you can't. You'll have to\r
+       wait until it leaves.\r
+580    The rat objects to being picked up, and starts to fight!\r
+581    Rats breed quicker than humans and are smaller too, so after a couple\r
+       of seconds it's all over...\r
+582    The cat lashes out and kills the unfortunate rat with one raking\r
+       claw! It eats it, too, just to make sure.\r
+583    The cat is dead, and doesn't seem to want to fight much...\r
+584    The coal burns away to nothing. Well I hope you feel better after\r
+       that.\r
+585    You can't flee at sea. How can you drop everything and move if\r
+       you're carrying a boat?!\r
+586    The undead creature won't allow you to pick up anything while it's here!\r
+587    You try to drop the egg to flee, but can't! You'll have to stay where\r
+       you are.\r
+589    You're taking a bit of a chance, aren't you?! Your brand lights,\r
+       you impetuous fool...\r
+591    The hole in the wall which leads out isn't large enough to let people\r
+       through if they're holding anything. Drop your equipment if you want\r
+       to go through.\r
+592    HAWUMPH! The dragon incinerates you with its fiery breath.\r
+593    Not a boat you don't, chummy: imagine the chaos if you do that sort \r
+       of thing at sea...\r
+594    You can't get treasure in general here, because the pancake is treasure\r
+       yet you can't pick it up for long. Get things individually.\r
+595    I told you you couldn't enter it. I wasn't lying.\r
+597    You make a hole large enough through which for people to pass.\r
+598    With a ghostly creak, the tomb slides shut.\r
+599    You can't dig for fear of bringing the tunnel down on you...\r
+600    Use the axe, that's what it's for...\r
+601    The fabric burns away until there's nothing left. Well that was a\r
+       pretty stupid thing to do, now wasn't it?\r
+602    The cliff is too steep and high to climb.\r
+603    Did I understand you properly? You want to jump off without a\r
+       parachute? Ha! Well consider yourself lucky I'm stopping you,\r
+       otherwise it would have been "Splatsville".\r
+604    You need a boat to sail to sea. EVERYONE knows that...\r
+605    You have a good wallop with your bat, but conclude that it's best\r
+       to use an axe, otherwise the years of rubbing linseed oil into the\r
+       surface will have been in vain.\r
+606    Have fun, hope you hit 'em for six.\r
+607    The beggar stops. "Were I not deaf, I'm sure that would sound like the\r
+       swish of a cri... no, it can't be", he thinks. Moments later his head\r
+       isn't where he was expecting it to be...\r
+608    Sorry old bean, some things just AREN'T cricket.\r
+609    Well, that's what cricket bats are for, isn't it?\r
+610    "Open not these tombs of yore,\r
+        They bear no common lock or door;\r
+        Upon each one is carved a guide\r
+        The wise may use to get inside\r
+        And reap the treasures that they hide."\r
+611    The tombs won't budge. If you roped in half the armies in christendom\r
+       they'd still remain closed. The magic sealing them is of a kind so\r
+       timeless and powerful that no power on earth may break it, unless the\r
+       riddles of the ancients are solved.\r
+612    Nice attempt, but you didn't honestly think it would work, now did you?\r
+613    The coffin creaks open, to reveal a body...\r
+614    It's already open. Why don't you take a look, you'd save me a lot of\r
+       work you know.\r
+615    Slowly the sarcophagus creaks shut.\r
+616    Yes, that's the idea, make sure it's well and truly stuck, even though\r
+       it was already...\r
+617    With an ear-shattering /C/R/E/A/K/ the entrance to the north tomb opens.\r
+618    With an earth-trembling \G\R\O\A\N\ the entrance to the west tomb\r
+       swings aside.\r
+619    With a nerve-rending ^S^C^R^E^E^C^H^ the south tomb opens up.\r
+620    With a mighty (B)(O)(O)(M) the east tomb's entrance rolls aside.\r
+621    The horse doesn't like gallops when it can fly...\r
+622    Why should the horse canter when it can fly?\r
+623    You can't roll tombs, clod. My, but you're stupid.\r
+624    There is a sudden awesome roll of thunder in your head, your wand\r
+       splits into innumerable splinters, and you collapse to the floor in\r
+       a dreamless slumber...\r
+625    The north tomb is already open, nitwit.\r
+626    The west tomb is already open, dummy.\r
+627    The south tomb is already open, bumpkin.\r
+628    The east tomb is already open, yokel.\r
+629    The sarcophagus creaks open...\r
+630    This sarcophagus is the resting place for the dead! It's not a box\r
+       to store your treasures in, you unfeeling individual.\r
+631    Rigormortis has set in and the body won't fit back.\r
+632    Cannibal. Still, it was fair enough - although perhaps a little more\r
+       seasoning would have made all the difference.\r
+633    The creature from the grave mindlessly takes a bite from the body, then\r
+       suddenly its face contorts in a horrible agony, the air rushes through\r
+       its now voiceless throat as it tries to call in pain, and it\r
+       disintegrates.\r
+634    I see no body, but that doesn't mean there isn't one nearby...\r
+635    The southeast tomb is already open, fool.\r
+636    With a grinding S>C>R>E>E>E>E the southeast tomb slides open.\r
+639    What, just cook it? How about cooking it on some fire..?\r
+641    It's a male ox. Fair enough?\r
+642    The sphere's a little heavy for cricket, I'm afraid. Why not hit\r
+       people with the bat instead, that's what they're for...\r
+643    You swing the sceptre, and an instant later the doorway is clear, the\r
+       shattered protal splintered around you. Vandal.\r
+644    Well you can bugger that for a lark...\r
+645    It's dead. If you think you can kill something dead, you are quite\r
+       welcome to try. I wouldn't waste your time trying here, though...\r
+646    Disect away, you don't find a thing.\r
+647    You're a necromancess, not a necrophiliac...\r
+648    You're a necromancer, not a necrophiliac...\r
+649    The dragon doesn't want the egg. It's not stupid, you know... Besides,\r
+       the dragon's fire is magical, and doesn't melt eggs. You'll need some\r
+       strong, non-magical heat source to get rid of it, I'm afraid!\r
+651    Aha, I spotted that one! The niche won't fit inside itself, try\r
+       something else, mug.\r
+652    The southwest tomb is already open, clot.\r
+653    With a vibrant G}R}A}U}N}C}H the southwest tomb opens.\r
+655    The vase breaks into little tiny pieces. Well, it was only 4000 years\r
+       old...\r
+656    It's not a skeleton key...\r
+657    It's tethered.\r
+658    The goat doesn't want to be milked, and starts attacking you!\r
+659    You can't take the goat with you in there!\r
+660    The goat is too cumbersome to take along.\r
+661    As you drop everything, the vase breaks!\r
+662    As you drop everything, the ornament crashes to the ground, but\r
+       miraculously it doesn't break!\r
+663    It's an ordinary bed, nothing unusual under it like reds or anything.\r
+664    The ox doesn't like goats and refuses to come along.\r
+665    The goat is afraid of the ox, and won't be taken.\r
+666    The horse doesn't care to be seen with anyone dragging a goat...\r
+667    The nanny goat isn't too keen on the horse, and won't come along.\r
+668    You can't ride goats!\r
+669    You don't eat goats, twit. Whenever did you hear of anyone eating a\r
+       goat? I don't know, some people are REALLY dumb...\r
+670    The goat is outraged, and attacks you! Not that you can really blame\r
+       it...\r
+671    The goat enjoyed it, but nothing special happens. Do you like bearded\r
+       females or something?\r
+672    As you pick the remains of the now-fragmented goat from your tunic,\r
+       you remember with fondness the way it boiled when your trusty wand \r
+       pointed in its direction...\r
+673    It's already tethered, empty-head.\r
+674    You'll have to catch it first.\r
+675    You can't let go of the goat when you've got the egg.\r
+676    Your way is blocked by the Undead.\r
+677    The goat isn't daft, and refuses point blank to be tethered in the\r
+       fiery pit!\r
+678    The goat is tethered.\r
+679    The goat is tethered, and sinks slowly into the swamp...\r
+680    It weighs too much, which is just as well as it's a bit runny having\r
+       been hacked up...\r
+681    The goat is currently abstaining from magic pancakes...\r
+682    The goat eats it.\r
+683    The goat swallows the toadstool whole, and promptly keels over dead as\r
+       a doornail. Ah well!\r
+684    It's not a carnivore.\r
+685    The goat devours the mistletoe, then seconds later falls quite dead. I\r
+       wonder if the sprig was poisonous?\r
+686    Nice try, but Chinese Boxing is no good against REAL dragons!\r
+687    The goat won't eat.\r
+688    It can't fly, you barnpot!\r
+689    The goat is now untethered.\r
+690    It already IS untethered. What do you want, some award for being\r
+       excessively kind to animals?\r
+691    Your spell doesn't work; either try again or use the hunting horn. Or\r
+       get to be a wizard or witch, of course! In the meantime, however, the\r
+       power of the magic has put you to sleep...\r
+692    Only champions and above have the skill to summon with the horn.\r
+693    A loud, clear note sounds from the horn...\r
+694    Someone has been summoned by the horn already, and it only works the\r
+       once.\r
+695    A feeble squeek croaks from the horn. You're supposed to summon people\r
+       with it, it's magic...\r
+697    From somewhere in the distance comes a low reverberating sound.\r
+698    The clear note of a horn sounds, somewhere in the distance.\r
+699    You hear a loud "MOO" lowed somewhere.\r
+700    You hear the >| CRASH |< of a cannon going off in the distance.\r
+701    The loud >< KAPOW >< of a door being blown up assails your ears.\r
+702    Your ears prick up at the sound of something being magically\r
+       destroyed quite noisily in the distance.\r
+703    A loud "AAAOOOOOOHHH" reaches your ears from afar.\r
+704    You can't flee from such fiends, they get in your way. You'll have to\r
+       wait until it goes, or kill it.\r
+705    A distant neighing noise reaches your ears.\r
+706    Using a lever, the bolt comes out easily.\r
+707    The fork snaps in your hands and is destroyed.\r
+708    The brand isn't strong enough.\r
+709    The wand is too short to use as a lever.\r
+710    The bolt is too deeply embedded to get it out, you'll need a strong\r
+       lever.\r
+711    The brand falls to bits. Ah well!\r
+712    The wand is indestructible, so you can't sharpen it.\r
+713    Sharpen it with something like a knife if you REALLY want to...\r
+715    There is a sudden crack of thunder and the gate opens!\r
+716    In the distance you hear a crack of thunder.\r
+717    The ore comes out quite easily when you use the pickaxe.\r
+718    After a struggle, the ore comes out.\r
+719    It's embedded in the face, you'll have to use some strong sort of\r
+       tool to get it out.\r
+720    It's not stuck in anything!\r
+721    The water flows smoothly through your body and fills you with a vibrant\r
+       energy. A second or so later, however, you feel dizzy and find yourself\r
+       collapsing into a deep sleep...\r
+722    The dwarfs have treated their trees with a special hardener just to stop\r
+       louts like you from chopping them down...\r
+723    The emerald plummets downwards, and lands somewhere in the cavern below.\r
+726    It falls down the duct and you hear noises which seem to indicate that\r
+       the ventilator is perhaps some 40 feet down, vertically. Certainly\r
+       enough to kill any human venturing there.\r
+727    The bones fall to dust when you try to pick them up. If you're\r
+       interested, most of them look like dwarf bones.\r
+728    A bright flash sparks from the end of your wand, forcing you to drop it\r
+       with the electric shock. In that brief instant, you see that you are in\r
+       a section of main passage, which has been closed down because of the\r
+       rockfalls. Then, everything goes black, and suddenly you re-materialise\r
+       elsewhere...\r
+729    There is a grinding sound, then you hear a deafening crash as of\r
+       millions of gallons of water suddenly released from somewhere very\r
+       close - about fifteen seconds away...\r
+730    In the distance you hear a sudden rushing sound, as if a huge\r
+       torrent of water has just started to flood somewhere.\r
+731    There is a grinding noise, and then a barely audible flushing noise,\r
+       as if a large body of water were seeping away.\r
+732    There is nothing here, apart from a few bones.\r
+733    The area is deep in flood water, you can't possibly hope to get past.\r
+734    Pickaxes aren't any use at chopping down trees. Wouldn't it be really\r
+       useful if someone invented a sort of axe with which you could chop trees\r
+       down..?\r
+735    You can't break down doors with pickaxes. Ordinary axes are OK, though.\r
+736    The ogre doesn't understand pickaxes and you hack him to buggery.\r
+737    You can't, its so deep you'd not be able to hold your breath for\r
+       long enough.\r
+738    Eh? There isn't any water here. You simple or something?\r
+740    It's a safety lantern, and never gets hot enough to melt anything.\r
+741    Your lantern is now lit.\r
+742    The dragon's breath melts the lantern, catches alight the oil and blows\r
+       you to pieces.\r
+743    In the distance you hear someone being blown to pieces.\r
+744    The lantern isn't lit!\r
+745    This is a safety lantern, you can't use it to light anything.\r
+746    Your lantern is now unlit.\r
+747    He doesn't like eating golden potatoes, they have a nasty effect on\r
+       his teeth.\r
+750    You can't go that way carrying anything, the gap is too narrow.\r
+751    The walls are too slippery, steep and tall to get up.\r
+752    It's too far to climb up the cavern wall.\r
+753    The citadel wall has been especially built to stop people climbing\r
+       it from here...\r
+754    The gate is closed and you cannot pass.\r
+757    The trumpet emits a feeble squeak, which surprisingly rises sharply\r
+       in loudness, and builds up to a crecendo. There is a sudden tremendous\r
+       > CRACK < and the east side of the wall splits apart to reveal a dark,\r
+       eerie room.\r
+758    The trumpet emits a feeble squeak, which rises suddenly in loudness,\r
+       but nothing else happens.\r
+759    In the distance you hear a loud blow on a trumpet.\r
+760    You can only cast sleep spells on people. If you want to go to sleep\r
+       yourself deliberately, say sleep.\r
+761    It's not that kind of pot, you degenerate.\r
+763    The ox is as dead as a doornail. Showing it affection has not the least \r
+       bit of effect, apart from making you look a right idiot.\r
+766    The sheepskin is too bulky to fit into any container.\r
+767    You start to insert the mirror, but as you try to insert it, a\r
+       magical force starts to push back. The harder you push, the more it\r
+       resists. You realise it is a futile task, and give up. I wonder why\r
+       that happened..?\r
+768    The bird starts flapping about the instant it realises you're going\r
+       to put it in the container. It causes such a kefuffle you can't get it\r
+       in.\r
+769    The leprechaun kicks wildly as you try to bung him in the container.\r
+       "'Tis a bully you are!" he expounds, as he successfully avoids your\r
+       suffocating him.\r
+770    If you put that in the container it would break.\r
+772    You can't put boats inside things! Imagine the problems if you\r
+       try that sort of thing at sea!\r
+773    You insert the nut, and an instant later it pops out again.\r
+774    No matter how hard you try, the mistletoe will not go in the container.\r
+775    The brand falls into the container, and promptly sets it alight. You\r
+       realise what is happening and drop the container, and start stamping\r
+       out the flames, but too late. The fire quickly consumes the container\r
+       and everything inside it, so quickly that you get the impression it\r
+       was magical. Presently, nothing remains.\r
+776    How about "a pox on thee, foul villain", or "oh wretched crone, may\r
+       thy visage be the abhoration of christendom", or "thou unspeakable\r
+       manifestation of hellish damnation, may thee spend thy days\r
+       languishing on the deepest plane of the Abyss", or "fuck off".\r
+777    The cat swallows the bird whole, licks its lips, and gives a\r
+       satisfied purr...\r
+779    The cat lashes out and kills the bird dead as you are ever likely to\r
+       find.\r
+783    You take one almighty swing and the cupboard door flies off its\r
+       hinges, destroyed. What did it ever do to you, murderer?\r
+784    From the end of your wand sparks a violent beam of intense light,\r
+       and an instant later the cupboard hasn't got a door any more...\r
+785    You don't think they make portcullises so feeble as you'd be able\r
+       to break them down, do you? What a twit...\r
+786    An amber cone glows from the end of your wand, and the dwarf melts.\r
+787    Out from the end of your wand flies a spectacular green ray, which\r
+       scythes across the sky and slices into the dragon, to absolutely no\r
+       effect whatsoever. Out from the end of the dragon's mouth flies a\r
+       ball of fire...\r
+788    Very festive...\r
+789    You need to be carrying the boat to sail it.\r
+790    If you want to sail the boat, just pick it up and move in the direction\r
+       in which you want to go.\r
+791    Some magical power in the rug prevents your taking it with you.\r
+794    Nice try, its clever of you to think of doing that here but nothing\r
+       special happens, I'm afraid. Well, not actually AFRAID afraid, well...\r
+795    This is the only place you'll find a chop-downable tree. Why not chop it\r
+       down with the axe? It won't fall on you.\r
+796    Someone's already felled the tree here. No point in trying to fell any\r
+       more if you want my opinion.\r
+797    There's nothing fellable here! Try a forest.\r
+798    Well pick it up then!\r
+799    Suddenly you feel a stinging pain from your wand, and an electric\r
+       charge runs through your body. You are forced to drop the magic to\r
+       save your hand, then suddenly everything about you goes black, and\r
+       an instant later you rematerialise...\r
+800    It won't burn.\r
+801    The priceless violin burns to nothing. Philistine.\r
+802    The violin bow is now burnt away.\r
+803    There's no electricity here.\r
+804    Well, you have a good conduct and nothing happens. Count yourself\r
+       fortunate I didn't hit you with a lightning bolt.\r
+805    You feel a sudden, painful static electric shock from your bow,\r
+       which makes you drop it in surprise. Moments later, everything goes\r
+       black, and you feel like your stomach has just been sucked out. An\r
+       instant afterwards, your surroundings swirl about you and you\r
+       rematerialise...\r
+806    It's not wide enough, try something thicker, such as a stick.\r
+807    The lion lands with a splodge and sinks, pointing nowhere.\r
+808    The pot is stuck closed, but you can put things in it through the\r
+       gaps in the wickerwork so it doesn't really matter.\r
+809    It doesn't make much difference with the sack, opened or closed.\r
+       Nothing will fall out anyway, and it's airtight.\r
+810    It's already open, why don't you read the description?\r
+811    The bag creaks open slowly.\r
+812    The bag is now closed.\r
+813    It's already closed.\r
+815    You'll have to furl it first.\r
+817    After a modest explosion, the shark appears to have disappeared.\r
+818    Well it tasted pretty bad, but you wolfed it down eventually.\r
+819    Well pick it up then! There's a method to these things...\r
+820    I don't suppose you'd care to use a bow, would you? Pizzicato ruins\r
+       your fingernails.\r
+821    Out from the violin come a few bars of Paganini's Caprice no. 21.\r
+822    Don't mention it...\r
+824    They made headstones much stronger in the old days, so the likes of\r
+       you wouldn't go around vandalising cemetaries.\r
+825    In the distance you hear the strains of a violin being played.\r
+827    The toilet flushes automatically and when you look, it's empty!\r
+832    When you try to manipulate the object, your egg starts to make a\r
+       humming noise, and you find some strange, powerful magic force prevents\r
+       your continuing...\r
+835    It floats off down the river.\r
+837    You feel a sudden sharp pain in your hand and drop what you were waving,\r
+       but nothing else special happens...\r
+838    You can't get a grip on the bookcase from this side good enough to\r
+       enable you to slide it.\r
+839    All of a sudden, to your shock and amazement, your violin cracks and\r
+       splinters to nothingness!\r
+847    It's a thick slab of rock, you couldn't break it if you dropped a\r
+       rhinosceros on it from 2,000 feet. Isn't it obvious you're supposed to\r
+       sacrifice something there?\r
+848    Have you ever thought how much cannons weigh, chump?\r
+850    The patterned curtain is now drawn open.\r
+851    The patterned curtain is now drawn closed.\r
+852    The curtain's already open! Take a look, pachyderm!\r
+853    The curtain's already closed! Why not take a look, donkey?\r
+854    The curtain won't hang properly here.\r
+855    It's already hanging up!\r
+856    The curtain is now hanging loosely by the opening to the north.\r
+857    The richly-woven pattern reads:\r
+       "When the eyes are red you may pass the ghouls,\r
+        But if treasure is wanted then emerald rules."\r
+       There are also some numbers written: "50" in red, "100" in blue,\r
+       "150" in green, "200" in yellow and "250" in emerald green.\r
+858    You hear a voice, which seems to come from inside your head, calling\r
+       you from afar...\r
+859    It's already full of rum.\r
+860    There's no fresh water here.\r
+861    The bottle fills, and its contents magically become rum!\r
+863    It's highly acidic, and you swallow a mouthfull of the burning liquid\r
+       before spitting the rest out! I certainly wouldn't advise swimming in\r
+       the stuff...\r
+864    The bottle won't fill.\r
+865    The bottle shatters to uselessness.\r
+866    The bottle's empty! You'll have to fill it.\r
+867    It's not raining!\r
+868    Yo-ho-ho! That was powerful stuff! Hic!\r
+869    If you want to consume something, go ahead and do so. I'm not having\r
+       any of this wishy-washy tasting going on...\r
+870    All of a sudden, you are feeling quite woozy, and fall asleep.\r
+872    Very resourceful, but regretably the bottle doesn't fill.\r
+875    How do you expect to do that? You haven't got a funnel, it'd go all\r
+       over!\r
+876    If you want to fill anything, the most appropriate thing I can suggest\r
+       which you are liable to encounter is a bottle.\r
+877    The room before you seems to swim around, and you stagger backwards...\r
+878    You find a potty under the bed, containing some jet!\r
+880    Over the cliff it goes!\r
+881    In the distance you hear a loud PLONK.\r
+883    HIC!\r
+884    You've got the hiccoughs. HIC!\r
+885    It won't eat it.\r
+886    The hyacinth is a type of flower, not flour. Still, you managed to get\r
+       it all down without too much coming back up.\r
+887    Mmm! Smoked hyacinth, it tastes delicious!\r
+890    Over you go! For some reason, you don't plummet like a stone...\r
+891    You land safely!\r
+892    You're already heading that way. The total time taken for the jump\r
+       should be about 8 seconds, if you're worried about missing a 'bus or\r
+       something...\r
+893    If you're falling, anything you let go of would fall the same speed as\r
+       you, wouldn't it? So you can't REALLY drop anything until you reach the\r
+       bottom...\r
+894    I can't let people go around furling as they fall, they'd plummet\r
+       downwards and splash on the rocks. Keep your country tidy!\r
+895    The dragon eats the coal. Seemed to enjoy it!\r
+896    In the distance you hear the terrible RHOAAAUUUAURRRRGGGGGGHGHHHGHHHH of\r
+       a dragon dying...\r
+897    It has no roots, so I'm afraid you can't plant it.\r
+898    The flower falls to bits. Ah well!\r
+899    It smells of hyacinth.\r
+900    He's allergic to flowers, but thanks you all the same.\r
+901    She's not in a position to accept at the moment...\r
+902    I'm sure that whoever's buried there will be very grateful.\r
+903    The flower doesn't perk up much, but then it didn't look like it was\r
+       going to die anyway.\r
+904    The flower withers and dies.\r
+905    The vase is so delicate that the weight of the flower breaks it!\r
+906    No, that's not it. Resourceful of you though!\r
+908    You find that the lantern won't light, the reason being that it's got no\r
+       wick.\r
+909    Your lantern's wick has just burned out.\r
+910    The lantern's lit, you'd burn your fingers.\r
+911    You fix the new wick into the lantern.\r
+912    It won't come out.\r
+913    There isn't one in there.\r
+915    You come out of the end of the chute and land with a thump on the floor.\r
+916    All of a sudden you go over a bump in the slippery tunnel, and start to\r
+       decelerate.\r
+917    Your're already going downwards, and since you have little say in the\r
+       matter I suggest you sit back and enjoy the ride...\r
+918    It's fireproof, ask the dragon.\r
+919    A single swing with the mighty axe fells the signpost.\r
+920    The chop has no effect.\r
+921    It resists your vandalism with commendable disdain.\r
+922    From the end of your wand shoots a pencil-thin ray, which explodes the\r
+       signpost almost instantly. Ooh!\r
+923    The signpost is a bit weatherbeaten, but you can make out:\r
+       "B WA E dr gon at  a ge, e tr me y dan ero s, bu  sh uld di  if fe \r
+        c   ."\r
+       Appended to the bottom, and more readable, is\r
+       "Drop boats here until you leave for the mainland - dangerous currents\r
+        will sink you if you move off the island from anywhere else".\r
+924    It's fixed into the ground, you can't move it. Might be able to chop\r
+       it down if you tried, though.\r
+925    The stem isn't long enough to fix it anywhere, I'm afraid.\r
+926    ~D~O~N~G~\r
+927    Ringing through the air you hear a loud ~D~O~N~G~.\r
+928    You hit the bell, and it rings a loud ~D~O~N~G~.\r
+929    Now you've dropped a clanger!\r
+930    It won't touch the demon drink...\r
+931    The bottle's empty, a fat lot of use it is feeding something with it.\r
+932    The creature of Satan swallows some of the rum, but is mindless anyway\r
+       so it has no effect.\r
+933    The dragon's fiery breath ignites the bottle in your hands, and you\r
+       only just escape injury from the flying shards of glass! Talk about\r
+       fire water...\r
+934    The beggar takes a gulp, passes back the bottle, then starts to sway\r
+       a bit. Unused to strong alcahol, in a sudden stupor he attacks you!\r
+935    You take hold of the cord and find, to your horror that you stick to\r
+       it! Try as you might, it won't come off, and you find to your horror\r
+       that it is part of the immense web of some huge spider! Taking hold of\r
+       the cord is bound to have informed the creature of your presence, too!\r
+936    You're stuck in the web, how could you pick it up?\r
+937    The spider suddenly springs at you!\r
+938    Well fair enough, worth a try I suppose. There's no special effects\r
+       as a result, though.\r
+939    The web catches fire, and an instant later you are free!\r
+940    You can't move that way, you're stuck in an enormous web!\r
+941    You're stuck in the web and can't move enough to do that.\r
+942    You haven't enough freedom of movement to wave anything.\r
+943    You can't it sticks to the web.\r
+944    It's far too sticky for that! What do you think it's made of,\r
+       marshmallow?\r
+945    You sink your teeth into the cord, only to find that you stick! The\r
+       cord is part of an immense web, which you see as you attempt to\r
+       struggle free. I wonder whether the spider will be attracted?\r
+946    From the end of your wand flies a blue bolt of highly-charged\r
+       electricity. PZINGGG no more spider...\r
+947    The wand erupts forth a cone of fire which destroys the web no end.\r
+948    Under the bed is not the sort of place to keep that sort of thing. Now\r
+       if you'd tried a potty on the other hand...\r
+949    The flood water is too deep there, the only dry place around is the\r
+       top of the citadel.\r
+950    The potty slides out of sight under the bed.\r
+951    It's already open, if you want to toggle open/close just TURN VALVE.\r
+952    It's already closed, if you want to toggle open/close just TURN VALVE.\r
+953    The horse was expecting to land on solid ground, so when its feet are\r
+       sucked under it is surprised, and unable to take off. Happily, you\r
+       watch it sink to oblivion. Brutal so-and-so.\r
+954    The stallion snorts forth ferocious billows of steam - it obviously\r
+       objects to what you're trying to do. Drop things some other way, it\r
+       MIGHT let you...\r
+961    You can't summon people when you're falling!\r
+962    OK, so you burn the cord. Wasn't that a whole heap of fun?\r
+963    The sword isn't flaming, it just glows in the dark (and in the light,\r
+       too, come to that!).\r
+964    The runes read, "If you were less experienced than enchanter, you'd be\r
+       blown up now!".\r
+965    You haven't a watch.\r
+966    Rarely have you witnessed a cat explode with such force.\r
+967    The wand unleashes a screaming bolt of power, but the door withstands\r
+       it. It must be magical...\r
+972    Your wand leaps from your hand, and beats the snake to death! It\r
+       then wipes itself on the ground and returns to your grasp.\r
+977    The cat has eaten the rat!\r
+978    The blade of the sword is so sharp as to be able to slice even through\r
+       the sticky, gooey web! An instant later, and you're free!\r
+983    You try to move that direction, but your feet seem rooted to the spot.\r
+       A suitably mysterious, eerie sound whirls about you, warning that the\r
+       magic of the ancients objects to your taking something you're carrying\r
+       along with you...\r
+984    Hey diddle diddle, the cat and the fiddle!\r
+985    What, and break your teeth on them? They're golden!\r
+986    ~D~I~N~G~\r
+987    Ringing through the air you hear a loud ~D~I~N~G~.\r
+988    You hit the bell, and it rings a loud ~D~I~N~G~.\r
+989    The golem interposes its iron frame, and blocks your way through the\r
+       opening.\r
+990    The sword barely chips at the golem, but it's better than nothing.\r
+991    It breaks on the golem's mighty iron torso! The guardian turns to you,\r
+       silently...\r
+992    There is a flash of violet light from your wand, and you feel like you\r
+       are being pulled apart. Momentarily, everything goes black...\r
+993    You fall asleep, deep in meditation.\r
+994    This is no place to meditate, try a shrine or chamber of some kind.\r
+995    There isn't sufficient meditation going on elsewhere to provide the\r
+       psychic energy to meditate in such a small shrine as this.\r
+996    You feal a great tranquility filling your being, and when you cease\r
+       your meditation, you are in a strange place...\r
+997    You start to meditate in this holy place, and the darkness around\r
+       you seems to close in. All of a sudden, it clears...\r
+998    The gate closes.\r
+999    It's already closed! I bet you're the sort of person who turns back to\r
+       their house after walking 20 yards "in case" they forgot to switch the\r
+       gas off...\r
+1000   You make a good job of it, and feel quite proud of yourself.\r
+1001   The throne is too small to sit in, but it looks to be worth a bob or\r
+       two.\r
+1002   Not THAT sort of prize, idiot!\r
+1003   It's not really supposed to go on a wall. Why not just drop it in the\r
+       swamp and forget about it, eh?\r
+1004   The oven door isn't open.\r
+1005   OK, but the oven isn't hot enough to do much damage.\r
+1006   The oven is now open.\r
+1007   The oven is already open, are you trying to get in or something? Perhaps\r
+       it would be best for all of us if I let you...\r
+1008   The oven is now closed.\r
+1009   It's already closed, twit.\r
+1010   The oven's coals are out of reach, so you can't light anything from them\r
+       I'm afraid.\r
+1011   The rabbit leaps suicidally into the recess where the hot coals are, and\r
+       that's the last you see of it!\r
+1012   OK, but the oven's probably hot enough to ignite the gunpowder after a\r
+       while...\r
+1013   You hear a loud explosion.\r
+1014   The guard blocks your way.\r
+1015   Your wand lets forth an amber cone of light, but it merely bounces off\r
+       the dwarf!\r
+1016   The gateway needs a key to open it. Say "open gate with <key>", where\r
+       <key> is what you think the necessary key is...\r
+1017   The gateway swings silently open...\r
+1018   It's already open. Making sure, were you?\r
+1019   It's not THAT kind of chip!\r
+1020   >>>>>SPARE<<<<<\r
+1021   With a mighty heave, you withdraw the longsword from the rock!\r
+1022   The dwarf is already awake, dope.\r
+1023   The dwarf wakes up!\r
+1024   The gateway won't open.\r
+1025   You kill the sleeping dwarf with a single blow, but it wasn't much\r
+       fun.\r
+1026   It continues to sleep.\r
+1027   The dwarf is very surprised!\r
+1029   It's already thrust into the rock, and won't go any further.\r
+1030   The longsword slides into the rock, smoothly and silently.\r
+1031   Not while you're falling!\r
+1032   You can't use the wand if you have the longsword, and, unluckily for\r
+       you, you have both!\r
+1033   The trapdoor won't budge.\r
+1034   The bed is already unmade!\r
+1035   It's tidy enough anyway, you're not one of those fastidious types\r
+       who dusts rooms 3 times "just to make sure", I hope...\r
+1036   The bed has been unmade with such enthusiasm that you soon realise\r
+       you'll never be able to make it again (the bed I mean).\r
+1037   Not THAT sort of Guardian!\r
+1038   If you want your leg pulled, try playing under the name "Gail"...\r
+1039   This part of the swamp is very treacherous, and as you move to get\r
+       the object, the shift in your centre of gravity is too much. A trice\r
+       later, and you're swallowed up into the mire...\r
+1040   The bunny gives you a nasty nip with its sharp incisors.\r
+1041   The bunny nuzzles up to you, oozing cuteness.\r
+1042   That's a bit of a daft thing to do - if it was climbable it wouldn't\r
+       have been much use building it. You start clambering up with enthusiasm,\r
+       but all of a sudden slip on a loose stone and break your neck. Sigh!\r
+1043   There is a sudden explosion, and you are blown to bits. A booby-trap,\r
+       in case you haven't guessed...\r
+1044   When you start to wave, the pillar magically rises into the air, then\r
+       before you can do anything comes crashing down on you, pulping you\r
+       and grinding you into the floor. Since humans do not function too\r
+       well in this condition, you die. The pillar smiles to itself in\r
+       satisfaction...\r
+1045   As you reach for the skull, a terrible transformation begins to take\r
+       place: skin starts to form on the ancient bones, and eyes well up in the\r
+       sockets. The leering grin of the ram becomes apparent, and it starts to\r
+       rise slowly into the air. Suddenly, it strikes! Its horns gouge deep\r
+       into your eyes. You fall back in agony as the manifestation of evil\r
+       gores you to death. Maybe that fleece nearby belonged to it once?\r
+1046   A spectacular flash of glorious firework colour erupts from your\r
+       wand, accompanied by a tremendous clap of thunder, and a bit of a\r
+       scream as you find that the marble pillar is so strong that it\r
+       reflects the spell back at you and you go up in smoke! Trouble-\r
+       maker!\r
+1047   When you open the chest, you discover that it contains clothing.\r
+       Unfortunately, said clothing came from a village whose entire\r
+       population was wiped out shortly afterwards by a particularly\r
+       virulent plague which kills instantly, as you suddenly discover\r
+       when you come out in rose-shaped blotches and drop dead. The lid\r
+       of the trunk conveniently slams shut afterwards, awaiting another\r
+       victim... Sorry about that!\r
+1048   The spider scuttles over to where you lie helplessly trapped in her\r
+       web, and she sinks her fangs into your torso. You black out, and...\r
+1049   You manage to budge the sword a little way, but you're not experienced\r
+       enough to dislodge it yet. Maybe if you made it to superhero or\r
+       superheroine you'd be able to?\r
+1050   As you move, the swamp enfolds about your body. Kicking and screaming\r
+       as best you can, you can make but futile headway before the clammy\r
+       marsh becomes too heavy and you are sucked to a terrible death by\r
+       asphyxiation.\r
+1051   I'm not telling you, so there!\r
+1052   The thundering waterfall smashes you to pulp with its power.\r
+1053   The sea suddenly becomes rough as a storm brews, and your little\r
+       boat is overturned. Needless to say, you drown...\r
+1054   You slide down the chute, an air of excited expectancy about you.\r
+       This ends abruptly when you pile into an incinerator, which although\r
+       no longer alight is nevertheless 40 feet below where you come out.\r
+       You die, of a broken everything.\r
+1055   You experience a relaxing, soothing sensation as you haplessly leap\r
+       to your doom, which only goes away when you break to pieces on the\r
+       rocks below. Do you think you're a lemming or something?\r
+1056   You descend, when suddenly out from above swings a huge axe. You see\r
+       it coming and try to swipe it aside, but it is too strong and you are\r
+       cleft in two.\r
+1057   You start your climb, and the rocky walls change to earth after a while.\r
+       All of a sudden, your foothold gives and you tumble back, the hunks of\r
+       earth you grab hold of coming away in your hands. You are knocked\r
+       unconcious on the wall behind you, and bounce off all the way down. You\r
+       are dead before you hit the bottom.\r
+1058   You suddenly slip on a piece of wet seaweed and fall into the water.\r
+       Desperately you cling on, but the waves drag you under and you\r
+       finally drown. That's one way not to try again!\r
+1059   You jump down, land on the rocks and are smashed to bits. Twit!\r
+1060   () GLOOP (). What made you do that?!\r
+1061   As you start crossing the pool, the waters enfold about you. You\r
+       realise that they are magical, and they seem very hot as you\r
+       splash about wildly, in a useless attempt to stop their dragging\r
+       you under. After you have drowned, the waters wash up your\r
+       possessions on the shore.\r
+1062   As you start to enter the room, a horde of ghouls spring as if\r
+       from nowhere and tear you limb from limb. There are so many that\r
+       you are soon overpowered and consumed. The ghouls push your\r
+       belongings back into the room whence you came, lest they alert\r
+       future pickings...\r
+1063   That's not enough, he wants something more substantial.\r
+1064   The rabbit eats the wafer, and seemed to enjoy it.\r
+1065   MMMmmm! Delicious! You feel better already!\r
+1066   You feel rather tired.\r
+1067   You pucker your lips to kiss the beggar, but as you close in on his\r
+       mouth he tries to bite off your nose, his sadly dim mind thinking\r
+       your head is food. Hastily you withdraw, since the beggar's teeth\r
+       are nothing to be sniffed at.\r
+1068   You hear everything you could before, only louder. Why not try\r
+       diagnosing people with it?\r
+1069   You can't read anything, you're blind!\r
+1070   The flute doesn't seem to want to play. And after it was brought all\r
+       the way here, too!\r
+1071   The clear notes of a tuneful melody ring through the air.\r
+1072   The clear notes of a tuneless melody ring through the air.\r
+1073   You hear the clear notes of a flute ringing through the air.\r
+1074   It doesn't play a note.\r
+1075   It's chained up, you can't get it. You aren't EVER going to be able to\r
+       get it, so don't bother trying!\r
+1076   The words, "Aw, shucks, you shouldn't have..." flash across the\r
+       headstone, then are gone.\r
+1077   You see large, pink and blue spots floating in front of you.\r
+1078   Inventive, but the icicles just float.\r
+1079   The stallion scoops you up onto its back and flies off before you can\r
+       stop it, passing through solid objects without let or hinder. Soon, it\r
+       circles, lands, and dumps you off...\r
+1080   Cremation, eh? Well it burns away quite quickly. Ashes to ashes...\r
+1081   It smells just like the sort of thing that if you were a wolf you\r
+       wouldn't like to be fed with it.\r
+1082   Nothing happens. Well, the tree IS already felled!\r
+1083   The incense quickly burns away, it exceeded its "best before" date\r
+       several centuries ago...\r
+1084   You start to climb it, but soon realise that it's too windy out\r
+       here and were you proceed you'd be blown off. Reluctantly, you\r
+       scramble down to earth again. \r
+1085   You don't see your reflection...\r
+1086   What are you trying to do? Develop a hacking cough..?\r
+1087   You can't steal the longsword, people guard it with too much\r
+       ferocity for the likes of you to take it!\r
+1088   It doesn't seem to want to go in the container.\r
+1089   Very generous of you, but the longsword has a mind of its own and\r
+       decides that you are quite good enough to wield it.\r
+1090   The chain makes a large dent in the side of the golem!\r
+1091   The king dwarf grabs hold of your leg and hangs on, preventing your\r
+       leaving.\r
+1092   The words are too faded to read, but you can tell that, in its day,\r
+       it was rather good.\r
+1093   At precisely 451 degrees farenheit, the magazine ignites and burns\r
+       away.\r
+1094   The goat has too much respect for such an august publication to eat\r
+       it.\r
+1095   As you fold the magazine, a fond reminiscence stirs you, of what once\r
+       was...\r
+1096   At the speed you're going?!\r
+1097   Ah, good idea, but nothing special happens. Only by entering the\r
+       fountain yourself may you gain any beneficial effects, and then only\r
+       if it glows blue.\r
+1098   OK, so it gets a bit wet. What did you expect would happen?\r
+1099   It looks perfectly OK to me.\r
+1100   The cat seems reasonably dead.\r
+1101   The cat isn't feeling very well.\r
+1102   It's not going to get up and hop away anywhere, I'm afraid...\r
+1103   The bunny is as fit as a fiddle.\r
+1104   The eagle rips the rat apart with its talons!\r
+1105   The eagle tears apart the gull with its talons!\r
+1106   The eagle wrenches itself from your grasp!\r
+1107   The eagle relaxes in its nest, and its wounds heal.\r
+1108   The eagle kills the rabbit with a single blow of its mighty talons.\r
+1109   The eagle bursts into flames as a cord of red fire rorars from the\r
+       end of your wand and engulfs it. An instant later, and the bird of\r
+       prey is no more.\r
+1110   It fits like a glove.\r
+1111   Well OK, but nothing special seems to happen.\r
+1112   Mmm, scumptious!\r
+1113   No, no, not THAT kind of a kipper!\r
+1114   Your heightened senses react badly to the enchanted waters, and you\r
+       faint in a heap.\r
diff --git a/MUD0.BCL b/MUD0.BCL
new file mode 100644 (file)
index 0000000..571567a
--- /dev/null
+++ b/MUD0.BCL
@@ -0,0 +1,157 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+$ldtext "/runame:mud"\r
\r
+STATIC\r
+$(     //Various odds and sods.\r
+       cmndbuf         =       vec DRSIZE      //Next command buffer\r
+       scanch          =       0               //The last character read.\r
+       scan.info       =       0               //The last word read.\r
+       name.string     =       vec 26          //A string.\r
+       fake.string     =       vec 26          //Space for another string.\r
+       mbuffer         =       vec 26          //Buffer for quote mode.\r
+       mainloop        =       0               //Contains the mainloop.\r
+       prompted        =       false           //Whether you've prompted.\r
+       firstsnoop      =       false           //Set when first snooped on\r
+       somethingarrived        =       false   //Whether some creature just arrived\r
+       lineflg         =       false           //True if typed a line.\r
+       fake            =       vec 6           //Fake node.\r
+       bcplrm          =       vec 1           //bcpl version of a 6bit room\r
+       lastdr          =       0               //The last door you locked.\r
+       lastdir         =       1               //last direction you went in.\r
+       autowho         =       -1              //auto-who seconds count (spectacularing)\r
+       autoint         =       INTERVAL        //how long to wait txixt autowho's\r
+       bstr            =       0               //Stream for BUG command.\r
+       kept            =       0               //kept object\r
+       events          =       0               //events due to demons\r
+       who.copy        =       0               //Who was last in a room.\r
+       pwcnt           =       0               //how many times tried "password" command\r
+       fight           =       vec 35          //Who you are fighting.\r
+       laststream      =       -1              //Stream of item in buffer\r
+       lastblock       =       -1              //Block of item in buffer\r
+       cccnt           =       CCTRIP          //number of ^C's before ejects you\r
+       savedp          =       0               //number of times done a SAVE\r
+       pain            =       0               //unnecessary ^C count\r
+       leading         =       true            //true if not following\r
+       followers       =       0               //People following\r
+       frontman        =       true            //true if not assisted\r
+       joined          =       0               //people joined to you\r
+       animal          =       0               //animal you're following\r
+       snooping        =       true            //True if you're not snooping...\r
+       snoopedon       =       false           //players snooping on you\r
+       snobj           =       false           //object you're snooping on\r
+       brief           =       false           //whether in brief mode or not...\r
+       lastmoments     =       false           //whether closing soon or not\r
+       verbname        =       ""              //To make printing errors easier\r
+       objname         =       ""              //ditto\r
+       insname         =       ""              //ditto\r
+       fodsville       =       false           //was I fodded just now?\r
+       osnop           =       0               //old value of snoopedon\r
+       olog            =       0               //old value of logstr\r
+       savescr         =       -1              //last score typed SAVE with\r
+       retaliated      =       0               //wherther used a weapon this fight\r
+       pretend         =       false           //Pretending not playing?\r
+       holdfirst       =       false           //A hack into the actions...\r
+       me              =       0               //My name\r
+       it              =       0               //name of last thing mentioned\r
+       him             =       0               //name of last male mentioned\r
+       her             =       0               //name of last female mentioned\r
+       them            =       0               //name of last player mentioned\r
+       there           =       0               //name of last 6bit room mentioned\r
+       flipping        =       0               //flipping between characters\r
+       fodded          =       false           //Whether you've fodded anyone yet\r
+       lvmdoor         =       0               //Address of message.door.\r
+       lvqdoor         =       0               //Address of our queue door.\r
+       lvrdoor         =       0               //Address of current rm. door\r
+       lvqueue         =       0               //Address of queue entry.\r
+       lvcarry         =       0               //Address of object list.\r
+       at              =       ?               //whether reversed objct & instrmnt or not\r
+       ps.word         =       0               //persona password\r
+       conversing      =       0               //just there to talk?\r
+       deaf            =       0               //am I deaf?\r
+       dumb            =       0               //am I dumb?\r
+       blind           =       0               //am I blind?\r
+       paralysed       =       0               //am I paralysed?\r
+       justforced      =       ?               //was I just forced?\r
+       strtab  =       (table                  //Strings for random output.\r
+                               "I'm not sure I understand you fully.",\r
+                               "What?",\r
+                               "I don't understand that.",\r
+                               "I don't see what you mean.",\r
+                               "It's all double dutch to me mate!",\r
+                               $az"Out from behind a pseudo-teletype leaps a grey-haired*\r
+                               * old man.*C*L*"You shall not pass*", he says.",\r
+                               $az"Don't run this program with a CCL entry!",\r
+                               $az"You find yourself in a grey formless void, the universe*\r
+                               * has not*C*Lyet been created. Try again later.",\r
+                               $az"There is something magic happening! You feel yourself leaving the land..*\r
+                               *.*C*LYou can restart in a minute or so.",\r
+                               $az"Some powerful magic prevents your entering The Land. Try again*C*Llater, please."\r
+                       )\r
+       mins    =       (table\r
+                       0,\r
+                       "Five past",\r
+                       "Ten past",\r
+                       "Quarter past",\r
+                       "Twenty past",\r
+                       "Twenty-five past",\r
+                       "Half past",\r
+                       "Twenty-five to",\r
+                       "Twenty to",\r
+                       "Quarter to",\r
+                       "Ten to",\r
+                       "Five to"\r
+                       )\r
+       hrs     =       (table\r
+                       "twelve",\r
+                       "one",\r
+                       "two",\r
+                       "three",\r
+                       "four",\r
+                       "five",\r
+                       "six",\r
+                       "seven",\r
+                       "eight",\r
+                       "nine",\r
+                       "ten",\r
+                       "eleven"\r
+                       )\r
+\r
+       days    =       (table\r
+                       "Sunday",\r
+                       "Monday",\r
+                       "Tuesday",\r
+                       "Wednesday",\r
+                       "Thursday",\r
+                       "Friday",\r
+                       "Saturday"\r
+                       )\r
\r
+//Player profile information.\r
+       profile         =       0               //Points to hi-seg profile.\r
+       name            =       0               //Points to hi-seg name.\r
+       player.no       =       0               //Player number (convenience).\r
+       player.bit      =       0               //Bit corresponding to us.\r
+       room            =       0               //Current room.\r
+       oldroom         =       0               //Last room we were alive in.\r
+       carry           =       0               //What we are carrying.\r
+       verb            =       0               //Last valid "verb".\r
+       objct           =       0               //Last valid "object".\r
+       instrmnt        =       0               //Last valid "instrument".\r
+       res6            =       ?               //for no.-to-6bit result\r
+$)\r
\r
diff --git a/MUD1.BCL b/MUD1.BCL
new file mode 100644 (file)
index 0000000..5816eb3
--- /dev/null
+++ b/MUD1.BCL
@@ -0,0 +1,465 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and/or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let start() be\r
+$(     input,output_tty,tty                    //Initialise things.\r
+       mainloop_label(l1)                      //Ditto.\r
+       initialise()                            //More of above.\r
+       $( l1:  at_false\r
+               justforced_false\r
+               check.stuff()                   //Game in full swing, check\r
+               parse.command()                 //various things and says\r
+               instate()\r
+               execute.command()               //anything try and understand\r
+       $)      repeat                          //it. Again and again.\r
+$)\r
+and check.stuff() be\r
+$(     let present,change,bit,nm=?,?,?,?\r
+       while magic\r
+       $(      $[      $setzm          JBINT   $]\r
+               outz(strtab!8)\r
+               Outs("Everything in the game has been reset to its original starting state!*C*L")\r
+               stop.fighting()\r
+               $[      $clrbfi $]\r
+               quit()\r
+       $)\r
+       ran()                                   //Bump random (ha!) number generator.\r
+       jar(@deldr)\r
+       check.gone()\r
+       active!player.no_valof\r
+       $[      $mstime 1,      0       $]\r
+       unjar(@deldr)\r
+       unless maint\r
+       test lastmoments then\r
+       $(      lastmoments+_1\r
+               if lastmoments ge TIMEOUT*60 test timeok(low2) then\r
+               $(      out("*C*L:6 will not be closing after all - carry on playing...*C*L", MUD6)\r
+                       lastmoments_0\r
+               $) or\r
+               $(      out("*C*L:6 is now closed!*C*L", MUD6)\r
+                       stop.fighting()         //ought to have a proc for these 2 - happen together often\r
+                       quit()\r
+               $)\r
+       $) or unless timeok()\r
+       $(      out("*C*L:6 will be closing shortly - you have about :N minutes left!*C*L", MUD6, TIMEOUT)\r
+               lastmoments_1\r
+       $)\r
+       present_WHO!room                        //See who is in room.\r
+       unless who.copy=present then            //If changed since last time report on it.\r
+       $(      change_present neqv who.copy    //Get changes.\r
+               unless ASLEEP of profile if visible() for i=0 to 35 do unless i=player.no then\r
+               $(      bit_1<<i                //See who it was and tell everyone!\r
+                       if bit bitand change then unless invisible(i)\r
+                       $(      nm_player.names!i\r
+                               if nm out(":p has just :s.*C*L",nm,\r
+                               (WIZARD of LH from player.names!i)=1->(bit bitand present -> "appeared with a crash of thunder", "disappeared in a puff of smoke"),\r
+                               (bit bitand present -> "arrived", "left"))\r
+                       $)\r
+               $)                              //If can't find name then someone "died".\r
+               who.copy_present                //Keep copy up to date.\r
+       $)                                      //Continue as nothing had happened\r
+       if queue!player.no interact()           //If received message process it (them).\r
+       if pain STAMINA of profile-_pain<>pain_0\r
+       if chcnt>0 test can.wake() then wake.up()<>return or error("You can't wake yourself up yet!")\r
+       if ASLEEP of profile /\ can.wake() /\ new.stamina() ge STAMINAMAX of profile\r
+       $(      outs("You are too alert to sleep any more! ")\r
+               wake.up()\r
+       $)\r
+       test somethingarrived then somethingarrived_false or unless lineflg\r
+       unless random(player+1) if melted do\r
+       $(      let tracer=movers\r
+               while tracer do\r
+               $(      let obj, mobile = LH of tracer, MOTN of obj\r
+                       if (CURROOM of mobile)/\(FIGHTS of mobile=0)/\(DESTROYED of obj ge 0)/\(P4 of obj=0) then\r
+                       $(      MOVECOUNT of mobile+_1\r
+                               if MOVECOUNT of mobile gr MOTION of mobile then moveobject(obj)<>MOVECOUNT of mobile_0\r
+                       $)\r
+                       tracer of_RH\r
+               $)\r
+       $)\r
+       if ~autowho\r
+       $(      autowho-_1\r
+               unless autowho\r
+               $(      autowho_autoint\r
+                       unless ASLEEP of profile\r
+                       $(      Outz($az"*C*LAuto-who:*C*L")\r
+                               Special(SF.WHO)\r
+                       $)\r
+               $)\r
+       $)\r
+       if events handledemons(@events)\r
+       if gdemons/\random(player+1)=0 handledemons(@gdemons)\r
+       if player unless random(player+1)\r
+       $(      jar(@deldr)\r
+               for i=0 to 35 unless i=player.no if player.names!i\r
+               $(      let act=active!i\r
+                       if act ls 0 loop\r
+                       if (((valof\r
+                       $[      $mstime 1,      0       $])-act+WHOLEDAY) rem WHOLEDAY gr DELAY)\/\r
+                       (valof\r
+                       $(      let jb=jobnos!i\r
+                               $[      $setz   1,      0\r
+                                       $move   2,      jb\r
+                                       $trmno. 2,      0\r
+                                       $seto   1,      0\r
+                               $]\r
+                       $)) then exorcise(i)\r
+               $)\r
+               unjar(@deldr)\r
+       $)\r
+       unless prompted \/ pretend\r
+       $(      unless snooping ge 0 \/ snobj\r
+               $(      outz($az"*S*C*L")\r
+                       ccnt_0\r
+                       if INVIS of profile writech(tty,'(')\r
+                       if WIZARD of profile writes(tty,"----")\r
+                       writech(tty,conversing->'"',(BZK/\BERSERK of profile) -> '>', '**')\r
+                       if INVIS of profile writech(tty,')')\r
+                       unless valof\r
+                       $[      $setz   1,      0\r
+                               $skpinc\r
+                               $seto   1,      0\r
+                       $] do\r
+                       $[      $movei  1,      2\r
+                       $hrli   1,      2\r
+                               $movei  2,      #2\r
+                               $move   3,      ttyno\r
+retry:                         $trmop. 1,      0\r
+                               $jrst           okthen\r
+                               $movei  4,      1\r
+                               $hiber  4,      0\r
+                               $trn\r
+                               $jrst           retry\r
+okthen:\r
+                       $] <> forcetty($az "*^R")\r
+               $)\r
+               prompted_true\r
+       $)\r
+       lineflg_hibernate()                     //Sleep for a sec. or until line ready.\r
+       if ctcflg quit()\r
+       if lineflg read.line()                  //Read the line if there.\r
+$)     repeat                                  //Otherwise do it again.\r
+and parse.command() be\r
+$(     let token=?\r
+       switchon scanner() into                 //See what was typed.\r
+       $(      case S.MOTION ... S.LEVEL:\r
+                       verb_scan.info          //Remember verb.\r
+                       token_nvscanner()       //Next token.\r
+                       if token=S.CONT return      //Only said verb.\r
+                       if token=S.WITH\/token=S.AT token_nvscanner()   //ignore superfluous WITHs\r
+                       if token=S.MOTION nvscanner()\r
+                                               //Frig participles to verbs!\r
+                       try.it(@objct,token)    //Remember object.\r
+                       unless token=S.WITH\/token=S.AT token_nvscanner()       //Anything more?\r
+                       if token=S.AT at_true\r
+                       unless token=S.WITH\/token=S.AT\/token=S.CONT\r
+                       $(      let what=scan.info\r
+                               token_nvscanner()\r
+                               test S.IT le token le S.THEM then try.it(@objct,token) or\r
+                               test token=S.CONT\/token=S.WITH\/token=S.AT then scan.info_what<>try.it(@objct,S.OBJECT)\r
+                               or try.it(@instrmnt,token)<>endcase\r
+                       $)\r
+                       if token=S.CONT instrmnt_0<>return  //No.\r
+                       if token=S.AT at_true\r
+                       token_nvscanner()\r
+                       try.it(@instrmnt,token)\r
+                       endcase\r
+               CASE S.SPECIAL:\r
+                       verb_scan.info\r
+                       nvscanner()                             //take off the s.cont\r
+                       return\r
+               case S.UNCONVERSE:\r
+                       verb_0\r
+                       return\r
+               case S.AT:\r
+                       at_true\r
+               case S.WITH:\r
+                       token_nvscanner()\r
+                       if token=S.CONT error("The first word I understood was a preposition, so it should be*C*L*\r
+                               *followed by an object, but I don't recognise it.")       //Must be followed by something.\r
+                       try.it(@instrmnt,token) //Remember it.\r
+                       if scanner()=S.CONT test verb then return or\r
+                               error("I got the first word as WITH-like and I think I got an instrument, but*C*LI can't find an action.")\r
+                                               //May have specified a verb.\r
+                       verb_scan.info          //Store verb.\r
+                       token_nvscanner()       //Next token.\r
+                       if token=S.CONT return      //Finished so return.\r
+                       if token=S.MOTION token_nvscanner()\r
+                                               //Frig participles.\r
+                       try.it(@objct,token)    //Store object.\r
+                       endcase\r
+               case S.CONT:\r
+                       if chcnt>0 endcase     //Allow stuff like 'and then'.\r
+                       return                  //Or return.\r
+               case S.PLAYER:\r
+                       objct_scan.info         //remember player number\r
+                       while valof switchon scanch into\r
+                       $(\r
+                       case '*S':\r
+                       case '*T':\r
+                       case ',':\r
+                       case '.':\r
+                       case ':':\r
+                       case '-':\r
+                               resultis true\r
+                       default '*0' ... '*D':\r
+                               resultis false\r
+                       $) scanch_getch()\r
+                       if dumb error("You can't speak to :U, you're dumb.",player.names!(P1 of objct)) //can find out hidden people this way\r
+                       interact(I.TELL)\r
+                       jump(mainloop)\r
+               default:\r
+                       objct_scan.info //Might be an 'object'\r
+                       unless verb error("You'll have to try something else, I don't understand the first word*C*L(which should be an action).")       //If not said verb report error.\r
+       $)\r
+       unless scanner()=S.CONT error("I think I can guess what some of that meant, try saying it again a*C*Ldifferent way.")       //Phrase must end with a conjunction.\r
+       if at swap(@objct, @instrmnt)\r
+       unless objct objct_fake.node("that")\r
+$)\r
+and execute.command() be if verb then switchon PTYPE of verb into\r
+$(     case S.SPECIAL:                         //A special verb.\r
+               special(P1 of verb)             //quoted or shouted\r
+               endcase\r
+       case S.LEVEL:\r
+               special(SF.DBUG)\r
+               endcase\r
+       case S.MOTION:                          //Execute a direction.\r
+               objct_verb\r
+               objname_verbname\r
+               verb_tverb\r
+               verbname_PNAME of verb\r
+       case S.ACTION: case S.FASTATN:          //An action verb.\r
+               action()\r
+$)\r
+and try.it(lvword,token) be switchon token into\r
+$(     case S.OBJECT:\r
+               setit(scan.info)                //inefficient\r
+       default:\r
+               !lvword_scan.info\r
+               endcase\r
+       case S.PLAYER:\r
+       $(      let nam,prof=player.names!(P1 of scan.info),LH from nam\r
+               unless hidden(P1 of scan.info)\r
+               $(      ((SEX of prof)->her, him)_nam\r
+                       them_nam\r
+               $)\r
+               !lvword_scan.info\r
+               endcase\r
+       $)\r
+       case S.HIM:\r
+               unless him error("I don't know to whom ':s' refers.",PNAME of scan.info)\r
+               pronoun(him,lvword)\r
+               endcase\r
+       case S.HER:\r
+               unless her error("I don't know to whom ':s' refers.",PNAME of scan.info)\r
+               pronoun(her,lvword)\r
+               endcase\r
+       case S.THEM:\r
+               unless them error("I don't know to whom ':s' refers.",PNAME of scan.info)\r
+               pronoun(them,lvword)\r
+               endcase\r
+       case S.ME:\r
+               pronoun(me, lvword)\r
+               endcase\r
+       case S.THERE:\r
+               unless WIZARD of profile error()\r
+               unless there error("I don't know where you mean by 'there'.")\r
+               $(      let s=selector 7:29:bcplrm\r
+                       and b=selector 6:30:1\r
+                       and c=0\r
+                       $[      $move   1,      there\r
+come:                          $ldb    2,      b\r
+                               $jumpe  2,      gone\r
+                               $aos            c\r
+                               $addi   2,      '*S'\r
+                               $idpb   2,      s\r
+                               $lsh    1,      6\r
+                               $jrst           come\r
+gone:\r
+                       $]\r
+                       LENGTH of bcplrm_c\r
+               $)\r
+               !lvword_fake.node(bcplrm)               //hope only have 1 room per sentence!\r
+               endcase\r
+       case S.IT:\r
+               unless it error("I don't know what you mean by 'it'.")\r
+       case S.WITH:\r
+               !lvword_find.word(it)\r
+               endcase\r
+$)\r
+and setit(nd) be unless NOIT of nd it_PNAME of nd\r
+and pronoun(pn,lvword) be\r
+$(     let word=find.player(pn)\r
+       !lvword_fake.node(pn)\r
+       if \word unless hidden(word)\r
+       $(      PTYPE of fake_S.PLAYER\r
+               P1 of fake_word\r
+               them_PNAME of LH from player.names!word\r
+       $)\r
+$)\r
+and nvscanner()=valof\r
+$(     let token=scanner()\r
+       while token=S.ACTION \/ token=S.FASTATN do token_scanner()\r
+       resultis token\r
+$)\r
+and scanner()=valof\r
+$(     let word=?\r
+       switchon scanch into\r
+       $(      case 'A' ... 'Z':\r
+               case 'a' ... 'z':\r
+               case '0' ... '9':\r
+                       if conversing\r
+                       $(      get.text()\r
+                               resultis S.SPECIAL\r
+                       $)\r
+                       word_read.name()\r
+                       scan.info_find.word(word)\r
+                       if scan.info then\r
+                       $(      if PTYPE of scan.info=S.NOISE then loop\r
+                               if PTYPE of scan.info=S.SPECIAL\r
+                               $(      get.text()\r
+                                       switchon FIRSTCH of mbuffer into\r
+                                       $(\r
+                                       case ',':\r
+                                       case '.':\r
+                                       case ':':\r
+                                       case '-':\r
+                                               FIRSTCH of mbuffer_'*0'\r
+                                       default '*0' ... '*D':\r
+                                       $)\r
+                                       P1 of scan.info_SF.SHOUT\r
+                               $)\r
+                               resultis PTYPE of scan.info\r
+                       $)\r
+                       scan.info_fake.node(word)\r
+                       word_find.player(word)\r
+                       if word\=-1 then\r
+                       $(      if hidden(word) resultis false\r
+                               PTYPE of scan.info_S.PLAYER\r
+                               P1 of scan.info_word\r
+                               resultis S.PLAYER\r
+                       $)\r
+                       resultis false\r
+               case ',':\r
+               case '.':\r
+               case ':':\r
+               case '-':\r
+                       if conversing\r
+                       $(      get.text()\r
+                               resultis S.SPECIAL\r
+                       $)\r
+                       scanch_getch()\r
+                       resultis S.CONT\r
+               case '*"':\r
+                       scanch_getch()\r
+                       get.text()\r
+                       resultis S.SPECIAL\r
+               case ';':\r
+                       chcnt_0\r
+                       verb_0\r
+               case '*L' ... '*P':\r
+               case '*$':\r
+               case '*^G':\r
+               case '*E':\r
+                       scanch_-1\r
+                       resultis S.CONT\r
+               case ')':\r
+                       conversing_true\r
+                       endcase\r
+               case '(':\r
+                       conversing_false\r
+                       endcase\r
+               case '**':\r
+               case '>':\r
+                       if conversing\r
+                       $(      conversing_false\r
+                               out("*C*LLeaving converse mode.*C*L")\r
+                               resultis S.UNCONVERSE\r
+                       $)\r
+               default '*0' ... '*D':\r
+       $)\r
+       scanch_getch()\r
+$)     repeat\r
+and read.name()=valof\r
+$(     let linev,n=vec 127,0\r
+       while 'a'<=scanch<='z'\/'0'<=scanch<='9'\/'A'<=scanch<='Z' do   //use a case?\r
+       $(      n+:1\r
+               unless n>127 n!linev_'A'<=scanch<='Z'->scanch+#40,scanch\r
+               scanch_getch()\r
+       $)\r
+       !linev_n>127->127,n\r
+       resultis packstring(linev,name.string)\r
+$)\r
+and find.word(word,type,cont)=valof\r
+$(     let node=dictionary!((!word>>1) rem HASHSIZE)\r
+       switchon numbargs() into\r
+       $(      case 1:\r
+                       type_0\r
+               case 2:\r
+                       cont_0\r
+       $)\r
+       if cont then node_LINK of cont\r
+       while node do test seq(word,PNAME of node)/\(type=0\/PTYPE of node=type)/\\r
+               (PTYPE of node ne S.OBJECT \/ DREC of node ge #400000) then resultis node\r
+               or node of_LINK\r
+       resultis false\r
+$)\r
+and find.room(name)=valof\r
+$(     let node=?\r
+       name_sixbit(name)\r
+       node_index!((name>>1) rem HASHSIZE)\r
+       while node do test name=RNAME of node then resultis node\r
+               or node of_LINK\r
+       resultis false\r
+$)\r
+and fake.node(wd)=valof\r
+$(     let t=fake.string\r
+       fake.string_name.string\r
+       name.string_t\r
+       PNAME of fake_wd\r
+       P1 of fake_0\r
+       PTYPE of fake_0\r
+       resultis fake\r
+$)\r
+and find.player(name)=valof\r
+$(     /*\r
+      This procedure searches down the list of player names, and returns the player\r
+      number if found, otherwise -1.\r
+      */\r
+      for i=0 to 35 do if player.names!i if seq(name,player.names!i) resultis i\r
+      resultis -1                             //otherwise\r
+$)\r
+and get.text() be\r
+$(     read.message(mbuffer)\r
+       scan.info_fake.node(mbuffer)\r
+       PTYPE of scan.info_S.SPECIAL\r
+       P1 of scan.info_SF.QOTE\r
+       unless deaf\/us(PNAME of profile) if censor("richard") \/ censor(" roy")\r
+               out("*C*LIn the distance you hear a deep rumble of thunder.*C*L")\r
+$)\r
+and censor(password)=valof\r
+$(     let pw, txt=vec 127, vec 127\r
+       unpackstring(password, pw)\r
+       unpackstring(mbuffer,txt)\r
+       for i=1 to !pw pw!i bitor_#40\r
+       for i=1 to !txt txt!i bitor_#40\r
+       for i=1 to !txt-!pw+1 do if valof\r
+       $(      for j=1 to !pw\r
+               unless pw!j=txt!(i+j-1) resultis false\r
+               resultis true\r
+       $) resultis true\r
+       resultis false\r
+$)\r
diff --git a/MUD2.BCL b/MUD2.BCL
new file mode 100644 (file)
index 0000000..8170446
--- /dev/null
+++ b/MUD2.BCL
@@ -0,0 +1,463 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let handledemons(oldptr) be test bstr then return or\r
+jar(@delock)<> //Locking not needed for locals, but cheaper not to check\r
+$(     let ptr=!oldptr\r
+       while ptr\r
+       $(      unless E.SUSPENDED of ptr E.TIME of ptr -_1\r
+               test E.TIME of ptr ge #777770 then      //give 'em up to -8 in the database\r
+               $(      let oldvb,oldobj,oldins=verb,objct,instrmnt\r
+                       and demon=ptr+DOF\r
+                       verb, objct, instrmnt_D.VERB of demon, D.OBJECT of demon, D.INSTRUMENT of demon\r
+                       instate()\r
+                       LINK of oldptr_LINK of ptr\r
+                       if D.PLONK of demon plonk(demon)\r
+                       (ptr ge #400000->freemblock,free)(ptr)  //Hack! But isn't it all?\r
+                       ptr_LINK of oldptr\r
+                       unjar(@delock)\r
+                       action(true)\r
+                       jar(@delock)\r
+                       reinstate(oldvb, oldobj, oldins)\r
+               $) or\r
+               $(      oldptr_ptr\r
+                       ptr of_LINK\r
+               $)\r
+       $)\r
+       unjar(@delock)\r
+$)\r
+and move(mnum) be\r
+$(     let trvtab,t,looking=TRAVEL of room,?,numbargs()\r
+       unless looking mnum_DREC of verb\r
+       start.leading()\r
+       until LH of trvtab=RHMASK do test LH of trvtab bitand 1<<mnum then\r
+               test 1!trvtab then\r
+               $(      let v=CONDVAL of trvtab\r
+                       switchon CONDTYPE of trvtab into\r
+                       $(      case 0:                                         //mustn't be carrying anything\r
+                                       lose.followers()\r
+                                       unless CARRY.COUNT of profile do\r
+                                       $(      unless looking lastdir_mnum\r
+                                               move.sub(RH of trvtab,looking)\r
+                                               return\r
+                                       $)\r
+                                       endcase\r
+                               case 1:                                         //Must be carrying some v in prop 0\r
+                                       t_carrying.class(v,false,carry)\r
+                                       while t\r
+                                       $(      unless P4 of t then\r
+                                               $(      lose.followers()\r
+                                                       unless looking lastdir_mnum\r
+                                                       move.sub(RH of trvtab,looking)\r
+                                                       return\r
+                                               $)\r
+                                               t_carrying.class(v,false,LINK of t)\r
+                                       $)\r
+                                       endcase\r
+                               case 2:                                         //must be carrying some v or some be here in prop 0\r
+                               $(      let s,o=false,?\r
+                                       t_carrying(v,false,carry)\r
+                                       jar(lvrdoor)\r
+                                       unless t s_is.or.was.here(v,ROBJT of room)\r
+                                       o_t bitor s\r
+                                       while o\r
+                                       $(      if (P4 of o=0 \/ DESTROYED of o ls 0) then\r
+                                               $(      unjar(lvrdoor)\r
+                                                       if t lose.followers()\r
+                                                       unless looking lastdir_mnum\r
+                                                       move.sub(RH of trvtab,looking)\r
+                                                       return\r
+                                               $)\r
+                                               if t t_carrying(v,false,LINK of t)\r
+                                               unless t s_is.or.was.here(v,s->LINK of s,ROBJT of room)\r
+                                               o_t bitor s\r
+                                       $)\r
+                                       unjar(lvrdoor)\r
+                                       endcase\r
+                               $)\r
+                               case 3: looksee(looking)        //straight text message\r
+                                       longdescribe(v)\r
+                                       return\r
+                               case 4: if RH of trvtab ne oldroom then         //can't go way you came\r
+                                       $(      unless looking lastdir_mnum\r
+                                               move.sub(RH of trvtab,looking)\r
+                                               return\r
+                                       $)\r
+                                       endcase\r
+                               case 5:                                 //text message if carrying some v\r
+                                       if carrying.class(v,false,carry) do\r
+                                       $(      if looksee(looking)\r
+                                               longdescribe(RH of trvtab)\r
+                                               return\r
+                                       $)\r
+                                       endcase\r
+                               case 6:                                 //text message if carrying some v or some here in prop 0\r
+                               $(      let s,o=false,?\r
+                                       t_carrying(v,false,carry)\r
+                                       jar(lvrdoor)\r
+                                       unless t s_is.or.was.here(v,ROBJT of room)\r
+                                       o_t bitor s\r
+                                       while o\r
+                                       $(      if (P4 of o\=0\/ DESTROYED of o ls 0) then      //ne 0? Wonder why?!\r
+                                               $(      unjar(lvrdoor)\r
+                                                       looksee(looking)\r
+                                                       longdescribe(RH of trvtab)\r
+                                                       return\r
+                                               $)\r
+                                               if t t_carrying(v,false,LINK of t)\r
+                                               unless t s_is.or.was.here(v,s->LINK of s,ROBJT of room)\r
+                                               o_t bitor s\r
+                                       $)\r
+                                       unjar(lvrdoor)\r
+                                       endcase\r
+                               $)\r
+                               case 7:                                         //mustn't be carrying any v in prop 0\r
+                                       t_carrying.class(v,false,carry)\r
+                                       while t\r
+                                       $(      unless P4 of t endcase\r
+                                               t_carrying.class(v,false,LINK of t)\r
+                                       $)\r
+                                       lose.followers()\r
+                                       unless looking lastdir_mnum\r
+                                       move.sub(RH of trvtab,looking)\r
+                                       return\r
+                               case 8:                                         //mustn't be carrying any v or there be some in prop 0\r
+                               $(      let s,o=false,?\r
+                                       t_carrying(v,false,carry)\r
+                                       jar(lvrdoor)\r
+                                       unless t s_is.or.was.here(v,ROBJT of room)\r
+                                       o_t bitor s\r
+                                       while o\r
+                                       $(      if (P4 of o = 0) /\ (DESTROYED of o ge 0)\r
+                                               $(      unjar(lvrdoor)\r
+                                                       endcase\r
+                                               $)\r
+                                               if t t_carrying(v,false,LINK of t)\r
+                                               unless t s_is.or.was.here(v,s->LINK of s,ROBJT of room)\r
+                                               o_t bitor s\r
+                                       $)\r
+                                       unjar(lvrdoor)\r
+                                       unless looking lastdir_mnum\r
+                                       move.sub(RH of trvtab,looking)\r
+                                       return\r
+                               $)\r
+                               case 9:                                         //set off demon\r
+                                       if looking error("You can't tell.")\r
+                                       enable(v)\r
+                                       return\r
+                               case 10:\r
+                                       if looking error("You can't tell.")\r
+                                       oktogo()\r
+                                       longdescribe(v)\r
+                                       if WIZARD of profile ne 0 return\r
+                                       test spectacular then           //should be a procedure...\r
+                                       $(      drop.everything()\r
+                                               STAMINA of profile_STAMINA of profile<20 -> 10, (STAMINA of profile)-10\r
+                                               special(SF.SLEEP)\r
+                                       $) or\r
+                                       $(      oldroom_room\r
+                                               quit()\r
+                                       $)\r
+                                       endcase\r
+                       $)\r
+                       trvtab+:2\r
+               $)\r
+               or\r
+               $(      unless looking lastdir_mnum\r
+                       move.sub(RH of trvtab, looking)\r
+                       return\r
+               $) or trvtab+:2\r
+       if looking error("You can't tell.")\r
+       Error("You cannot go that way!")\r
+$)\r
+and move.sub(newrm, justlooking) be test numbargs()=2/\justlooking then\r
+$(     if FORCED of newrm newrm of_FORCED\r
+       test WIZARD of profile Describe(newrm,true) or\r
+       $(      if \(visible(newrm))\/\r
+                       ((A.DEATH  bitor A.NOLOOK) bitand ATTRIB of newrm) error("You can't tell.")\r
+               desc.short(newrm)\r
+               if A.HIDE bitand ATTRIB of newrm return\r
+               unless A.HIDEAWAY bitand ATTRIB of newrm\r
+               $(      let nd,nm,l,something=?,?,?,false\r
+                       Outz($az"Therein can be seen")\r
+                       lock(newrm+door)\r
+                       nd_ROBJT of newrm\r
+                       while nd do test DESTROYED of nd ls 0\/valof\r
+                       $(      let cprop=P4 of nd              //use WHERE instead?\r
+                               resultis (selector 18:18*(cprop rem 2):cprop/2+OBJECTSIZE+1) of nd=0\r
+                       $) then nd of_LINK or\r
+                       $(      nm_PNAME of nd\r
+                               l_LENGTH of nm\r
+                               test ccnt+l+1>72 then out("*C*L:S",nm) or out("*S:S",nm)\r
+                               something_true\r
+                               nd of_LINK\r
+                       $)\r
+                       unlock()\r
+                       unless something outz($az" nothing")\r
+                       outz($az".*C*L")\r
+               $)\r
+               for i=0 to 35 do if 1<<i bitand who!newrm unless invisible(i)\r
+               $(      let tt,tz=player.names!i,?\r
+                       tz_LH from tt\r
+                       Out(":P is there,:s carrying :i*C*L",tt, ASLEEP of tz->" asleep","",ROBJT of tz)\r
+               $)\r
+       $)\r
+$) or move.ser(newrm)\r
+and move.ser(newrm, no.option) be\r
+$(     oktogo()\r
+       unless (RELAXED\/us(me)) if A.CHAIN bitand ATTRIB of newrm\r
+               error("You can't leave that way, for magical reasons...sorry!")\r
+       if numbargs()\=2/\((max.obj()<OBJ.CARRIED of profile)\/(max.wt()<CARRY.COUNT of profile))/\(WIZARD of profile)=0\r
+               Error("You're too encumbered with objects to be able to move.")\r
+       if (A.SMALL bitand ATTRIB of newrm)/\(wizard of profile)=0 then unless newrm=room\r
+       $(      let bit, who.cpy = ?, who!newrm\r
+               test who.cpy then for I = 0 to 35 do\r
+               $(      bit_1<<i\r
+                       if (bit bitand who.cpy) /\(WIZARD of LH from player.names!I)=0 then\r
+                       $(      transmit(i,0,K.ITTE)\r
+                               error(":p is in the room already and it is too small for you both!", player.names!i)\r
+                       $)\r
+               $) or lose.followers()\r
+       $)\r
+       doownthing()\r
+       lose.joiners()\r
+       oldroom_room\r
+       unsetbit()\r
+       room_newrm\r
+       unless numbargs()=2 if FORCED of room oldroom_room<>room of_FORCED\r
+       if followers test A.DEATH bitand ATTRIB of room then lose.followers()\r
+               or broadcast(K.YFIM,followers,newrm)\r
+       CROOM of profile_room\r
+       lvrdoor_DOOR+room\r
+       setbit()\r
+       describe(room)\r
+       if (A.CHAIN bitand ATTRIB of room) then quit(INVADE of LEAVE of room,BCHEAD of LEAVE of room)\r
+       been.in(RNUMB of room)_true\r
+$)\r
+and oktogo() be\r
+for i=0 to 35 do if fight!i then\r
+test start.leading() then error("You are too involved in combat to follow anyone further") or\r
+       error("You can't leave in the middle of a fight unless you flee in some direction!")\r
+and moveobject(obj) be\r
+$(     let rm,trvtab,tracer,newrm,mnum,insides,ins,t,v,it.moves=\r
+               ?,?,?,?,?,CONTENTS of obj,insides->CONTS of insides,0,?,?,MOTN of obj\r
+       jar(@mvlock)\r
+       rm,trvtab,tracer_CURROOM of it.moves, TRAVEL of rm, trvtab\r
+       if LH of tracer=RHMASK unjar(@mvlock)<>return\r
+       until LH of tracer=RHMASK do tracer+_2\r
+       trvtab+_random((tracer-trvtab)/2)*2\r
+       mnum_LH of trvtab\r
+       for i=TRAVEL of rm to tracer-2 by 2 do if mnum bitand LH of i then\r
+       $(      v_CONDVAL of i\r
+               switchon CONDTYPE of i into\r
+               $(\r
+               case 0: if ins\r
+                       $(      unjar(@mvlock)\r
+                               instinctify(it.moves,rm,obj,ins)\r
+                               return\r
+                       $)\r
+               case 10:\r
+                       endcase\r
+               case 1:\r
+                       if classmatch(v,obj)/\P4 of obj=0 endcase\r
+                       t_carrying.class(v,false,ins)\r
+                       while t\r
+                       $(      unless P4 of t endcase\r
+                               t_carrying.class(v,false,LINK of t)\r
+                       $)\r
+                       unjar(@mvlock)\r
+                       instinctify(it.moves,rm,obj,ins)\r
+                       return\r
+               case 2:\r
+                       if LH of obj=v/\P4 of obj=0 endcase\r
+                       $(      let nd=ROBJT of rm\r
+                               while nd do\r
+                               $(      let t=LH of nd\r
+                                       if ((A.HIDEAWAY bitand attrib of rm) ne 0)/\(FIXED of nd=0)  nd_LINK of nd<>loop\r
+                                       test v=t/\((P4 of nd=0)\/(DESTROYED of nd ls 0)) then  endcase\r
+                                       or nd of_LINK\r
+                               $)\r
+                       $)\r
+                       t_carrying(v,false,ins)\r
+                       while t\r
+                       $(      unless P4 of t endcase\r
+                               t_carrying(v,false,LINK of t)\r
+                       $)\r
+               case 3: case 9:\r
+                       unjar(@mvlock)\r
+                       instinctify(it.moves,rm,obj,ins)\r
+                       return\r
+               case 4: if RH of i ne PREVROOM of it.moves endcase\r
+               case 5: case 6:                         //isn't this a bit unfair to the mobiles?\r
+                       unjar(@mvlock)\r
+                       instinctify(it.moves,rm,obj,ins)\r
+                       return\r
+               case 8: if LH of obj=v/\P4 of obj=0 endcase     //monsters can't block themselves...\r
+                       $(      let nd=ROBJT of rm\r
+                               while nd do\r
+                               $(      let t=LH of nd\r
+                                       if ((A.HIDEAWAY bitand attrib of rm) ne 0)/\(FIXED of nd=0) endcase\r
+                                       test v=t /\(P4 of nd=0)/\(DESTROYED of nd ge 0) then\r
+                                       $(      unjar(@mvlock)\r
+                                               instinctify(it.moves,rm,obj,ins)\r
+                                               return\r
+                                       $) or nd of_LINK\r
+                               $)\r
+                       $)\r
+                       t_carrying(v,false,ins)\r
+                       while t\r
+                       $(      unless P4 of t\r
+                               $(      unjar(@mvlock)\r
+                                       instinctify(it.moves,rm,obj,ins)\r
+                                       return\r
+                               $)\r
+                               t_carrying(v,false,LINK of t)\r
+                       $)\r
+                       endcase\r
+               case 7:\r
+                       t_carrying.class(v,false,ins)\r
+                       while t\r
+                       $(      unless P4 of t\r
+                               $(      unjar(@mvlock)\r
+                                       instinctify(it.moves,rm,obj,ins)\r
+                                       return\r
+                               $)\r
+                               t_carrying.class(v,false,LINK of t)\r
+                       $)\r
+                       endcase\r
+               $)\r
+               newrm_RH of i\r
+               if (A.HIDEAWAY bitand ATTRIB of newrm)\r
+               $(      unjar(@mvlock)\r
+                       instinctify(it.moves,rm,obj,ins)\r
+                       return\r
+               $)\r
+               if FORCED of newrm newrm of_FORCED\r
+               if (A.DEATH bitand ATTRIB of newrm) \/  newrm=rm \/\r
+                       (A.CHAIN bitand ATTRIB of newrm) \/ ((A.SMALL bitand ATTRIB of newrm)/\occupied(newrm,obj))\r
+               $(      unjar(@mvlock)\r
+                       instinctify(it.moves,rm,obj,ins)\r
+                       return\r
+               $)\r
+               lock(door+rm)\r
+               $(      let nd, oldnd=ROBJT of rm,rm+4\r
+                       until nd=obj do\r
+                       $(      oldnd_nd\r
+                               nd of_LINK\r
+                               unless nd\r
+                               $(      unlock()\r
+                                       unjar(@mvlock)\r
+                                       instinctify(it.moves,rm,obj,ins)\r
+                                       return\r
+                               $)\r
+                       $)\r
+                       LINK of oldnd_LINK of nd\r
+               $)\r
+               unlock()\r
+               lock(door+newrm)\r
+               pushlist(newrm+4,obj)\r
+               unlock()\r
+               CURROOM of it.moves_newrm\r
+               PREVROOM of it.moves_rm\r
+               unjar(@mvlock)\r
+               instinctify(it.moves,newrm, obj, ins)\r
+               $(      let who.from, who.to, snprs, chsrs = who!rm, who!newrm, SNOOPERS of MOTN of obj,CHASERS of MOTN of obj\r
+                       for j=0 to 35 do\r
+                       $(      let bit=1<<j\r
+                               test bit bitand who.from then transmit(j,0,K.SJL,obj) or\r
+                               if bit bitand who.to transmit(j,0,K.SJA,obj)    //maybe 1<<i should be assigned to summat...\r
+                               if bit bitand snprs transmit(j,0,K.OHM,obj)\r
+                               if bit bitand chsrs transmit(j,0,K.YFIM,RH of i)\r
+                       $)\r
+               $)\r
+               return\r
+       $)\r
+$)\r
+and looksee(looking) be test looking then Error("You can't tell.") or\r
+       unless visible() Error("You cannot go that way!")\r
+and instinctify(it.moves,newrm, obj, ins) be\r
+$(     let oldvb, oldobj, oldins, oldrm=verb, objct, instrmnt, room\r
+       and demon=INSTINCTS of it.moves\r
+       verb, objct, instrmnt, room_D.VERB of demon,\r
+               D.OBJECT of demon=#777777->find.word(PNAME of obj), D.OBJECT of demon,\r
+               D.INSTRUMENT of demon=#777777->find.word(PNAME of obj), D.INSTRUMENT of demon,\r
+               newrm\r
+       instate()\r
+       action(false)\r
+       reinstate(oldvb, oldobj, oldins)\r
+       room_oldrm\r
+$)\r
+and enabled(demonum) = valof\r
+$(     let ptr=events\r
+       while ptr test E.DEMONUM of ptr=demonum/\E.SUSPENDED of ptr=false then resultis true or ptr of_LINK\r
+       jar(@delock)\r
+       ptr_gdemons\r
+       while ptr test E.DEMONUM of ptr=demonum/\E.SUSPENDED of ptr=false then unjar(@delock)<>resultis true or ptr of_LINK\r
+       unjar(@delock)\r
+       resultis false\r
+$)\r
+and enable(demonum, old) be\r
+$(     let indx,demon,globald=demons+(DEMONSIZE+DOF)*demonum,?,D.GLOBAL of indx\r
+       unless 0 le demonum le max.demon.no return\r
+       if numbargs()=2\r
+       $(      let ptr,gotone=globald->gdemons, events,false\r
+               while ptr\r
+               $(      if E.DEMONUM of ptr=demonum/\E.SUSPENDED of ptr\r
+                       $(      E.SUSPENDED of ptr_false\r
+                               gotone_true\r
+                       $)\r
+                       ptr of_LINK\r
+               $)\r
+               if gotone return\r
+       $)\r
+       demon_globald->getmblock(),newvec(DEMONSIZE+DOF)\r
+       copy(indx, demon+DOF, DEMONSIZE)\r
+       E.TIME of demon+_random(D.OFFSET of indx)\r
+       jar(@delock)\r
+       !demon_(demonum<<18) bitor (globald->gdemons, events)\r
+       (globald->gdemons,events)_demon\r
+       unjar(@delock)\r
+$)\r
+and suspend(ptr, demonum) be while ptr\r
+$(     if E.DEMONUM of ptr=demonum E.SUSPENDED of ptr_true\r
+       ptr of_LINK\r
+$)\r
+and disenable(demonum) =valof\r
+$(     let ptr, oldptr=events,@events\r
+       while ptr\r
+       $(      if E.DEMONUM of ptr=demonum\r
+               $(      LINK of oldptr_LINK of ptr\r
+                       free(ptr)\r
+                       resultis true\r
+               $)\r
+               oldptr_ptr\r
+               ptr of_LINK\r
+       $)\r
+       jar(@delock)\r
+       ptr, oldptr_gdemons, @gdemons\r
+       while ptr\r
+       $(      if E.DEMONUM of ptr=demonum\r
+               $(      LINK of oldptr_LINK of ptr\r
+                       freemblock(ptr)\r
+                       unjar(@delock)\r
+                       resultis true\r
+               $)\r
+               oldptr_ptr\r
+               ptr of_LINK\r
+       $)\r
+       unjar(@delock)\r
+       resultis false\r
+$)\r
diff --git a/MUD3.BCL b/MUD3.BCL
new file mode 100644 (file)
index 0000000..c3a6934
--- /dev/null
+++ b/MUD3.BCL
@@ -0,0 +1,344 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let error(message,f1,f2,f3) be\r
+$(     outs("*C*L")\r
+       checksnoop(SNOOPROMPT)\r
+       test numbargs() then echo()<>out(message,f1,f2,f3)<>outs("*C*L") or\r
+       outstr(strtab,5)\r
+       flush()\r
+       jump(mainloop)\r
+$)\r
+and private() be\r
+$(     olog, osnop_logstr, snoopedon\r
+       logstr, snoopedon_0,false\r
+$)\r
+and public() be\r
+$(     logstr, snoopedon_olog, osnop\r
+$)\r
+and reinstate(ov, oo, oi) be\r
+$(     verb, objct, instrmnt_ov, oo, oi\r
+       instate()\r
+$)\r
+and instate() be verbname,objname,insname_\r
+       verb->PNAME of verb, "", PNAME of objct, instrmnt->PNAME of instrmnt, ""\r
+and playing(sm) = valof\r
+$(     sm_(1<<(sm-2))*EXP.STEP\r
+       for i=0 to 35 if player.names!i\r
+       $(      let prof=LH from player.names!i\r
+               if SCORE of prof ge sm\/WIZARD of prof=1 resultis true\r
+       $)\r
+       resultis false\r
+$)\r
+and normalise(attrib, max) be\r
+$(     if attrib of profile > max attrib of profile_max\r
+       unless attrib=STAMINA if attrib of profile <10 attrib of profile_10\r
+$)\r
+and setexp(o1,nolose,asking) =valof\r
+$(     let ans=?\r
+       unless numbargs()=3 asking_false\r
+       unless asking if (WIZARD of profile)=1 return\r
+       ans_(P4 of o1=SCOREPROP of o1 \/P1 of o1=1 \/ RANDM of o1 ne 0)-> valof\r
+       $(      let res=VALUE of o1\r
+               $[      $hrre   1,      res\r
+                       $movem  1,      res\r
+               $]\r
+               if res le 0 /\ numbargs()=2 resultis 0\r
+               if P1 of o1=1 \/ RANDM of o1 then res*_(P4 of o1)+1\r
+               resultis extra(res)\r
+       $),0\r
+       if asking resultis ans\r
+       setscore(ans)\r
+$)\r
+and setscore(pts, okberserk) be if pts\r
+$(     let oldlev,newlev=player.level(),?\r
+       unless numbargs()=2 okberserk_1\r
+       test BZK/\BERSERK of profile then unless numbargs()=2 return\r
+               or okberserk_1\r
+       unless pts ls 0 if INVIS of profile return\r
+       SCORE of profile+_pts*okberserk\r
+       if SCORE of profile ls 0 SCORE of profile_0\r
+       newlev_player.level()\r
+       if newlev ne oldlev\r
+       $(      let alter=newlev gr oldlev->boost, unboost\r
+               Out("Your level of experience is now :P.*C*L",(SEX of profile->female,male)!newlev)\r
+               unless us(me) sendall(true,K.IHCL,false,true,(newlev<<18)+oldlev)\r
+               alter(STRENGTH)\r
+               alter(DEXTERITY)\r
+               alter(STAMINA)\r
+               alter(STAMINAMAX)\r
+               if newlev=MAX.LEVEL unless BZK/\BERSERK of profile\r
+                       out("You can now enter :s mode, but I suggest you save your persona first...*C*L",\r
+                               (SEX of profile->female, male)!MAX.LEVEL)\r
+       $)\r
+$)\r
+and read.message(addr) be\r
+$(     if chcnt>0 while scanch='*S'\/scanch='*T' do scanch_getch()\r
+       unless chcnt>0/\scanch ne '*C' then\r
+       $(      outz($az"OK, tell me the message:*C*L")\r
+               if scanch='*C' scanch_getch()\r
+               check.stuff()\r
+               scanch_getch()\r
+       $)\r
+       nextch,chcnt-:1,-1\r
+       chcnt_chcnt-(linebuffer!(!linebuffer-1)='*C'->2,1)\r
+       !nextch_chcnt>69->69,chcnt\r
+       while !nextch /\ nextch!!nextch ls ' ' then !nextch-_1\r
+       packstring(nextch,addr)\r
+       reset()\r
+$)\r
+and check.gone() be\r
+$(     unless active!player.no=-1 return\r
+       unjar(@deldr)\r
+       out("*C*LTime out! :6 has lost contact with you!*C*L", mud6)\r
+       out("You have been exorcised from the game.*C*L")\r
+       if detch() run($6"sys", $6"logout", $6"exe", 0)\r
+       finish\r
+$)\r
+and dormant() be\r
+$(     jar(@deldr)\r
+       check.gone()\r
+       active!player.no_-2\r
+       unjar(@deldr)\r
+$)\r
+and alive() be\r
+$(     jar(@deldr)\r
+       active!player.no_valof\r
+       $[      $mstime 1,      0       $]\r
+       unjar(@deldr)\r
+$)\r
+and flush() be\r
+$(     objct_fake.node("that")\r
+       him_0\r
+       her_0\r
+       them_0\r
+       it_0\r
+       there_0\r
+       instrmnt_0\r
+       verb_0\r
+       chcnt_0\r
+       scanch_-1\r
+$)\r
+and nextnum(def)=valof\r
+$(     let ans=?\r
+       check.stuff()\r
+       scanch_getch()\r
+       ans_getnum()\r
+       resultis ans->ans,def\r
+$)\r
+and swap(lvone,lvtwo) be\r
+$(     let three=!lvone\r
+       !lvone_!lvtwo\r
+       !lvtwo_three\r
+$)\r
+and swapobjins() be\r
+$(     swap(@objct, @instrmnt)\r
+       swap(@objname, @insname)\r
+       if objct=0 objct_fake.node("that")<>objname_"that"\r
+$)\r
+and gettrue()=valof\r
+$(     swap(@getnum, @gettrue)\r
+       resultis true\r
+$)\r
+and getnum()=valof\r
+$(     let res=0\r
+       if chcnt>0 then\r
+       $(      while scanch='*S' \/ scanch='*T' do scanch_getch()\r
+               while '0' le scanch le '9' do res_res*10+scanch-'0'<>scanch_getch()\r
+       $)\r
+       reset()\r
+       resultis res\r
+$)\r
+and place(room) = valof\r
+$(     let rm=0\r
+       if WIZARD of profile=1/\instrmnt\r
+       $(      rm_find.room(insname)\r
+               if rm rm_LH of rm\r
+       $)\r
+       resultis rm->rm,room\r
+$)\r
+and killmonster(it) be if MOTN of it\r
+$(     let moit,watchers,chsrs,insides,ins,rm=\r
+       MOTN of it,SNOOPERS of moit,CHASERS of moit,CONTENTS of it,insides->CONTS of insides,0,CURROOM of moit\r
+       for i=0 to 35 do\r
+       $(      let bit=1<<i\r
+               if bit bitand watchers transmit(i,0,K.OHD,it)\r
+               if bit bitand chsrs transmit(i,0,K.SFM)\r
+       $)\r
+       CHASERS of moit_0\r
+       SNOOPERS of moit_0\r
+       if rm/\ins\r
+       $(      jar(DOOR+rm)\r
+               ins_unlink(insides)\r
+               while ins do\r
+               $(      WTUSED of insides-_WEIGHT of ins\r
+                       WEIGHT of it-_WEIGHT of ins\r
+                       pushlist(rm+4,ins)\r
+                       infrm(ins,it,K.MDROPT)\r
+                       broadcast(K.SHBD,who!rm,ins,true)\r
+                       ins_unlink(insides)\r
+               $)\r
+               unjar(DOOR+rm)\r
+       $)\r
+$)\r
+and invisible(prf)=valof\r
+$(     if fodsville resultis false\r
+       if 0 le prf le 35 prf_LH from player.names!prf\r
+       if prf=profile resultis false\r
+       unless INVIS of prf resultis false\r
+       if us(PNAME of prf) unless us(me) resultis true\r
+       unless WIZARD of profile resultis true\r
+       resultis false\r
+$)\r
+and visible(rm)=valof\r
+$(     let nd=?\r
+       if WIZARD of profile resultis true\r
+       if blind resultis false\r
+       unless numbargs() rm_room\r
+       if A.LIGHT bitand ATTRIB of rm resultis true\r
+       lock(rm+door)\r
+       nd_ROBJT of rm\r
+       while nd do\r
+       $(      if luminous(nd, BRIGHT) unlock()<>resultis true\r
+               nd of_LINK\r
+       $)\r
+       unlock()\r
+       for i=0 to 35 do if (1<<i) bitand who!rm do unless invisible(i)\r
+       $(      let nd=LH from player.names!i\r
+               if WIZARD of nd resultis true\r
+               nd_ROBJT of nd\r
+               while nd do\r
+               test luminous(nd, BRIGHT) then resultis true\r
+               or nd of_LINK\r
+       $)\r
+       resultis false\r
+$)\r
+and luminous(obj, sel)=valof\r
+$(     if (sel of obj)/\(P4 of obj=0) resultis true\r
+       if CONTENTS of obj ne 0/\ TRANSPARENT of CONTENTS of obj ne 0/\ P4 of obj=0\r
+       $(      let nd=CONTS of CONTENTS of obj\r
+               while nd do\r
+               $(      if luminous(nd, sel) resultis true\r
+                       nd of_LINK\r
+               $)\r
+       $)\r
+       resultis false\r
+$)\r
+and setprop(obj,val,sm) be\r
+$(     let oldprop,objmotn=P4 of obj,MOTN of obj\r
+       P4 of obj_val\r
+       if objmotn/\val ne oldprop\r
+       $(      let watchers,chsrs,v=SNOOPERS of objmotn, CHASERS of objmotn,WEIGHT of obj-WTHRESHOLD\r
+               for i=0 to 35\r
+               $(      let bit=1<<i\r
+                       if bit bitand watchers transmit(i,0,K.OHD,obj)\r
+                       if (bit bitand chsrs)/\oldprop=0 transmit(i,0,K.SFM)\r
+               $)\r
+               SNOOPERS of objmotn, CHASERS of objmotn_0,0\r
+               if v>0/\holding(obj)\r
+               test val then unless oldprop\r
+               $(      OBJ.EXTRA of profile-_(v/WTHRESHOLD)+1\r
+                       WT.EXTRA of profile-_v\r
+               $) or\r
+               $(      OBJ.EXTRA of profile+_(v/WTHRESHOLD)+1\r
+                       WT.EXTRA of profile+_v\r
+               $)\r
+       $)\r
+       unless numbargs()=3 return\r
+       longdescribe(sm)\r
+$)\r
+and hidden(pnum) = valof\r
+$(     let prf=LH from player.names!pnum\r
+       if invisible(prf) resultis true\r
+       pnum_CROOM of prf\r
+       resultis pnum=0\/\r
+       (WIZARD of profile=1\/flipping -> false, A.HIDE bitand (ATTRIB of pnum))\r
+$)\r
+and dud(one,two) be return\r
+and person(objct) be\r
+$(     if PTYPE of objct = S.PLAYER /\ hidden(P1 of objct)=0 return\r
+       error(":U is not a player.",objname)\r
+$)\r
+and reset() be\r
+$[     $setom          scanch\r
+       $setzm          chcnt\r
+       $move   1,      objname\r
+       $move   1,      0(ac)\r
+       $came   1,      bufull\r
+       $(      return  $)\r
+       $move   1,      rep1\r
+       $add    1,      rep2\r
+       $hlrz   1,      0(ac)\r
+       $movem  13,     3(ac)\r
+$]\r
\r
+and sb(num) = valof\r
+$(     res6_0\r
+       until num=0 do\r
+       $(      res6_(res6>>6) bitor ((num rem 10 +#20)<<30)\r
+               num /_10\r
+       $)\r
+       resultis @res6\r
+$)\r
+and player.level(prof)=valof\r
+$(     let scr=SCORE of (numbargs()->prof, profile)\r
+       for i=0 to MAX.LEVEL do if (1<<i)*EXP.STEP gr scr resultis i\r
+       resultis MAX.LEVEL\r
+$)\r
+and checkout(block) be\r
+if STAMINA of profile<=0 then\r
+test us(me)\/(WIZARD of profile ne 0/\realwiz(me)) then STAMINA of profile_STAMINAMAX of profile or\r
+$(     let nam=PNAME of profile and pts=SCORE of profile\r
+       and mpts=EXP.STEP*(1<<(MAX.LEVEL-1)) and them=player.no\r
+       if pts gr mpts pts_mpts\r
+       pts_DEADPTS+pts/((2-(BZK->(BERSERK of profile), 1))*12)\r
+       if numbargs()\r
+       $(      fightmess(B.IMDEAD,0)           //player 0 will do some extra work...\r
+               freemblock(block)\r
+       $)\r
+       for i=0 to 35 do if fight!i\r
+       $(      test i=player.no then if MOTN of fight!i FIGHTS of MOTN of fight!i bitand_\player.bit or\r
+               $(      block_getmblock()\r
+                       if block\r
+                       $(      block!3_!nam\r
+                               block!4_1!nam\r
+                               send(i, block, K.IMDD,pts)\r
+                               them_i\r
+                       $)\r
+               $)\r
+               fight!i_0\r
+       $)\r
+       if them ne player.no\r
+       $(      let tmp=?\r
+               private()\r
+               tmp_Createtmp($6"where", Label(tish))\r
+               Writeno(tmp,valof\r
+               $[      $move   ac,     them\r
+                       $add    ac,     jobnos\r
+                       $move   ac,     0(ac)\r
+                       $trmno. ac,     0\r
+                       $seto   ac,     0\r
+                       $gtntn. ac,     0\r
+                       $seto   ac,     0\r
+               $])\r
+               Close(tmp)\r
+               if false\r
+tish:          Writes(tty, "*C*LCan't create the .TMP file for WHERE.*C*L")\r
+               public()\r
+       $)\r
+       quit()\r
+$)\r
+and extra(pts)=3*pts-((4*pts)/(player+2))\r
diff --git a/MUD4.BCL b/MUD4.BCL
new file mode 100644 (file)
index 0000000..02ab58d
--- /dev/null
+++ b/MUD4.BCL
@@ -0,0 +1,245 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let occupied(room,obj)=valof\r
+$(     let who.copy=who!room\r
+       unless who.copy resultis false\r
+       broadcast(K.STTE,who.copy,PNAME of obj)\r
+       resultis true\r
+$)\r
+and start.leading() = valof test not leading then\r
+$(     transmit(leading,0,K.ISFY)\r
+       leading_true\r
+       resultis true\r
+$) or test animal then\r
+$(     CHASERS of MOTN of animal bitand_\player.bit\r
+       animal_false\r
+       resultis true\r
+$) or resultis false\r
+and lose.followers() be if followers then\r
+$(     broadcast(K.SFM,followers)\r
+       followers_0\r
+$)\r
+and doownthing() = valof test not frontman\r
+$(     transmit(frontman, 0, K.ISJY)\r
+       frontman_true\r
+       resultis true\r
+$) or resultis false\r
+and lose.joiners() be if joined then\r
+$(     broadcast(K.SJM,joined)\r
+       joined_0\r
+$)\r
+and break.off() be\r
+$(     lose.followers()\r
+       start.leading()\r
+       lose.joiners()\r
+       doownthing()\r
+$)\r
+and new.stamina(pno) =valof\r
+$(     let prof, val, smax=?, ?, ?\r
+       unless numbargs() pno_player.no\r
+       prof_LH from player.names!pno\r
+       unless ASLEEP of prof resultis STAMINA of prof\r
+       val_can.wake(pno)\r
+       val+_STAMINA of prof\r
+       smax_STAMINAMAX of prof\r
+       if val gr smax val_smax\r
+       resultis val\r
+$)\r
+and can.wake(pno)=(ud.time()-kips!(numbargs()->pno,player.no))/SDIV\r
+and wake.up() be\r
+$(     unless ASLEEP of profile return\r
+       out("You wake up.*C*L")\r
+       broadcast(K.IHWU, who.copy)\r
+       STAMINA of profile_new.stamina()\r
+       kips!player.no_false\r
+       ASLEEP of profile_false\r
+       out("Your stamina is now :N.*C*L", STAMINA of profile)\r
+$)\r
+and fightmess(what, snd, deadname) be\r
+$(     let str, who=vec 26, valof\r
+       test snd=player.no then\r
+       $(      let name=numbargs()=3->deadname,PNAME of fight!player.no\r
+               !str_!"*0the"\r
+               1!str_!name\r
+               2!str_1!name\r
+               LENGTH of str+_((LENGTH bitor 1) of str)+1\r
+               (LENGTH bitor 1) of str_'*S'\r
+               resultis str\r
+       $) or resultis numbargs()=3->deadname, player.names!snd\r
+       switchon what into\r
+       $(\r
+       case B.START:\r
+               out("You :r that :p is :r at you :r...*C*L", 16, who, 1, 2)\r
+               endcase\r
+       case B.IHIT:\r
+               out("You :r :p with a :r :r!*C*L", 3, who, 4, 5)\r
+               endcase\r
+       case B.THEYMISS:\r
+               out("You :r :r a :r :r :r :p.*C*L", 22, 6, 7, 5, 9, who)\r
+               endcase\r
+       case B.IMISS:\r
+               out("Your :r :r is :r :p.*C*L", 7, 5, 10, who)\r
+               endcase\r
+       case B.THEYHIT:\r
+               test random(3) then out("The :r of a :r :r :p sends you :r.*C*L", 12, 5, 9, who, 21)\r
+               or out("You are :r by the :r of a :r :r :p!*C*L", 11, 12, 5, 9, who)\r
+               endcase\r
+       case B.IMDEAD:\r
+               out("You can :r your :r :r...*C*L", 13, 14, 15)\r
+               endcase\r
+       case B.IMOK:\r
+               out(":r you :r, and :r into the :r.*C*L", 17, 18, 19, 8)\r
+               endcase\r
+       case B.IHITBACK:\r
+               out("Your :r :r sends :p :r!*C*L", 20, 5, who, 21)              \r
+               endcase\r
+       case B.IMISSAGAIN:\r
+               out("Your :r :r :r at :p is :r :r.*C*L", 7, 20, 5, who, 22, 23)\r
+               endcase\r
+       case B.VICTORY:\r
+               out("Your last :r :r :U!*C*L", 5, 24, who)\r
+               endcase\r
+       $)\r
+       unless snd=player.no hibernate()\r
+$)\r
+and ch.sendlevel(hmm) be\r
+$(     let l=(DREC of hmm)\r
+       if l=max.level unless WIZARD of profile\r
+               error("Only immortals may speak to immortals in this way.")\r
+       sendlevel(l-1)\r
+$)\r
+and sendlevel(l) be\r
+$(     let cn,sc1,sc2=?,(1<<l)*EXP.STEP,(1<<(l+1))*EXP.STEP\r
+       test chcnt>0 then\r
+       $(      read.message(mbuffer)\r
+               cn_(LENGTH of mbuffer)/5\r
+               cn_cn>13->13,cn\r
+       $) or return\r
+       for i=0 to 35 if i ne player.no /\ player.names!i\r
+       $(      let pr=LH from player.names!i\r
+               if (l=max.level-1/\(WIZARD of pr ne 0\/SCORE of pr ge sc1))\/(sc1 le SCORE of pr ls sc2)\r
+               $(      let mb=getmblock()\r
+                       unless mb return\r
+                       transmit(i, 0, K.ISCY, verbname)\r
+                       copy(mbuffer, mb+2, cn)\r
+                       send(i, mb, K.TEXT, mb!2)\r
+               $)\r
+       $)\r
+$)\r
+and sendall(bits,fn,always,wizonly,val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14) be\r
+if bits for i=0 to 35 if player.no \= i if bits bitand (1<<i)\r
+$(     let p, vals=player.names!i, numbargs()-5\r
+       unless p loop\r
+       p_LH from p\r
+       if ~wizonly \/ WIZARD of p ne 0\r
+//     if SNOOPBIT of p=0\/((1<<i) bitand snoopedon) ne 0\r
+       if always \/ (A.SILENT bitand ATTRIB of CROOM of p) =0\r
+       $(      let b,ptr,inf=getmblock(vals le 0),@val1,b+2\r
+               if vals ge 0 copy(ptr,inf, vals)\r
+               send(i,b,fn,!inf)\r
+       $)\r
+$)\r
+and unsnoop(silent) be\r
+$(     if snobj\r
+       $(      SNOOPERS of MOTN of snobj bitand_\player.bit\r
+               unless numbargs() Out("You have stopped snooping on the :P.*C*L",PNAME of snobj)\r
+               snobj_false\r
+       $)\r
+       if \snooping\r
+       $(      unless numbargs() out("You have stopped snooping on :p.*C*L",player.names!snooping)\r
+               them_0\r
+               (SEX of LH from player.names!snooping->her,him)_0\r
+               transmit(snooping, 0, K.IWSS)\r
+               snooping_true                   //that is to say, false...\r
+               SNOOPBIT of profile_false\r
+       $)\r
+$)\r
+and announcechange() be sendall(true,K.WM,true,false)\r
+and stop.fighting(fleeing) be\r
+$(     let fighting=false\r
+       for i=0 to 35 do if fight!i\r
+       $(      fighting_true\r
+               test i=player.no then if MOTN of fight!i FIGHTS of MOTN of fight!i bitand_\player.bit\r
+               or transmit(i,0,K.IFFY, verb\/((SCORE of profile gr FLEELOSS->((player.level()+1)*FLEELOSS*numbargs()),SCORE of profile)<<18))\r
+               fight!i_false\r
+       $)\r
+       if fighting/\numbargs()\r
+       $(      out("You drop everything as you make your tactical withdrawal...*C*L")\r
+               drop.everything()\r
+               setscore((player.level()+1)*2*-FLEELOSS)\r
+       $)\r
+       quitflg_true\r
+$)\r
+and unfollow() be      //the same as unsnoop...\r
+$(     if animal\r
+       $(      CHASERS of MOTN of animal bitand_\player.bit\r
+               out("You have stopped following the :P.*C*L", PNAME of animal)\r
+               animal_false\r
+       $)\r
+       if \leading\r
+       $(      transmit(leading,0,K.ISFY)\r
+               out("You have stopped following :P.*C*L", player.names!leading)\r
+               leading_true\r
+       $)\r
+$)\r
+and inform(nd,token) be if MOTN of nd broadcast(token, SNOOPERS of MOTN of nd, nd,true)\r
+and stopmoving(nd) be\r
+$(     let mobile=MOTN of nd\r
+       unless mobile return\r
+       !mobile_0\r
+       broadcast(K.SFM,CHASERS of mobile, nd,true)\r
+       CHASERS of mobile_false\r
+$)\r
+and broadcast(token,bits,info,to.me) be\r
+$(     unless numbargs()=4 bits bitand_\player.bit\r
+       unless bits return\r
+       for i=0 to 35 if (1<<i) bitand bits\r
+       transmit(i, 0, token, info)\r
+$)\r
+and infrm(nd,bag,token) be\r
+       sendall(SNOOPERS of MOTN of bag,token,true,false,nd,PNAME of bag)\r
+and bashfull() be\r
+$(     if snoopedon broadcast(K.SSNO, snoopedon,SEX of profile)\r
+       snoopedon_false\r
+$)\r
+and send(dst,blk,fn,val) be\r
+$(     let nd,oldnd=?,?\r
+       unless blk blk_getmblock()\r
+       if numbargs()<4 val_0\r
+       unless player.names!dst/\(JBNUM of LH from player.names!dst) do //If he's dead we can't send him a\r
+       $(      fight!dst_0             //packet. So zero the fight entry\r
+               freemblock(blk)         //and give back the block we would\r
+               return                  //have used to the freelist\r
+       $)\r
+       LH of blk_player.no\r
+       FUNC of blk,LINK of blk_fn,0\r
+       INFO of blk_val\r
+       jar(queue.doors+dst)\r
+       nd,oldnd_queue!dst,queue+dst\r
+       while nd do oldnd_nd<>nd of_LINK\r
+       LINK of oldnd_blk\r
+       unjar(queue.doors+dst)\r
+       unless dst=player.no\r
+       $[      $move   ac,     dst\r
+               $add    ac,     jobnos\r
+               $move   ac,     0(ac)   //I should've used block instead of vec\r
+               $wake   ac,     0\r
+               $trn\r
+       $]\r
+$)\r
+and transmit(dst,blk,fn,val) be\r
+       send(dst,blk->blk,getmblock(true),fn,numbargs()<4->0,val)\r
diff --git a/MUD5.BCL b/MUD5.BCL
new file mode 100644 (file)
index 0000000..f46b4ec
--- /dev/null
+++ b/MUD5.BCL
@@ -0,0 +1,2068 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let special(sftype) be\r
+$(     let cn,nd,nm,l=0,?,?,?\r
+       switchon sftype into\r
+       $(      case SF.TELL: //Tell\r
+                       if dumb error("You can't tell anyone anything, you're dumb.")\r
+                       if PTYPE of objct=S.LEVEL\r
+                       $(      ch.sendlevel(objct)\r
+                               endcase\r
+                       $)\r
+                       interact(I.TELL)\r
+                       endcase\r
+               case SF.SAY: //Say\r
+                       if dumb error("You can't say anything, you're dumb.")\r
+                       out("*':s*'*C*L",objname)\r
+                       endcase\r
+               case SF.FLUSH:\r
+                       flush()\r
+                       endcase\r
+               case SF.GET: //Get\r
+                       test PTYPE of instrmnt=S.PLAYER then\r
+                       $(      swapobjins()\r
+                               interact(I.STEAL)\r
+                               swapobjins()\r
+                       $) or switchon PTYPE of objct into\r
+                       $(      case S.OBJECT:\r
+                                       gett()\r
+                                       endcase\r
+                               case S.ALL:\r
+                                       test RELAXED/\WIZARD of profile=1/\(spectacular=0\/(spectacular ne 0/\maint)) then get.all() or\r
+                                       test spectacular/\(WIZARD of profile=0) then Error("Not during a spectacular!") or\r
+                                       $(      let newnd,nd,portal,gotone,all=?,?,DOOR+place(room),false,objct\r
+                                               unless A.HIDEAWAY bitand ATTRIB of room\r
+                                               $(      lockup(@nd,@newnd)\r
+                                                       while nd do\r
+                                                       $(      newnd_LINK of nd\r
+                                                               unless FIXED of nd ne 0\/NOGET of nd ne 0\/(DESTROYED of nd ls 0)       //the ne 0's are needed\r
+                                                               $(      objct_find.word(PNAME of nd)\r
+                                                                       objname_PNAME of objct\r
+                                                                       unlock()\r
+                                                                       action()\r
+                                                                       gotone_true\r
+                                                                       lock(portal)\r
+                                                               $)\r
+                                                               nd_newnd                //2 simultaneous get alls will cause trouble...\r
+                                                       $)\r
+                                                       unlock()\r
+                                               $)\r
+                                               unless gotone error("Nothing taken.")\r
+                                               objct_all\r
+                                               objname_PNAME of objct          //needed?\r
+                                       $)\r
+                                       endcase\r
+                               case S.CLASS:\r
+                                       get.class()\r
+                                       endcase\r
+                               case S.PLAYER:\r
+                                       interact(I.STEAL)\r
+                               default:\r
+                                       error("I don't know what :s means.",objname)\r
+                       $)\r
+                       endcase\r
+               case SF.KEEP:\r
+                       $(      let val=?\r
+                               test PTYPE of objct=S.OBJECT then\r
+                                       val_(D1 of DREC of objct)<<18\/objname or\r
+                               test PTYPE of objct=S.CLASS /\ valof\r
+                                       $(      val_toting.class(P1 of objct)\r
+                                               resultis val\r
+                                       $) then val_(PTYPE of val)<<18\/(PNAME of val)\r
+                               or error("You can only keep hold of objects.")\r
+                               if val=kept out("You're already keeping :s.*C*L",objname)<>endcase\r
+                               if kept /\ toting(LH from kept) out("Stopped keeping :s. ", kept)\r
+                               out("Keeping :s.*C*L", objname)\r
+                               kept_val\r
+                               endcase\r
+                       $)\r
+               case SF.UNKEEP:\r
+                       test kept then\r
+                       $(      out(":U unkept.*C*L", kept)\r
+                               kept_0\r
+                       $) or outs("You aren't keeping anything anyway!*C*L")\r
+                       endcase\r
+               case SF.DROP: //Drop\r
+                       test PTYPE of instrmnt=S.PLAYER then\r
+                       $(      swapobjins()\r
+                               interact(I.GIVE)\r
+                               swapobjins()\r
+                       $) or\r
+                       switchon PTYPE of objct into\r
+                       $(      case S.OBJECT:\r
+                                       drop()\r
+                                       endcase\r
+                               case S.ALL:\r
+                                       test RELAXED/\WIZARD of profile=1/\(spectacular=0\/(spectacular ne 0/\maint)) then drop.everything(true) or\r
+                                       $(      let all=objct\r
+                                               and ptr=carry\r
+                                               objname_PNAME of objct\r
+                                               unless carry error("You aren't carrying anything!")\r
+                                               while ptr test PTYPE of ptr=LH from kept then\r
+                                               $(      out(":U kept.*C*L", PNAME of ptr)\r
+                                                       ptr of_LINK\r
+                                               $) or\r
+                                               $(      let nd=LINK of ptr\r
+                                                       objct_find.word(PNAME of ptr)\r
+                                                       action()\r
+                                                       ptr_nd\r
+                                               $)\r
+                                               objct_all\r
+                                               objname_PNAME of objct  //needed?\r
+                                       $)\r
+                                       endcase\r
+                               case S.CLASS:\r
+                                       drop.class()\r
+                                       endcase\r
+                               case S.PLAYER:\r
+                                       interact(I.GIVE)\r
+                                       endcase\r
+                               default:\r
+                                       error("I don't know what :s means.",objname)\r
+                       $)\r
+                       endcase\r
+               case SF.BYE:\r
+                       checkforced()\r
+                       test RELAXED then Quit(true) or quit()\r
+                       endcase\r
+               case SF.SGO:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless us(me) then error()\r
+                               unless WIZARD of profile Error()\r
+                               $(      let game=Sixbit(objname)\r
+                                       scanner()\r
+                                       quit(PNAME of scan.info,game)\r
+                               $)\r
+                               endcase\r
+                       $)\r
+               CASE SF.KILL:   case SF.PROVOKE:\r
+                       if peace test sftype=SF.PROVOKE then Jump(mainloop) or Error("Fighting is currently forbidden.")\r
+                       test PTYPE of objct = S.PLAYER then interact(I.KILL) or\r
+                       $(      let obj, tipe, watchers,wiz=?, PTYPE of objct, 0,who.copy\r
+                               unless tipe=S.OBJECT\/tipe=S.CLASS error(":U is not a player.", objname)\r
+                               obj_tipe=S.CLASS-> PTYPE of valof\r
+                               $(      let v=here.or.toting.class(P1 of objct)\r
+                                       unless v error("You can't :s that!", verbname)\r
+                                       resultis v\r
+                               $), D1 of DREC of objct\r
+                               obj_here.or.toting(obj)\r
+                               test sftype=SF.KILL then\r
+                               $(      unless objct ne fake error("To use the verb :p you have to give someone's name!", verbname)\r
+                                       unless DESTROYED of obj gr 0 error("You can't :s that!", verbname)\r
+                                       if fight!player.no=obj error("You're already fighting the :s!", objname)\r
+                                       if fight!player.no error("You can't fight more than one non-player at once!")\r
+                               $) or\r
+                               $(      if fight!player.no ne 0\/obj=0 jump(mainloop)\r
+                                       out("You are attacked by the :p!*C*L",objname)\r
+                               $)\r
+                               quitflg_false\r
+                               if MOTN of obj\r
+                               $(      FIGHTS of MOTN of obj bitor_player.bit\r
+                                       watchers_SNOOPERS of MOTN of obj\r
+                               $)\r
+                               fight!player.no_obj\r
+                               for i=0 to 35 if player.names!i/\WIZARD of LH from player.names!i ne 0 wiz bitor_1<<i\r
+                               sendall(wiz,sftype=SF.PROVOKE->K.MFM,K.IFM,false,false,objname)\r
+                               test sftype=SF.KILL then\r
+                               send(player.no, 0, WIZARD of profile->K.ISAHM,\r
+                                       DEXTERITY of profile gr 60->K.ISAHM, K.ISAMM, WIZARD of profile->10000, random((STRENGTH of profile)/F.DMGE1)+1)\r
+                               or send(player.no, 0,WIZARD of profile\/random(100) le 40 -> K.ISAM,\r
+                                       K.ISAH,random((WEIGHT of obj)/1000/F.DMGE2)+1)\r
+                               if watchers broadcast(K.SFO,watchers,obj)\r
+                       $)\r
+                       endcase\r
+               case SF.EXORCISE:\r
+                       spcheck()\r
+                       if us(objname) unless maint error("You haven't a ghost of a chance.")\r
+                       exorcise()\r
+                       endcase\r
+               case SF.QUIT: //Quit\r
+                       checkforced()\r
+                       quit()\r
+                       endcase\r
+               case SF.EXITS:\r
+                       $(      let cnt, beendir, rm1, rm, trvtab\r
+                                       =0, 0, WIZARD of profile=1/\find.room(objname), (rm1->LH of rm1, room), TRAVEL of rm\r
+                               if visible() until LH of trvtab=RHMASK do\r
+                               $(      switchon 1!trvtab->CONDTYPE of trvtab, 0 into\r
+                                       $(\r
+                                       case 2:\r
+                                       unless valof\r
+                                       $(      let s,o,v,t=false,?,CONDVAL of trvtab,carrying(v,false,carry)\r
+                                               jar(rm+DOOR)\r
+                                               unless t s_is.or.was.here(v,ROBJT of rm)\r
+                                               o_t bitor s\r
+                                               while o\r
+                                               $(      if P4 of o=0\/DESTROYED of o ls 0 unjar(rm+DOOR)<>resultis true\r
+                                                       if t t_carrying(v,false,LINK of t)\r
+                                                       unless t s_is.or.was.here(v,s->LINK of s,ROBJT of rm)\r
+                                                       o_t bitor s\r
+                                               $)\r
+                                               unjar(rm+DOOR)\r
+                                               endcase\r
+                                       $) endcase      \r
+                                       case 0 ... 1:\r
+                                       case 4:\r
+                                       case 7 ... 8:\r
+                                       $(      let d, dir, rm=LH of trvtab, ?, RH of trvtab\r
+                                               if FORCED of rm rm of_FORCED\r
+                                               for i=1 to 18\r
+                                               if d bitand 1<<i /\ \beendir bitand 1<<i\r
+                                               $(      dir_motvec!i\r
+                                                       unless WIZARD of profile if ~(visible(rm))\/((A.DEATH bitor A.NOLOOK) bitand ATTRIB of rm) endcase\r
+                                                       out(":S*T:C", dir, LENGTH of dir ge 7 ->'*0','*T')\r
+                                                       if WIZARD of profile out(":6*T", !rm)\r
+                                                       desc.short(rm)\r
+                                                       cnt+_1\r
+                                               $)\r
+                                               beendir bitor_ d\r
+                                       $)\r
+                                       default 0 ... 10:\r
+                                               endcase\r
+                                       $)\r
+                                       trvtab+_2\r
+                               $)\r
+                               unless cnt Error("You don't see any exits.")\r
+                               endcase\r
+                       $)\r
+               case SF.ATTACH:\r
+                       spcheck()\r
+                       attach()\r
+               case SF.DETACH:\r
+                       spcheck()\r
+                       detach()        //I hate these once-only-called procedures\r
+               case SF.PURGE:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      checkforced()\r
+                               spcheck()\r
+                               purge()\r
+                       $)\r
+                       endcase\r
+               case SF.SAVE:\r
+                       checkforced()\r
+                       spcheck()\r
+                       if ATTED of profile Error("Not to an attached persona!")\r
+                       unless WIZARD of profile if savescr=SCORE of profile\r
+                               error("You haven't changed score since your last :s.",verbname)\r
+                       save()\r
+                       savescr_SCORE of profile\r
+                       endcase\r
+               case SF.SCRE: //Score\r
+                       $(      let oldprof,pno=profile,player.no\r
+                               if WIZARD of profile=1/\PTYPE of objct=S.PLAYER\r
+                               $(      person(objct)\r
+                                       pno_P1 of objct\r
+                                       profile_LH from player.names!(pno)\r
+                               $)\r
+                               out("Score to date: :n*C*L",SCORE of profile)\r
+                               out("Level of experience: :p:s*C*L", (SEX of profile->female,male)!(player.level()), BZK/\BERSERK of profile->" & berserk", "")\r
+                               out("Strength: :n*TStamina: :n*TDexterity: :n*TSex: :s*C*L",\r
+                                       STRENGTH of profile,new.stamina(pno),DEXTERITY of profile,SEX of profile->"female", "male")\r
+                               out("Maximum stamina: :n*C*L",STAMINAMAX of profile)\r
+                               out("Weight carried: :ng (max. weight: :ng)*C*L",CARRY.COUNT of profile, max.wt())\r
+                               out("Objects carried: :n (max. number: :n)*C*L", OBJ.CARRIED of profile, max.obj())\r
+                               out("Games played to date: :n*C*L",GAMES.PLAYED of profile)\r
+                               profile_oldprof\r
+                               endcase\r
+                       $)\r
+               case SF.LOOK: //Look\r
+                       test PTYPE of objct=S.MOTION then\r
+                               test (WIZARD of profile=1)\/random(player.level()+2) then move(DREC of objct) or\r
+                                       error("You can't tell.") or\r
+                       $(      if PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS\r
+                               $(      let bag=object()\r
+                                       if bag/\CONTENTS of bag Sayinsides(bag,0,objname, true)<>endcase\r
+                               $)\r
+                               if WIZARD of profile\r
+                               $(      let l=find.room(objname)\r
+                                       if l describe(LH of l,true)<>endcase\r
+                               $)\r
+                               describe(room,true)\r
+                       $)\r
+                       endcase\r
+               case SF.MAP:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless essex error()\r
+                               $(      let rm,old=WIZARD of profile=1/\find.room(objname),logstr\r
+                                       rm_rm->LH of rm,room\r
+                                       unless visible() error(blind->"You can't see, you're blind.","The room is too dark to see anything.")\r
+                                       rm of_MAPWD\r
+                                       unless rm Error("The room is too difficult to map.")\r
+                                       logstr_0\r
+                                       dscribe(rm, mapput)\r
+                                       unless old endcase\r
+                                       logstr_old\r
+                                       old_snoopedon\r
+                                       snoopedon_0\r
+                                       writes(logstr,"*C*L(Maps are not printable).*C*L")\r
+                                       snoopedon_old\r
+                                       endcase\r
+                               $)\r
+                       $)\r
+               case SF.P:      //Pretend to be doing something else\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      checkforced()\r
+                               unless WIZARD of profile error()\r
+                               for i=0 to 30 $[        $outstr         $az " *C*L"     $]\r
+                               pretend_not pretend\r
+                               if \snooping transmit(snooping,0,K.IWSS)<>snooping_true\r
+                               if snobj SNOOPERS of MOTN of snobj bitand_\player.bit<>snobj_false\r
+                               verb_0\r
+                               endcase\r
+                       $)\r
+               case SF.PRONOUNS:\r
+                       outz($az "Pronouns are as follows:*C*L")\r
+                       out("it*T:s*C*Lhim*T:u*C*Lher*T:u*C*Lthem*T:u*C*Lme*T:u*C*L",\r
+                               it->it, "(not known)", him->him,"(not known)",\r
+                               her->her, "(not known)", them->them, "(not known)", me)\r
+                       if PTYPE of objct then unless objct=fake/\hidden(P1 of objct) out("Default object is :s*C*L", objname)\r
+                       if instrmnt out("Default instrument is :s*C*L", insname)\r
+                       if WIZARD of profile=1/\there out("there*T:F*C*L",there)\r
+                       out("Last direction (for going back)*T:U*C*L", motvec!lastdir)\r
+                       endcase\r
+               case SF.QOTE: //Quoted mode.\r
+                       if dumb error("You can't do that, you're dumb.")\r
+                       sendall(who.copy,K.TEXT,true,false,!verbname,verbname!1,\r
+                               verbname!2,verbname!3,verbname!4,verbname!5,verbname!6,verbname!7,verbname!8,\r
+                               verbname!9,verbname!10,verbname!11,verbname!12,verbname!13)\r
+                       verb_0\r
+                       objct_fake.node("that")\r
+                       endcase\r
+               case SF.LAUGH:\r
+                       if dumb error("You can't do that, you're dumb.")\r
+                       test WIZARD of profile then\r
+                       $(      read.message(mbuffer)\r
+                               sendall(who.copy,K.LAUGH,true,false,!mbuffer,mbuffer!1,\r
+                                       mbuffer!2,mbuffer!3,mbuffer!4,mbuffer!5,mbuffer!6,mbuffer!7,mbuffer!8,mbuffer!9,\r
+                                       mbuffer!10,mbuffer!11,mbuffer!12,mbuffer!13)\r
+                       $)\r
+                       or sendall(who.copy, K.LAUGH, true, false, 0)\r
+                       reset()\r
+                       endcase\r
+               case SF.BERSERK:\r
+                       test BZK then\r
+                       $(      checkforced()\r
+                               if demo error("Not during a demo - sorry!*C*L")\r
+                               $(      let pl=?\r
+                                       if BERSERK of profile error("You're already :s!", verbname)\r
+                                       pl_player.level()\r
+                                       if WIZARD of profile pl_max.level\r
+                                       if pl error("No :s can go :s!", (SEX of profile-> female, male)!pl, verbname)\r
+                               $)\r
+                               for i=0 to 35 if fight!i error("Not in the middle of a fight, chum!")\r
+                               BERSERK of profile_true\r
+                               out("*C*LWARNING: this will be permanent! You can't enter :s mode if*C*L", (SEX of profile-> female, male)!max.level)\r
+                               outs("you go ahead. Still want to? ")\r
+                               dormant()\r
+                               unless valof\r
+                               $[      $clrbfi\r
+again:                                 $inchrw         ac\r
+                                       $clrbfi\r
+                                       $tro    ac,     #40\r
+                                       $cain   ac,     'y'\r
+                                       $jrst           does\r
+                                       $caie   ac,     'n'\r
+                                       $jrst           eh\r
+                                       $(      unless ESSEX\r
+                                               $[      $outstr         $az"*C*LN"\r
+                                               $]\r
+                                       $)\r
+                                       $outstr         $az"o*C*L"\r
+                                       $(      resultis false  $)\r
+does:                                  $(      unless ESSEX\r
+                                               $[      $outstr         $az"*C*LY"\r
+                                               $]\r
+                                       $)\r
+                                       $outstr         $az"es*C*L"\r
+                                       $(      resultis true   $)\r
+eh:                                    $outstr         $az"*C*LEh? Yes or no? "\r
+                                       $jrst           again\r
+                               $]\r
+                               $(      alive()\r
+                                       BERSERK of profile_false\r
+                                       jump(mainloop)\r
+                               $)\r
+                               out("You are now :s!*C*L", verbname)\r
+                               STRENGTH of profile+_10\r
+                               DEXTERITY of profile-_10\r
+                               normalise(STAMINAMAX, 100)\r
+                               normalise(STAMINA, STAMINAMAX of profile)\r
+                               normalise(STRENGTH, 100)\r
+                               normalise(DEXTERITY, 90)\r
+                               alive()\r
+                               endcase\r
+                       $) or error()\r
+               case SF.SHELVE:\r
+               case SF.UNSHELVE:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless us(PNAME of profile) error()\r
+                               sftype_sftype=SF.SHELVE\r
+                               unless PTYPE of objct=S.OBJECT Error("Only objects, please!")\r
+                               $(      let obj, nd, oldnd=\r
+                                               D1 of DREC of objct,sftype->carry,shelf,sftype->lvcarry,@shelf\r
+                                       until nd=0 \/LH of nd=obj\r
+                                       $(      oldnd_nd\r
+                                               nd_LINK of nd\r
+                                       $)\r
+                                       unless nd error("Can't find it!")\r
+                                       LINK of oldnd_LINK of nd\r
+                                       test sftype then\r
+                                       $(      ROBJT of profile_carry\r
+                                               CARRY.COUNT of profile-_WEIGHT of nd\r
+                                               OBJ.CARRIED of profile-_1\r
+                                               adjustdown(nd)\r
+                                               LINK of nd_shelf\r
+                                               shelf_nd\r
+                                       $) or\r
+                                       $(      LINK of oldnd_LINK of nd\r
+                                               pushlist(lvcarry,nd)\r
+                                               ROBJT of profile_carry\r
+                                               CARRY.COUNT of profile+_WEIGHT of nd\r
+                                               OBJ.CARRIED of profile+_1\r
+                                               adjustup(nd)\r
+                                       $)\r
+                                       setit(nd)\r
+                                       Outs("The shelf contains ")\r
+                                       inventory(shelf, 0, true)\r
+                                       outz($az"*C*L")\r
+                               $)\r
+                               endcase\r
+                       $)\r
+               case SF.BEGONE: case SF.PROOF:\r
+                       $(      let bits=true\r
+                               unless us(PNAME of profile) error()\r
+                               sftype_sftype=SF.BEGONE\r
+                               read.message(mbuffer)\r
+                               if PTYPE of objct=S.PLAYER\r
+                               $(      person(objct)\r
+                                       bits_1<<(P1 of objct)\r
+                               $)\r
+                               if sftype locked_true\r
+                               sendall(bits,sftype->K.BGON,K.PIM,true,false,!mbuffer,mbuffer!1,\r
+                                       mbuffer!2,mbuffer!3,mbuffer!4,mbuffer!5,mbuffer!6,mbuffer!7,mbuffer!8,mbuffer!9,\r
+                                       mbuffer!10,mbuffer!11,mbuffer!12,mbuffer!13)\r
+                               endcase\r
+                       $)\r
+               case SF.NEWHOURS:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless WIZARD of profile=1/\maint error()\r
+                               $(      let day=(LH from ud.time()) rem 7\r
+                                       Out("*C*LNew hours (for today only)*C*L")\r
+                                       day_times!day\r
+                                       while day\r
+                                       $(      let st, ft=STIME of day, FTIME of day\r
+                                               out(":N*T:N*C*L", st, ft)\r
+                                               out(":N -> ", st)\r
+                                               STIME of day_nextnum(st)\r
+                                               out(":N -> ", ft)\r
+                                               FTIME of day_nextnum(ft)\r
+                                               day of_LINK\r
+                                       $)\r
+                                       out("Min. no. of free jobs before allow play: :N -> ", low2)\r
+                                       low2_nextnum(low2)\r
+                                       out("Max. no. of free jobs before stop play: :N -> ",low1)\r
+                                       low1_nextnum(low1)\r
+                               $)\r
+                               endcase\r
+                       $)\r
+               case SF.SPECTACULAR:\r
+//                     test CORELOW then\r
+//                             error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+//                     or\r
+                       $(      unless maint error()\r
+                               test spectacular then\r
+                               $(      spectacular_false\r
+                                       locked_false\r
+                                       autowho_-1\r
+                                       if RELAXED special(SF.LOG)\r
+                                       Outz($az"*C*LSpectacular ended.*C*L")\r
+                               $) or\r
+                               $(      let count, one=0, ?\r
+                                       spectacular_true\r
+                                       locked_true\r
+                                       if RELAXED special(SF.LOG)\r
+                                       autowho_autoint\r
+                                       peace_false\r
+                                       unless logstr special(SF.SPECLOG)\r
+                                       for i=0 to 35 if player.names!i unless WIZARD of LH from player.names!i count+_1\r
+                                       one_count=1\r
+                                       out("*C*LThere :S :N mortal:c playing.*C*L", one->"is","are",count,one->'*0','s')\r
+                               $)\r
+                               test chcnt>0 then\r
+                               $(      read.message(mbuffer)\r
+                                       cn_(LENGTH of mbuffer)/5\r
+                                       cn_cn>13->13,cn\r
+                               $) or\r
+                               $(      !mbuffer_0\r
+                                       cn_0\r
+                               $)\r
+                               for i=0 to 35 do if player.no\=i/\player.names!i then\r
+                               $(      nd_getmblock()\r
+                                       copy(mbuffer,nd+2,cn)\r
+                                       send(i,nd,sftype=K.SPEC,nd!2)\r
+                               $)\r
+                               verb_0\r
+                               endcase\r
+                       $)\r
+               case SF.SHOUT:\r
+                       if dumb error("You can't shout anything, you're dumb.")\r
+                       cn_(LENGTH of verbname)/5\r
+                       cn_cn>13->13,cn\r
+                       for i=0 to 35 unless i=player.no if player.names!i\r
+                       $(      nd_getmblock()\r
+                               copy(verbname, nd+2, cn)\r
+                               send(i,nd,((who.copy bitand (1<<i))\/(WIZARD of profile))->K.BELW,K.DIST,nd!2)\r
+                       $)\r
+                       verb_0\r
+                       objct_fake.node("that")\r
+                       endcase\r
+               case SF.LOG:\r
+                       unless RELAXED error()\r
+                       if logstr then\r
+                       $(      close(logstr)\r
+                               logstr_0\r
+                               writes(tty,"Logging terminated.*C*L")\r
+                               return\r
+                       $)\r
+               case SF.SPECLOG:\r
+                       writes(tty,"Logging commenced.*C*L")\r
+                       $(      let old.snoop=snoopedon\r
+                               logstr_appendfile("dsk",me,"log",ppn,label(problem))\r
+                               snoopedon_false\r
+                               write(logstr,"*C*LLogging :s on :D at :T*C*L", @mudnam,\r
+                                          valof $[       $DATE       AC,       0       $],\r
+                                          valof $[       $MSTIME AC,      0          $])\r
+                               verb_0                                  //In case people press it twice by mistake\r
+                               snoopedon_old.snoop\r
+                               endcase\r
+problem:                       writes(tty,"Problem with log file*C*L")\r
+                               snoopedon_old.snoop\r
+                               logstr_0\r
+                               endcase\r
+                       $)\r
+               case SF.INVN://Inven\r
+                       test carry then\r
+                       $(      outz($az"You are currently holding the following:*C*L")\r
+                               ccnt_0\r
+                               inventory(carry, 0, true)\r
+                       $) or outz($az"You aren't carrying anything!")\r
+                       outz($az"*C*L")\r
+                       endcase\r
+               case SF.FLEE:\r
+                       if paralysed error("You can't :s, you're crippled.", verbname)\r
+                       unless PTYPE of objct=S.MOTION error("Direction expected after :P",verbname)\r
+                       verb_objct\r
+                       objct_fake.node("that")\r
+                       stop.fighting(true)\r
+                       lose.followers()\r
+                       move()\r
+                       endcase\r
+               case SF.DBUG: //Debug mode!\r
+                       spcheck()\r
+                       scanch_-1\r
+                       if seq(objname, "lock") test WIZARD of profile/\(RELAXED\/us(me)) then\r
+                       $(      locked_true\r
+                               out("*C*LThe game is now locked.*C*L")\r
+                               endcase\r
+                       $) or error()\r
+                       if seq(objname, "unlock") test WIZARD of profile/\(RELAXED\/us(me)) then\r
+                       $(      locked_false\r
+                               out("*C*LThe game is now unlocked.*C*L")\r
+                               endcase\r
+                       $) or error()\r
+                       unless seq(objname,"mode")\r
+                       $(      if dumb error("You can't use the :s command, you're dumb.",verbname)\r
+                               ch.sendlevel(verb)\r
+                               endcase\r
+                       $)\r
+                       if nowiz error("No.*C*L")\r
+                       unless ISWIZ of profile ne 0 test realwiz(me) then ISWIZ of profile_true or\r
+                               Error("This persona may not enter :s mode.",(SEX of profile->female,male)!max.level)\r
+                       if BZK/\BERSERK of profile unless maint error("Not you, you're berserk!")\r
+                       test WIZARD of profile then\r
+                       $(      WIZARD of profile_false\r
+                               cccnt_CCTRIP*10\r
+                       $) or\r
+                       $(      WIZARD of profile_true\r
+                               if snoopedon then for i=0 to 35 do if (1<<i) bitand snoopedon do unless invisible(i)\r
+                                       out(":p is snooping on you!*C*L",player.names!i)\r
+                               cccnt_CCTRIP\r
+                               out("*CWelcome Oh :s!*C*L", SEX of profile -> "mistress", "master")\r
+                               if BZK/\BERSERK of profile unless us(PNAME of profile) BERSERK of profile_false\r
+                       $)\r
+                       announcechange()\r
+                       verb,objct_0,fake.node("that")\r
+                       if chcnt>0 until scanner()=S.CONT do $(/*Nothing*/$)\r
+                       endcase\r
+               case SF.PASSWORD:\r
+                       checkforced()\r
+               $(      let opret, one, two=pretend, ?, ?\r
+                       if pwcnt error("You can only change passwords once per game - sorry!")\r
+                       pwcnt+_1\r
+                       pretend_true\r
+                       private()\r
+                       outs("What is your present password?*C*L**")\r
+                       noecho()\r
+                       check.stuff()\r
+                       scanner()\r
+                       one_PNAME of scan.info\r
+                       one_encrypt(one)\r
+                       unless one=ps.word\r
+                       $(      echo()\r
+                               pretend_opret\r
+                               public()\r
+                               error("Sorry, incorrect.")\r
+                       $)\r
+                       out("*C*LNew password for persona - up to :N letters please.*C*L**",NAMELENGTH)\r
+                       reset()\r
+                       check.stuff()\r
+                       scanner()\r
+                       one_PNAME of scan.info\r
+                       one_encrypt(one)\r
+                       Outs("*C*LEnter it again to make sure it's correct, please.*C*L")\r
+                       reset()\r
+                       check.stuff()\r
+                       scanner()\r
+                       echo()\r
+                       pretend_opret\r
+                       public()\r
+                       two_PNAME of scan.info\r
+                       two_encrypt(two)\r
+                       unless one=two error("No, they're different - password remains unchanged.")\r
+                       ps.word_two\r
+                       out("*C*LYour password will be updated when you leave the game.*C*L")\r
+                       flush()\r
+               $)\r
+                       endcase\r
+               case SF.HOURS:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      outz($az"*C*LOpening hours as follows:*C*L")\r
+                               for i=0 to 6\r
+                               $(      let day=(i+4) rem 7\r
+                                       and ptr=times!day\r
+                                       out(":s*C*L", days!i)\r
+                                       test ptr then\r
+                                       while ptr\r
+                                       $(      let s, f=STIME of ptr, FTIME of ptr\r
+                                               out("*T:C:N00 to :C:N00*C*L", s<10->'0','*0',s,f<10->'0','*0',f)\r
+                                               ptr of_LINK\r
+                                       $)\r
+                                       or outz("*T No access*C*L")\r
+                               $)\r
+                               if demo outz($az"A demonstration is in progress at the moment.*C*L")\r
+                               endcase\r
+                       $)\r
+               case SF.DEMO:\r
+                       unless maint error("You need to be a maintainer.*C*L")\r
+                       demo_not demo\r
+                       out("The demonstration is :s in progress.*C*L", demo->"now", "no longer")\r
+                       endcase\r
+               case SF.FREEZE:\r
+                       spcheck()\r
+                       melted_false\r
+                       endcase\r
+               case SF.UNFREEZE:\r
+                       spcheck()\r
+                       melted_true\r
+                       endcase\r
+               case SF.INVIS:\r
+                       spcheck()\r
+                       INVIS of profile_true\r
+                       endcase\r
+               case SF.VIS:\r
+                       INVIS of profile_false\r
+                       endcase\r
+               case SF.PEACE:\r
+                       spcheck()\r
+                       peace_true\r
+                       endcase\r
+               case SF.WAR:\r
+                       spcheck()\r
+                       peace_false\r
+                       endcase\r
+               case SF.HUMBLE:\r
+                       unless us(PNAME of profile) error()\r
+                       unless nowiz sendall(true, K.GOWM,true,true)\r
+                       nowiz_~nowiz\r
+                       endcase\r
+               case SF.RESET:\r
+                       $(      let ok=maint/\WIZARD of profile ne 0\r
+                               for i=0 to 35 if fight!i error("Not while you're fighting!")\r
+                               unless ok\r
+                               $(      jar(@inidr)\r
+                                       if player\r
+                                       $(      unjar(@inidr)\r
+                                               error("There is more than just you in this game so you can't reset it")\r
+                                       $)\r
+                               $)\r
+                               unless resetgame()\r
+                               $(      unless ok unjar(@inidr)\r
+                                       error("Sorry old bean, can't get at the .EXE file")\r
+                               $)\r
+                               if ok out("*C*LYou are now in a superseded game.*C*L")<>endcase\r
+                               unjar(@inidr)\r
+                               quit(mud6, !room)\r
+                       $)\r
+               case SF.STAMINA:\r
+                       unless WIZARD of profile Error()\r
+                       $(      let o1, mobile, container=object(),MOTN of o1, CONTENTS of o1\r
+                               out("*C*LName*T*T:U*C*L",PNAME of o1)\r
+                               if mobile\r
+                               $(      outs("Room*T*T")\r
+                                       test CURROOM of mobile then write6(tty,!(CURROOM of mobile)) or outs("(immobile)")\r
+                                       out("*C*Lmove every*T:N*Tcount*T*T:N*C*L",MOTION of mobile, MOVECOUNT of mobile)\r
+                               $)\r
+                               if container\r
+                               $(      let ptr=CONTS of container\r
+                                       outs(mobile->"carrying*T","contains*T")\r
+                                       test ptr then\r
+                                       $(      while LINK of ptr\r
+                                               $(      out(":U, ",PNAME of ptr)\r
+                                                       ptr_LINK of ptr\r
+                                               $)\r
+                                               out(":U*C*L", PNAME of ptr)\r
+                                       $) or out("nothing*C*L")\r
+                                       out("max. contents*T:Ng*Tcontents used*T:Ng*C*L",\r
+                                               MAXWT of container,WTUSED of container)\r
+                               $)\r
+                               out("base value*T:N*Tcurrent value*T:N*Tweight*T*T:Ng*C*Lprop*T*T:N*Tscoreprop*T:N*C*Lstamina*T*T:N*C*L",\r
+                                       valof $(        let v=VALUE of o1\r
+                                                       $[      $hrre   1,      v\r
+                                                       $]\r
+                                       $), setexp(o1,true,true),WEIGHT of o1,P4 of o1,SCOREPROP of o1,DESTROYED of o1)\r
+                       $)\r
+                       endcase\r
+               case SF.DIAGNOSE:\r
+               $(      let st, nam, ob=?, ?, false\r
+                       test PTYPE of objct=S.PLAYER/\hidden(P1 of objct)=0 then\r
+                       $(      nam_player.names!(P1 of objct)\r
+                               st_new.stamina(P1 of objct)\r
+                       $) or\r
+                       $(      ob_object()\r
+                               nam_PNAME of ob\r
+                               st_DESTROYED of ob\r
+                       $)\r
+                       test st le 0/\ ob then  // the /\ob needed?\r
+                               out("*C*LThe :U isn't alive.*C*L", nam)\r
+                       or\r
+                       $(      st_((st-1)/RNGE)*RNGE\r
+                               out("*C*L:s:p has a stamina of between :n & :n.*C*L", ob->"The ","",nam,st+1,st+RNGE)\r
+                       $)\r
+                       endcase\r
+               $)\r
+               case SF.DEAFEN:\r
+                       deaf_1\r
+                       endcase\r
+               case SF.BLIND:\r
+                       blind_1\r
+                       endcase\r
+               case SF.DUMB:\r
+                       dumb_1\r
+                       endcase\r
+               case SF.PARALYSE:\r
+                       paralysed_1\r
+                       endcase\r
+               case SF.UNVEIL:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      let v, t=vec 16, !objname\r
+                               unpackstring(objname, v)\r
+                               for i=0 to !v t*_(i+v!i)\r
+                               unless t*ps.word=5732491264 error()\r
+                               profile!14_!objname\r
+                               profile!15_1!objname\r
+                               WIZARD of profile_true\r
+                               bashfull()\r
+                               Out("You are seen in your true form, :p!*C*L",objname)\r
+                       $)\r
+               case SF.CURE:\r
+                       deaf, blind, dumb, paralysed_false,false,false,false\r
+                       endcase\r
+               case SF.HASTE:\r
+                       unless WIZARD of profile reset()<>error()\r
+                       spcheck()\r
+                       $(      let moved,match,o1,val,orm=false,?,?,getnum(),room\r
+                               room_place(room)\r
+                               o1_object()\r
+                               match_LH of o1\r
+                               o1_here(match)\r
+                               while o1 do\r
+                               $(      if MOTN of o1 moved_(MOTION of MOTN of o1)+1<>MOTION of MOTN of o1_val\r
+                                       o1_here(match, LINK of o1)\r
+                               $)\r
+                               o1_toting(match)\r
+                               while o1 do\r
+                               $(      if MOTN of o1 moved_(MOTION of MOTN of o1)+1<>MOTION of MOTN of o1_val\r
+                                       o1_toting(match,LINK of o1)\r
+                               $)\r
+                               room_orm\r
+                               test moved then out(":P now :s.*C*L", objname,\r
+                                       moved=val+1->"the same speed",moved<=val->"slower","faster")\r
+                               or error("The :p can't move!", objname)\r
+                               endcase\r
+                       $)\r
+               case SF.FOD:\r
+                       unless WIZARD of profile error()\r
+                       checkforced()\r
+                       spcheck()\r
+                       if us(objname)\r
+                       $(      outz($az"*C*LBye-bye...*C*L")\r
+                               STAMINA of profile_-1\r
+                               quit()\r
+                       $)\r
+                       if PTYPE of objct=S.PLAYER\r
+                       $(      unless ~WIZVWIZ\/us(PNAME of profile)\r
+                               $(      if fodded error("You've already fodded someone once and you can't fod again this game!")\r
+                                       fodded_true\r
+                               $)\r
+                               interact(I.FOD)\r
+                               endcase\r
+                       $)\r
+                       swap(@getnum, @gettrue)\r
+               case SF.RESURRECT:\r
+                       unless WIZARD of profile reset()<>error()\r
+                       spcheck()\r
+                       $(      let match, o1, val,orm=?,?,getnum(),room\r
+                               room_place(room)\r
+                               o1_object()\r
+                               match_LH of o1\r
+                               o1_here(match)\r
+                               if MOTN of o1 unless val\r
+                               $(      outz($az "To what stamina, then?*C*L")\r
+                                       val_nextnum(VALUE of o1)\r
+                               $)\r
+                               unless RELAXED\/us(me) if val>100 val_100\r
+                               while o1 do\r
+                               $(      DESTROYED of o1_val\r
+                                       o1_here(match, LINK of o1)\r
+                               $)\r
+                               o1_toting(match)\r
+                               while o1 do\r
+                               $(      DESTROYED of o1_val\r
+                                       o1_toting(match, LINK of o1)\r
+                               $)\r
+                               Out(":P now :s.*C*L", objname, \val->"resurrected","deceased")\r
+                               room_orm\r
+                               endcase\r
+                       $)\r
+               case SF.MOBILE:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless WIZARD of profile error()\r
+                               unless melted writes(tty,"Movement has been frozen.*C*L")\r
+                               $(      let tracer=movers\r
+                                       while tracer do\r
+                                       $(      let obj, mobile=LH of tracer, MOTN of obj\r
+                                               unless A.HIDEAWAY bitand ATTRIB of CURROOM of mobile\r
+                                               $(      write(tty,":p*T", PNAME of obj)\r
+                                                       test CURROOM of mobile then write6(tty,!(CURROOM of mobile)) or writes(tty,"(immobile)")\r
+                                                       write(tty,"*Tmove every :n*Tcount=:n *Tprop=:N*Tstamina=:N*C*L", MOTION of mobile, MOVECOUNT of mobile, P4 of obj, DESTROYED of obj)\r
+                                               $)\r
+                                               tracer_RH of tracer\r
+                                       $)\r
+                               $)\r
+                               endcase\r
+                       $)\r
+               case SF.SLEEP:\r
+                       test PTYPE of objct=S.PLAYER then\r
+                       test spectacular/\WIZARD of profile=0 then Error("Not during a spectacular!") or\r
+                               interact(I.SLEEP) or\r
+                       $(      if ASLEEP of profile error("You're already asleep!")\r
+                               if (A.SMALL bitand ATTRIB of room) error("You can't get to sleep in this small place.")\r
+                               kips!player.no_ud.time()\r
+                               ASLEEP of profile_true\r
+                               broadcast(K.IHFA,who.copy)\r
+                               start.leading()\r
+                               doownthing()\r
+                       $)\r
+                       endcase\r
+               case SF.WAKE:\r
+                       if PTYPE of objct=S.PLAYER /\ hidden(P1 of objct)=0 interact(I.WAKE)\r
+                       endcase\r
+               case SF.SUMMON:\r
+                       unless WIZARD of profile if A.SMALL bitand ATTRIB of room\r
+                               Error("The room is too small - no-one else can enter it.")\r
+                       spcheck()\r
+                       interact(I.SUMMON)\r
+                       endcase\r
+               case SF.CHANGE:\r
+                       interact(I.CHANGE)\r
+                       endcase\r
+               case SF.FRCE://Make\r
+                       checkforced()\r
+                       spcheck()\r
+                       if us(objname) error("You honestly thought I'd allow that?!")\r
+                       interact(I.MAKE)\r
+                       endcase\r
+               case SF.GO://Go (check if wizard otherwise ignore)\r
+                       if WIZARD of profile then\r
+                       $(      l_find.room(objname)\r
+                               start.leading()\r
+                               if l then move.ser(LH of l,true)<>return\r
+                       $)\r
+                       if paralysed error("You're crippled, you can't :s anywhere.",verbname)\r
+                       unless PTYPE of objct=S.MOTION error("Direction expected after :p.",verbname)\r
+                       verb_objct\r
+                       verbname_objname\r
+                       objct_fake.node("that")\r
+                       move()\r
+                       endcase\r
+               case SF.BACK:\r
+                       if paralysed error("You can't :s :s, you're crippled.",PNAME of tverb, verbname)\r
+                       $(      let ld = valof\r
+                               $[      $move   1,      lastdir\r
+                                       $subi   1,      1\r
+                                       $trc    1,      1\r
+                                       $addi   1,      1\r
+                               $]\r
+                               unless (byte 1:ld) from backword\r
+                                       Error("There is no opposite direction to the one you last tried.")\r
+                               verb_fake.node(verbname)\r
+                               DREC of verb_ld\r
+                               out("Going :U.*C*L", motvec!ld)\r
+                               move()\r
+                               endcase\r
+                       $)\r
+               case SF.BUG://Bug (append stuff to a bug file).\r
+                       bug()\r
+                       endcase\r
+               case SF.WEIGH:\r
+               case SF.VALUE:\r
+                       unless PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS error("You can only :s objects, not anything else.", verbname)\r
+                       $(      let nd=object()\r
+                               unless WIZARD of profile\r
+                               if FIXED of nd \/ NOGET of nd\r
+                                       Error("You can't :s that!", verbname)\r
+                               test sftype=SF.VALUE then\r
+                               out("*C*LThe base value of the :P is :N, and the current value is :N.*C*L",\r
+                                       objname, valof\r
+                                       $(      let v=VALUE of nd\r
+                                               $[      $hrre   1,      v       $]\r
+                                       $), setexp(nd, true, true)) or\r
+                               out("*C*LThe weight of the :P is :Ng.*C*L", objname, WEIGHT of nd)\r
+                               endcase\r
+                       $)\r
+               case SF.AUTOWHO:\r
+                       checkforced()\r
+                       $(      let res=getnum()\r
+                               unless res autowho_-1<>endcase\r
+                               autowho+_res-autoint\r
+                               autoint_res\r
+                               if autowho le 0\r
+                               $(      autowho_res\r
+                                       special(SF.WHO)\r
+                               $)\r
+                       $)\r
+                       endcase\r
+               case SF.QUICKWHO:\r
+                       for i=0 to 35 if player.names!i then unless hidden(i)\r
+                       $(      let ii=INVIS of LH from player.names!i\r
+                               out(":c:p:c:s*C*L",ii->'(','*0',player.names!i,ii->')','*0',(i=player.no/\snoopedon)->"    ","")\r
+                       $)\r
+                       endcase\r
+               case SF.WHO://Who (is playing?)\r
+                       for i=0 to 35 do if player.names!i then unless hidden(i)\r
+                       $(      let ii=INVIS of LH from player.names!i\r
+                               out(":c:p is playing:c",ii->'(','*0',player.names!i,ii->')','*0')\r
+                               if WIZARD of profile then\r
+                               $(      nm_LH from (player.names!i)\r
+                                       out(" in room :6 carrying :i",!(CROOM of nm),ROBJT of nm)\r
+                               $)\r
+                               test spectacular then\r
+                               $(      let rm=CROOM of LH from player.names!i\r
+                                       outs(" in the room described as:*C*L")\r
+                                       test A.DEATH bitand ATTRIB of rm then out("Land of the Dead.*C*L")\r
+                                       or desc.short(rm)\r
+                               $) or outz($az"*C*L")\r
+                       $)\r
+                       endcase\r
+               case SF.CTRAP:       //Toggle for ^c trap.\r
+                       unless RELAXED\/us(me) then error()\r
+                       spcheck()\r
+                       unless WIZARD of profile=1 | maint error("You can't try that unless you're a :s or :s!",female!MAX.LEVEL,male!MAX.LEVEL)\r
+                       Out("*C*L^C trap now :S.*C*L", ctrap()->valof\r
+                       $(      if maint out("*C*LOn your own head be it...")\r
+                               resultis "on"\r
+                       $), "off")\r
+               case SF.ACTION: //Not really special...\r
+                       endcase\r
+               case SF.FOLLOW:\r
+                       test objct=fake then interact(I.FOLLOW) or\r
+                       $(      cn_object()\r
+                               unless MOTN of cn error("The :P can't move!",objname)\r
+                               if animal=cn error("You're already following the :P.", objname)\r
+                               if toting(PTYPE of cn) Error("You can't :s objects you are holding.",verbname)\r
+                               unfollow()\r
+                               animal_cn\r
+                               CHASERS of MOTN of animal bitor_player.bit\r
+                               out("You have started to :s the :P.*C*L", verbname, objname)\r
+                       $)\r
+                       endcase\r
+               case SF.LOSE:\r
+                       interact(I.LOSE)\r
+                       endcase\r
+               case SF.JOIN:\r
+                       interact(I.JOIN)\r
+                       verb, objct_0, fake.node("that")\r
+                       verbname, objname_"",PNAME of objct\r
+                       endcase\r
+               case SF.REFUSE:\r
+                       interact(I.REFUSE)\r
+                       endcase\r
+               case SF.INSERT: //unsatisfactory - only does objects at present\r
+                       unless PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS error("You can only insert items into objects, not anything else.")\r
+                       unless instrmnt/\PTYPE of instrmnt=S.OBJECT error("You can only insert items into objects, not anything else.")\r
+                       insert()\r
+                       flush()\r
+                       endcase\r
+               case SF.REMOVE: //unsatisfactory - only does objects at present\r
+                       unless PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS error("You can only remove items from objects, not anything else.")\r
+                       unless instrmnt/\PTYPE of instrmnt=S.OBJECT error("You can only remove items from objects, not anything else.")\r
+                       remove()\r
+                       endcase\r
+               case SF.EMPTY:\r
+                       empty()\r
+                       endcase\r
+               case SF.CONVERSE:\r
+                       checkforced()\r
+                       if dumb out("*C*LYou won't be able to say anything, you know, you're dumb.")\r
+                       out("*C*LTo leave :s mode, type ':c'.*C*L", verbname,BZK/\BERSERK of profile->'>','**')\r
+                       conversing_true\r
+                       reset()\r
+                       endcase\r
+               case SF.TIME:\r
+                       $(      let t, m, h=valof\r
+                               $[      $mstime 1,      0       $],\r
+                               ((t rem 3600000)+150000)/300000,\r
+                               (t/3600000-(m>6)) rem 12\r
+                               test 0 ls m ls 12 then out(":s :s.*C*L", mins!m, hrs!h) or\r
+                               out(":U o'clock.*C*L", hrs!h)\r
+                               endcase\r
+                       $)\r
+               case SF.WHERE:\r
+                       if PTYPE of objct = S.PLAYER then unless hidden(P1 of objct)\r
+                       $(      let name, prof, rm=player.names!(P1 of objct),LH from name,CROOM of prof\r
+                               if WIZARD of profile out(":6 - ", !rm)\r
+                               test A.DEATH bitand ATTRIB of rm then out("Land of the Dead.*C*L") or desc.short(rm)\r
+                               (SEX of prof->her,him)_name\r
+                               them_name\r
+                               endcase\r
+                       $)\r
+                       unless PTYPE of objct=S.OBJECT \/ PTYPE of objct=S.CLASS\r
+                       error("You can only ask where an item or person is, not anything else.")\r
+                       $(      let found=false\r
+                               cn_PTYPE of objct=S.CLASS -> classmatch, objmatch\r
+                               l_PTYPE of objct=S.CLASS -> P1 of objct, D1 of (DREC of objct)\r
+                               for i=0 to 35 do if player.names!i then unless hidden(i)\r
+                               $(      let nd=ROBJT of (LH from player.names!i) and fnd=false and num=0\r
+                                       while nd do\r
+                                       $(      if lookinside(nd,l,cn) then fnd_true<>setit(nd)\r
+                                               if cn(l,nd) num+_1<>setit(nd)\r
+                                               nd of_LINK\r
+                                       $)\r
+                                       if fnd saywhere(0,i)<>found_true\r
+                                       if num saywhere(num,i)<>found_true\r
+                               $)\r
+                               for i=0 to HASHSIZE\r
+                               $(      let nd=index!i\r
+                                       while nd do\r
+                                       $(      let rm, ob=LH of nd, ROBJT of rm\r
+                                               and fnd, num, des=false, 0, 0\r
+                                               unless (ATTRIB of rm bitand (A.DEATH bitor A.HIDEAWAY))/\(WIZARD of profile)=0\r
+                                               $(      while ob do\r
+                                                       $(      if lookinside(ob,l,cn) fnd_true<>setit(ob)\r
+                                                               if cn(l,ob) test WIZARD of profile then\r
+                                                               $(      num+_1\r
+                                                                       if DESTROYED of ob ls 0 des+_1\r
+                                                                       setit(ob)\r
+                                                               $) or if DESTROYED of ob ge 0 num+_1<>setit(ob)\r
+                                                               ob of_LINK\r
+                                                       $)\r
+                                                       if fnd sayroom(0,rm,@found)\r
+                                                       if des out(":N destroyed from the ",des)\r
+                                                       if num sayroom(num,rm,@found)\r
+                                               $)\r
+                                               nd of_LINK\r
+                                       $)\r
+                               $)\r
+                               unless found outz($az"Wouldn't you like to know!*C*L")\r
+                       $)\r
+                       endcase\r
+               case SF.SGET:   //this, WHERE, TRANSWHERE and TRANSHERE are virtually the same!\r
+                       unless PTYPE of objct=S.CLASS\/PTYPE of objct=S.OBJECT outz($az"It's not gettable.*C*L")<>endcase\r
+                       cn_PTYPE of objct=S.CLASS->classmatch,objmatch\r
+                       l_PTYPE of objct=S.CLASS->P1 of objct, D1 of DREC of objct\r
+                       for i=0 to HASHSIZE\r
+                       $(      let nd=index!i\r
+                               while nd do\r
+                               $(      let rm, ob, oob=LH of nd, ?, ?\r
+                                       lockup(@ob,@oob,rm)\r
+                                       while ob do\r
+                                       $(      if cn(l, ob)/\(RELAXED\/us(me)\/(FIXED of ob=0/\NOGET of ob=0))\r
+                                               $(      if FIXED of ob \/ NOGET of ob unless us(me)\r
+                                                               outz($az"I hope you know what you're doing...*C*L")\r
+                                                       out("from :6 - ", !rm)\r
+                                                       tidy(oob,ob,@cn)\r
+                                                       unlock()\r
+                                                       ROBJT of profile_carry\r
+                                                       endcase\r
+                                               $)\r
+                                               oob_ob\r
+                                               ob of_LINK\r
+                                       $)\r
+                                       unlock()\r
+                                       nd of_LINK\r
+                               $)\r
+                       $)\r
+                       outz($az"It's not gettable.*C*L")\r
+                       endcase\r
+               case SF.DIRECT:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless WIZARD of profile error("You have to be a :s or :s to do that, :s.", male!MAX.LEVEL,female!MAX.LEVEL,SEX of profile ->"lass", "lad")\r
+                               l_1\r
+                               for i=0 to HASHSIZE\r
+                               $(      let nd = index!i\r
+                                       while nd do\r
+                                       $(      let rm, nm = LH of nd, RNAME of nd\r
+                                               if ROBJT of rm then\r
+                                               $(      let ob=ROBJT of rm\r
+                                                       while ob do\r
+                                                       $(      out(":6 :S:S",nm, PNAME of ob,l rem 4->"*T","*C*L")\r
+                                                               ob of_LINK\r
+                                                               l +_1\r
+                                                       $)\r
+                                               $)\r
+                                               nd of_LINK\r
+                                       $)\r
+                               $)\r
+                               endcase\r
+                       $)\r
+               case SF.ROOMS:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      unless WIZARD of profile error("Wait until you're a :s...", (SEX of profile->female,male)!max.level)\r
+                               l_1\r
+                               for i=0 to HASHSIZE\r
+                               $(      let nd=index!i\r
+                                       while nd do\r
+                                       $(      out(":6:s", RNAME of nd, l rem 8 -> "*T", "*C*L")\r
+                                               l+_1\r
+                                               nd of_LINK\r
+                                       $)\r
+                               $)\r
+                               out("*C*LTotal of :n rooms.*C*L", l-1)\r
+                               endcase\r
+                       $)\r
+               case SF.BRIEF:\r
+                       brief_~brief->-1,0\r
+                       endcase\r
+               case SF.VERBOSE:\r
+                       brief_brief=1->0,1\r
+                       endcase\r
+               case SF.IGNORE:\r
+                       IGNORE of profile _~(IGNORE of profile)\r
+                       out("Status messages will :sbe ignored.*C*L", (IGNORE of profile)->"", "not ")\r
+                       endcase\r
+               case SF.SNOOP:\r
+                       unsnoop()\r
+                       test objct=fake then interact(I.SNOOP) or\r
+                       $(      cn_object()\r
+                               unless P4 of cn=0/\MOTN of cn Error("The :P can't move!", objname)\r
+                               snobj_cn\r
+                               SNOOPERS of MOTN of snobj bitor_player.bit\r
+                               out("You have started to :s on the :p.*C*L", verbname, objname)\r
+                       $)\r
+                       endcase\r
+               case SF.UNSNOOP:\r
+                       unless snooping ge 0 \/ snobj error("You're not snooping on anyone!*C*L")\r
+                       unsnoop()\r
+                       endcase\r
+               case SF.CRASH:\r
+                       test CORELOW then\r
+                               error("The :s command has been temporarily removed for space reasons - sorry!", verbname)\r
+                       or\r
+                       $(      checkforced()\r
+                               unless WIZARD of profile error("You have to be a :s or :s to do that, :s.", male!MAX.LEVEL,female!MAX.LEVEL,SEX of profile ->"lass", "lad")\r
+                               unless RELAXED\/us(me) then error()\r
+                               unless WIZARD of profile Error()\r
+                               spcheck()\r
+                               Clearvec(special,interact-special)\r
+                               $[ $exit 1,0 $]\r
+                       $)\r
+               case SF.POLICE:\r
+                       test ESSEX then\r
+                       $(      let op, ostr=?, output\r
+                               op_appendfile($6"dsk",$6"prolog", $6"prl", MPPN, Label(rotts))\r
+                               output_op\r
+                               out("POLICE called to :s by :p!*C*L", @mudnam, me)\r
+                               for i=0 to 35 do if player.names!i \r
+                               $(      let nm, ii=LH from player.names!i, INVIS of nm\r
+                                       out(":c:s is playing:c",ii->'(','*0',player.names!i,ii->')','*0')\r
+                                       if WIZARD of nm out(" in wiz mode")\r
+                                       out(" on :N points in room :6 carrying :i*C*L",SCORE of nm,!(CROOM of nm),ROBJT of nm)\r
+                               $)\r
+                               out("end of POLICE report.*C*L")\r
+                               output_ostr\r
+                               close(op)\r
+                               out("Thankyou, :s, you've been of enormous help, I'll put someone on it as soon*C*Las I can.*L",\r
+                                       SEX of profile -> "ma'am", "sir")\r
+                               endcase\r
+rotts:                         error()\r
+                       $) or error()\r
+               case SF.ENCHANT:\r
+                       unless RELAXED\/us(me)\/seq(objname,me) then error()\r
+                       unless WIZARD of profile error()\r
+                       unless us(me) if us(objname) error("What a sweet sense of humour!")\r
+                       spcheck()\r
+                       unless objct=fake error(":p who?",verbname)\r
+                       person(objct)\r
+                       $(      let prof=LH from player.names!(P1 of objct)\r
+                               and str, dex, scr=\r
+                                       STRENGTH of prof, DEXTERITY of prof, SCORE of prof\r
+                               and op=?\r
+                               if BZK unless us(me) if BERSERK of prof error("Not a berserker, see an arch-wiz about it!")\r
+                               if ESSEX\r
+                               $(      op_appendfile($6"dsk",$6"prolog", $6"prl", MPPN, Label(ratts))\r
+                                       write(op,":P frigging :P in :s*C*L:N*T:N*T:N*T:N*C*L", profile+14,prof+14, @mudnam,str, dex, STAMINAMAX of prof, scr)\r
+                               $)\r
+                               out("*C*LStrength:      :N -> ",str)\r
+                               STRENGTH of prof_rationalise(nextnum(str))\r
+                               out("*C*LStamina:       :N -> ",STAMINA of prof)\r
+                               STAMINA of prof_rationalise(nextnum(STAMINAMAX of prof))        //default to max stamina, not current one\r
+                               STAMINAMAX of prof_STAMINA of prof\r
+                               out("*C*LDexterity:     :N -> ",dex)\r
+                               DEXTERITY of prof_rationalise(nextnum(dex))\r
+                               if Us(PNAME of profile)\r
+                               $(      let gam=GAMES.PLAYED of prof\r
+                                       out("*C*LGames: :N -> ", gam)\r
+                                       GAMES.PLAYED of prof_nextnum(gam)\r
+                                       if BZK\r
+                                       $(      let ber=BERSERK of prof\r
+                                               out("*C*LBerserk:       :N -> ", ber)\r
+                                               BERSERK of prof_nextnum(ber)\r
+                                       $)\r
+                               $)\r
+                               out("*C*LScore: :N -> ",scr)\r
+                               SCORE of prof_nextnum(scr)\r
+                               if ESSEX\r
+                               $(      write(op, ":N*T:N*T:N*T:N*C*L", STRENGTH of prof,DEXTERITY of prof,STAMINAMAX of prof,SCORE of prof)\r
+                                       close(op)\r
+                               $)\r
+                               endcase\r
+ratts: error()\r
+                       $)\r
+               case SF.SET:\r
+                       unless WIZARD of profile out("You've got to be a :s or :s to be able to do that!*C*L",female!MAX.LEVEL,male!MAX.LEVEL)<>reset()<>endcase\r
+                       spcheck()\r
+                       $(      let o1, p=object(), getnum()\r
+                               unless p <= P5 of o1\r
+                                       Error("Max. property for :S is :n.",objname, P5 of o1)\r
+                               setprop(o1,p)\r
+                               longdescribe(@mud6,(selector 18:18*((P4 of o1)rem 2):(P4 of o1)/2+OBJECTSIZE+1)of o1)\r
+                       $)\r
+       $)\r
+$)\r
+and action(skiptonext) be\r
+$(     let fast.action,vb,nd,oldnd,ocl,o1,rcl,o2,sm,fm,function,obj,ifr,sms,fms,trylots,formobile=\r
+               PTYPE of verb=S.FASTATN,get.cmnd(DREC of verb,fast.action),?,?,?,?,?,?,?,?,?,?,false,?,?,Numbargs(),trylots ne 0 /\ skiptonext=0\r
+       $(      o1_false\r
+               ocl,rcl_D1 of vb,D2 of vb\r
+               if rcl=#400001 then if (PTYPE of objct)=S.PLAYER loop    //Means can override eg ".assist"\r
+               if ocl o1_action.ser(objct,ocl,trylots,formobile)<>unless o1 loop\r
+               if rcl then test #400000 le rcl le #400077 then\r
+               $(      let cnt=0\r
+                       for i=0 to 35 do if (1<<i) bitand joined cnt+_1\r
+                       if cnt ls rcl-1-#400000 loop\r
+               $) or test ocl then test ocl=#777775 \/ ocl=#777777 then\r
+               $(      o1_action.ser(instrmnt, rcl,trylots,formobile)\r
+                       unless o1 loop\r
+               $) or\r
+               $(      o2_action.ser(instrmnt,rcl,trylots,formobile)\r
+                       unless o2 loop\r
+                       unless PTYPE of instrmnt=S.PLAYER\/formobile\r
+                       $(      let poss=?\r
+                               test PTYPE of instrmnt=S.CLASS then poss_toting.class(DREC of instrmnt)\r
+                                       or poss_toting(D1 of (DREC of instrmnt))\r
+                               if poss o2_poss\r
+                       $)\r
+               $) or\r
+               $(      o1_(formobile->here.class,here.or.toting.class)(rcl)\r
+                       unless o1 loop\r
+               $)\r
+               obj_D6 of vb->((D6 of vb ne #777777/\D6 of vb ne #777775)->D6 of vb,o2),o1\r
+               sm,function_D4 of vb,D3 of vb\r
+               switchon function into\r
+               $(\r
+               case F.HOLDFIRST:\r
+                       holdfirst_true\r
+                       loop\r
+               case F.HOLDLAST:\r
+                       holdfirst_false\r
+                       loop\r
+               case F.FLIPAT:\r
+                       if at swapobjins()\r
+                       loop\r
+               case F.NOIFR:\r
+                       ifr_false\r
+                       loop\r
+               case F.IFRPROP:\r
+                       if RANDM of obj setprop(obj,random(1+(P5 of obj)))\r
+               case F.IFPROP:  case F.IFPROPINC:       case F.IFPROPDEC:       case F.IFPROPDESTROY:\r
+                       if(P4 of obj) ne sm loop\r
+                       endcase\r
+               case F.IFOBJCOUNT:\r
+               $(      let cnt=0\r
+                       sm_ROBJT of LH of sm\r
+                       while sm\r
+                       $(      cnt+_1\r
+                               sm_LINK of sm\r
+                       $)\r
+                       test cnt ge D5 of vb then endcase or loop\r
+               $)\r
+               case F.UNLESSPROP:      case F.UNLESSPROPDESTROY:\r
+                       unless (P4 of obj) ne sm loop\r
+                       endcase\r
+               case F.IFIN:    case F.IFINC:   if (LH of sm ne room) loop\r
+                       endcase\r
+               case F.UNLESSIN:        case F.UNLESSINC:       if (LH of sm eq room) loop\r
+                       endcase\r
+               case F.SENDEMON: case F.SSENDEMON:      //sendemon or super-sendemon\r
+                       obj_D6 of vb->((D6 of vb ne #777777/\D6 of vb ne #777775)->D6 of vb,instrmnt),objct\r
+                       unless PTYPE of obj=S.PLAYER loop\r
+                       $(      let pnum=P1 of obj\r
+                               if hidden(pnum) loop\r
+                               unless function=F.SSENDEMON\/(WIZARD of profile=1)\/((1<<pnum) bitand who.copy) loop\r
+                               endcase\r
+                       $)\r
+               case F.IFHERETRANS:\r
+               case F.IFHERE:  case F.UNLESSHERE:      case F.HURT:    case F.EMOTION:\r
+                       if ocl=#777775 loop\r
+                       if ocl=#777777 /\ (PTYPE of objct = S.PLAYER) then\r
+                       $(      let pnum=P1 of objct\r
+                               if hidden(pnum) test function=F.UNLESSHERE then endcase or loop\r
+                               if (1<<pnum) bitand who.copy test D3=F.UNLESSHERE then loop or endcase\r
+                               test D3=F.UNLESSHERE then endcase or loop\r
+                       $)\r
+               case F.UNLESSGOT:       case F.IFGOT:\r
+                       nd_holding(obj)\r
+                       if (function=F.UNLESSGOT /\ nd) \/ (function=F.IFGOT /\\nd) loop\r
+                       if (function=F.UNLESSGOT) \/ (function=F.IFGOT) endcase\r
+                       if ((function=F.IFHERE)\/(function=F.IFHERETRANS))/\nd endcase\r
+                       if (function=F.UNLESSHERE/\nd) loop\r
+                       nd_valof\r
+                       $(      let nd=ROBJT of room\r
+                               if (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then resultis false\r
+                               while nd do test obj=nd /\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0)) then resultis true or\r
+                               nd of_LINK\r
+                               resultis false\r
+                       $)\r
+                       if (function=F.UNLESSHERE /\nd) \/ (((function=F.IFHERE)\/(function=F.IFHERETRANS)) /\\nd) loop\r
+                       endcase\r
+               case F.IFHAVE:\r
+                       if carrying(PTYPE of obj,true,carry) endcase\r
+                       loop\r
+               case F.UNLESSHAVE:\r
+                       unless carrying(PTYPE of obj,true,carry) endcase\r
+                       loop\r
+               case F.UNLESSOBJIS:     if objct=fake endcase\r
+                       if (D1 of DREC of objct)=(LH of D6 of vb) loop\r
+                       endcase\r
+               case F.IFOBJIS: if objct=fake loop\r
+                       if (D1 of DREC of objct)=(LH of obj) endcase\r
+                       loop\r
+               case F.UNLESSOBJCONTAINS:\r
+                       unless open(o1,PTYPE of obj,objmatch,true) endcase\r
+                       loop\r
+               case F.IFOBJCONTAINS:\r
+                       if open(o1,PTYPE of obj,objmatch,true) endcase\r
+                       loop\r
+               case F.UNLESSOBJPLAYER: if objct ne fake endcase\r
+                       unless PTYPE of objct=S.PLAYER endcase\r
+                       test P1 of objct=player.no then endcase or loop\r
+               case F.IFOBJPLAYER:     if objct ne fake loop\r
+                       unless PTYPE of objct=S.PLAYER endcase\r
+                       test P1 of objct=player.no then loop or endcase\r
+               case F.UNLESSINSIS:     if instrmnt=fake\/instrmnt=0 endcase\r
+                       if (D1 of DREC of instrmnt)=(LH of D6 of vb) loop\r
+                       endcase\r
+               case F.IFINSIS: if instrmnt=fake\/instrmnt=0 loop\r
+                       if (D1 of DREC of instrmnt)=(LH of D6 of vb) endcase\r
+                       loop\r
+               case F.IFDISENABLE:\r
+                       if disenable(sm) endcase\r
+                       loop\r
+               case F.UNLESSDISENABLE:\r
+                       unless disenable(sm) endcase\r
+                       loop\r
+               case F.IFENABLED:\r
+                       if enabled(sm) endcase\r
+                       loop\r
+               case F.UNLESSENABLED:\r
+                       if enabled(sm) loop\r
+                       endcase\r
+               case F.IFBERSERK:\r
+                       if BZK/\BERSERK of profile endcase\r
+                       loop\r
+               case F.UNLESSBERSERK:\r
+                       unless BZK/\BERSERK of profile endcase\r
+                       loop\r
+               case F.IFWIZ:                           //ought to do this like ifasleep & ifsex...\r
+                       if WIZARD of profile endcase\r
+                       loop\r
+               case F.UNLESSWIZ:\r
+                       unless WIZARD of profile endcase\r
+                       loop\r
+               case F.IFILL:\r
+                       if deaf\/dumb\/blind\/paralysed endcase\r
+                       loop\r
+               case F.UNLESSILL:\r
+                       unless deaf\/dumb\/blind\/paralysed endcase\r
+                       loop\r
+               case F.UNLESSWEIGHS:\r
+                       unless WEIGHT of obj ge sm endcase\r
+                       loop\r
+               case F.IFWEIGHS:\r
+                       if WEIGHT of obj ge sm endcase\r
+                       loop\r
+               case F.UNLESSDEAD:              //use IFALIVE?\r
+                       if DESTROYED of obj le 0 loop\r
+                       endcase\r
+               case F.IFDEAD:\r
+                       if DESTROYED of obj le 0 endcase\r
+                       loop\r
+               case F.UNLESSDESTROYED:\r
+                       if DESTROYED of obj ls 0 loop\r
+                       endcase\r
+               case F.IFDESTROYED:\r
+                       if DESTROYED of obj ls 0 endcase\r
+                       loop\r
+               case F.IFSMALL:\r
+                       if A.SMALL bitand (ATTRIB of room) endcase\r
+                       loop\r
+               case F.UNLESSSMALL:\r
+                       unless A.SMALL bitand (ATTRIB of room) endcase\r
+                       loop\r
+               case F.IFSNOOPING:\r
+                       if snobj ne 0 \/ snooping ne -1 endcase\r
+                       loop\r
+               case F.UNLESSSNOOPING:\r
+                       unless snobj unless ~snooping endcase\r
+                       loop\r
+               case F.RETALIATE:\r
+               case F.IFFIGHTING:\r
+               case F.UNLESSFIGHTING:\r
+                       if valof\r
+                       $(      for i=0 to 35 if fight!i resultis true\r
+                               resultis false\r
+                       $) test function=F.UNLESSFIGHTING then loop or endcase\r
+                       test function=F.UNLESSFIGHTING then endcase or loop\r
+               case F.IFLEVEL: if player.level()<sm-1 /\(WIZARD of profile)=0 loop\r
+                       endcase\r
+               case F.IFPLAYING:\r
+                       if playing(sm) endcase\r
+                       loop\r
+               case F.UNLESSPLAYING:\r
+                       if playing(sm) loop\r
+                       endcase\r
+               case F.IFSELF:\r
+                       test PTYPE of objct=S.PLAYER /\ P1 of objct=player.no then endcase or loop\r
+               case F.IFSEX:   unless SEX of profile=sm loop\r
+                       endcase\r
+               case F.IFASLEEP:\r
+                       if ASLEEP of profile=sm endcase\r
+                       loop\r
+               case F.IFINVIS:\r
+                       if INVIS of profile=sm endcase\r
+                       loop\r
+               case F.IFDEAF:\r
+                       if deaf=sm endcase\r
+                       loop\r
+               case F.IFblind:\r
+                       if blind=sm endcase\r
+                       loop\r
+               case F.IFparalysed:\r
+                       if paralysed=sm endcase\r
+                       loop\r
+               case F.IFdumb:\r
+                       if dumb=sm endcase\r
+                       loop\r
+               case F.IFRSTAS:\r
+                       if random(STAMINA of profile) ls random(DESTROYED of obj) endcase\r
+                       loop\r
+               case F.UNLESSRSTAS:\r
+                       if random(STAMINA of profile) ls random(DESTROYED of obj) loop\r
+                       endcase\r
+               case F.IFRLEVEL:\r
+                       ifr_true\r
+                       test Random(100) ls (1+player.level())*sm\/(WIZARD of profile=1) then\r
+                               test objct=fake/\PTYPE of objct=S.PLAYER then\r
+                                       test P1 of objct=player.no then\r
+                                               endcase or\r
+                                                       test random(100) ls (1+player.level(LH from player.names!(P1 of objct)))*sm/\(WIZARD of profile=0)\r
+                                                       then loop or\r
+                                                       endcase or\r
+                                               endcase or\r
+                               loop\r
+               case F.UNLESSRLEVEL:\r
+                       ifr_true\r
+                       test Random(100) ls (1+player.level())*sm\/(WIZARD of profile)=1 then\r
+                               test objct=fake/\PTYPE of objct=S.PLAYER then\r
+                                       test P1 of objct=player.no then\r
+                                               loop or\r
+                                               test random(100) ls (1+player.level(LH from player.names!(P1 of objct)))*sm/\(WIZARD of profile=0)\r
+                                                       then endcase or\r
+                                                       loop or\r
+                                       loop or\r
+                               endcase\r
+               case F.IFR:\r
+                       ifr_true\r
+                       if random(100) ls sm endcase    //ls, not le\r
+                       loop\r
+               case F.UNLESSLEVEL:     if player.level()>=sm-1 \/(WIZARD of profile)=1 loop\r
+               default:        endcase\r
+               $)\r
+               holdfirst_false\r
+               unless D7 of vb doownthing()            //What? No mobile check?!\r
+               if D8 of vb sendall(true,K.LOUD,false,false,D8 of vb)\r
+               special(D7 of vb)\r
+               break\r
+       $) repeatwhile valof $( vb_get.cmnd(LINK of vb,fast.action); resultis vb $)\r
+       unless vb test trylots then return or error()\r
+       if ifr/\(WIZARD of profile)=0 verb_0<>objct_fake.node("that")\r
+       unless o1 o1_obj\r
+       fm_D5 of vb\r
+       enable(D9 of vb)\r
+       skiptonext_formobile->-1, 1\r
+       sms_skiptonext*sm\r
+       fms_skiptonext*fm\r
+       if function ge F.INCDESTROY then switchon function into\r
+       $(      case F.FLOATDESTROY:\r
+                       FIXED of o1_false\r
+               case F.INCDESTROY:\r
+                       if P4 of o1 < P5 of o1 then setprop(o1,(P4 of o1)+1)\r
+                       function_F.DESTROY\r
+                       endcase\r
+               case F.DESTROYINC:\r
+                       destroy(o1,0)\r
+                       function_F.INC\r
+                       endcase\r
+               case F.DESTROYCREATE:\r
+                       destroy(o1,0)\r
+                       function_F.CREATE\r
+                       endcase\r
+               case F.EXPDESTROY:\r
+                       setexp(o1)\r
+                       function_F.DESTROY\r
+                       endcase\r
+               case F.EXPMOVE:\r
+                       setexp(o1)\r
+                       function_F.MOVE\r
+                       endcase\r
+               case F.INCMOVE:\r
+                       function_F.MOVE\r
+               case F.UNLESSINC:\r
+               case F.IFINC:\r
+                       if P4 of o1<P5 of o1 then setprop(o1,(P4 of o1)+1)\r
+                       endcase\r
+               case F.DESTROYTRANS:\r
+                       destroy(o1,0)\r
+                       function_F.TRANS\r
+                       endcase\r
+               case F.DECDESTROY:\r
+                       if P4 of o1>0 then setprop(o1,(P4 of o1)-1)\r
+                       function_F.DESTROY\r
+                       endcase\r
+               case F.DECIFZERO:\r
+                       if P4 of o1>0 then setprop(o1,(P4 of o1)-1)\r
+                       function_F.IFZERO\r
+                       endcase\r
+               case F.DECINC:\r
+                       if P4 of o1 > 0 then setprop(o1,(P4 of o1)-1)\r
+                       function_F.INC\r
+                       endcase\r
+               case F.INCDEC:\r
+                       if P4 of o1 < P5 of o1 then setprop(o1,(P4 of o1)+1)\r
+                       function_F.DEC\r
+                       endcase\r
+               case F.DESTROYDEC:\r
+                       destroy(o1,0)\r
+                       function_F.DEC\r
+                       endcase\r
+               case F.DESTROYDESTROY:\r
+                       destroy(o1,0)\r
+                       function_F.DESTROY\r
+                       endcase\r
+               case F.DESTROYSET:\r
+                       destroy(o1,0)\r
+                       function_F.SET\r
+                       endcase\r
+               case F.SETDESTROY:\r
+               case F.SETFLOAT:\r
+                       setprop(o1, sm)\r
+                       endcase\r
+               case F.SWAP:\r
+                       If D6 of vb /\ D6 of vb ne #777777/\D6 of vb ne #777775 then\r
+                       $(      let temp=P4 of (D6 of vb)\r
+                               setprop((D6 of vb),P4 of o1)\r
+                               setprop(o1,temp)\r
+                       $)\r
+                       longdescribe(sms)\r
+                       return\r
+       $)\r
+       if D6 of vb then o1_D6 of vb ne #777777/\D6 of vb ne #777775->D6 of vb, o2\r
+       switchon function into\r
+       $(      case F.FLOAT:\r
+                       unless FIXED of o1 endcase\r
+                       FIXED of o1_false\r
+                       longdescribe(sms)\r
+                       return\r
+               case F.IFLIGHT:\r
+                       longdescribe(visible()->sms,fms)\r
+                       return\r
+               case F.INC: //Inc\r
+                       if P4 of o1>=P5 of o1 then endcase\r
+                       setprop(o1,(P4 of o1)+1,sms)\r
+                       return\r
+               case F.FIX:\r
+                       if fixed of o1 endcase\r
+                       fixed of o1_true\r
+               case F.DEC: //Dec\r
+                       if P4 of o1>0 then\r
+                       $(      setprop(o1,(P4 of o1)-1,sms)\r
+                               return\r
+                       $)\r
+                       endcase\r
+               case F.IFPROPDEC:\r
+                       if P4 of o1>0 then\r
+                       $(      setprop(o1,(P4 of o1)-1,fms)\r
+                               return\r
+                       $)\r
+                       endcase\r
+               case F.TESTSMALL:\r
+                       longdescribe(A.SMALL bitand ATTRIB of room->sms, fms)\r
+                       return\r
+               case F.FLUSH:\r
+                       flush()\r
+               case F.UNLESSGOT:\r
+               case F.IFGOT:\r
+               case F.IFRSTAS:\r
+               case F.UNLESSRSTAS:\r
+               case F.IFHAVE:\r
+               case F.UNLESSHAVE:\r
+               case F.IFHERE:\r
+               case F.UNLESSHERE:\r
+               case F.IFOBJIS:\r
+               case F.UNLESSOBJIS:\r
+               case F.IFOBJPLAYER:\r
+               case F.UNLESSOBJPLAYER:\r
+               case F.IFSNOOPING:\r
+               case F.UNLESSSNOOPING:\r
+               case F.IFOBJCONTAINS:\r
+               case F.UNLESSOBJCONTAINS:\r
+               case F.IFINSIS:\r
+               case F.UNLESSINSIS:\r
+               case F.IFDEAD:\r
+               case F.UNLESSDEAD:\r
+               case F.IFBERSERK:\r
+               case F.UNLESSBERSERK:\r
+               case F.IFFIGHTING:\r
+               case F.UNLESSFIGHTING:\r
+               case F.IFWIZ:\r
+               case F.UNLESSWIZ:\r
+               case F.IFILL:\r
+               case F.UNLESSILL:\r
+               case F.IFSMALL:\r
+               case F.UNLESSSMALL:\r
+               case F.IFSELF:\r
+               case F.NULL: //Null\r
+                       longdescribe(sms)\r
+                       return\r
+               case F.IFDISENABLE:\r
+               case F.IFWEIGHS:\r
+               case F.UNLESSWEIGHS:\r
+                       endcase\r
+               case F.MOVE: //Move\r
+                       if skiptonext ls 0 endcase\r
+                       switchon PTYPE of objct into\r
+                       $(      CASE S.OBJECT:       drop(LH of sm); endcase\r
+                               CASE S.CLASS:       drop.class(LH of sm); endcase\r
+                               DEFAULT:        error("I don't know what :s means.", objname)\r
+                       $)\r
+                       endcase\r
+               case F.DELAYMOVE:\r
+                       $(      let obj,nd,oldnd,indx=?,carry,lvcarry,demons+(DEMONSIZE+DOF)*fm\r
+                               if skiptonext ls 0 endcase\r
+                               switchon PTYPE of objct into\r
+                               $(\r
+                               case S.OBJECT:\r
+                                       obj_D1 of DREC of objct\r
+                                       unless toting(obj) error("You aren't carrying it!")\r
+                                       until LH of nd=obj oldnd_nd<>nd of_LINK\r
+                                       drop.delay(nd,oldnd,LH of sm,indx,fm)\r
+                                       return\r
+                               case S.CLASS:\r
+                                       obj_P1 of objct\r
+                                       unless toting.class(obj) error("You aren't carrying any :s", objname)\r
+                                       while nd do\r
+                                       $(      unless PTYPE of nd=LH from kept if P1 of nd=obj\/(obj=1/\P4 of nd=SCOREPROP of nd /\ valof\r
+                                               $(      let res=VALUE of nd\r
+                                               $[      $hrre   1,      res     $]\r
+                                               $) ge 0) then drop.delay(nd,oldnd,LH of sm,indx,fm)<>nd_oldnd\r
+                                               oldnd_nd\r
+                                               nd of_LINK\r
+                                       $)\r
+                                       return\r
+                               default:        error("I don't know what :s means.", objname)\r
+                               $)\r
+                       $)\r
+               case F.IFHERETRANS:\r
+               case F.TRANS: //Trans\r
+                       longdescribe(fms)\r
+                       lose.followers()\r
+                       start.leading()\r
+                       move.ser(LH of sm->LH of sm,room, true)\r
+                       return\r
+               case F.TRANSWHERE:\r
+               $(      let obno=PTYPE of o1\r
+                       let place=valof\r
+                       $(      for i=0 to HASHSIZE\r
+                               $(      let nd=index!i\r
+                                       while nd do\r
+                                       $(      let rm,ob=LH of nd,ROBJT of rm\r
+                                               unless (ATTRIB of rm bitand (A.DEATH bitor A.HIDEAWAY))/\(WIZARD of profile)=0\r
+                                               while ob do\r
+                                               $(      if PTYPE of ob=obno resultis rm\r
+                                                       ob of_LINK\r
+                                               $)\r
+                                               nd of_LINK\r
+                                       $)\r
+                               $)\r
+                               resultis false\r
+                       $)\r
+                       unless place endcase\r
+                       longdescribe(sms)\r
+                       lose.followers()\r
+                       start.leading()\r
+                       move.ser(place,true)\r
+                       return\r
+               $)\r
+               case F.WRITEIN:\r
+               $(      let mudstream, buffer, snoopy=?, vec 26, snoopedon\r
+                       read.message(buffer)\r
+                       snoopedon_false\r
+rats:                  mudstream_appendfile(DISC, PNAME of o1, "dba", MAINTA, label(rats))\r
+                       write(mudstream, "*":s*"*C*L", buffer)\r
+                       close(mudstream)\r
+                       snoopedon_snoopy\r
+                       out("*C*L")\r
+                       longdescribe(sms)\r
+                       return\r
+               $)\r
+               case F.RETALIATE:\r
+                       if skiptonext ls 0 endcase\r
+                       if retaliated error("You can't :s further this melee",verbname)\r
+                       $(      let wpn=(sm<<18) bitor ((0 le ocl ls #400000)/\(object ne fake) -> objct, 0)\r
+                               for i=0 to 35 if fight!i transmit(i, 0, K.IHR, wpn)\r
+                               out("You :s with your :s!*C*L", verbname, objname)\r
+                               retaliated_true\r
+                               endcase\r
+                       $)\r
+               case F.ENABLE:\r
+                       enable(sm,true)\r
+                       endcase\r
+               case F.DISENABLE:\r
+                       disenable(sm)\r
+                       endcase\r
+               case F.SUSPEND:\r
+                       suspend(events,sm)\r
+                       suspend(gdemons,sm)\r
+                       endcase\r
+               case F.SENDLEVEL:\r
+                       if dumb error("You can't do that, you're dumb")\r
+                       sendlevel(sm-2)\r
+                       endcase\r
+               case F.SENDMESS:\r
+                       if skiptonext ls 0 endcase\r
+                       sendall(true,K.MESS,false,false,sm)\r
+                       endcase\r
+               case F.TESTSEX:\r
+                       longdescribe(SEX of profile->sms,fms)\r
+                       return\r
+               case F.SETSEX:\r
+                       $(      let beforeoperation=SEX of profile\r
+                               SEX of profile_sm ge 1 -> 1, 0\r
+                               unless SEX of profile=beforeoperation sexify(SEX of profile)\r
+                       $)\r
+                       endcase\r
+               case F.DESTROYTOGGLESEX:\r
+                       SEX of profile_not (SEX of profile)\r
+                       sexify(SEX of profile)\r
+                       destroy(o1,SEX of profile -> sms, fms,numbargs())       //not too useful for demons...\r
+                       return\r
+               case F.TOGGLESEX:\r
+                       SEX of profile_NOT (SEX of profile)\r
+                       sexify(SEX of profile)\r
+                       longdescribe(SEX of profile->sms,fms)\r
+                       return\r
+               case F.SENDEMON:\r
+               case F.SSENDEMON:\r
+                       transmit(P1 of obj,0,K.DTD,sm)\r
+                       endcase\r
+               case F.HURT:\r
+                       if skiptonext ls 0 endcase\r
+                       if peace error("Fighting is currently forbidden.")\r
+                       unless RELAXED\/us(me) if WIZARD of profile error("I'm sure you don't mean it...")\r
+                       test PTYPE of objct=S.PLAYER then\r
+                       $(      let pnum=P1 of objct and weapon=0 ls rcl ls #400000->instrmnt, 0\r
+                               if pnum=player.no error("Don't do it, kid! Things will look better in the morning, honest!")\r
+                               if fight!pnum error("You're not allowed to do that to :p while fighting :s",\r
+                                       objname, SEX of LH from player.names!pnum ->"her", "him")\r
+                               send(pnum, 0, K.IHHU, (sm<<18)bitor weapon)\r
+                               out("You start to :s :P with :s :r", verbname,player.names!pnum,\r
+                                       sm<10->"extra",sm<30->"real","tremendous", 12)\r
+                               test weapon then Out(" using your :s.*C*L",insname)\r
+                               or outs(".*C*L")\r
+                       $) or\r
+                       $(      if fight!player.no error("You're not allowed to  do that to the :s in the middle*C*L of a fight", objname)\r
+                               unless DESTROYED of o1 gr 0 error("You can't :S that!", verbname)\r
+                               quitflg_false\r
+                               if MOTN of obj FIGHTS of MOTN of obj bitor_player.bit\r
+                               fight!player.no_o1\r
+                               broadcast(K.IFM,who.copy, objname)\r
+                               send(player.no, 0, K.ISAHM, sm)\r
+                               out("You start to :s the :s with :s power", verbname, objname, sm<10->"little extra",sm<30->"real","tremendous")\r
+                               if instrmnt out(" using your :s", insname)\r
+                               outs("!*C*L")\r
+                       $)\r
+                       retaliated_true\r
+                       endcase\r
+               case F.EMOTION:\r
+                       if skiptonext ls 0 endcase\r
+                       test PTYPE of objct=S.PLAYER then\r
+                       $(      let pnum, blk, sc, scr,pr,prf,nam,pnam=\r
+                                       P1 of objct, ?, sm, SCORE of profile,player.names!pnum,LH from pr,PNAME of prf, PNAME of profile\r
+                               if pnum=player.no error("Narcissism gets you nowhere these days, flower.")\r
+                               unless us(pnam)\/(!pnam>>1)=(!"gail">>1) if us(nam) unless invisible(prf) error("You are too lowly a being to :s :p.",verbname,pr)\r
+                               if BZK/\BERSERK of profile error("Berserkers, such as yourself, are unable to perform such an act!*C*L")\r
+                               if BZK/\BERSERK of prf error("You can't :s a berserker!", verbname)\r
+                               if scr ls SCORE of prf sc_0\r
+                               if scr ls sc sc_scr\r
+                               setscore(-sc)\r
+                               blk_getmblock()\r
+                               blk!3, blk!4_!verbname, 1!verbname\r
+                               send(pnum, blk, K.IHSE, (E.MULT*sc)/E.DIV)\r
+                               sendall(who.copy bitand ~(1<<pnum), K.IHKS, false, false, pr, !verbname, 1!verbname)\r
+                               flush()\r
+                       $) or Error()\r
+                       endcase\r
+               case F.INCSEND:\r
+                       if P4 of o1 < P5 of o1 setprop(o1,(P4 of o1)+1)\r
+               case F.SEND:    case F.SENDEFFECT:\r
+               $(      let ptoob,whoto,thisrm=LH of o1,0,?\r
+                       function_function=F.SENDEFFECT\r
+                       thisrm_function -> sm, LH of sm\r
+                       for i=0 to HASHSIZE\r
+                       $(      let nd=index!i\r
+                               while nd do\r
+                               $(      let rm, ob = LH of nd, ROBJT of rm\r
+                                       while ob do\r
+                                       $(      if ptoob=PTYPE of ob\r
+                                               $(      test function then whoto bitor_WHO!rm or\r
+                                                       $(      broadcast(K.TTH,WHO!rm,thisrm,true)\r
+                                                               if (ATTRIB of thisrm) bitand A.DEATH\r
+                                                               $(      let o1=ROBJT of rm\r
+                                                                       while o1 do     //walk list already walking via ob...\r
+                                                                       $(      if DESTROYED of o1 gr 0\r
+                                                                                       destroy(o1,0)\r
+                                                                               o1 of_LINK\r
+                                                                       $)\r
+                                                               $)\r
+                                                       $)\r
+                                                       break\r
+                                               $)\r
+                                               ob of_LINK\r
+                                       $)\r
+                                       nd of_LINK\r
+                               $)\r
+                       $)\r
+                       if whoto sendall(whoto,K.LOUD,false,false,thisrm)\r
+                       endcase\r
+               $)\r
+               case F.ZONK:\r
+                       unless WIZARD of profile stamina of profile_-1\r
+                       longdescribe(sms)\r
+                       checkout()\r
+                       endcase\r
+               case F.DEAD:\r
+                       $(      let nam=PNAME of profile\r
+                               for i=0 to 35 if fight!i /\ i ne player.no\r
+                               $(      let block=getmblock()\r
+                                       block!3_!nam\r
+                                       block!4_1!nam\r
+                                       send(i,block,K.IHD,(player.level()+1)*DEADPTS/2)\r
+                                       fight!i_false\r
+                               $)\r
+                       $)\r
+                       stop.fighting()\r
+                       longdescribe(sms)\r
+                       unless WIZARD of profile ne 0 test spectacular then\r
+                       $(      drop.everything()\r
+                               STAMINA of profile_STAMINA of profile<20 -> 10, (STAMINA of profile)-10\r
+                       $) or\r
+                       $(      if sms<0 longdescribe(-sms)\r
+                               quit()\r
+                       $)\r
+                       endcase\r
+               case F.EXPSET:\r
+                       setexp(o1)\r
+               case F.SET: //Set\r
+                       setprop(o1,sm)\r
+                       endcase\r
+               case F.RESETDEST:\r
+                       DESTROYED of o1_sm\r
+                       endcase\r
+               case F.IFPROPINC:\r
+                       if P4 of o1 < P5 of o1 setprop(o1,(P4 of o1)+1)\r
+                       endcase\r
+               case F.EXP:\r
+                       setscore(extra(sm))\r
+                       flush()\r
+                       endcase\r
+               case F.LOSEEXP:\r
+                       setscore(-sm)\r
+                       endcase\r
+               case F.LOSESTAMINA:\r
+                       unless WIZARD of profile STAMINA of profile-_sm\r
+                       longdescribe(fms)\r
+                       checkout()\r
+               case F.IFOBJCOUNT:\r
+                       return\r
+               case F.TOGGLE: //Toggle\r
+                       setprop(o1,(p5 of o1)-(p4 of o1))\r
+                       longdescribe(P4 of o1->sms, fms)\r
+                       return\r
+               case F.SETFLOAT:\r
+                       FIXED of o1_false\r
+                       if P4 of o1 <P5 of o1 setprop(o1,(P4 of o1)+1)  //so as to let you see 'em too\r
+                       endcase\r
+               case F.STAMINA:\r
+               case F.STAMINADESTROY:\r
+                       $(      let s, smax=(STAMINA of profile)+sm, STAMINAMAX of profile\r
+                               if s>smax s_smax\r
+                               STAMINA of profile_s\r
+                       $)\r
+                       if function=F.STAMINA endcase\r
+               case F.SETDESTROY:\r
+               case F.IFPROPDESTROY:\r
+               case F.UNLESSPROPDESTROY:\r
+               case F.DESTROY:\r
+                       if DESTROYED of o1 ls 0 endcase\r
+                       destroy(o1,function = F.DESTROY->sms,fms,D8 of vb->false,Numbargs()=skiptonext)\r
+                       return\r
+               case F.INJURE:\r
+                       if DESTROYED of o1 le 0 endcase\r
+                       DESTROYED of o1-_sm\r
+                       if DESTROYED of o1 le 0 destroy(o1,0)\r
+                       endcase\r
+               case F.CREATE:\r
+                       unless DESTROYED of o1 ls 0 endcase\r
+                       DESTROYED of o1_false\r
+                       longdescribe(sms)\r
+                       return\r
+               case F.FORROT:\r
+                       setprop(o1,((P4 of o1)+1) rem ((P5 of o1)+1))\r
+                       longdescribe(P4 of o1->sms,fms)\r
+                       return\r
+               case F.BACKROT:\r
+                       setprop(o1,((P4 of o1)-1) rem ((P5 of o1)+1))\r
+                       longdescribe(P4 of o1->sms, fms)\r
+                       return\r
+               case F.TRANSHERE:\r
+               $(      let obno, nd=PTYPE of o1, ?\r
+                       longdescribe((valof\r
+                       $(      for i=0 to HASHSIZE\r
+                               $(      nd_index!i\r
+                                       while nd\r
+                                       $(      let rm, ob, oob=LH of nd,?,?\r
+                                               lockup(@ob,@oob,rm)\r
+                                               unless rm=room\/((ATTRIB of rm bitand (A.DEATH bitor A.HIDEAWAY))/\(WIZARD of profile=0))\r
+                                               while ob do\r
+                                               $(      if PTYPE of ob=obno/\DESTROYED of ob ge 0\r
+                                                       $(      LINK of oob_LINK of ob\r
+                                                               unlock()\r
+                                                               lockdown(room,ob)\r
+                                                               broadcast(K.SHBD,who!room,ob,true)\r
+                                                               resultis true\r
+                                                       $)\r
+                                                       oob_ob\r
+                                                       ob of_LINK\r
+                                               $)\r
+                                               unlock()\r
+                                               nd of_LINK\r
+                                       $)\r
+                               $)\r
+                               resultis false\r
+                       $)) -> sms, fms)\r
+                       return\r
+               $)\r
+               case F.EXPINC:\r
+                       setexp(o1)\r
+                       unless P4 of o1<P5 of o1 endcase\r
+                       setprop(o1,(P4 of o1)+1,sms)\r
+                       return\r
+               case F.IFZERO:\r
+                       longdescribe(P4 of o1->fms,sms)\r
+                       return\r
+               default:        endcase //hope this catches the rest...\r
+       $)\r
+       longdescribe(fms)\r
+$)\r
+and action.ser(obj,ocl,skipnext,formobile)=valof\r
+$(     let class,res,type=?,?,?\r
+       unless obj resultis false\r
+       type_PTYPE of obj\r
+       if ocl=#777777 resultis type=S.PLAYER->obj, 0\r
+       unless type=S.CLASS\/type=S.OBJECT resultis false\r
+       if ocl=#777775 resultis obj=fake->false, true\r
+       test type=S.CLASS then class_DREC of obj or class_D2 of (DREC of obj)\r
+       unless ocl=#777776 \/ ocl=class resultis false\r
+       test type=S.CLASS then res_(formobile->here.class,here.or.toting.class)(class)\r
+       or res_(formobile->here, here.or.toting)(D1 of (DREC of obj))\r
+       unless res\/skipnext out("I see no :s!*C*L",PNAME of obj)<>jump(mainloop)\r
+       resultis res\r
+$)\r
+and spcheck() be if spectacular unless maint Error("Not during a spectacular!")\r
+and checkforced() be if justforced Error("You can't be forced to do that!")\r
diff --git a/MUD6.BCL b/MUD6.BCL
new file mode 100644 (file)
index 0000000..6f27dee
--- /dev/null
+++ b/MUD6.BCL
@@ -0,0 +1,674 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
+\r
+let saywhere(num,i) be\r
+$(     let rm=CROOM of LH from player.names!i\r
+       if num out(":n ",num)\r
+       out("carried by :p in the room described as ",player.names!i)\r
+       if WIZARD of profile out("(:6) ",!rm)\r
+       test (A.DEATH bitand ATTRIB of rm)/\(WIZARD of profile)=0 then outs("Land of the Dead.*C*L") or desc.short(rm)\r
+$)\r
+and sayroom(num,rm,lvfound) be //get nm from obj sometime?\r
+$(     if num out(":n ",num)\r
+       out("in the room described as ")\r
+       if WIZARD of profile out("(:6) ",!rm)<>!lvfound_true\r
+       desc.short(rm)\r
+       unless LENGTH of (dmpbuf+((TITLE of rm) rem WDSPERBUF+1)) outz($az"Land of the Dead")\r
+       !lvfound_true\r
+$)\r
\r
+and lookinside(nd,l,cn)=valof\r
+test CONTENTS of nd ne 0 /\ (WIZARD of profile ne 0 \/ DESTROYED of nd ge 0) then\r
+$(     let n=CONTS of CONTENTS of nd and found=false and num=0\r
+       while n do\r
+       $(      if lookinside(n, l, cn) found_true\r
+               if cn(l,n)/\(WIZARD of profile=1\/DESTROYED of n ge 0) num+_1\r
+               n of_LINK\r
+       $)\r
+       if found out(":s the :s ",MOTN of nd->"carried by","inside",PNAME of nd)\r
+       if num\r
+       $(      if found outz($az"and ")\r
+               out(":n :s the :s ",num,MOTN of nd->"carried by","inside",PNAME of nd)\r
+               found_true\r
+       $)\r
+       resultis found\r
+$) or resultis false\r
+and inventory(list,level,looking) be test list then    //don't use outz in here or sayinsides\r
+$(     let nd,nm,l=list,?,0\r
+       while nd do\r
+       $(      nm_PNAME of nd\r
+               l_LENGTH of nm\r
+               test ccnt+l+1>72 then\r
+               $(      outs("*C*L")\r
+                       for i=1 to level outs("    ")\r
+                       out(":s*S", nm)\r
+               $) or out(":s*S",nm)\r
+               nd of_LINK\r
+       $)\r
+       nd_list //could just use list\r
+       while nd do\r
+       $(      if holds(nd) outz($az"*C*L")<>sayinsides(nd, level+1, PNAME of nd, numbargs()=3)\r
+               setit(nd)\r
+               nd of_LINK\r
+       $)\r
+$) or outs("nothing")\r
+and holds(obj)=valof\r
+$(     let insides=CONTENTS of obj\r
+       unless insides /\ (DISGUISED of insides=0 \/ WIZARD of profile=1) resultis false\r
+       resultis insides\r
+$)\r
+and sayinsides(obj,level, nm, looking) be\r
+$(     let insides=holds(obj)\r
+       unless insides return\r
+       ccnt_0\r
+       for i=1 to level outs("    ")\r
+       out("The :s :s ", nm,MOTN of obj->"is carrying","contains")\r
+       test ((TRANSPARENT of insides ne 0 \/ looking)/\P4 of obj=0) \/ WIZARD of profile=1 then inventory(CONTS of insides, level)\r
+               or out(CONTS of insides ->"something", "nothing")\r
+$)\r
+and holding(obj)=valof\r
+$(     let nd=carry\r
+       while nd do test obj=nd then resultis true or nd of_LINK\r
+       resultis false\r
+$)\r
+and gett() be\r
+$(     let obj,nd,oldnd=D1 of (DREC of objct),?,?\r
+       unless WIZARD of profile=1 \/ here(obj) then\r
+               error("I see no :s", objname)\r
+       lockup(@nd,@oldnd)\r
+       until LH of nd=obj /\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0)) do\r
+       $(      oldnd_nd\r
+               nd of_LINK\r
+               unless nd unlock()<>Error("It's not :chere.",place(room)=room->'*0','t')\r
+       $)\r
+       if FIXED of nd\/NOGET of nd test WIZARD of profile=1/\(RELAXED\/us(me))/\(spectacular=0\/maint) then    //should combine fixed & noget selectors\r
+               unless us(me) outz($az"I hope you know what you're doing...*C*L") or\r
+       $(      unlock()\r
+               error("Don't be ridiculous!")\r
+       $)\r
+       if full.up()\r
+       $(      unlock()\r
+               error("You can't carry more than :n objects.", max.obj())\r
+       $)\r
+       if WEIGHT of nd+CARRY.COUNT of profile>max.wt()/\(WIZARD of profile)=0 then\r
+       $(      unlock()\r
+               error(CARRY.COUNT of profile ->"It is too much extra weight","It is too heavy for you to carry alone")\r
+       $)\r
+       LINK of oldnd_LINK of nd\r
+       stopmoving(nd)\r
+       unlock()\r
+       CARRY.COUNT of profile+:WEIGHT of nd\r
+       OBJ.CARRIED of profile+:1\r
+       if DESTROYED of nd ls 0 DESTROYED of nd_false\r
+       pushlist(lvcarry,nd)\r
+       ROBJT of profile_carry\r
+       adjustup(nd)\r
+       inform(nd,K.IGOT)\r
+       out(":u taken.*C*L", objname)\r
+       setit(nd)\r
+$)\r
+and get.class() be\r
+$(     let cl,nd,oldnd,got.one,got.not=P1 of objct,?,?,false,false\r
+       unless WIZARD of profile=1\/here.class(cl) error("I don't see any :s", objname)\r
+       lockup(@nd,@oldnd)\r
+       while nd do\r
+       $(      if classmatch(cl,nd)/\(\r
+               ((FIXED of nd=0)/\(NOGET of nd=0))\/\r
+               (WIZARD of profile=1/\(RELAXED\/us(me))/\(spectacular=0\/maint))\/valof\r
+               $(      got.not_true\r
+                       resultis false\r
+               $)) then\r
+               $(      got.one_1\r
+                       if WEIGHT of nd+carry.count of profile>max.wt()/\(WIZARD of profile)=0 then\r
+                       $(      out(CARRY.COUNT of profile->"Too much extra weight to take :s*C*L",":s too heavy for you to take*C*L",PNAME of nd)\r
+                               break\r
+                       $)\r
+                       if full.up()\r
+                       $(      out("Too many objects carried to take :s*C*L",PNAME of nd)\r
+                               break\r
+                       $)\r
+                       tidy(oldnd,nd,@got.one)\r
+                       nd_oldnd\r
+               $)\r
+               oldnd_nd\r
+               nd of_LINK\r
+       $)\r
+       unlock()\r
+       if not got.one\r
+       $(      unless got.one out(got.not->"Don't be ridiculous!*C*L","I don't see any :s*C*L", objname)\r
+               jump(mainloop)\r
+       $)\r
+       ROBJT of profile_carry\r
+$)\r
+and tidy(oldnd,nd,got.one) be\r
+$(     out(":u taken.*C*L",PNAME of nd)\r
+       setit(nd)\r
+       !got.one_true\r
+       if DESTROYED of nd ls 0 DESTROYED of nd_false\r
+       LINK of oldnd_LINK of nd\r
+       CARRY.COUNT of profile+:WEIGHT of nd\r
+       OBJ.CARRIED of profile+:1\r
+       stopmoving(nd)\r
+       pushlist(lvcarry,nd)\r
+       adjustup(nd)\r
+       inform(nd,K.IGOT)\r
+$)\r
+and full.up()=(max.obj()<=OBJ.CARRIED of profile)/\(WIZARD of profile)=0\r
+and max.wt()=MAXWEIGHT*(STRENGTH of profile)+(WT.EXTRA of profile)\r
+and max.obj()=(DEXTERITY of profile)/10+2+(OBJ.EXTRA of profile)\r
+and get.rid.of(o1,mess) be\r
+$(     let nd,oldnd=carry,lvcarry\r
+       while nd do\r
+       $(      let t=therein(nd, o1, true)\r
+               if t\r
+               $(      if t=1\r
+                       $(      let.go.of(nd)           //nasty if got by 2 demons at once...\r
+                               longdescribe(mess)\r
+                       $)\r
+                       break\r
+               $)\r
+               oldnd_nd\r
+               nd of_LINK\r
+       $)\r
+       killmonster(o1)\r
+$)\r
+and let.go.of(obj) be\r
+$(     let nd, oldnd, secnd=carry, lvcarry, ?\r
+       while nd do test obj=nd then break or oldnd_nd<>nd of_LINK\r
+       unless nd return\r
+       drop.ser.ser(nd,oldnd)\r
+       pushlist(room+4,nd)\r
+       ROBJT of profile_carry\r
+$)\r
+and drop.ser(nd,oldnd,rm) be\r
+$(     out(":u dropped.*C*L",PNAME of nd)\r
+       setit(nd)\r
+       if A.SANCTUARY bitand ATTRIB of rm setexp(nd,true)\r
+       drop.ser.ser(nd,oldnd)\r
+       if (A.HIDEAWAY bitand ATTRIB of rm)/\(MOTN of nd) destroy(nd,0)\r
+$)\r
+and drop.ser.ser(nd,oldnd) be\r
+$(     LINK of oldnd_LINK of nd\r
+       CARRY.COUNT of profile-:WEIGHT of nd\r
+       OBJ.CARRIED of profile-:1\r
+       adjustdown(nd)\r
+       inform(nd,K.IDROPT)\r
+$)\r
+and drop(rm) be\r
+$(     let obj,nd,oldnd=D1 of (DREC of objct),carry,lvcarry\r
+       unless numbargs() rm_place(room)\r
+       unless toting(obj) then error("You aren't carrying it!")\r
+       until LH of nd=obj do\r
+       $(      oldnd_nd\r
+               nd of_LINK\r
+       $)\r
+       drop.move(@rm)\r
+       drop.ser(nd,oldnd,rm)\r
+       lockdown(rm,nd)\r
+       broadcast(K.SHBD,who!rm,nd)\r
+       ROBJT of profile_carry\r
+$)\r
+and drop.delay(nd,oldnd,rm,indx,demonum) be            //what,where,with\r
+$(     let block=getmblock()\r
+       drop.move(@rm)\r
+       drop.ser(nd,oldnd,rm)\r
+       copy(indx,block+DOF,DEMONSIZE)\r
+       E.TIME of block+_Random(D.OFFSET of indx)\r
+       E.PLONK of block_true\r
+       block!(DEMONSIZE+DOF+1)_nd<<18 bitor rm\r
+       jar(@delock)\r
+       !block_(demons+(DEMONSIZE+DOF)*demonum)<<18 bitor gdemons\r
+       gdemons_block\r
+       unjar(@delock)\r
+       ROBJT of profile_carry\r
+$)\r
+and plonk(demon) be\r
+$(     let wd,nd,rm=demon!(DEMONSIZE+1),LH from wd, RH from wd\r
+       lockdown(rm,nd)\r
+       broadcast(K.SHBD,WHO!rm,nd,true)\r
+$)     \r
+and get.all() be\r
+$(     let nd,oldnd,gotone=?,?, false\r
+       lockup(@nd,@oldnd)\r
+       while nd do\r
+       $(      unless FIXED of nd \/ NOGET of nd tidy(oldnd,nd,@gotone)<>nd_oldnd\r
+               oldnd_nd\r
+               nd of_LINK\r
+       $)\r
+       unlock()\r
+       ROBJT of profile_carry\r
+       unless gotone error("Nothing taken.")\r
+$)\r
+//NB for next 2 procs: if the person who changes the object's property isn't\r
+//carrying it, could end up with a different carrying allowance to what should.\r
+and adjustup(nd) be if P4 of nd=0/\WEIGHT of nd>WTHRESHOLD/\MOTN of nd ne 0\r
+$(     let VAL = WEIGHT of nd -WTHRESHOLD\r
+       OBJ.EXTRA of profile+_(val/WTHRESHOLD)+1\r
+       WT.EXTRA of profile+_val\r
+$)\r
+and adjustdown(nd) be if P4 of nd=0/\WEIGHT of nd>WTHRESHOLD/\MOTN of nd ne 0\r
+$(     let val=WEIGHT of nd-WTHRESHOLD\r
+       OBJ.EXTRA of profile-_(val/WTHRESHOLD)+1\r
+       WT.EXTRA of profile-_val\r
+$)\r
+and drop.move(lvrm) be\r
+$(     let rm=!lvrm\r
+       if (A.SANCTUARY bitand ATTRIB of rm) /\\r
+               (A.DMOVE bitand ATTRIB of rm) then !lvrm_DMOVE of rm\r
+$)\r
+and drop.everything(tell.them) be\r
+$(     let obj,rm=unlink(lvcarry),?\r
+       rm_WIZARD of profile=0/\(A.DEATH bitand ATTRIB of room)->oldroom,place(room)\r
+       rm_WIZARD of profile=0/\(A.DMOVE bitand ATTRIB of rm)-> DMOVE of rm, rm\r
+       drop.move(@rm)\r
+       unless obj return\r
+       $(      if numbargs() Out(":u dropped.*C*L", PNAME of obj)\r
+               broadcast(K.SHBD,who!rm,obj)\r
+               inform(obj,K.IDROPT)\r
+               lockdown(rm,obj)\r
+               obj_unlink(lvcarry)\r
+       $)      repeatwhile obj\r
+       ROBJT of profile_carry\r
+       CARRY.COUNT of profile_0\r
+       OBJ.CARRIED of profile_0\r
+       OBJ.EXTRA of profile_0\r
+       WT.EXTRA of profile_0\r
+$)\r
+and drop.class(rm) be\r
+$(     let cl,nd,oldnd,dropped.one=P1 of objct,carry,lvcarry,false\r
+       unless toting.class(cl) error("You aren't carrying any :s.", objname)\r
+       unless numbargs() rm_place(room)\r
+       drop.move(@rm)\r
+       while nd do\r
+       $(      if P1 of nd=cl \/(cl=1 /\ P4 of nd=SCOREPROP of nd/\valof\r
+                       $(      let res=VALUE of nd\r
+                               $[      $HRRE   1,      res     $]\r
+                       $) ge 0 ) then\r
+               test PTYPE of nd=LH from kept \r
+               then Out(":U kept.*C*L", PNAME of nd) or\r
+               $(      drop.ser(nd,oldnd,rm)\r
+                       lockdown(rm,nd)\r
+                       broadcast(K.SHBD,who!rm,nd)\r
+                       nd_oldnd\r
+                       dropped.one_true\r
+               $)\r
+               oldnd_nd\r
+               nd of_LINK\r
+       $)\r
+       ROBJT of profile_carry\r
+       unless dropped.one error("You're keeping all the :s you have.", objname)\r
+$)\r
+and insert(given) be\r
+$(     let class,obj, nd, oldnd, ins, bag, insides,sel,gotone=\r
+               PTYPE of objct=S.CLASS, class->P1 of objct, D1 of DREC of objct,carry,lvcarry,D1 of DREC of instrmnt, ?, ?, class->classmatch,objmatch,false\r
+       bag_here.or.toting(ins)\r
+       unless bag error("I see no :s!", insname)\r
+       unless numbargs() given_MOTN of bag\r
+       unless (class->toting.class, toting)(obj)\r
+               error("You have to be carrying the :s to :s it :s anything.",  objname, verbname,given->"to","in")\r
+       insides_CONTENTS of bag\r
+       unless insides error("You can't :s it :s!", verbname,given->"to that","in there")\r
+       $(      until sel(obj,nd)\/nd=0\r
+               $(      oldnd_nd\r
+                       nd of_LINK\r
+               $)\r
+               unless nd test gotone then return or error("You aren't carrying any :s.", objname)\r
+               if nd=bag error("You can't :s something :s itself!", verbname,given->"to","inside")\r
+               if (WTUSED of insides)+(WEIGHT of nd)>MAXWT of insides /\(WIZARD of profile)=0\r
+                       error(given->"The :s can't carry it.","There's not enough room!", insname)\r
+               LINK of oldnd_LINK of nd        //possible deadlock here...\r
+               WTUSED of insides+_WEIGHT of nd\r
+               WEIGHT of bag+_WEIGHT of nd\r
+               unless toting(ins) CARRY.COUNT of profile-_WEIGHT of nd\r
+               OBJ.CARRIED of profile-_1\r
+               ROBJT of profile_carry\r
+               pushlist(insides,nd)\r
+               inform(nd, given->K.IGIV,K.IINS)\r
+               if given infrm(nd,bag,K.MGOT)\r
+               adjustdown(nd)\r
+               out(":p now :s the :s.*C*L", PNAME of nd,given->"carried by","inside", insname)\r
+               unless class setit(bag)<>return\r
+               gotone_true\r
+               nd_LINK of oldnd\r
+       $) repeat\r
+$)\r
+and remove() be\r
+$(     let class,obj,nd,oldnd,ins,bag,insides,sel,gotone,mover=\r
+               PTYPE of objct=S.CLASS,class->P1 of objct,D1 of DREC of objct,\r
+               ?,?,D1 of DREC of instrmnt, here.or.toting(ins), CONTENTS of bag,\r
+               class->classmatch,objmatch,false,MOTN of bag\r
+       unless insides error("The :s :s anything!", insname,mover->"isn't carrying","doesn't contain")\r
+       nd_CONTS of insides\r
+       oldnd_insides\r
+       $(      until sel(obj,nd)\/nd=0\r
+               $(      oldnd_nd\r
+                       nd of_LINK\r
+               $)\r
+               unless nd test gotone then return or error("The :s :s any :s.", insname, mover->"isn't carrying","doesn't contain", objname)\r
+               if full.up()\r
+               $(      out("You can't carry more than :n discrete objects.*C*L", max.obj())\r
+                       test gotone then return or jump(mainloop)\r
+               $)\r
+               unless toting(ins)\r
+               $(      if (WEIGHT of nd)+(CARRY.COUNT of profile)>max.wt()/\(WIZARD of profile)=0\r
+                       $(      out(CARRY.COUNT of profile->"it is too much extra weight*C*L", "it is too heavy for you to carry alone")\r
+                               test gotone then return or jump(mainloop)\r
+                       $)\r
+                       CARRY.COUNT of profile+_WEIGHT of nd\r
+               $)\r
+               LINK of oldnd_LINK of nd\r
+               WTUSED of insides-_WEIGHT of nd\r
+               WEIGHT of bag-_WEIGHT of nd\r
+               OBJ.CARRIED of profile+_1\r
+               pushlist(lvcarry, nd)\r
+               ROBJT of profile_carry\r
+               adjustup(nd)\r
+               if mover infrm(nd,bag,K.MDROPT)\r
+               inform(nd, mover->K.ITAK,K.IREM)\r
+               out(":p :s from :s.*C*L", PNAME of nd,mover->"stolen","removed",PNAME of bag)\r
+               setit(nd)\r
+               unless class return\r
+               gotone_true\r
+               nd_LINK of oldnd\r
+       $) repeat\r
+$)\r
+and empty() be\r
+$(     let obj, ins,bag,insides,holding,rm=?,D1 of DREC of objct,here.or.toting(ins),CONTENTS of bag,toting(ins),place(room)\r
+       unless insides error("The :s isn't a container.", objname)\r
+       obj_unlink(insides)\r
+       unless obj error("The :s is already empty!", objname)\r
+       while obj do\r
+       $(      out(":u dropped.*C*L", PNAME of obj)\r
+               setit(obj)\r
+               if A.SANCTUARY bitand ATTRIB of rm setexp(obj,true)\r
+               WTUSED of insides-_WEIGHT of obj\r
+               WEIGHT of bag-_WEIGHT of obj\r
+               if holding CARRY.COUNT of profile-_WEIGHT of obj\r
+               lockdown(rm,obj)\r
+               inform(obj,K.IREM)\r
+               inform(obj,K.IDROPT)\r
+               obj_unlink(insides)\r
+       $)\r
+       adjustdown(bag)\r
+       out("The :s now :s nothing.*C*L", objname,MOTN of bag->"carries","contains")\r
+$)\r
+and lockup(lvnd,lvoldnd,rm) be\r
+$(     unless numbargs()=3 rm_place(room)\r
+       !lvoldnd_rm+4\r
+       lock(door+rm)\r
+       !lvnd_ROBJT of rm\r
+$)\r
+and lockdown(rm, nd) be\r
+$(     lock(door+rm)\r
+       pushlist(rm+4,nd)\r
+       if MOTN of nd then\r
+       $(      !(MOTN of nd)_rm\r
+               if A.HIDEAWAY bitand ATTRIB of rm unless WIZARD of profile=1/\numbargs() ne 3\r
+                       destroy(nd,0)\r
+       $)\r
+       unlock()\r
+$)\r
+and describe(room,long) be\r
+$(     let bit,ty, lvrdoor=?,brief, door+room\r
+       if numbargs()<2 long_false\r
+       unless long gr 0\/ visible() then\r
+       error(blind->"You can't see anything, you're blind.","The room is too dark to see anything.")\r
+       if WIZARD of profile=1/\(brief ne -1\/long)\r
+       $(      out("Room :6*C*L",!room)\r
+               if(A.HIDEAWAY bitand ATTRIB of room) then out("(Hideaway)*C*L")\r
+               if(A.HIDE bitand ATTRIB of room) out("(Hide)*C*L")\r
+               if(A.DEATH bitand ATTRIB of room) out("(Death)*C*L")\r
+               if(A.SILENT bitand ATTRIB of room) out("(Silent)*C*L")\r
+       $)\r
+       desc.short(room)\r
+       if long=true \/ (A.DEATH bitand ATTRIB of room) dscribe(ROOMWD of room, roomput)<>ty_true       //the =true is needed...\r
+       unless ty=-1\/(ty=0/\been.in(RNUMB of room)) dscribe(ROOMWD of room, roomput)\r
+       if (A.DEATH bitand ATTRIB of room)/\(WIZARD of profile)=0 then\r
+       $(      let nd=?\r
+               lock(lvrdoor)\r
+               nd_ROBJT of room\r
+               while nd do\r
+               $(      unless P4 of nd >= P5 of nd setprop(nd, P4 of nd+1)\r
+                       nd of_LINK\r
+               $)\r
+               unlock()\r
+               test spectacular then\r
+               $(      drop.everything()\r
+                       STAMINA of profile_STAMINA of profile<20->10, (STAMINA of profile)-10\r
+                       special(SF.SLEEP)\r
+               $) or quit()\r
+       $)\r
+       if (A.HIDE bitand ATTRIB of room)/\(WIZARD of profile)=0 then return\r
+       unless (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then\r
+       $(      lock(lvrdoor)\r
+               describe.obj(ROBJT of room, long)\r
+               unlock()\r
+       $)\r
+       for i=0 to 35 do unless invisible(i)\r
+       $(      bit_1<<i\r
+               if (bit bitand who!room)/\(long gr 0\/i\=player.no) then\r
+               $(      let tt=player.names!i\r
+                       out(":p is here,:s carrying :i*C*L",tt, ASLEEP of LH from tt->" asleep,", "",ROBJT of (LH from tt))\r
+               $)\r
+       $)\r
+$)\r
+and longdescribe(rm, dd, nocrlf) be\r
+$(     let input=?\r
+       if LH from rm=#777777 then\r
+       $(      broadcast(K.OHDS, WHO!room, -rm, true)\r
+               return\r
+       $)\r
+       test numbargs() ne 2 then\r
+               test rm then\r
+                       test (selector 1:rm rem 36:rm/36) of text then\r
+                               rm_sb(rm)\r
+                               or dscribe((rm rem 2->LH, RH) from txtvec!(rm/2),textput, numbargs()=3)<>return\r
+                       or return\r
+               or if dd ne #777777 dscribe(dd,objput)<>return\r
+       input_dofile(DISC,!rm,"dba",MAINTA,label(ak),0,2,lookup,rda,sterr,closefile)\r
+       readch(input,@dd,true)\r
+       nocrlf_numbargs()=3->'*C',-1\r
+       until dd='*E'\/dd=nocrlf do\r
+       $(      outch(dd)\r
+               readch(input,@dd,true)\r
+       $)\r
+       close(input)\r
+ak:    outz($az"*C*L")\r
+$)\r
+and desc.short(rm) be dscribe(TITLE of rm, roomput)\r
+and dscribe(num, stream, nocrlf) be\r
+$(     let block=num/WDSPERBUF+1\r
+       unless stream=laststream /\ block=lastblock\r
+       $(      useti(stream, block)\r
+               inuuo(stream, cbl)\r
+               laststream_stream\r
+               lastblock_block\r
+       $)\r
+       num_dmpbuf+(num rem WDSPERBUF)\r
+       if numbargs()=3/\nocrlf\r
+       $(      let s=selector 7:36:num\r
+               $[      \r
+neckst:                        $ildb   ac,     s\r
+                       $jumpe  ac,     dun\r
+                       $caie   ac,     '*C'\r
+                       $jrst           neckst\r
+                       $setz   ac,     0\r
+                       $dpb    ac,     s\r
+dun:\r
+               $]\r
+       $)\r
+       outz(num,stream=comput)\r
+$)\r
+and describe.obj(obj, long) be\r
+$(     let rand,cprop,sprop=?,?,?\r
+       while obj do\r
+       $(      if obj ne long\r
+               $(      rand,cprop_RANDM of obj,P4 of obj\r
+                       if rand cprop_random(1+(P5 of obj))<>setprop(obj,cprop)\r
+                       sprop_selector 18:18*(cprop rem 2):cprop/2+OBJECTSIZE+1\r
+                       if WIZARD of profile=1/\(brief ne -1\/long)\r
+                       $(      out(":s - ", PNAME of obj)\r
+                               unless sprop of obj outz($az"*C*L")\r
+                       $)\r
+                       if WIZARD of profile=1\r
+                               if DESTROYED of obj ls 0 outz($az"(Destroyed) - ")\r
+                       unless (DESTROYED of obj ls 0 /\(WIZARD of profile)=0)\/sprop of obj=0\r
+                       $(      let sp,sxb=SPROP of obj,?\r
+                               if sp=#777777 sxb_sixbit(PNAME of obj)\r
+                               setit(obj)\r
+                               longdescribe(@sxb,sp)\r
+                               sayinsides(obj, 1, PNAME of obj, false)\r
+                               if holds(obj) outz($az"*C*L")\r
+                       $)\r
+               $)\r
+               obj of_LINK\r
+       $)\r
+$)\r
+and destroy(o1,mess,noprint) be\r
+$(     let msg=Abs(mess)\r
+       DESTROYED of o1_true\r
+       for i=0 to 35 if player.names!i\r
+       $(      let nd=ROBJT of (LH from player.names!i)\r
+               while nd do\r
+               $(      if therein(nd, o1,false)\r
+                       $(      test i=player.no then get.rid.of(o1,msg) or\r
+                                       transmit(i,0,K.GRO,(msg<<18)\/o1)\r
+                               return\r
+                       $)\r
+                       nd of_LINK\r
+               $)\r
+       $)\r
+       if numbargs()=3 unless noprint longdescribe(mess)\r
+       killmonster(o1)\r
+$)\r
+and therein(nd, o1,dropit) = valof\r
+$(     let insides,n,oldn=CONTENTS of nd,?,?\r
+       if nd=o1 resultis 1\r
+       unless insides resultis false\r
+       n_CONTS of insides\r
+       oldn_insides                    //relies on CONTS=LINK\r
+       while n do\r
+       $(      let there=therein(n, o1)\r
+               if there\r
+               $(      if there=1/\dropit\r
+                       $(      LINK of oldn_LINK of n          //could get away with oldn as insides\r
+                               CARRY.COUNT of profile-_WEIGHT of n\r
+                               WTUSED of insides-_WEIGHT of n\r
+                               WEIGHT of nd-_WEIGHT of n\r
+                               killmonster(n)\r
+                               pushlist(room+4,n)\r
+                       $)\r
+                       resultis true\r
+               $)\r
+               oldn_n\r
+               n of_LINK\r
+       $)\r
+       resultis false\r
+$)\r
+and is.or.was.here(obj,nd)=valof\r
+$(     while nd do test obj=LH of nd then\r
+       $(      test ((A.HIDEAWAY bitand ATTRIB of room) ne 0)/\(FIXED of nd=0) then resultis false\r
+               or resultis nd\r
+       $) or\r
+       $(      let o=open(nd, obj, objmatch,false)\r
+               if o resultis o\r
+               nd of_LINK\r
+       $)\r
+       resultis false\r
+$)\r
+and open(nd, obj, match,oppen)=valof\r
+$(     let bag, insides=CONTENTS of nd, ?\r
+       unless bag ne 0/\(oppen\/(OPENED of bag ne 0 /\ P4 of nd=0)) resultis false\r
+       insides_CONTS of bag\r
+       while insides do\r
+       $(      let o=?\r
+               if match(obj,insides) resultis insides\r
+               o_open(insides, obj, match,oppen)\r
+               if o resultis o\r
+               insides of_LINK\r
+       $)\r
+       resultis false\r
+$)\r
+and here(obj, nd)=valof\r
+$(     if (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then resultis false\r
+       lock(lvrdoor)\r
+       unless numbargs() = 2 nd_ROBJT of room\r
+       while nd do test obj=LH of nd /\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0)) then\r
+       $(      unlock()\r
+               resultis nd\r
+       $) or nd of_LINK\r
+       unlock()\r
+       resultis false\r
+$)\r
+and toting(obj, nd)=have(obj, numbargs()=2->nd, carry, objmatch)\r
+and toting.class(obj)=have(obj, carry, classmatch)\r
+and have(obj, nd, match)=valof\r
+$(     while nd do test match(obj,nd) then resultis nd or nd of_LINK\r
+       resultis false\r
+$)\r
+and here.class(obj)=valof\r
+$(     let nd=?\r
+       if (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then resultis false\r
+       lock(lvrdoor)\r
+       nd_ROBJT of room\r
+       while nd test classmatch(obj,nd) then\r
+       $(      unlock()\r
+               resultis nd\r
+       $) or nd of_LINK\r
+       unlock()\r
+       resultis false\r
+$)\r
+and carrying.class(obj,oppen,nd)=got(obj, classmatch,oppen,nd)\r
+and carrying(obj,oppen,nd)=got(obj, objmatch,oppen,nd)\r
+and got(obj, match,oppen,nd)=valof\r
+$(     while nd do test match(obj,nd) then resultis nd or\r
+       $(      let o=open(nd, obj, match,oppen)\r
+               if o resultis o\r
+               nd of_LINK\r
+       $)\r
+       resultis false\r
+$)\r
+and object()=valof\r
+$(     let tipe,orm=PTYPE of objct,room\r
+       unless tipe=S.CLASS\/tipe=S.OBJECT Error("You can't :s that!", verbname)\r
+       room_place(room)\r
+       tipe_tipe=S.CLASS->valof\r
+       $(      let v=here.or.toting.class(P1 of objct)\r
+               unless v resultis 0\r
+               resultis PTYPE of v\r
+       $), (D1 of DREC of objct)\r
+       if tipe tipe_here.or.toting(tipe)\r
+       room_orm\r
+       unless tipe error("I see no :s!", objname)\r
+       resultis tipe\r
+$)             \r
+and objmatch(obj, nd)=obj=PTYPE of nd\r
+and classmatch(obj,nd)=\r
+(obj=P1 of nd \/(obj=1 /\ P4 of nd=SCOREPROP of nd/\valof\r
+                       $(      let res=VALUE of nd\r
+                               $[      $hrre   1,      res     $]\r
+                       $) ge 0 ))/\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0))\r
+and here.or.toting.class(obj)=around(obj, here.class, toting.class)\r
+and here.or.toting(obj)=around(obj, here, toting)\r
+and around(obj, heretest, totingtest)=valof test holdfirst then\r
+$(     let res=totingtest(obj)\r
+       unless res res_heretest(obj)\r
+       resultis res\r
+$) or\r
+$(     let res=heretest(obj)\r
+       unless res res_totingtest(obj)\r
+       resultis res\r
+$)\r
diff --git a/MUD7.BCL b/MUD7.BCL
new file mode 100644 (file)
index 0000000..019066e
--- /dev/null
+++ b/MUD7.BCL
@@ -0,0 +1,413 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let save() be\r
+$(     let testsaved=?\r
+       perput_dofile(disc,ps6,$6".pm",mainta,label(eh),#17,1,lookup.enter,rdb,wrb,closefile)\r
+       assign()\r
+       testsaved_saverec(profile+14)\r
+       deassign()\r
+       close(perput)\r
+       if testsaved\r
+       $(      out("*C*L:P saved.*C*L", me)\r
+               savedp+_1\r
+       $)\r
+       return\r
+eh:    error("Someone accessing the profile file - :P not saved! Try again.", me)\r
+$)\r
+and purge() be\r
+$(     let psw,going,numrecs,bcnt=ps.word,true,?,3\r
+       if fight!player.no error("You can't :s in the middle of a fight!",verbname)\r
+       unsetbit()\r
+       perput_dofile(disc,ps6,$6".pm",mainta,label(eh),#17,1,lookup.enter,rdb,wrb,closefile)\r
+       dormant()\r
+       assign()\r
+       test seq(objname,"that") then\r
+       $(      load.block(perput,1)            //Load in the first block for filelength\r
+               numrecs_(FLEN of dmpbuf-2*WDSPERBUF)/RECLENGTH\r
+               load.block(perput,bcnt)\r
+               rec_dmpbuf\r
+       $) or\r
+       $(      searchrec(objname)\r
+               numrecs_rec -> 1, 0\r
+               rec_rec rem 128+dmpbuf  //Dmpbuf contains record after searchrec.\r
+       $)\r
+       deassign()\r
+       for i=1 to numrecs\r
+       $(      if us(me) psw_PSWD of rec\r
+               if PSWD of rec=psw/\WRD1 of rec then            //Deleted record if name zero\r
+               $(      out("*L*S*C*LName: :U*T[**,:8]*C*LStrength: :N*TStamina (max): :N*TDexterity: :N*TSex: :s*C*L",\r
+                               rec+2,PN of rec,STRN of rec,STMX of rec,DXTY of rec,rec!1 bitand 1 -> "female", "male")\r
+                       out("Games: :N*TScore: :N.*C*L", GAMES of rec, SCRE of rec)\r
+                       unless valof\r
+                       $(      unless WIZARD of profile resultis true\r
+                               out("*L*S*C*LSave, delete or finish? ")\r
+                               $[      $clrbfi\r
+                                       $inchrw         ac\r
+                                       $clrbfi\r
+                                       $trz    ac,     '*S'\r
+                                       $cain   ac,     'S'\r
+                                       $jrst           save\r
+                                       $cain   ac,     'D'\r
+                                       $jrst           delete\r
+                                       $cain   ac,     'F'\r
+                                       $jrst           finsh\r
+                                       $clrbfi\r
+                                       $outstr         $az"S"\r
+                                       $jrst           saver\r
+finsh:                                 $setzm          going\r
+                                       $(      unless ESSEX\r
+                                               $[      $outstr         $az"F"\r
+                                               $]\r
+                                       $)\r
+                                       $outstr         $az"inish*C*L"\r
+                                       $jrst           tr\r
+save:                                  $(      unless ESSEX\r
+                                               $[      $outstr         $az"S"\r
+                                               $]\r
+                                       $)\r
+saver:                                 $outstr         $az"ave*C*L"\r
+tr:                                    $(      resultis true   $)\r
+delete:                                        $(      unless ESSEX\r
+                                               $[      $outstr         $az"D"\r
+                                               $]\r
+                                       $)\r
+                                       $outstr         $az"elete*C*L"\r
+                                       $(      resultis false  $)\r
+                               $]\r
+                       $) then \r
+                       $(      let str,prevrec=vec 1,rec\r
+                               !str_2!rec\r
+                               1!str_3!rec\r
+                               assign()\r
+                               deleterec(str)\r
+                               deassign()\r
+                               load.block(perput,bcnt)         //Deleterec screws up dmpbuf\r
+                               rec_prevrec             //and rec\r
+                               out("*C*L:u deleted.*C*L",str)\r
+                       $)\r
+               $)\r
+               unless going break      //Finished.\r
+               if (rec-dmpbuf)>128\r
+               $(      rec-_128\r
+                       assign()\r
+                       bcnt+_1\r
+                       load.block(perput,bcnt)\r
+                       deassign()\r
+               $)\r
+               rec +_ RECLENGTH\r
+       $)\r
+               close(perput)\r
+               laststream_-1\r
+               setbit()\r
+               flush()\r
+               alive()\r
+               return\r
+eh:    Outs("*C*LSomeone is using the persona file, try again later, sorry.*C*L")\r
+       alive()\r
+       setbit()\r
+$)\r
+and bug() be\r
+$(     let day,tim,ch,wot=?,?,?,verbname\r
+       for i=0 to 35 do if fight!i error("You don't have time to :s during a fight!", wot)\r
+       private()\r
+       bstr_appendfile("all","letter","box",MAINTA,label(errlab))\r
+       day_valof $[ $DATE       AC,      0           $]\r
+       tim_valof $[ $MSTIME       AC,      0         $]\r
+       write(bstr,"*D*C*LFrom:: :p [:8,:8] on :d at :t*C*LSubject:: :s :s.*C*L",me,LH from ppn,RH from ppn,day,tim,@mudnam, wot)\r
+       unsetbit()\r
+       write(tty,"Please type in your :s. Finish it with an ESCape*C*L",wot)\r
+       reset()\r
+       verb_0\r
+       $(      check.stuff()\r
+               ch_getch()\r
+               until linebreak(ch) do\r
+               $(      writech(bstr,ch)\r
+                       ch_getch()\r
+               $)\r
+               unless ch='*L' writech(bstr,'*C')\r
+               writech(bstr,'*L')\r
+               if ch='*$' break\r
+       $)      repeat\r
+       close(bstr)\r
+       bstr_0\r
+       public()\r
+       out("*C*LYour :s has been recorded. Thankyou!*C*L", wot)\r
+       setbit()\r
+       return\r
+errlab: writes(tty,"Problem with bug file ")\r
+       public()\r
+       iomessage()\r
+$)\r
+and attach() be\r
+$(     let oldname, real, oldp.no=player.names!player.no,false,player.no\r
+       unless (RELAXED\/us(me)\/us(objname))/\(flipping\/WIZARD of profile=1) error()\r
+       if !objname=!"gail" then !objname_!"glai"\r
+       if LENGTH of objname gr NAMELENGTH\r
+               error("Maximum length of name allowed is :N", NAMELENGTH)\r
+       if (find.word(objname) ne 0) \/ (objct ne fake)\r
+               error("I can't call you :s.",objname)\r
+       if player.no=P1 of objct error("There's no point in attaching to yourself...")\r
+       if us(objname) unless maint error("Not to :U you don't!", objname)\r
+       test PTYPE of objct=S.PLAYER then\r
+       $(      unless JBNUM of LH from player.names!(P1 of objct)=jobno\r
+               if us(objname) \/ us(me)=0\r
+                       error("You can't attach to someone else's persona")\r
+               break.off()\r
+               bashfull()\r
+               dormant()\r
+               player.no_p1 of objct\r
+               player.bit_1<<player.no\r
+               INVIS of profile_false\r
+               profile_LH from player.names!player.no\r
+               room_CROOM of profile\r
+               carry_ROBJT of profile\r
+               outz($az"If you leave the game, they'll get your password...*C*L")\r
+       $) or\r
+       $(      perput_dofile($6"all",ps6,$6".pm",mainta,label(hmph),#17,1,lookup,rdb,wrb,closefile)\r
+               quitflg_true\r
+               assign()\r
+               searchrec(objname)\r
+               deassign()\r
+               close(perput)\r
+               if rec\r
+               $(      let pw=PSWD of (rec rem 128+dmpbuf)\r
+                       rec_rec rem 128+dmpbuf\r
+                       quitflg_true\r
+                       if BZK unless us(me) if BERSERKMASK bitand (WIZD of rec) error("Not to a berserker, I'm afraid!")\r
+                       unless us(me) /\ us(objname)=0 if (pw /\ ps.word ne pw)\r
+                       $(      let opret=pretend\r
+                               outs("*C*LWhat's the password for this persona?*C*L")\r
+                               noecho()\r
+                               private()\r
+                               pretend_true\r
+                               $[      $clrbfi $]\r
+                               check.stuff()\r
+                               scanner()\r
+                               pretend_opret\r
+                               echo()\r
+                               public()\r
+                               opret_PNAME of scan.info\r
+                               unless pw=encrypt(opret) error("Wrong!")\r
+                         $)\r
+                       real_true\r
+               $)\r
+               unsnoop(true)\r
+               bashfull()\r
+               break.off()\r
+               dormant()\r
+               quitflg_false\r
+               lock(@inidr)\r
+               if player>=35 unlock()<>quitflg_true<>Error("Too many players - try again later")\r
+               player+_1\r
+               player.no_plynum!player\r
+               unlock()\r
+               player.bit_1<<player.no\r
+               INVIS of profile_false\r
+               profile_getmblock()\r
+               quitflg_1\r
+               SENDER of profile,LINK of profile_player.no,0\r
+               info of profile,PNAME of profile_player.bit,profile+14\r
+               profile!14_!objname\r
+               profile!15_1!objname\r
+               ATTED of profile_true\r
+               test real then\r
+               $(      SCORE of profile_SCRE of rec\r
+                       STRENGTH of profile _STRN of rec\r
+                       DEXTERITY of profile _DXTY of rec\r
+                       STAMINA of profile _STNA of rec\r
+                       GAMES.PLAYED of profile _GAMES of rec\r
+                       STAMINAMAX of profile _STMX of rec\r
+                       STATES of profile _WIZD of rec\r
+                       SEX of profile _WRD1 of rec\r
+               $) or newpersona(objname)\r
+               quitflg_true\r
+               JBNUM of profile_jobno\r
+               jobnos!player.no_jobno\r
+               player.names!player.no_(profile<<18)bitor(profile+14)\r
+               room_LH of find.room($6"start")\r
+               CROOM of profile_room\r
+       $)\r
+       me_PNAME of profile\r
+       out("Detaching from :P.*C*L",oldname)\r
+       oldroom_room\r
+       who.copy_who!room\r
+       carry_robjt of profile\r
+       lvrdoor_room+door\r
+       lvqueue_queue+player.no\r
+       lvqdoor_queue.doors+player.no\r
+       flipping_true\r
+       if us(objname) WIZARD of profile_true\r
+       unless PTYPE of objct setbit()\r
+       out("Attaching to :P.*C*L",player.names!player.no)\r
+       verb,objct_0,fake.node("that")\r
+       deaf,blind,dumb,paralysed_false,false,false,false\r
+       laststream_-1\r
+       describe(room)\r
+       alive()\r
+       sendall(~(1<<oldp.no), K.IHA, false, true, oldp.no)\r
+       jump(mainloop)\r
+hmph:  Error("Someone else is using the persona file at the moment - try again later.")\r
+$)\r
+and detach() be\r
+$(     unless (RELAXED\/us(me))/\(WIZARD of profile=1\/flipping) error()\r
+       out("Detaching from :P.*C*LType CONT to continue.*C*L",player.names!player.no)\r
+       unsnoop(true)\r
+       bashfull()\r
+       break.off()\r
+       dormant()\r
+       $[      $exit   1,      0\r
+       $]\r
+       flush()\r
+       describe(room)\r
+       alive()\r
+       jump(mainloop)\r
+$)\r
+and exorcise(pno) be\r
+$(     let jalready, block, myroom, mypb, mypno, myprofile, myold, mycarry, n1, n2, pts =\r
+               numbargs(), ?, room, player.bit, player.no, profile, oldroom, carry, ?, ?, ?\r
+       unless jalready\r
+       $(      unless objct=fake error(":p isn't a name.", objname)\r
+               person(objct)\r
+               pno_P1 of objct\r
+               unless (RELAXED\/us(me))/\WIZARD of profile error("*C*LNo can do, old :s.", SEX of profile -> "girl", "son")\r
+               if player.no=pno error("*C*LYou can't exorcise yourself! You're not dead!")\r
+       $)\r
+       unless jalready jar(@deldr)\r
+       if active!pno=-1\r
+       $(      unless jalready unjar(@deldr)\r
+               return\r
+       $)\r
+       player.no_pno\r
+       active!player.no_-1\r
+       unless jalready unjar(@deldr)\r
+       player.bit_1<<player.no\r
+       profile_LH from (player.names!player.no)\r
+       room_CROOM of profile\r
+       oldroom_room\r
+       carry_ROBJT of profile\r
+       player.names!player.no_0\r
+       unsetbit()\r
+       drop.everything()\r
+       $(      jar(queue.doors+player.no)\r
+               block_unlink(queue+player.no)\r
+               unjar(queue.doors+player.no)\r
+               unless block break\r
+               freemblock(block)\r
+       $) repeat\r
+       jar(@inidr)\r
+       plynum!player_player.no\r
+       player-_1\r
+       unjar(@inidr)\r
+       n1_PNAME of profile\r
+       n2_1!n1\r
+       n1_!n1\r
+       pts_(player.level()+1)*FLEELOSS\r
+       freemblock(profile)\r
+       room, player.bit, player.no, profile, oldroom, carry_myroom, mypb, mypno, myprofile, myold, mycarry\r
+       unless jalready out(":p is no more.*C*L", objname)\r
+       sendall(true,K.SHBE,true,false,pno,n1,n2,pts)\r
+       them_getmblock()\r
+       them!3,them!4, them!5_n1,n2,pts\r
+       send(player.no,them,K.SHBE,pno)\r
+       him, her, them_false, false, false\r
+       verb,objct_0,fake.node("that")\r
+$)\r
+and quit(nextgame, nextrm) be\r
+$(     let block, logs,dest = ?, logstr,who.copy\r
+       for i=0 to 35 do if fight!i return      //Check if still fighting anyone\r
+       quitflg_false                           //Stop control C letting u out.\r
+       for i=0 to 35 if wizard of LH from player.names!i dest bitor_1<<i\r
+       unless us(me) \/ (A.HIDE bitand ATTRIB of room)\r
+               sendall(dest,K.IHPO,false,false,profile!14,profile!15)\r
+       jar(@deldr)\r
+       check.gone()\r
+       active!player.no_-1\r
+       unjar(@deldr)\r
+       break.off()                             //stop follows and helps\r
+       player.names!player.no_0                //Remove him from the list of players\r
+       unsetbit()                              //Remove him from the current room\r
+       unsnoop(true)\r
+       bashfull()\r
+       drop.everything()                       //What it says\r
+       $(      lock(lvqdoor)                   //Lock the queue door\r
+               block_unlink(lvqueue)           //Unlink a block from the queue\r
+               unlock()                        //Open the door\r
+               unless block break              //We finished only when no more blocks\r
+               freemblock(block)               //Stick it back on the freelist\r
+       $)      repeat\r
+       longdescribe_dud\r
+       while events\r
+       $(      let demon=events+DOF\r
+               if D.ALWAYS of demon\r
+               $(      verb, objct, instrmnt_D.VERB of demon, D.OBJECT of demon, D.INSTRUMENT of demon\r
+                       instate()\r
+                       action(true)\r
+               $)\r
+               events of_LINK\r
+       $)\r
+       unless numbargs() nextgame_false\r
+       if true le nextgame le false do\r
+       $(      let t, d, scr =\r
+               valof $[        $mstime 1,      0       $]-daytime,\r
+               (ud.time()-udaytime)>>18, (SCORE of profile)-oldscore\r
+               if t le 0 t+_WHOLEDAY\r
+               t/_1000\r
+               rhours+_t               //don't really care too much if it's interrupted!\r
+               writez(tty,$az"*C*LDuration of game =")\r
+               if d write(tty," :N day:S",d, d=1->"","s")\r
+               writesecs(tty,t)\r
+               writes(tty,".*C*L")\r
+               if d writez(tty, "*C*LMy god! What dedication!")\r
+               if scr ge 1 write(tty,"You scored :N point:S this session:s.*C*L",\r
+                       scr,scr=1->"","s", STAMINA of profile le 0->" before you died","")\r
+if essex /\ scr ge 6888\r
+$(     let op=?\r
+       op_appendfile($6"dsk",$6"prolog",$6"prl",MPPN,label(rattts))\r
+       write(op,":P leaving :s gaining :N points from :N to :N*C*L",\r
+               me, @mudnam, scr, oldscore, SCORE of profile)\r
+       close(op)\r
+rattts:\r
+$)\r
+       $)\r
+       if logstr close(logstr)                 //If logging close log file.\r
+       logstr_0                                //Stop dump mode I/O causing ill uuo.\r
+       if bstr close(bstr)<>bstr_0\r
+       writeprofile(nextgame)\r
+       lock(@inidr)                            //Lock initialisation door\r
+       plynum!player_player.no         //Re-cycle the player no.\r
+       player-:1                               //Decrement player-stack pointer\r
+       unless \player locked_false             //last one out unlocks game\r
+       unlock()                                //Now unlock the door\r
+       test numbargs() then test \nextgame then\r
+       $(      output_createtmp(sixbit(nextgame),label(nochain))\r
+//dofile(disc,nextgame,"tmp",0,label(nochain),0,2,enter,rda,wrb,closefile)\r
+               outch('*^A')\r
+               out(PNAME of profile)\r
+               test logs then outch('*B') or outch('*^C')\r
+               out(":n*$:n*$:n*$:n*$:n",valof $[ $mstime 1, 0 $],daytime,sixbit(nextrm),ps.word,oldscore)\r
+               close(output)\r
+       $) or\r
+       $(      freemblock(profile)\r
+               run($6"sys",$6"logout",$6"exe",0)\r
+       $) or\r
+       $(\r
+nochain:       freemblock(profile)\r
+               finish\r
+       $)\r
+       freemblock(profile)\r
+       run(disc,nextgame,$6"exe",mainta,0)\r
+$)\r
diff --git a/MUD8.BCL b/MUD8.BCL
new file mode 100644 (file)
index 0000000..c9c896f
--- /dev/null
+++ b/MUD8.BCL
@@ -0,0 +1,828 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.         No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+get "mudlib"\r
+get "dungen"\r
\r
+let interact(fn) be\r
+$(     let snd,bit,block,damage,pp,pn,inv,inf=?,?,?,?,?,?,?,?\r
+       if numbargs() then\r
+       $(      unless objct=fake error("To use the verb :p you have to give someone's name!", verbname)\r
+               person(objct)\r
+               snd_P1 of objct\r
+               pn_player.names!snd\r
+               pp_LH from pn\r
+               switchon fn into\r
+               $(      case I.KILL:\r
+                               unless RELAXED\/us(me)\r
+                                       if WIZARD of profile\r
+                                       unless ~WIZVWIZ/\WIZARD of pp ne 0\r
+                                       error("That's a bit un:s!",\r
+                                               SEX of profile->"ladylike", "gentlemanly")\r
+                               if snd=player.no error("Committing suicide is too easy a way to get points!")\r
+                               if fight!snd then error("You're already fighting :p",pn)\r
+                               bit_1<<snd\r
+                               unless WIZARD of profile unless bit bitand who.copy error(":p isn't here!",objname)\r
+                               send(snd,0,K.IWKU)\r
+                               endcase\r
+                       case I.TELL:\r
+                               if snd=player.no error("Talking to yourself is the first sign of madness...")\r
+                               block_getmblock()\r
+                               read.message(block+2)\r
+                               send(snd,block,K.TOLD,2!block)\r
+                               verb_0          //To stop <return> getting U in a loop.\r
+                               endcase\r
+                       case I.SNOOP:\r
+                               if snd=player.no error("You should already know what YOU'RE doing...")\r
+                               if snd=snooping error("You're already snooping on :p!",pn)\r
+                               transmit(snd, 0, K.SNOP)\r
+                               out("You have started to :s on :p.*C*L", verbname, pn)\r
+                               snooping_snd\r
+                               SNOOPBIT of profile_true\r
+                               endcase\r
+                       case I.WAKE:\r
+                               if snd=player.no return\r
+                               unless WIZARD of profile unless (1<<snd) bitand who.copy error(":p isn't here to :s.", objname, verbname)\r
+                               unless ASLEEP of pp error(":p is already awake.",pn)\r
+                               transmit(snd,0,K.WU)\r
+                               out("You :s :p.*C*L", verbname,objname)\r
+                               endcase\r
+                       case I.MAKE:\r
+                               unless WIZARD of profile if WIZARD of pp\r
+                               error("You can't do that to a :s or :s unless you are one!", male!max.level, female!max.level)\r
+                               unless chcnt>0 do\r
+                                       Error("Say it again, and this time mention what you want to :p :p do.",verbname,objname)\r
+                               block_getmblock()\r
+                               read.message(block+2)\r
+                               unless us(me) for i=0 to 35 do\r
+                                       if player.no\= i /\\r
+                                       snd \= i /\\r
+                                       player.names!i /\\r
+                                       WIZARD of LH from player.names!i then\r
+                               $(      let msg=getmblock()\r
+                                       copy(block+2, msg+2, 13)\r
+                                       send(i,msg,K.SHBF, 2!block)\r
+                               $)\r
+                               send(snd,block,K.MAKE,2!block)\r
+                               verb_0\r
+                               endcase\r
+                       case I.FOD:\r
+                               unless RELAXED\/us(me)\/(WIZARD of pp ne 0) error("Not to mortals!")\r
+                               transmit(snd,0,K.FOD)\r
+                               endcase\r
+                       case I.STEAL:\r
+                               if snd=player.no then\r
+                               error("Stealing from yourself is silly!")\r
+                               bit_1<<snd\r
+                               unless WIZARD of profile unless bit bitand who.copy then\r
+                               error(":p isn't here to :s from.",objname, verbname)\r
+                               test PTYPE of instrmnt=S.OBJECT then\r
+                                       send(snd,0,K.IWSU,((DEXTERITY of profile)<<18)\/instrmnt)\r
+                               or test PTYPE of instrmnt=S.CLASS then\r
+                                       error(":U is a class, you can only steal individual objects!", insname) or error()\r
+                               flush()\r
+                               endcase\r
+                       case I.SUMMON:\r
+                               if snd=player.no error("You're already here!")\r
+                               bit_1<<snd\r
+                               if bit bitand who.copy error(":P is already here!", pn)\r
+                               transmit(snd,0,K.TTH,(verbname<<18)\/room)\r
+                               endcase\r
+                       case I.GIVE:\r
+                               if snd=player.no then\r
+                               error("Giving things to yourself is rather miserly...")\r
+                               unless toting(D1 of (DREC of instrmnt)) then\r
+                               unless PTYPE of instrmnt = S.CLASS then\r
+                               test PTYPE of instrmnt=S.ALL then\r
+                                       error("You can't ':s all', only 'get all' or 'drop all'.", verbname)\r
+                                       or error("There's a word I don't know there, try rephrasing the command...")\r
+                               bit_1<<snd\r
+                               unless WIZARD of profile unless bit bitand who.copy then\r
+                               error(":p isn't here to :s anything to.",objname, verbname)\r
+                               test PTYPE of instrmnt=S.OBJECT then\r
+                               $(      let oldnd, nd, bit=lvcarry,carry,D1 of (DREC of instrmnt)\r
+                                       block_getmblock()\r
+                                       nd, oldnd_carry, lvcarry\r
+                                       until LH of nd=bit do\r
+                                       $(      oldnd_nd\r
+                                               nd of_LINK\r
+                                       $)\r
+                                       LINK of oldnd_LINK of nd\r
+                                       CARRY.COUNT of profile-:WEIGHT of nd\r
+                                       OBJ.CARRIED of profile-:1\r
+                                       ROBJT of profile_carry\r
+                                       adjustdown(nd)\r
+                                       inform(nd,K.IDROPT)\r
+                                       block!2_(nd<<18)+(RH from instrmnt)\r
+                                       send(snd, block, K.IWGU, block!2)\r
+                               $) or test PTYPE of instrmnt=S.CLASS then\r
+                               error(":U is a class, you can only give individual objects!", insname) or error()\r
+                               endcase\r
+                       case I.FOLLOW:\r
+                               if snd=player.no then\r
+                               error("Isn't following yourself rather vain?")\r
+                               unless WIZARD of profile unless who.copy bitand (1<<snd) error(":p isn't here to :s!",objname, verbname)\r
+                               if not leading then test snd=leading then\r
+                                       error("You're already following :p!",objname)\r
+                               or unfollow()\r
+                               leading_snd\r
+                               transmit(snd,0,K.IWTF)\r
+                               out("You have started to follow :p.*C*L", pn)\r
+                               endcase\r
+                       case I.LOSE:\r
+                               if snd=player.no error("If you want to lose yourself shut your eyes and hit the keyboard at random...")\r
+                               unless followers bitand (1<<snd) out (":p isn't following you!*C*L",objname)<>return\r
+                               followers bitand:\(1<<snd)\r
+                               transmit(snd,0,K.SFM)\r
+                               out("You have lost :p.*C*L", objname)\r
+                               endcase\r
+                       case I.JOIN:\r
+                               if snd=player.no then\r
+                               error("Assisting yourself isn't useful unless you're schizophrenic!")\r
+                               unless WIZARD of profile unless who.copy bitand (1<<snd) do\r
+                               error(":p isn't here to :s!", objname, verbname)\r
+                               if not frontman then test frontman=snd then\r
+                               error("You're already assisting :p!", objname) or\r
+                               $(      transmit(frontman, 0, K.ISJY)\r
+                                       out("You have stopped assisting :p.*C*L", player.names!frontman)\r
+                               $)\r
+                               frontman_snd\r
+                               transmit(snd, 0, K.IWJY)\r
+                               out("You have offered to assist :p.*C*L", pn)\r
+                               endcase\r
+                       case I.REFUSE:\r
+                               if snd=player.no error("Refusing yourself is the action of a cataleptic!")\r
+                               unless joined bitand(1<<snd) error(":p isn't assisting you!", objname)\r
+                               joined bitand_\(1<<snd)\r
+                               transmit(snd, 0, K.SJM)\r
+                               out("You have refused assistance from :p.*C*L", objname)\r
+                               endcase\r
+                       case I.CHANGE:\r
+                               unless us(me)\/snd=player.no if WIZARD of pp\r
+                                       error("Not to a :s you don't!",(SEX of pp->female,male)!MAX.LEVEL)\r
+                               out(":p is now :smale.*C*L",objname,SEX of pp->"","fe")\r
+                               transmit(snd,0,K.TSEX)\r
+                               endcase\r
+                       case I.SLEEP:\r
+                               if snd=player.no\r
+                               $(      objct_fake.node("that")\r
+                                       special(SF.SLEEP)\r
+                                       return\r
+                               $)\r
+                               unless WIZARD of profile unless (1<<snd)bitand who.copy error(":P isn't here!", objname)\r
+                               transmit(snd, 0,K.ZZZ)\r
+                               if WIZARD of pp\r
+                                       error("Not to a :p you don't...", (SEX of pp->female,male)!MAX.LEVEL)\r
+                               endcase\r
+               $)\r
+       $)\r
+       $(      lock(lvqdoor)\r
+               block_unlink(lvqueue)\r
+               unlock()\r
+               unless block return\r
+               snd_SENDER of block\r
+               pn_player.names!snd\r
+               inv_invisible(snd)\r
+               inf_INFO of block\r
+               pp_LH from pn\r
+               switchon FUNC of block into\r
+               $(      case K.IHHU:\r
+                               if fight!snd endcase\r
+                               $(      let ins, damge=RH from inf,\r
+                                               WIZVWIZ/\WIZARD of profile ne 0 -> 0, LH from inf\r
+                                       out("*C*L:p has suddenly attacked you", pn)\r
+                                       if ins Out(" with :s :s", SEX of pp->"her","his", PNAME of ins)\r
+                                       outs("!*C*L")\r
+                                       STAMINA of profile -_damge\r
+                                       if ASLEEP of profile STAMINA of profile-_damge\r
+                                       if STAMINA of profile le 0 STAMINA of profile_1 //no outright kills\r
+                               $)\r
+                       case K.IWKU:\r
+                               if fight!snd endcase\r
+                               quitflg_false\r
+                               fight!snd_-1\r
+                               $(      let kipped=kips!player.no\r
+                                       wake.up()\r
+                                       unless FUNC of block=K.IHHU fightmess(B.START, snd)\r
+                                       send(snd,block,K.IACPT,WIZVWIZ/\WIZARD of profile ne 0->10000000,kipped->-1,DEXTERITY of profile)\r
+                                       loop\r
+                               $)\r
+                       case K.IACPT:\r
+                               quitflg_false\r
+                               fight!snd_-1\r
+                               for i=0 to 35 do if player.no\=i/\i\=snd/\player.names!i then\r
+                               $(      let p=LH from player.names!i\r
+                                       if WIZARD of p ne 0\/(who.copy bitand (1<<i))\r
+                                       unless A.SILENT bitand ATTRIB of CROOM of p\r
+                                       transmit(i,0,K.WAF,snd)\r
+                               $)\r
+                               wake.up()\r
+                               if INF>DEXTERITY of profile then\r
+                               $(      send(snd,block,K.ISAM)\r
+                                       loop\r
+                               $)\r
+                       case K.ISAM:\r
+                               unless fight!snd endcase\r
+                               if phased(snd,block)loop\r
+                               fightmess(B.THEYMISS, snd)\r
+                               damage_WIZVWIZ/\WIZARD of profile ne 0->0,random(100)+1+(CARRY.COUNT of profile)/F.ENCMB\r
+                               test damage<=DEXTERITY of profile \/  INF=-1 then\r
+                               $(      damage_WIZVWIZ/\WIZARD of profile ne 0->1000000,random(STRENGTH of profile/F.DMGE1)+1\r
+                                       send(snd,block,snd=player.no->K.ISAHM, K.ISAH,INF=-1 ->2*damage, damage)\r
+                                       fightmess(B.IHIT, snd)\r
+                               $) or\r
+                               $(      send(snd,block,snd=player.no->K.ISAMM, K.ISAM)\r
+                                       fightmess(B.IMISS, snd)\r
+                               $)\r
+                               wake.up()\r
+                               loop\r
+                       case K.ISAH:\r
+                               unless fight!snd endcase\r
+                               if phased(snd,block)loop\r
+                               fightmess(B.THEYHIT, snd)\r
+                               STAMINA of profile-:INF\r
+                               checkout(block)\r
+                               fightmess(B.IMOK, snd)\r
+                               damage_WIZVWIZ/\WIZARD of profile ne 0->0,random(100)+1+(CARRY.COUNT of profile)/F.ENCMB\r
+                               test damage<=DEXTERITY of profile then\r
+                               $(      damage_WIZVWIZ/\WIZARD of profile ne 0->10000000,random(STRENGTH of profile/F.DMGE2)+1\r
+                                       send(snd,block,snd=player.no->K.ISAHM, K.ISAH,damage)\r
+                                       fightmess(B.IHITBACK, snd)\r
+                               $) or\r
+                               $(      send(snd,block,snd=player.no->K.ISAMM, K.ISAM)\r
+                                       fightmess(B.IMISSAGAIN, snd)\r
+                               $)\r
+                               wake.up()\r
+                               loop\r
+                       case K.IMDD:    case K.IHD:\r
+                               if snd=player.no /\ MOTN of fight!snd then\r
+                                       FIGHTS of MOTN of fight!snd bitand_\player.bit\r
+                               fight!snd_0\r
+                               setscore(INF, 2)\r
+                               test FUNC of block=K.IHD then\r
+                                       out(":U has died, but not because of the fight!*C*L", block+3) or\r
+                                       fightmess(B.VICTORY, snd, block+3)\r
+                               freemblock(block)\r
+                               for i=0 to 35 if fight!i snd_-1<>break\r
+                               if snd=-1 loop\r
+                               retaliated_0\r
+                               outz($az"You are victorious - this time...*C*L")\r
+                               quitflg_true\r
+                               return\r
+                       case K.WAF:\r
+                               unless ASLEEP of profile unless inv\r
+                               unless IGNORE of profile\r
+                               $(      out("*C*L:p and :p have started to fight", pn, player.names!(INF))\r
+                                       givewhere(snd,pp)\r
+                               $)\r
+                               endcase\r
+                       case K.IFM:\r
+                               unless ASLEEP of profile unless inv\r
+                               unless IGNORE of profile\r
+                               $(      out("*C*L:p and the :p have started to fight", pn, INF)\r
+                                       givewhere(snd,pp)\r
+                               $)\r
+                               endcase\r
+                       case K.MFM:\r
+                               unless ASLEEP of profile unless inv\r
+                               unless IGNORE of profile\r
+                               $(      out("*C*L:p has been attacked by the :p",pn,INF)\r
+                                       givewhere(snd,pp)\r
+                               $)\r
+                               endcase\r
+                       case K.ISAHM:\r
+                       $(      let monster=fight!player.no\r
+                               unless monster endcase\r
+                               DESTROYED of monster -: INF\r
+                               if DESTROYED of monster ls 0 then\r
+                               $(      let val, name=0, PNAME of monster\r
+                                       destroy(monster, 0)\r
+                                       if P4 of monster = SCOREPROP of monster val_VALUE of monster\r
+                                       block!3_!name\r
+                                       block!4_1!name\r
+                                       send(player.no, block, K.IMDD, val)\r
+                                       return\r
+                               $)\r
+                               unless DESTROYED of monster DESTROYED of monster+_1\r
+                       $)\r
+                       case K.ISAMM:\r
+                       $(      let monster=fight!player.no\r
+                               unless monster endcase\r
+                               if DESTROYED of monster ls 0\r
+                               $(      send(player.no,block,K.ISAHM,0)\r
+                                       loop\r
+                               $)\r
+                               damage_random(100)\r
+                               test damage ls 60 then\r
+                               $(      damage_WIZARD of profile->0,random((WEIGHT of monster)/1000/F.DMGE2)+1\r
+                                       send(player.no, block, K.ISAH, damage)\r
+                               $) or send(player.no, block, K.ISAM)\r
+                               return\r
+                       $)\r
+                       case K.IHR:\r
+                       $(      let obj,damge=RH from inf, LH from inf\r
+                               if snd=player.no\r
+                               $(      send(player.no, block, K.ISAHM, damge)\r
+                                       loop\r
+                               $)\r
+                               if obj out(":P retaliates with :s :s.*C*L",\r
+                                       pn, SEX of pp->"her","his", PNAME of obj)\r
+                               STAMINA of profile-_damge\r
+                               if STAMINA of profile le 0 STAMINA of profile_1\r
+                               endcase\r
+                       $)\r
+                       case K.GRO:\r
+                               get.rid.of(RH from inf,LH from inf)\r
+                               endcase\r
+                       case K.MESS:\r
+                               if deaf endcase\r
+                               out("*C*L:p says *"",pn)\r
+                               longdescribe(INF,false,true)\r
+                               outs("*"*C*L")\r
+                               wake.up()\r
+                               endcase\r
+                       case K.ISCY:\r
+                               out("*C*L:P is about to contact you with a *":s*" command...", pn, inf)\r
+                               endcase\r
+                       case K.TEXT:    case K.TOLD:\r
+                               if deaf endcase\r
+                               bit_FUNC of block=K.TEXT\r
+                               test conversing /\ bit then\r
+                                       $(      if inv pn_"someone"\r
+                                               out("*C*L:U:: *":s*"*C*L",pn,block+2)\r
+                                       $) or\r
+                                       out("*C*L:p :s *":s*"*C*L",pn,bit->"says","tells you", block+2)\r
+                               wake.up()\r
+                               endcase\r
+                       case K.LAUGH:\r
+                               if deaf endcase\r
+                               out("*C*L:p laughs", pn)\r
+                               if inf out(", :s", block+2)\r
+                               outs("*C*L")\r
+                               wake.up()\r
+                               endcase\r
+                       case K.MAKE:\r
+                               wake.up()\r
+                               sendall(true, K.IHBF, true, true)\r
+                               unless us(pn)\r
+                               $(      justforced_true\r
+                                       test WIZARD of profile then\r
+                                       out("*C*L:U has forced you to :s*C*L",pn,block+2) or\r
+                                       $(      let osnp=snoopedon\r
+                                               snoopedon bitand_~(1<<snd)\r
+                                               out((osnp bitand (1<<snd))->"*C*L:s*C*L", "*C*LYou are forced to :s*C*L",block+2)\r
+                                       $)\r
+                               $)\r
+                               unpackstring(block+2,linebuffer)\r
+                               chcnt,nextch_!linebuffer+2,linebuffer\r
+                               chcnt!linebuffer,(chcnt-1)!linebuffer_'*l','*C'\r
+                               freemblock(block)\r
+                               scanch_-1\r
+                               at_false\r
+                               parse.command()\r
+                               instate()\r
+                               execute.command()\r
+                               reset()\r
+                               loop\r
+                       case K.IHBF:\r
+                               out(":p has been forced.*C*L", pn)\r
+                               endcase\r
+                       case K.SHBF:\r
+                               out(":p has forced someone to :s*C*L", pn, block+2)\r
+                               endcase\r
+                       case K.IHA:\r
+                               unless IGNORE of profile\r
+                               out(":p has attached to :p.*C*L", player.names!inf, pn)\r
+                               endcase\r
+                       case K.WU:\r
+                               unless ASLEEP of profile endcase\r
+                               unless inv out("*C*L:p has started to wake you up.*C*L",pn)\r
+                               wake.up()\r
+                               endcase\r
+                       case K.ITTE:\r
+                               unless ASLEEP of profile if visible() out("*C*L:p tries to enter your room but it is too small for you both.*C*L",pn)\r
+                               endcase\r
+                       case K.SPEC:\r
+                               unless logstr special(SF.SPECLOG)\r
+                       case K.DIST:    case K.BELW:\r
+                               if deaf endcase\r
+                               $(      let osnp=snoopedon\r
+                                       snoopedon_false\r
+                                       test WIZARD of profile=1\/FUNC of block ne K.DIST then out("*C*L:p shouts",pn)\r
+                                               or out("*C*LA :Smale voice in the distance shouts",SEX of pp->"fe","")\r
+                                       test block!2 then out(" *":S*"*C*L",block+2)or outz($az" something*C*L")\r
+                                       wake.up()\r
+                                       snoopedon_osnp\r
+                               $)\r
+                               endcase\r
+                       case K.LOUD:\r
+                               if deaf endcase\r
+                               outz($az"*C*L")\r
+                               longdescribe(INF)\r
+                               wake.up()\r
+                               endcase\r
+                       case K.IWSU:\r
+                               bit_D1 of(DREC of(RH from (INF)))\r
+                               unless toting(bit) then\r
+                               $(      send(snd,block,K.INCI,block!2)\r
+                                       loop\r
+                               $)\r
+                               damage_WIZARD of profile->102,ASLEEP of profile->-1,random(100)+1\r
+                               test us(me)\/(damage>(LH from(INF))/\us(pn)=0) then\r
+                               $(      out("*C*LYou catch :p trying to steal the :s from you!*C*L",pn, PNAME of (RH from block!2))\r
+                                       send(snd,block,K.IFYO,block!2)\r
+                               $) or\r
+                               $(      let nd, oldnd=carry, lvcarry\r
+                                       until LH of nd=bit do\r
+                                       $(      oldnd_nd\r
+                                               nd of_LINK\r
+                                       $)\r
+                                       LINK of oldnd_LINK of nd\r
+                                       CARRY.COUNT of profile-:WEIGHT of nd\r
+                                       OBJ.CARRIED of profile-:1\r
+                                       ROBJT of profile_carry\r
+                                       adjustdown(nd)\r
+                                       inform(nd,K.IDROPT)\r
+                                       if random(100-(WEIGHT of nd)/100)+1 le DEXTERITY of profile then\r
+                                       $(      setit(RH from block!2)\r
+                                               unless ASLEEP of profile out("*C*L:p has stolen the :s from you!*C*L",pn,PNAME of RH from block!2)\r
+                                       $)\r
+                                       LH from block!2_nd\r
+                                       send(snd,block,K.YSFM,block!2)\r
+                               $)\r
+                               loop\r
+                       case K.INCI:       case K.IFYO:\r
+                               out(FUNC of block=K.INCI->"*C*L:p isn't carrying the :s*C*L","*C*L:p discovers your attempt to steal the :s!*C*L",\r
+                               pn,PNAME of (RH from block!2))\r
+                               endcase\r
+                       case K.IWGU:\r
+                               bit_LH from block!2\r
+                               if (((WEIGHT of bit)+CARRY.COUNT of profile>max.wt())\/\r
+                                       full.up())/\(WIZARD of profile)=0 then\r
+                               $(      send(snd, block,K.ITHM,block!2)\r
+                                       loop\r
+                               $)\r
+                       case K.ITHM:\r
+                               test FUNC of block=K.ITHM then\r
+                               $(      out("*C*L:p can't take the object you try to give :s.*C*L", pn, SEX of pp->"her","him")\r
+                                       bit_LH from block!2\r
+                               $) or unless ASLEEP of profile\r
+                               $(      setit(RH from block!2)\r
+                                       out("*C*L:p has given you the :s.*C*L", pn, PNAME of RH from block!2)\r
+                               $)\r
+                               //Hope you've not picked up another in the meantime!\r
+                               //Maybe sending the PNAME only would be better...\r
+                               pushlist(lvcarry,bit)\r
+                               CARRY.COUNT of profile+_WEIGHT of bit\r
+                               OBJ.CARRIED of profile+:1\r
+                               ROBJT of profile_carry\r
+                               adjustup(bit)\r
+                               inform(bit,K.IGOT)\r
+                               if FUNC of block=K.IWGU then\r
+                               $(      send(snd,block,K.TYVM,block!2)\r
+                                       loop\r
+                               $)\r
+                               endcase\r
+                       case K.YSFM:\r
+                               bit_LH from block!2\r
+                               test (((WEIGHT of bit)+(CARRY.COUNT of profile)>MAXWEIGHT*(STRENGTH of profile))\/\r
+                                               full.up())/\(WIZARD of profile)=0 then\r
+                               $(      out(":U's :s is too hard to hold and you have to put it down*C*L",pn,PNAME of (RH from block!2))\r
+                                       unless here(bit) do\r
+                                       $(      lock(lvrdoor)\r
+                                               pushlist(room+4,bit)\r
+                                               unlock()\r
+                                       $)\r
+                               $) or\r
+                               $(      pushlist(lvcarry,bit)\r
+                                       CARRY.COUNT of profile+:WEIGHT of bit\r
+                                       OBJ.CARRIED of profile+:1\r
+                                       ROBJT of profile_carry\r
+                                       adjustup(bit)\r
+                                       inform(bit,K.IGOT)\r
+                                       out("*C*L:U stolen from :p*C*L",PNAME of (RH from block!2),pn)\r
+                               $)\r
+                               endcase\r
+                       case K.IWTF:\r
+                               followers bitor:(1<<snd)\r
+                               if WIZARD of profile unless inv out("*C*L:p has started following you.*C*L",pn)\r
+                               endcase\r
+                       case K.SFM:\r
+                               test animal then\r
+                               $(      out("*C*LYou cannot follow the :P further.*C*L",PNAME of animal)\r
+                                       animal_false\r
+                               $) or\r
+                               $(      if pn out("*C*LYou cannot follow :p further*C*L",pn)\r
+                                       leading_true\r
+                               $)\r
+                               endcase\r
+                       case K.ISFY:\r
+                               followers bitand_\(1<<snd)\r
+                               if WIZARD of profile unless inv out("*C*L:p has stopped following you.*C*L", pn)\r
+                               endcase\r
+                       case K.YFIM:\r
+                               if ASLEEP of profile endcase\r
+                               test animal then out("*C*LYou follow the :P...*C*L",PNAME of animal) or out("*C*LYou follow :p...*C*L",pn)\r
+                               snd_block!2\r
+                               freemblock(block)\r
+                               move.ser(snd)\r
+                               loop\r
+                       case K.ISJY:\r
+                               joined bitand_\(1<<snd)\r
+                               unless ASLEEP of profile if pn out("*C*L:p has stopped assisting you.*C*L",pn)\r
+                               endcase\r
+                       case K.IWJY:\r
+                               joined bitor:1<<snd\r
+                               out("*C*L:p has offered to assist you.*C*L", pn)\r
+                               endcase\r
+                       case K.SJM:\r
+                               if pn out("*C*LYou can help :P no longer.*C*L",pn)\r
+                               frontman_true\r
+                               endcase\r
+                       case K.SSNO:\r
+                               snooping_true\r
+                               SNOOPBIT of profile_false\r
+                               out("*C*LYou can snoop on :p no longer*C*L",pn)\r
+                               them_0\r
+                               (INF->her,him)_0\r
+                               objct_fake.node("that")\r
+                               wake.up()\r
+                               endcase\r
+                       case K.SNOP:\r
+                               unless us(pn) if (WIZARD of profile ne 0) \/snooping ne -1 then\r
+                               $(      send(snd,block,K.SSNO,SEX of profile)\r
+                                       unless inv out("*C*L:p has tried to snoop on you!*C*L",pn)\r
+                                       return\r
+                               $)\r
+                               unless snoopedon firstsnoop_true\r
+                               snoopedon bitor_1<<snd\r
+                               endcase\r
+                       case K.IWSS:\r
+                               snoopedon bitand_\(1<<snd)\r
+                               unless snoopedon then !snoopbuffer_0\r
+                               unless us(pn) if WIZARD of profile out("*C*L:p has stopped snooping on you.*C*L",pn)\r
+                               endcase\r
+                       case K.SNPA:    case K.PIM:\r
+                               outs(block+2)\r
+                               if FUNC of block=K.PIM outs("*C*L")\r
+                               endcase\r
+                       case K.IFFY:\r
+                               wake.up()\r
+                               fight!snd_0\r
+                               bit_LH from INF\r
+                               test bit then\r
+                               $(      out("*C*L:p has fled by going :P!*C*L", pn,PNAME of INF)\r
+                                       setscore(bit, 1)\r
+                               $) or out("*C*LYou can no longer fight :P.*C*L", pn)\r
+                               freemblock(block)\r
+                               for i=0 to 35 if fight!i snd_-1<>break\r
+                               if snd=-1 loop\r
+                               retaliated_0\r
+                               if bit outz($az"You have defeated the coward!*C*L")\r
+                               quitflg_true\r
+                               return\r
+                       case K.TSEX:\r
+                               SEX of profile_NOT (SEX of profile)\r
+                               sexify(SEX of profile)\r
+                               out("*C*LYour sex has been magically changed to :smale!*C*L",SEX of profile->"fe","")\r
+                               endcase\r
+                       case K.BGON:\r
+                               stop.fighting()\r
+                               outs(block+2)\r
+                               freemblock(block)\r
+                               quit()\r
+                       case K.FOD:\r
+                               STAMINA of profile_-1\r
+                               if us(pn)\/~WIZVWIZ\r
+                               $(      ISWIZ of profile_false\r
+                                       WIZARD of profile_false\r
+                               $)\r
+                               fodsville_true\r
+                               out("*C*LA finger of death by :P has terminated you.*C*L",pn)\r
+                               freemblock(block)\r
+                               checkout()\r
+                               return\r
+                       case K.TYVM:\r
+                               out("*C*L:U given to :p.*C*L",PNAME of RH from block!2, pn)\r
+                               endcase\r
+                       case K.STTE:\r
+                               unless IGNORE of profile\r
+                               unless ASLEEP of profile if visible() out("*C*LAn attempt to enter your room has failed, made by some :p.*C*L",INF)\r
+                               endcase\r
+                       case K.SJL:\r
+                               unless ASLEEP of profile if visible()\r
+                                       unless ~snooping/\(((1<<snooping)bitand who.copy)ne 0)\r
+                                       out("*C*LThe :p has just left.*C*L", PNAME of INF)\r
+                               endcase\r
+                       case K.SJA:     case K.SHBD:\r
+                               if FUNC of block=K.SHBD\/CURROOM of MOTN of INF=room\r
+                               $(      let them, it.moves=P4 of INF,MOTN of INF\r
+                                       //can't cut double snoops in case snoopee hasn't sent msg yet so you don't know what's attacking you\r
+                                       unless (ASLEEP of profile ne 0)\/(FUNC of block=K.SHBD/\(A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0) then\r
+                                       $(      Outz($az"*C*L")\r
+                                               longdescribe(@mud6, (selector 18:18*(them rem 2):them/2+objectsize+1) of INF)\r
+                                       $)\r
+                                       somethingarrived_true           //suppose could use sta_setbit(...)\r
+                                       setit(INF)\r
+                                       if it.moves\r
+                                       $(      let oldvb,oldobj,oldins=verb,objct,instrmnt\r
+                                               and demon=ACTIONS of it.moves\r
+                                               verb, objct, instrmnt_D.VERB of demon,\r
+                                                       D.OBJECT of demon=#777777->find.word(PNAME of INF), D.OBJECT of demon,\r
+                                                       D.INSTRUMENT of demon=#777777->find.word(PNAME of inf), D.INSTRUMENT of demon\r
+                                               freemblock(block)\r
+                                               instate()\r
+                                               action(false)\r
+                                               reinstate(oldvb, oldobj, oldins)\r
+                                               return          //or loop if you prefer\r
+                                       $)\r
+                               $)\r
+                               endcase\r
+                       case K.OHM:\r
+                               out("*C*L:C:C",SNOOPROMPT,SNOOPROMPT)\r
+                               describe(CURROOM of MOTN of INF, INF)\r
+                               out(":C:C*C*L",SNOOPROMPT,SNOOPROMPT)\r
+                               endcase\r
+                       case K.SFO:\r
+                               out("*C*L(The :P is fighting :P).*C*L",PNAME of INF,pn)\r
+                               endcase\r
+                       case K.OHD:\r
+                               if snobj\r
+                               $(      snobj_false\r
+                                       out("*C*LYou can snoop on the :p no longer.*C*L",PNAME of INF)\r
+                               $)\r
+                               endcase\r
+                       case K.IGOT:    case K.IDROPT:\r
+                               unless inv out("*C*L(:P has :Sthe :P)*C*L",pn,FUNC of block=K.IGOT->"got ","dropped ",PNAME of INF)\r
+                               endcase\r
+                       case K.MGOT:    case K.MDROPT:\r
+                               out("*C*L(The :P has :Sthe :P)*C*L",block!3,FUNC of block=K.MGOT->"got ","dropped ",PNAME of INF)\r
+                               endcase\r
+                       case K.IINS:    case K.IREM:\r
+                               bit_FUNC of block\r
+                               bit_bit=K.IINS->0,bit=K.IREM->1,bit=K.IGIV->2,3\r
+                               unless inv out("*C*L(:P has :sthe :p :s some:s)*C*L",\r
+                                       pn,\r
+                                       bit!(table "inserted ","removed ","given ","taken "),\r
+                                       PNAME of INF,\r
+                                       bit!(table "inside","from","to","from"),\r
+                                       bit ge 2->" creature","thing")\r
+                               endcase\r
+                       case K.TTH:\r
+                               $(      let dropsy, sumnd=WIZARD of pp, LH from INF\r
+                                       if sumnd if WIZARD of profile=1 \/ valof\r
+                                       $(      let nd=lvcarry\r
+                                               if dropsy resultis false\r
+                                               while nd test luminous(nd, NOSUMMON)\r
+                                               then resultis true or nd_LINK of nd\r
+                                               resultis false\r
+                                       $) then unless us(pn)\r
+                                       $(      out("*C*L:P has tried to :s you.*C*L",\r
+                                                       pn, LH from INF)\r
+                                               send(snd, block, K.YCSM, INF)\r
+                                               loop\r
+                                       $)\r
+                                       bit_RH from INF\r
+                                       if bit=room endcase\r
+                                       wake.up()\r
+                                       lose.followers()\r
+                                       start.leading()\r
+                                       stop.fighting()\r
+                                       if sumnd\r
+                                       $(      Out("*C*L:P has summoned you magically!*C*L", pn)\r
+                                               if carry/\dropsy=0 outz($az"You drop everything...*C*L")\r
+                                       $)\r
+                                       freemblock(block)\r
+                                       unless dropsy drop.everything()\r
+                                       move.ser(bit,true)\r
+                                       loop\r
+                               $)\r
+                       case K.IHWU:\r
+                               unless inv out("*C*L:P has woken up.*C*L", pn)\r
+                               endcase\r
+                       case K.ZZZ:\r
+                               if WIZARD of profile\r
+                               $(      unless inv out("*C*L:p has tried to put you to sleep!*C*L", pn)\r
+                                       endcase\r
+                               $)\r
+                               if ASLEEP of profile send(snd,block,K.IAA)<>loop\r
+                               if valof\r
+                               $(      for i=0 to 35 if fight!i\r
+                                               send(snd,block,K.IMOF)<>resultis true\r
+                                       resultis false\r
+                               $) loop\r
+                               kips!player.no_ud.time()\r
+                               start.leading()\r
+                               doownthing()\r
+                               ASLEEP of profile_true\r
+                               out("*C*L:p has put you to sleep!*C*L", pn)\r
+                               broadcast(K.IHFA,who.copy)\r
+                               endcase\r
+                       case K.IMOF:\r
+                               out("*C*L:P is in the middle of a fight!*C*L", pn)\r
+                               endcase\r
+                       case K.IAA:\r
+                               out("*C*L:p is already asleep!*C*L", pn)\r
+                               endcase\r
+                       case K.IHFA:\r
+                               unless inv out("*C*L:P has fallen asleep.*C*L", pn)\r
+                               endcase\r
+                       case K.SHBE:\r
+                               unless IGNORE of profile\r
+                               out("*C*L:U has been exorcised.*C*L", block+3)\r
+                               if snooping=INF\r
+                               $(      snooping_true\r
+                                       SNOOPBIT of profile_false\r
+                                       him, her, them_false, false, false\r
+                               $)\r
+                               if snoopedon bitor (1<<inf)\r
+                               $(      snoopedon bitand_\(1<<inf)\r
+                                       unless snoopedon then !snoopbuffer_0\r
+                               $)\r
+                               if fight!inf\r
+                               $(      setscore(block!5, 2)\r
+                                       fight!inf_0\r
+                                       for i=0 to 35 if fight!i snd_-1<>break\r
+                                       unless snd=-1\r
+                                       $(      retaliated_0\r
+                                               quitflg_true\r
+                                       $)\r
+                                       outz($az"Well you won that one anyway!*C*L")\r
+                               $)\r
+                               endcase\r
+                       case K.INH:\r
+                               unless IGNORE of profile\r
+                               out("*C*L:P has entered :F having played :N time:c before.*C*L",\r
+                                       pn, mud6, block!2, block!2=1-> '*0', 's')\r
+                               endcase\r
+                       case K.IHCL:\r
+                               unless IGNORE of profile\r
+                               $(      let sx=(SEX of pp->female,male)\r
+                                       out("*C*L:U has changed experience level from :S to :S.*C*L",\r
+                                       pn,sx!(RH from INF), sx!(LH from INF))\r
+                               $)\r
+                               endcase\r
+                       case K.YCSM:\r
+                               out("*C*LYou cannot :s :p.*C*L", LH from INF, pn)\r
+                               endcase\r
+                       case K.WM:\r
+                               unless IGNORE of profile\r
+                               unless us(pn) unless inv\r
+                               $(      let theirp=pp\r
+                                       Out("*C*L:P is:s in :s mode:s*C*L", pn,\r
+                                               WIZARD of theirp->""," not",SEX of theirp->female!max.level,male!max.level,\r
+                                               WIZARD of theirp->"...",".")\r
+                               $)\r
+                               endcase\r
+                       case K.OHDS:\r
+                               unless ASLEEP of profile if visible() longdescribe(INF)\r
+                               endcase\r
+                       case K.IHPO:\r
+                               unless IGNORE of profile\r
+                               unless ASLEEP of profile out(":U has just passed on.*C*L",block+2)\r
+                               endcase\r
+                       case K.DTD:\r
+                               enable(INF)\r
+                               endcase\r
+                       case K.IHSE:\r
+                               wake.up()\r
+                               out(":p has given you a nice :s!*C*L", pn, block+3)\r
+                               setscore(INF)\r
+                               endcase\r
+                       case K.IHKS:\r
+                               unless ASLEEP of profile unless inv out(":P has given :P a nice :s.*C*L",pn, INF, block+3)\r
+                               endcase\r
+                       case K.GOWM:\r
+                               if WIZARD of profile\r
+                               $(      out("*C*LLeaving :s mode.*C*L",(SEX of profile->female,male)!max.level)\r
+                                       WIZARD of profile_false\r
+                               $)\r
+                               unsnoop(true)\r
+                               endcase\r
+               $)\r
+       freemblock(block)\r
+       $)      repeat\r
+$)\r
+and phased(snd,block)=valof\r
+$(     unless snd=player.no resultis false\r
+       snd_fight!player.no\r
+       if DESTROYED of snd ls 0\r
+       $(      send(player.no, block, K.ISAHM, 0)\r
+               resultis true\r
+       $)\r
+       resultis false\r
+$)\r
+and givewhere(snd,pp) be\r
+$(     if WIZARD of profile Out(" in :6",!(CROOM of pp))\r
+       outs("!*C*L")\r
+$)\r
diff --git a/MUDLIB.BCL b/MUDLIB.BCL
new file mode 100644 (file)
index 0000000..a640306
--- /dev/null
@@ -0,0 +1,2172 @@
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.  No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+$nolist\r
+get "mudlib"\r
+get "dungen"\r
+$list\r
\r
+manifest\r
+$(     REGIONSIZE      :       6\r
+       INTEGRITY       :       #525252\r
+       DEBUGGING       :       FALSE\r
+       SIZE            :       LH\r
+       ISTTY           :       B14\r
+       BUFLENGTH       :       150\r
+       TMP.BLOCKSIZE   :       128\r
+       TTY6            :       $6"tty"\r
+$)\r
\r
+static\r
+$(     region          :       VEC REGIONSIZE\r
+       //   **** Order must be same as order of FREESPACE parameters ****\r
+       origin          :       #377\r
+       extent          :       0\r
+       quantum         :       -2\r
+       routine         :       NIL\r
+       nname           :       "the low-seg' freelist"\r
+       //   ****                                                     ****\r
+       page            :       #377\r
+       freelist        :       0\r
+       scbsize         =       SC.DEFAULT.SIZE\r
+       hibflg          =       (1<<22)\/1000   //Hibernate flags.\r
+       trmpar          =       (3<<18)\/1      //TRMOP. parameter flags\r
+       hwmain          =       #2776\r
+       months          =       (table          //Month names for writedate.\r
+                               "January",      "February",     "March",\r
+                               "April",        "May",          "June",\r
+                               "July",         "August",       "September",\r
+                               "October",      "November",     "December")\r
+       snoopbuffer     =       vec 69\r
\r
+//Four word interrupt block\r
+       intblk          =       #4000000        //XWD 4,0\r
+       inttyp          =       2               //EXP ER.ICC\r
+       retadr          =       0               //EXP 0\r
+       ctcflg          =       0               //EXP 0\r
+       stack           =       vec 100         //100 words of PDL stack\r
+//Statics for testing access to mud (leave as NIL!!).\r
+       ppn             =       ?               //User's PPn.\r
+       peen            =       ?               //User's Pn.\r
+       guest           =       ?               //User is a guest (from outside)\r
+       ttyno           =       ?               //TTY udx.\r
+       jobno           =       ?               //Jobnumber.\r
+       ctlno           =       ?               //Controlling job number.\r
+       micstatus       =       ?               //MIC status bits.\r
+       hsattrib        =       ?               //Hi-seg attributes.\r
+       hsname          =       ?               //Name of hi-seg.\r
+       hsppn           =       ?               //PPn of hi-seg.\r
+       privved         =       ?               //True if privileged.\r
\r
+       logstr          =       false           //Non zero means logging enabled.\r
+       linebuffer      =       vec BUFLENGTH   //Line buffer.\r
+       chcnt           =       0               //Character count.\r
+       nextch          =       0               //next character\r
+       roomput         =       0               //SCB for the .RM file\r
+       textput         =       0               //ditto .TM file\r
+       objput          =       0               //ditto .OM file\r
+       comput          =       0               //ditto .CM file\r
+       perput          =       0               //ditto .PM file\r
+       mapput          =       0               //ditto .MM file\r
+       cmndput         =       0               //ditto .GM file\r
+       oldscore        =       0\r
+       rec             =       ?               //pointer to record in dmpbuf\r
+       bufull          =       3690556618      //buffer full name.string termination flag\r
+       first           =       true            //for opening .PM file automatically\r
+       quitflg         =       true            //Set to true if ^C gets u out.\r
+       maint           =       false           //true if maintainer\r
+       room.been       =       ?               //whether been in this room or not\r
+       dmpbuf          =       vec BUFFERS     //input buffer for textput/roomput/objput/comput/perput/mapput\r
+       cbl             =       vec 1           //argument block to read above in in dump mode\r
+       ccnt            =       0               //character count on output\r
+//STATICS for vestigal BCPL library (Leave as NIL!!!!).\r
+       batch           =       ?\r
+       ccl             =       ?\r
+       callnm          =       ?\r
+       input           =       ?\r
+       output          =       ?\r
+       daytime         =       ?\r
+       udaytime        =       ?\r
+       err             =       ?\r
+       fl              =       ?\r
+       scb             =       ?\r
+       sl              =       ?\r
+       stackbase       =       ?\r
+       savpdl          =       ?\r
+       savt            =       ?\r
+       mainta          =       ?\r
+       chain           =       ?\r
+       lockflg         =       0               //lets you out on ^C if 0\r
+$)\r
\r
+let appendfile(dev,file,ext,ppn,error) = VALOF\r
+$(     let r,w,last=?,?,?\r
+       r_dofile(DEV,FILE,EXT,PPN,LABEL(NX),0,1,lookup.enter,rda,wrb,closefile)\r
+       w_words(r);     last_w/128+1\r
+       useti(r,last)\r
+       SC.ERROR^r_LABEL(END.OF.FILE)\r
+       SC.READER^R_RDB // NON ASCII READ\r
+       SC.APPENDCL^R_SC.CLOSER^R\r
+       SC.CLOSER^R_CLOSEA\r
+       $(      let ch=?\r
+               rdb(r,@ch)\r
+               wrb(r,ch)\r
+       $)      repeat\r
+end.of.file:\r
+       USETO(R,LAST)\r
+       SC.ERROR^R_ERROR\r
+       RESULTIS R\r
+NX:    resultis dofile(dev,file,ext,ppn,error,0,2,enter,sterr,wrb,closefile)\r
+$)\r
+and detch()=valof\r
+$[     $pjob   2,      0\r
+       $setz   1,      0\r
+       $trmno. 2,      0\r
+       $seto   1,      0\r
+$]\r
+and Enq(chan) be\r
+$(     let addr=vec 4\r
+       !addr_#1000005\r
+       1!addr_142857\r
+       2!addr_chan\r
+       3!addr_$az"mud"+(-1<<18)\r
+       4!addr_0\r
+       $[      $move   1,      addr\r
+               $enq.   1,      0\r
+               $trn\r
+       $]\r
+$)\r
+\r
+and Deq(chan) be\r
+$(     let addr=vec 1\r
+       !addr_#1000005\r
+       1!addr_142857\r
+       $[      $move   1,      addr\r
+               $hrli   1,      1\r
+               $deq.   1,      0\r
+               $trn\r
+       $]\r
+$)\r
+and assign() be jar(@persona.door)<>enq(SC.CHANNEL^perput)\r
+and deassign() be deq(SC.CHANNEL^perput)<>unjar(@persona.door)\r
+\r
+AND FINDTMP(F,ERR) = VALOF     // FINDS TMP:XXX, DOES A READ-DELETE\r
+$( LET S=NEWVEC(SC.TMPCOR.SIZE+TMP.BLOCKSIZE)\r
+   LET NAME,BLOCK=SIXBIT(F),(-TMP.BLOCKSIZE<<18)+(SC.TMPCOR.SIZE-1)+S\r
+   LET REPLY=VALOF\r
+   $[ $HRLI    AC,#2\r
+      $HRRI    AC,NAME\r
+      $TMPCOR  AC,0    // TMP: READ AND DELETE INTO S\r
+      $SETZM   AC\r
+   $]\r
+   SC.TMPNAME^S_F>>18\r
+   UNLESS REPLY IOERROR(S,ERR.FINDTMP,ERR)\r
+   SC.FLAGS^S_(SC.TMPCOR.SIZE<<12)+1\r
+   SC.READER^S_READTMP\r
+   SC.WRITER^S_sterr\r
+   SC.CLOSER^S_FCLOSETMP\r
+   SC.ERROR^S_ERR\r
+   SC.TMPBYTEP^S_(SELECTOR 7:0:(SC.TMPCOR.SIZE-1))+S   // JUST BEFORE BUFFER\r
+   SC.TMPLIMIT^S_SC.TMPCOR.SIZE+REPLY+S                        // LAST WORD READ\r
+   RESULTIS S\r
+$)\r
+\r
+AND READTMP(S,LVCH) BE\r
+$(\r
+   !LVCH_VALOF\r
+   $[\r
+       $HRRZ   SCBREG,S\r
+       $ILDB   AC,SC.TMPBYTEP(SCBREG)\r
+   $]\r
+   IF (SC.TMPWORD^S)>SC.TMPLIMIT^S THEN !LVCH_'*E'\r
+   // WORD IS THE RH OF BYTEP\r
+$)\r
+\r
+AND FCLOSETMP(S) BE FREEVEC(S)\r
+and CREATETMP(F,ERR) = VALOF\r
+$( LET S=NEWVEC(SC.TMPCOR.SIZE+TMP.BLOCKSIZE)\r
+   IF NUMBARGS<2 THEN ERR_0\r
+   SC.FLAGS^S_(SC.TMPCOR.SIZE<<12)+1\r
+   SC.WRITER^S_WRITETMP\r
+   SC.READER^S_STERR\r
+   SC.CLOSER^S_CLOSETMP\r
+   SC.ERROR^S_ERR\r
+   SC.TMPNAME^S_F>>18\r
+   SC.TMPBYTEP^S_(SELECTOR 7:0:(SC.TMPCOR.SIZE-1))+S\r
+   RESULTIS S\r
+$)\r
+\r
+AND WRITETMP(S,C) BE\r
+$(\r
+$[ $MOVE       SCBREG,S\r
+   $MOVE       AC,C\r
+   $IDPB       AC,SC.TMPBYTEP(SCBREG)\r
+$]\r
+$)\r
+\r
+AND CLOSETMP(S) BE\r
+$( LET NAME,BLOCK,Z=SC.TMPNAME^S<<18,((S+(SC.TMPCOR.SIZE-1)-SC.TMPWORD^S)<<18)\/(S+(SC.TMPCOR.SIZE-1)),0\r
+   FOR I=0 TO 4 WRITETMP(S,0) // CLEAR REST OF LAST WORD\r
+   UNLESS VALOF\r
+   $[\r
+       $SETOM  AC\r
+       $HRLI   B,#3\r
+       $HRRI   B,NAME\r
+       $TMPCOR B,0     // TMPCOR WRITE\r
+       $SETZM  AC\r
+   $] sterr()\r
+   FREEVEC(S)\r
+$)\r
+AND CLOSEA(R) BE\r
+$(     LET WD=SC.OWD^R\r
+       LET BUF=SC.OBUF^R+2\r
+       SETSTS(R,#17)\r
+       WRDMP(R,IOWD(WD-BUF+1,BUF),0)\r
+       (SC.APPENDCL^R)(R)\r
+$)\r
+AND LOOKUP.ENTER(CH,FILESPEC)=LOOKUP(CH,FILESPEC)&ENTER(CH,FILESPEC)\r
+AND DOFILE(DEV,FILE,EXT,PPN,ERROR,MODE,BUFFS,SELECT,RD,WR,CL)=VALOF\r
+$(     LET SIXDEV, date=DEV=0\/LH&&dev\=0\/(LH&&DEV=0&!DEV=0)->$6 "DSK",SIXBIT(DEV), valof $[ $date 1, 0 $]\r
+       and DEVCHR=VALOF\r
+       $[       $MOVE   AC,     SIXDEV\r
+                $DEVCHR AC,     0\r
+       $]\r
+       and DEVSIZ=VALOF\r
+       $[       $MOVEI  AC,    B\r
+                $MOVE   B,     MODE\r
+                $MOVE   C,     SIXDEV\r
+                $DEVSIZ AC,    0\r
+                $SETZ   AC,    0\r
+       $]\r
+       and scb,ch=?,?\r
+       IF MODE = 0 & (DEVCHR&ISTTY)\=0 THEN  // INCHWL STREAM\r
+       $(      LET TTYNAME=VALOF $[ $GETLIN    AC,     0       $]\r
+               LET PHYSDEV=VALOF $[ $MOVE      AC,     SIXDEV\r
+                                    $DEVNAM    AC,     0\r
+                                    $TRN\r
+                                 $]\r
+               IF PHYSDEV=TTYNAME THEN RESULTIS TTY\r
+       $)\r
+       CH_FINDCHANNEL()\r
+       IF CH<0 THEN DOFILE..ERROR(0,ERR.NOCHANNEL,ERROR)\r
+       SCB_NEWVEC(SCBSIZE)\r
+       clearvec(scb,scbsize)\r
+       SC.STATUS^SCB, SC.DEV^SCB, SC.OBUFHDR^SCB, SC.IBUFHDR^SCB_\r
+       MODE, SIXDEV, WR=0\/WR=sterr->0, SC.OBUF+SCB, RD=0\/RD=STERR->0, SC.IBUF+SCB\r
+       SC.CHANNEL!SCB_CH<<23 // ! TO CLEAR REST OF WORD\r
+       SC.COUNT^SCB_6\r
+       SC.FILENAME^SCB_SIXBIT(FILE)\r
+       SC.EXT^SCB_LH&&SIXBIT(EXT)\r
+       SC.PPN^SCB_PPN\r
+       SC.FLAGS^SCB_B0+B35\r
+       SC.MODE of scb_mode\r
+       IF DEVCHR\=!#74 &  (DEVCHR & (1 << (BYTE 4:0)&&MODE)) = 0 DOFILE..ERROR(SCB,ERR.BADMODE,ERROR)\r
+       SC.READER^SCB_RD\r
+       SC.WRITER^SCB_WR\r
+       SC.CLOSER^SCB_CL\r
+       SC.IN^SCB_$IN<<27\/(CH<<23)\r
+       SC.OUT^SCB_$OUT<<27\/(CH<<23)\r
+       SC.STATZ^SCB_$STATZ<<27\/(CH<<23)+#740000\r
+       SC.PROTECTION^SCB_#477\r
+       SC.USETI^SCB_$USETI<<27\/(#36000003)+(CH<<23) // USETI CHANNEL,@3(P)\r
+       SC.USETO^SCB_$USETO<<27\/(#36000003)+(CH<<23)\r
+       SC.SIZE^SCB_SCBSIZE\r
+       SC.TIME^scb_valof $[ $mstime 1, 0 $]/60000\r
+       date_((date-61)/372)*372+61\r
+       SC.CREATEDATE^SCB_date\r
+       SC.HIDATE^SCB_(BYTE 3:12)&&date\r
+       SC.ERROR^SCB_ERROR\r
+       SC.OBUF!SCB_B0 // VIRGIN OUTPUT BUFFER RING (! TO CLEAR REST OF WORD)\r
+       SC.IBUF!SCB_B0 // DITTO  INPUT\r
+       UNLESS HOPEN(CH,SC.STATUS+SCB) DO DOFILE..ERROR(SCB,ERR.NODEV,ERROR)\r
+       UNLESS SELECT(CH,SC.COUNT+SCB) DO DOFILE..ERROR(SCB,ERR.NOFILE,ERROR)\r
+       IF BUFFS <= 0 THEN BUFFS_LH&&DEVSIZ\r
+       IF (MODE&#17) LE #14 THEN // MAKE THE BUFFER RINGS\r
+       $(      UNLESS WR=STERR \/ WR=!#74 DO SC.OBUF^SCB_GETRING(OUTBUF,CH,BUFFS,RH&&DEVSIZ)\r
+               UNLESS RD=STERR \/ RD=!#74 DO SC.IBUF^SCB_GETRING(INBUF,CH,BUFFS,RH&&DEVSIZ)\r
+       $)\r
+       RESULTIS SCB\r
+$)\r
+AND GETRING(GETBUF, CHANNEL, NO, SIZE) =VALOF\r
+$(     LET T=JBFF\r
+       LET BUF=NEWVEC(SIZE*NO-1)\r
+       JBFF_BUF\r
+       GETBUF(CHANNEL,NO)\r
+       JBFF_T\r
+       RESULTIS BUF+1\r
+$)\r
+AND CLOSEFILE(SCB) BE\r
+$(     LET CH=SC.CHANNEL^SCB\r
+       RELEASE(CH,0)\r
+       FREEBUFRING( SC.IBUF^SCB )\r
+       FREEBUFRING( SC.OBUF^SCB )\r
+       FREE( SCB )\r
+$)\r
+AND FREEBUFRING(R) BE UNLESS R=!#74 DO\r
+$(     LET P,Q=R,R\r
+       $( IF P<Q THEN Q_P; P_RH^P $) REPEATUNTIL P=R\r
+       FREE(Q-1)\r
+$)\r
+AND FINDCHANNEL()BE\r
+$[     $MOVEI  AC,     #17\r
+TRYCH: $MOVE   B,      AC\r
+       $DEVCHR B,      0     // RETURNS 0 IF NO SUCH CHANNEL\r
+       $JUMPE  B,      RESULT\r
+       $SOJGE  AC,     TRYCH\r
+       $SETOM  0,      AC    // RETURN -1 IF NO CHANNEL EXISTS\r
+RESULT:\r
+$]\r
+AND DOFILE..ERROR(SCB,ERR,LAB) BE\r
+$(     IF SCB THEN\r
+       $(      RELEASE(SC.CHANNEL^SCB)\r
+               FREE(SCB)\r
+       $)\r
+       GOTO IOERROR+2 // GO ON AS IOERROR\r
+$)\r
+AND IOERROR(ERRSCB,ERRCODE,ERRPARAM) BE\r
+$(     SCB, ERR_ERRSCB, ERRCODE\r
+       if errparam jump(errparam)\r
+       outz($az"?*C*L?MUDIOE MUD I/O error ")\r
+       IOMESSAGE()\r
+       FINISH\r
+$)\r
+AND IOMESSAGE() BE outz($az"*C*L")\r
+AND RDA(SCB,LVCH) BE\r
+$[     $MOVE   SCBREG, SCB\r
+NEXT:  $SOSLE  0,      WSC.ICOUNT(SCBREG)\r
+       $JRST           GETOK\r
+       $XCT    0,      WSC.IN(SCBREG)                // IN CHANNEL,0\r
+       $JRST           GETOK                   // NOT AT E-O-F\r
+       $XCT    0,      WSC.STATZ(SCBREG)     // STATZ CHANNEL,#740000\r
+       $JRST           @ERRSTATUS\r
+       $MOVEI  AC,     '*E'\r
+       $MOVEM  AC,     @LVCH\r
+       $(      return  $)\r
+GETOK: $ILDB   AC,     WSC.IBYTE(SCBREG)\r
+       $JUMPE  AC,     NEXT                 // OMIT ZERO CHARACTERS, TOO\r
+       $HRRZ   2,      WSC.IBYTE(SCBREG)     // LOOK AT THE WORD THAT THE BYTE CAME FROM\r
+       $TDNE   ONE,    0(2)                // AND IF B35=1 SKIP THE WORD (IT'S A LINE NUMBER)\r
+       $JRST           NEXT                    // EVENTUALLY WE'LL DO THIS FASTER&REMEMBER THE NO\r
+       $MOVEM  AC,     @LVCH                // SET THE RESULT\r
+$]\r
+AND RDB(SCB,LVCH) BE\r
+$[     $MOVE   SCBREG, SCB\r
+NEXT:  $SOSLE  0,      WSC.ICOUNT(SCBREG)\r
+       $JRST           GETOK\r
+       $XCT    0,      WSC.IN(SCBREG)                // IN CHANNEL,0\r
+       $JRST           GETOK                   // NO AT E-O-F\r
+       $XCT    0,      WSC.STATZ(SCBREG)     // STATZ CHANNEL,#740000\r
+       $JRST           @ERRSTATUS              // REAL STATUS ERROR\r
+       $JRST           @EOF                    // END-OF-FILE CODE\r
+GETOK: $ILDB   AC,     WSC.IBYTE(SCBREG)\r
+       $MOVEM  AC,     @LVCH        // SET RESULT\r
+$]\r
+AND WRB(SCB,CH) BE unless detch()\r
+$[     $MOVE   SCBREG, SCB\r
+       $SOSLE  0,      WSC.OCOUNT(SCBREG)\r
+       $JRST           PUTOK\r
+       $XCT    0,      WSC.OUT(SCBREG)\r
+       $JRST           PUTOK\r
+       $JRST           @ERRSTATUS\r
+PUTOK: $MOVE   AC,     CH\r
+       $IDPB   AC,     WSC.OBYTE(SCBREG)\r
+$]\r
+AND RDDMP(SCB,BUFFLIST) BE\r
+$[     $MOVE   SCBREG, SCB\r
+       $HLL    B,      WSC.IN(SCBREG)\r
+       $HRRI   B,      BUFFLIST\r
+       $XCT    0,      B\r
+       $(      return          $)\r
+       $XCT    0,      WSC.STATZ(SCBREG)\r
+       $JRST           @ERRSTATUS\r
+       $JRST           @EOF\r
+$]\r
+AND WRDMP(SCB,BUFFLIST) BE\r
+$[     $MOVE   SCBREG, SCB\r
+       $HLL    B,      WSC.OUT(SCBREG)\r
+       $HRRI   B,      BUFFLIST\r
+       $XCT    0,      B\r
+       $(      return          $)\r
+       $JRST           @ERRSTATUS\r
+$]\r
+and sterr() = IOERROR\r
+AND NEWVEC(S) = VALOF\r
+$(     LET N = S+2\r
+       LET Q, P = @FREELIST, FREELIST\r
+       UNTIL P=!#74 DO\r
+       $(      LET S = SIZE^P\r
+               IF S>=N THEN\r
+               $(      LET K = S-N\r
+                       TEST K<4 THEN\r
+                       $(      LINK^Q_LINK^P\r
+                               LINK^P_INTEGRITY\r
+                               RESULTIS P+1\r
+                       $) OR\r
+                       $(      LET L = P+K\r
+                               SIZE^P_K\r
+                               SIZE^L_N\r
+                               LINK^L_INTEGRITY\r
+                               RESULTIS L+1\r
+                       $)\r
+               $)\r
+               Q_P\r
+               P ^_LINK\r
+       $)\r
+// Expand the current region if necessary\r
+       $(      LET D, ORIG, SIZ = NIL, NIL, NIL\r
+               AND Q = QUANTUM\r
+               TEST QUANTUM<0 THEN\r
+               $(      D_-1\r
+                       SIZ_#1000*-QUANTUM\r
+                       ORIG_#1000*(1+PAGE+QUANTUM)\r
+               $) OR\r
+               $(      D_1\r
+                       ORIG_#1000*PAGE\r
+                       SIZ_#1000*QUANTUM\r
+               $)\r
+               UNTIL Q=!#74 DO\r
+               $(      UNLESS GETPAGE(PAGE) STOREERROR(S,ERR.NEWPAGE,@ORIGIN)\r
+                       PAGE+_D\r
+                       Q-_D\r
+               $)\r
+               SIZE^ORIG, LINK^ORIG_SIZ, 0\r
+               LINK^ORIG_INTEGRITY\r
+               FREEVEC(ORIG+1)\r
+               RESULTIS NEWVEC(S)\r
+       $)\r
+$)\r
+AND FREEVEC(B) BE\r
+$(     LET P0, Q, P = B-1, @FREELIST, FREELIST\r
+       LET N = SIZE^P0\r
+       UNLESS LINK^P0=INTEGRITY DO STOREERROR(B,ERR.FREEBAD,@ORIGIN)\r
+       UNTIL P=!#74\/P>P0 DO\r
+       $(      Q_P\r
+               P_LINK^P\r
+       $)\r
+       TEST P0+N=P THEN\r
+       $(      N+_SIZE^P\r
+               SIZE^P0, LINK^P0_N, LINK^P\r
+       $) OR SIZE^P0, LINK^P0_N, P\r
+       $(      LET S = SIZE^Q\r
+               TEST Q+S=P0 THEN SIZE^Q, LINK^Q_S+N, LINK^P0 OR LINK^Q_P0\r
+       $)\r
+$)\r
+AND GETPAGE(N) = VALOF TEST (N<<9) < SL THEN RESULTIS FALSE OR\r
+$[     $MOVE   B,      !((1<<18)+C)\r
+       $MOVEI  C,      1\r
+       $MOVE   D,      N\r
+       $PAGE.  B,      0\r
+       $CAIN   B,      3             //PAGE ALREADY EXISTS?\r
+       $JRST           OK              //THEN OK\r
+       $CAIE   B,      #12           //NO ROOM IN WORKING SET\r
+       $JRST           FAIL            //NO, THEN CANT HELP\r
+       $MOVE   B,      !((1<<18)+C)\r
+       $HRLI   D,      #200000       //TRY TO CREATE ON DISK\r
+       $PAGE.  B,      0\r
+       $CAIN   B,      3             //PAGE EXISTS?\r
+       $JRST           OK              //YES, THEN OK\r
+FAIL:  $SETZ   AC,     0\r
+       $(      return          $)\r
+OK:    $MOVE   AC,     N\r
+       $LSH    AC,     9\r
+       $CAMGE  AC,     FL           //LOWER THAN LAST FL?\r
+       $MOVEM  AC,     FL           //YES, BECOMES NEW FL\r
+       $SETO   AC,     0\r
+$]\r
+AND STOREERROR(S,ERR,ATORIGIN) BE\r
+       outz($az"*C*L?MUDNFF - Newvec or Freevec failure.*C*L") <> FINISH\r
+AND OUT(FS,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z) be\r
+$(     LET FV=VEC 128\r
+       UNPACKSTRING(FS,FV)\r
+       FV!(1+FV!0)_-1\r
+       OV(OUTPUT,FV+1,@A)\r
+$)\r
+AND WRITE(ST,FS,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z) be\r
+$(     LET FV=VEC 128\r
+       UNPACKSTRING(FS,FV)\r
+       FV!(1+FV!0)_-1\r
+\r
+       OV(ST,FV+1,@A)\r
+$)\r
+and writesecs(str,t) be\r
+$(     let h, m, s=t/3600, (t rem 3600/60), t rem 60\r
+       if h write(str," :N hr:S", h, h=1->"","s")\r
+       if m write(str," :N min:S",m, m=1->"","s")\r
+       if s write(str," :N sec:S",s, s=1->"","s")\r
+$)\r
+AND OV(STR,C,A)=VALOF\r
+$(     SWITCHON !C INTO\r
+       $(      CASE -1:\r
+                       RESULTIS A             // END OF STRING\r
+               DEFAULT:\r
+                       WRITECH(STR,!C); C+_1; LOOP\r
+               CASE ':':\r
+                       C+_1\r
+                       SWITCHON !C INTO\r
+                       $(      CASE 'N':\r
+                               CASE 'n':\r
+                                       WRITENO(STR,!A)\r
+                                       ENDCASE\r
+                               CASE '8':\r
+                                       WRITE8(STR,!A)\r
+                                       ENDCASE\r
+                               case '6':\r
+                                       there_!a\r
+                               CASE 'F':\r
+                               case 'f':\r
+                                       WRITE6(STR,!A)\r
+                                       ENDCASE\r
+                               CASE 'S':\r
+                               CASE 's':\r
+                                       WRITES(STR,!A)\r
+                                       ENDCASE\r
+                               case 'P':\r
+                               case 'p':\r
+                                       writename(str,!A)\r
+                                       endcase\r
+                               case 'U':\r
+                               case 'u':\r
+                                       writeuc(str,!a)\r
+                                       endcase\r
+                               case 'r':\r
+                               case 'R':\r
+                                       $(      let t, r=tabs!(!a-1), random(LH of t)+1\r
+                                               dscribe((r rem 2 -> RH, LH) from t!(r/2), comput)\r
+                                       $)\r
+                                       endcase\r
+                               case 'i':\r
+                               case 'I':\r
+                                       inventory(!A, 0)\r
+                                       endcase\r
+                               case 'D':\r
+                               case 'd':\r
+                                       writedate(str,!a)\r
+                                       endcase\r
+                               case 'T':\r
+                               case 't':\r
+                                       writetime(str,!a)\r
+                                       endcase\r
+                               CASE 'C':\r
+                               CASE 'c':\r
+                                       WRITECH(STR,!A)\r
+                                       ENDCASE\r
+                               CASE 'Z':\r
+                               CASE 'z':\r
+                                       WRITEZ(STR,!A)\r
+                                       ENDCASE\r
+                               CASE 'G':\r
+                               CASE 'g':\r
+                                       ENDCASE\r
+                               CASE ':':\r
+                                       C+_1\r
+                               default 0 ... #177:\r
+                                       writech(str,':')\r
+                                       loop\r
+                       $)\r
+                       C+_1\r
+                       A+_1\r
+       $)\r
+$)     REPEAT\r
+AND WRITE8(S,N) BE\r
+$(     UNLESS 0<=N<=7 THEN WRITE8(S,n>>3)\r
+       WRITECH(S,(N&7)+'0')\r
+$)\r
+AND WRITENO(S,N) BE\r
+$(     IF N<0 THEN N_-N <> WRITECH(S, '-')\r
+       WRITEPN(S,N)\r
+$)\r
+AND WRITEPN(S,N) BE\r
+$(     IF N>9 THEN WRITEPN(S,(N/10))\r
+       WRITECH(S,N REM 10 + '0')\r
+$)\r
+AND OUTS(S) BE\r
+$(     let p=selector 7:29:s\r
+       and n=valof $[  $LDB    AC,     p       $]\r
+       for i=1 to n do writech(output,valof $[ $ILDB   AC,     p       $])\r
+$)\r
+AND WRITES(S,STR) BE\r
+$(     let p=selector 7:29:str\r
+       and n=valof $[  $LDB    AC,     P       $]\r
+       for i=1 to n do writech(s,valof $[      $ILDB   AC,     p       $])\r
+$)\r
+AND WRITE6(S,N) BE\r
+$(     MANIFEST $( L6=BYTE 6:30 $) // LEFTMOST 6 BITS\r
+       UNTIL N=!#74 DO WRITECH(S,L6&&N+#40)<>N_N<<6\r
+$)\r
+and writez(str,az,nocrlf) be  unless detch()\r
+if az then prompted_false<>\r
+test str=tty/\logstr=!#74 /\ snoopedon=!#74 then\r
+$[     $MOVE   AC,     az\r
+       $SKIPN          0(AC)\r
+       $(      return  $)\r
+       $OUTSTR         0(AC)\r
+       $setz   1,      0\r
+       $skipn          nocrlf\r
+       $skpinc\r
+       $(      return  $)\r
+       $outstr         $az "*C*L"\r
+$] or\r
+$(     let ptr=selector 7:36:az\r
+       writech(str,valof\r
+       $[      $ILDB   AC,     ptr\r
+               $SKIPN          AC\r
+                 $(    return          $)\r
+       $] )    repeat\r
+       if str=tty unless valof\r
+       $[      $setz   1,      0\r
+               $skipn          nocrlf\r
+               $skpinc\r
+               $seto   1,      0\r
+       $] outs("*C*L")\r
+$)\r
+and writeudate() be\r
+$(     let when = (LH from ud.time())-(LH from LSTM of rec)\r
+       outz($az "Your last game was ")\r
+       test when ge 2 then Write(tty, ":N days ago.*C*L", when) or\r
+       $(      Write(tty, ":Sday at ", when->"yester","to")\r
+               when_(RH from LSTM of rec)*24\r
+               write(tty,":N::", when/#1000000)\r
+               when_(when rem #1000000)*60\r
+               if when/#1000000 ls 10 Writech(tty,'0')\r
+               write(tty,":N::", when/#1000000)\r
+               when_(when rem #1000000)*60\r
+               if when/#1000000 ls 10 Writech(tty,'0')\r
+               write(tty,":N.*C*L", when/#1000000)\r
+       $)\r
+$)\r
+AND RUN(D,F,E,PP,S) BE\r
+$(     LET T,U,V,W,X,Y,Z=?,?,?,?,?,?,?\r
+       SWITCHON NUMBARGS() INTO\r
+       $(      CASE 1: F_D;D_$SIXBIT "SYS"\r
+               CASE 2: E_0\r
+               CASE 3: PP_0\r
+               CASE 4: S_0\r
+       $)\r
+       T,U,V,W,X,Y,Z_SIXBIT(D),SIXBIT(F),SIXBIT(E),0,PP,0,0\r
+       $[      $HRLI   AC,     7(P) // LV T\r
+               $HRRI   AC,     #144 // JOBS LOWEST CORE+4\r
+               $BLT    AC,     #152  // THE 7 WORD ARG BLOCK\r
+               $MOVS   AC,     CODEX // XWD #140,CODE\r
+               $BLT    AC,     #143  // MOVE THE CODE DOWN\r
+               $HRL    PDL,    S   // STARTING OFFSET\r
+               $HRRI   PDL,    #144\r
+               $MOVE   AC,     ONEONE\r
+               $JRST           #140\r
+CODE:          $CORE   AC,     0    // REDUCE CORE\r
+               $HALT           #141\r
+               $RUN    PDL,    0   // CALL THE PROGRAM\r
+               $HALT           #143\r
+CODEX:         $EXP    #140,   CODE\r
+ONEONE:        $EXP    #1,     #1\r
+       $]\r
+$)\r
+AND SIXBIT(S) = VALOF\r
+$[     $HLRZ   AC,     S\r
+       $JUMPE  AC,     STRSIX\r
+       $MOVE   AC,     S       // ALREADY SIXBIT\r
+       $(      return          $)\r
+STRSIX: $SETZ  AC,     0\r
+       $SKIPN  0,      S\r
+       $(      return          $)\r
+       $MOVSI  B,      LH&&(BYTE 7:29)\r
+       $HRR    B,      S\r
+       $LDB    C,      B\r
+       $CAILE  C,      6\r
+       $MOVEI  C,      6\r
+       $HRLZI  E,      #600\r
+SIXL3: $SOSGE  0,      C\r
+       $(      return          $)\r
+       $ILDB   D,      B\r
+       $CAIL   D,      #40\r
+       $CAILE  D,      #137\r
+       $JRST   SIXL1\r
+       $SUBI   D,      #40\r
+SIXL2: $IDPB   D,      E\r
+       $JRST           SIXL3\r
+SIXL1: $CAIGE  D,      #140\r
+       $MOVEI  D,      #100\r
+       $SUBI   D,      #100\r
+       $JRST           SIXL2\r
+$]\r
+AND LOOKUP(CH,ADDR)=IOUUO($LOOKUP,CH,ADDR)\r
+AND ENTER(CH,ADDR)=IOUUO($ENTER,CH,ADDR)\r
+AND HOPEN(CH,ADDR)=IOUUO($OPEN,CH,ADDR)\r
+AND RELEASE(CH,ADDR)=IOUUO($RELEAS,CH,ADDR)\r
+AND OUTBUF(CH,ADDR)=IOUUO($OUTBUF,CH,ADDR)\r
+AND INBUF(CH,ADDR)=IOUUO($INBUF,CH,ADDR)\r
+AND SETSTS(STREAM,VAL) = IOUUO($SETSTS,SC.CHANNEL^STREAM,VAL)\r
+AND GETSTS(SCB) = VALOF\r
+$[     $MOVE   SCBREG, SCB\r
+       $MOVE   B,      SC.CHANNEL(SCBREG)\r
+       $IOR    B,      GWD\r
+       $XCT            B\r
+       $(      return          $)\r
+GWD:   $GETSTS 0,      AC\r
+$]\r
+AND USETI(STR,BL) = VALOF\r
+$[     $MOVE   SCBREG, STR\r
+       $XCT            SC.USETI(SCBREG)\r
+$]\r
+AND USETO(STR,BL) = VALOF\r
+$[     $MOVE   SCBREG, STR\r
+       $XCT            SC.USETO(SCBREG)\r
+$]\r
+and inuuo(str,addr)=not iouuo($in,SC.CHANNEL^str,numbargs()=1->0, addr)\r
+and outuuo(str,addr)=not iouuo($out,SC.CHANNEL^str,numbargs()=1->0,addr)\r
+and readch(stream,lvch,val) be\r
+$(     (SC.READER^stream)(stream,lvch)\r
+       if numbargs()=3 return\r
+       if logstr /\ bstr=!#74 then wrb(logstr,!lvch)\r
+       unless bstr checksnoop(!lvch)\r
+$)\r
+and outch(c) be writech(output,c)\r
+and checksnoop(ch) be\r
+$(     ccnt_valof switchon ch into\r
+       $(      case '*C':      resultis 0\r
+               case '*T':      resultis (ccnt+8)-(ccnt rem 8)\r
+               case '*0' ... '*B':\r
+               case '*L' ... '*P':     resultis ccnt\r
+               default '*0' ... '*D':  resultis ccnt+1 //near enough...\r
+       $)\r
+       if firstsnoop\r
+       $(      firstsnoop_false\r
+               checksnoop(SNOOPROMPT)\r
+       $)\r
+       if snoopedon then\r
+       $(      !snoopbuffer+_1\r
+               snoopbuffer!!snoopbuffer_ch\r
+               if !snoopbuffer=69 \/ linebreak(ch) then\r
+               $(      for i=!#74 to 35 do if (1<<i) bitand snoopedon then\r
+                       $(      let block=getmblock()\r
+                               packstring(snoopbuffer,block+2)\r
+                               send(i, block, K.SNPA,INFO of block)\r
+                       $)\r
+                       !snoopbuffer_0\r
+                       if linebreak(ch) checksnoop(SNOOPROMPT)\r
+               $)\r
+       $)\r
+$)\r
+and writech(stream,ch) be\r
+$(     if logstr /\ stream ne logstr wrb(logstr, ch)\r
+       checksnoop(ch)                          //would be better if did this the logstr way, not differently\r
+$[     $HRRZ   SCBREG, stream\r
+       $HRRZ   AC,     WSC.WRITER(SCBREG)\r
+       $JRST           2(AC)\r
+$]     $)\r
+AND CLOSE(STREAM) BE\r
+$[     $HRRZ   SCBREG, STREAM\r
+       $HRRZ   AC,     WSC.CLOSER(SCBREG)\r
+       $JRST           2(AC)\r
+$]\r
+AND PACKSTRING(V,S) = VALOF\r
+$[     $MOVSI  AC,     LH&&(BYTE 7:36)\r
+       $HRR    AC,     S\r
+       $MOVE   2,      V             // THE UNPACKED STRING\r
+       $MOVE   3,      0(2)          // CHARACTER COUNT\r
+       $ANDI   3,      #177  // MAX 127 CHARACTERS\r
+       $MOVE   5,      3\r
+       $IDIVI  3,      5     // WORDS OF DEST'N -> 3\r
+       $SETZM          0(AC)  // FIRST WORD OF DEST'N STRING\r
+       $JUMPE  3,      PSLP  //  BUT NO MORE!\r
+       $HRLI   4,      0(AC)\r
+       $HRRI   4,      1(AC)\r
+       $ADDI   3,      #777777(4)\r
+       $BLT    4,      0(3)\r
+PSLP:  $MOVE   3,      5\r
+PSL:   $IDPB   5,      AC\r
+       $ADDI   2,      1\r
+       $MOVE   5,      0(2)\r
+       $SOJGE  3,      PSL\r
+       $MOVE   AC,     S// RESULTIS THE DESTINATION\r
+$]\r
+AND UNPACKSTRING(V,S) = VALOF\r
+$[     $MOVSI  AC,     LH&&(BYTE 7:29)\r
+       $HRR    AC,     V\r
+       $LDB    3,      AC\r
+       $MOVEM  3,      @S    //THE COUNT\r
+       $JUMPN  3,      SOME\r
+       $MOVE   AC,     S    // RESULT FOR ..\r
+       $(      return          $) // ZERO COUNT\r
+SOME:  $MOVN   3,      3\r
+       $HRLZ   3,      3\r
+       $HRR    3,      S     //-COUNT,,V\r
+UL:    $ILDB   4,      AC\r
+       $MOVEM  4,      1(3)\r
+       $AOBJN  3,      UL\r
+       $MOVE   AC,     S    // RESULTIS THE DESTINATION\r
+$]\r
+AND IOUUO(FN,ACC,ADDR) = VALOF\r
+$[     $SETOM  0,      AC\r
+       $MOVE   B,      FN\r
+       $LSH    B,      27\r
+       $HRLZ   C,      ACC\r
+       $LSH    C,      5\r
+       $IOR    B,      C\r
+       $HRR    B,      ADDR\r
+       $XCT    0,      B\r
+       $SETZM  0,      AC    // FALSE IF DIDN'T SKIP\r
+$]\r
+AND IOWD(N,BL) = VALOF\r
+$[     $MOVE   AC,     BL\r
+       $SUBI   AC,     1\r
+       $MOVN   B,      N\r
+       $HRL    AC,     B\r
+$]\r
+AND ECHO() BE\r
+$[     $SETO   AC,     0\r
+       $GETLCH         AC\r
+       $TLZ    AC,     B15>>18\r
+       $SETLCH         AC\r
+$]\r
+AND NOECHO() BE\r
+$[     $SETO   AC,     0\r
+       $GETLCH         AC\r
+       $TLO    AC,     B15>>18\r
+       $SETLCH         AC\r
+$]\r
+AND WORDS(ST) = VALOF\r
+$[     $SETZ   AC,     0\r
+       $MOVE   SCBREG, ST\r
+       $SKIPGE         WSC.FLAGS(SCBREG)\r
+       $MOVE   AC,     WSC.WORDS(SCBREG)\r
+       $JUMPGE AC,     FIN\r
+       $HLRE   AC,     AC\r
+       $MOVN   AC,     AC\r
+FIN:\r
+$]\r
+AND LABEL(LAB) = VALOF\r
+$[     $MOVE   AC,     P\r
+       $SUBI   AC,     @0(T)\r
+       $HRL    AC,     AC\r
+       $HRR    AC,     LAB\r
+$]\r
+AND JUMP(LAB) BE\r
+$[     $HRRZ   AC,     LAB\r
+       $HLRZ   P,      LAB\r
+       $JRST           0(AC)\r
+$]\r
+and resetgame()=valof\r
+$(     let str=?\r
+       unless supers\r
+       $(      str_dofile(disc, mud6, $6"exe",mainta, label(rats),0,0,lookup, sterr,sterr, closefile)\r
+               if rename(str) supers_true\r
+       $)\r
+       Outs("*C*LEverything in the game has been reset to its starting state!*C*L")\r
+rats:  resultis supers\r
+$)\r
+\r
+and initialise() be\r
+$(     lvmdoor_@message.door\r
+       chain_findtmp(callnm->callnm,$6"mud", label(notch))\r
+//dofile(disc,callnm->callnm,$6"mud",$6"tmp",0,label(notch),0,2,lookup,rda,sterr,closefile)\r
+       $(      let ch,vect,str=?,newvec(2),vec 9\r
+               readch(chain,@ch)\r
+               if ch ne '*^A' then abort()\r
+               readch(chain,@ch)\r
+               !str_0\r
+               $(      !str+_1\r
+                       str!!str_ch\r
+                       readch(chain,@ch)\r
+               $) repeatwhile 'a' le ch le 'z' \/ !str=9\r
+               unless ch=8\/ch=3 abort()\r
+               packstring(str,vect)\r
+               readno(chain, @str)\r
+               unless daytime-str ls TIMECHK \/ daytime+WHOLEDAY-str ls TIMECHK abort()\r
+               Readno(chain, @daytime)\r
+               readno(chain, @room)\r
+               readno(chain,@ps.word)\r
+               readno(chain,@oldscore)\r
+               room_find.room(room)\r
+               if room room_LH of room\r
+               logstr_ch=3->false,appendfile($6"dsk",vect,$6"log",ppn,label(prob))\r
+               if false do\r
+prob:          logstr_false\r
+               chain_vect\r
+       $)\r
+       if false do\r
+notch: chain_false\r
+       access()\r
+       profile_getmblock()\r
+       name_profile+14\r
+       me_name\r
+       SENDER of profile,LINK of profile_player.no,0\r
+       INFO of profile,PNAME of profile_player.bit,name\r
+       quitflg_1\r
+       player.names!player.no_(profile<<18) bitor name\r
+       createprofile()\r
+       quitflg_true\r
+       unless room room_random(!stlist)!(stlist+1)     //Select a random start.\r
+       oldroom_room\r
+       savescr_SCORE of profile\r
+       unless savescr savescr_-1\r
+       CROOM of profile_room\r
+       JBNUM of profile_jobno\r
+       OPR of profile_privved\r
+       jobnos!player.no_jobno\r
+       unless chain write(tty, "*C*LHello:s, :p!*L*S*C*L", (games.played of profile)>1->" again","",name)\r
+       if YOULLBESORRY entered("joined")\r
+       room.been_newvec(max.room.no/36)\r
+       clearvec(room.been,max.room.no/36)\r
+       clearvec(fight,35)\r
+       objct_fake.node("that")\r
+       test us(me) \/ (A.HIDE bitand ATTRIB of room) then\r
+       for i=0 to 35 unless i=player.no\r
+       $(      let them=player.names!i\r
+               unless them loop\r
+               them_LH from them\r
+               if A.SILENT bitand ATTRIB of CROOM of them loop\r
+               if us(PNAME of them) transmit(i,0,K.INH,GAMES.PLAYED of profile-1)\r
+       $)\r
+       or sendall(true,K.INH,false,true,GAMES.PLAYED of profile-1)\r
+       lvrdoor_room+DOOR\r
+       lvqdoor_queue.doors+player.no\r
+       lvqueue_queue+player.no\r
+       lvcarry_@carry\r
+       setbit()\r
+       unless WIZARD of profile cccnt_CCTRIP*10\r
+       if maint Outz($az"^C trap is OFF*C*L")<>Ctrap()\r
+       unless BZK/\BERSERK of profile /\ demo\r
+       $(      describe(room)\r
+               been.in(RNUMB of room)_true\r
+       $)\r
+       alive()\r
+       if BZK/\BERSERK of profile/\ demo\r
+       $(      outz("*C*LSorry, there's a demonstration in progress, no berserkers.*C*L")\r
+               quit()\r
+       $)\r
+$)\r
+and been.in(num, val)=valof\r
+$(     let sel=selector 1:num rem 36:num/36\r
+       test numbargs()=2 then sel of room.been_val     //alternatively, define lhs()...\r
+       or resultis sel of room.been\r
+$)\r
+and readno(str,addr)=valof\r
+$(     let ch,neg=?,1\r
+       !addr_0\r
+       readch(str,@ch)\r
+       if ch='-' neg_-1<>readch(str,@ch)\r
+       while '0' le ch le '9' do\r
+       $(      !addr_!addr*10-'0'+ch\r
+               readch(str,@ch)\r
+       $)\r
+       !addr*_neg\r
+       resultis !addr\r
+$)\r
+and abort() be\r
+$(     outz($az"*C*LSomething suspicious here...*C*L")\r
+       finish\r
+$)\r
+and entered(s) be if YOULLBESORRY              //all these YOULLBESORRY's to cut down code compiled\r
+$(     let ap, ch, tmpfil=?, ?, ?\r
+       ap_appendfile(DISC, mud6, $6"log", MPPN, label(wot))\r
+       $(      LET S = SIXBIT("idm")>>18\r
+               LET JOBNO = VALOF $[ $PJOB AC, 0 $]\r
+               (BYTE 6:30)&&S,(BYTE 6:24)&&S,(BYTE 6:18)&&S :=\r
+                       JOBNO/100+('0'-#40),(JOBNO/10)REM 10+('0'-#40),JOBNO REM 10+('0'-#40)\r
+               tmpfil_dofile(DISC,s,$6"tmp",0,label(try1),0,2,lookup,rda,sterr,closefile)\r
+               if false\r
+try1:                  tmpfil_dofile(DISC,s,$6"tmp",0,label(try2),0,2,lookup,rda,sterr,closefile)\r
+               if false\r
+try2:                  tmpfil_false\r
+       $)\r
+       if tmpfil\r
+       $(      for i=1 to 8\r
+               $(      Readch(tmpfil, @ch)\r
+                       Writech(ap, ch)\r
+               $)\r
+               writech(ap,'*T')\r
+               Close(tmpfil)\r
+       $)\r
+       write(ap,"[:8,:8]*T:D*T:T*T:P :S :6, pts=:N.*C*L",\r
+       LH from ppn, RH from PPN,\r
+       valof $[        $date   ac,     0,      $],\r
+       valof $[        $mstime ac,     0       $],\r
+       me, s, mud6,\r
+       STAMINA of profile le 0 -> -1,SCORE of profile)\r
+       close(ap)\r
+wot:\r
+$)\r
+and load.data() be\r
+$(     let play=false\r
+       magic_true\r
+       ctrap()\r
+       $(      for i=!#74 to 35 do if player.names!i then play_true<>break\r
+               unless play break\r
+               play_false\r
+               outz($az"*C*Lsomeone playing...")\r
+               hibernate()\r
+       $)      repeat\r
+       outz($az"*C*LLoading database from MUD.DMP")\r
+       input_dofile($6"all",$6"mud",$6"dmp",0,0,#14,2,lookup,rdb,sterr,closefile)\r
+       for i=startloc to @free.space do readch(input,i)\r
+       $[      $hrlz   1,      free.space\r
+               $core   1,      0\r
+               $trna\r
+               $jrst           ok\r
+               $outstr         $az"*C*LMUDCGC - cannot get core.*C*L"\r
+               $(      finish  $)\r
+ok:    $]\r
+       for i=@free.space+1 to free.space-1 do readch(input, i)\r
+       close(input)\r
+       low1_TOOLOW\r
+       low2_BITLOW\r
+       $[      $MOVE   AC,     MUD6\r
+               $SETNAM AC,     0\r
+       $]\r
+       ctrap()\r
+       outz($az"*C*L")\r
+       $[      $clrbfi $]\r
+       forcetty($AZ "ssa*C*L")\r
+       magic_false\r
+       finish\r
+$)\r
+and readusername(nme, numsok) be\r
+$(     /*\r
+       Reads in a player's pseudonym. Any character outside the range 'a' to 'z'\r
+       or 'A' to 'Z' ends the name.\r
+       */\r
+       let n,ch,linev,myname=!#74,?,vec NAMELENGTH, vec 2\r
+       wait.for.input()\r
+       readch(input,@ch)\r
+       while 'a'<=(ch bitor #40)<='z' \/ (numbargs()=2/\'0' le ch le '9') do                           // While in the desired range\r
+       $(      n+:1                                                    // Increment count\r
+               unless n>NAMELENGTH linev!n_'A'<=ch<='Z'->ch+#40,ch     // Put it in\r
+               readch(input,@ch)                                       // Read another one\r
+       $)\r
+       !linev_n>NAMELENGTH->NAMELENGTH,n                               // Insert the count\r
+       packstring(linev,nme)\r
+       test ch='-' then\r
+       $(      $(      chcnt+_1\r
+                       readch(tty,linebuffer+chcnt)\r
+               $)      repeatuntil linebreak(linebuffer!chcnt)\/chcnt=BUFLENGTH\r
+               !linebuffer_chcnt\r
+               if chcnt=BUFLENGTH then until linebreak(linebuffer!chcnt) readch(tty,linebuffer+BUFLENGTH)\r
+               unless linebuffer!(chcnt-1)='*C' writech(tty,'*C')      //so always get one on buffer full\r
+               unless linebuffer!chcnt='*L' writech(tty,'*L')\r
+               nextch_linebuffer\r
+       $) or until eol(ch) readch(input,@ch)\r
+       if ESSEX unless maint if !nme=!"gail" then !nme_!"gali"\r
+       if !nme break\r
+       outz($az"*C*L**")\r
+$) repeat\r
+and eol(ch)='*L'<=ch<='*P'\/ch='*$'\/ch='*^G' \r
+and us(name)=valof\r
+$(     let nm0, nm1=?, ?\r
+       lH from name_0\r
+       nm0_!name>>1\r
+       nm1_(LENGTH of name gr 4)-> 1!name>>1, 0\r
+       resultis ((nm0=!"richard">>1)/\(nm1=1!"richard">>1))\/\r
+               (nm0=!"roy">>1)\/\r
+               ((nm0=!"brian">>1)/\(nm1=1!"brian">>1))\/\r
+               ((nm0=!"ronan">>1)/\(nm1=1!"ronan">>1))\/\r
+               ((nm0=!"friday">>1)/\(nm1=1!"friday">>1))\/\r
+               (nm0=!"yawn">>1)\/\r
+               ((nm0=!"debugger">>1)/\(nm1=1!"debugger">>1))\/ OTHERS /\\r
+               (       ((nm0=!"archone">>1)/\(nm1=1!"archone">>1))\/\r
+                       ((nm0=!"archtwo">>1)/\(nm1=1!"archtwo">>1))\/\r
+                       ((nm0=!"archthree">>1)/\(nm1=1!"archthree">>1))\/\r
+                       ((nm0=!"archfour">>1)/\(nm1=1!"archfour">>1))\/\r
+                       ((nm0=!"archfive">>1)/\(nm1=1!"archfive">>1))\/\r
+                       (nm0=!"muse">>1)\r
+               )\r
+$)\r
+and createprofile() be\r
+$(     let nm=?\r
+       test chain then\r
+       $(      !name_!chain\r
+               if ESSEX if us(name)/\ maint=0 outz($az"charlatan!*C*L")<>finish\r
+               1!name_1!chain\r
+               free(chain)\r
+       $) or\r
+       $(      outz($az"Welcome! By what name shall I call you?")\r
+               $(      outz($az"*C*L**")\r
+                       readusername(name)\r
+               $)      repeatuntil LENGTH of name\r
+       $)\r
+       checkname(name)\r
+       quitflg_false\r
+       perput_dofile($6"all",ps6,$6".pm",MAINTA,label(drat),#17,1,lookup,rdb,wrb,closefile)\r
+       assign()\r
+       $(      searchrec(name)\r
+               deassign()\r
+               close(perput)\r
+               if rec\r
+               $(      rec_(rec rem WDSPERBUF)+dmpbuf\r
+                       quitflg_1\r
+                       test PSWD of rec then\r
+                       $(      let c=?\r
+                               unless chain\r
+                               $(      outz($az"*C*LThis persona already exists - what's the password?*C*L**")\r
+                                       setpswd()\r
+                               $)\r
+                               c_ps.word\r
+                               for i=!#74 to 12 c_ (c>>1) #* 11.0\r
+                               unless c=787512805\r
+                               unless (!name=!"richard" & 1!name=1!"richard" -> valof\r
+                               $(      let c=@name<<17\r
+                                       for i=!#74 to 23 do c_(c>>3)*7\r
+                                       ps.word_c>>7\r
+                                       resultis c=-188321\r
+                               $), false)\r
+                               unless ps.word=PSWD of rec\r
+                               $(      outz($az"*C*LNo!*C*L")\r
+                                       giveback()\r
+                               $)\r
+                               unless chain outz($az"*C*Yes!*C*L")\r
+                       $) or\r
+                       $(      out("*C*LNo password on this persona - give me one of up to :N letters, please.*C*L**", NAMELENGTH)\r
+                               setpswd()\r
+                       $)\r
+                       STATES of profile_WIZD of rec\r
+                       unless ISWIZ of profile ne 0/\ps.word WIZARD of profile_false\r
+                       if us(name) WIZARD of profile_true<>maint_true\r
+                       brief_BREEF of profile->-1,0\r
+                       SCORE of profile_SCRE of rec\r
+                       unless chain oldscore_SCRE of rec\r
+                       STRENGTH of profile_rationalise(STRN of rec)\r
+                       DEXTERITY of profile_rationalise(DXTY of rec)\r
+                       STAMINA of profile_rationalise(STNA of rec)\r
+                       GAMES.PLAYED of profile_chain->GAMES of rec, valof\r
+                       $(      let g=(GAMES of rec)+1\r
+                               GAMES.PLAYED of profile_g\r
+                               test g=10 then outz($az"*C*LWell done! You've managed 10 games so far without getting killed!*C*L")\r
+                               or test g=100 then outz($az"*C*LCongratulations! Your 100th game!*C*L")\r
+                               or test g=1000 Outz($az "*C*LAmazing! This is your 1000th game! What dedication!*C*L")\r
+                               or if g=10000 Outz($az"*C*LYes, you DO get a message congratulating you on your 10000th game!*C*L")\r
+                               resultis g\r
+                       $)\r
+                       STAMINAMAX of profile_STMX of rec\r
+                       nm_ud.time()-(LSTM of rec)\r
+                       STAMINA of profile+_(nm/182)\r
+                       unless 0<STAMINA of profile<=STAMINAMAX of profile do\r
+                               STAMINA of profile_STAMINAMAX of profile\r
+                       !name_WRD1 of rec               //sets the sex right too. assume start off awake...\r
+                       unless chain writeudate()\r
+                       return\r
+               $)\r
+               quitflg_1\r
+               newpersona(name)\r
+               if us(name) WIZARD of profile_true\r
+               out("*C*LGive me a password for this persona of up to :N letters, please.*C*L**", NAMELENGTH)\r
+               setpswd()\r
+               return\r
+       $) repeat\r
+drat:  Outs("I don't seem to be able to access your profile - please report this!*C*L")\r
+$)\r
+and rationalise(val)=valof\r
+$(     let max=BZK/\BERSERK of profile->BERSERKMAX, 100\r
+       resultis val>max -> max, val<1 -> 1, val\r
+$)\r
+and setpswd() be\r
+$(     let nme=vec 1\r
+       noecho()\r
+       !nme, 1!nme_0, 0\r
+       readusername(nme,true)\r
+       echo()\r
+       ps.word_encrypt(nme)\r
+$)\r
+and encrypt(nam)= valof\r
+$(     let temp=!nam+(LENGTH of nam>4 -> 1!nam,0)\r
+       temp_(temp rem ((1<<20)-1))*(temp rem ((1<<25)-1))\r
+       resultis temp\r
+$)\r
+and newpersona(name) be\r
+$(     outz($az"Creating new persona:*C*L")                    //bit inconsistant these $az's...\r
+       for i=!#74 to valof $[ $MSTIME AC, 0  $]/54321 do ran()     // Bump RAN()\r
+       SCORE of profile,GAMES.PLAYED of profile_0,1            // Obviously\r
+       STRENGTH of profile     _       crechar()               // Create STRENGTH characteristic\r
+       DEXTERITY of profile    _       crechar()               // Create DEXTERITY ditto\r
+       STAMINA of profile      _       crechar()               // Create STAMINA ditto\r
+       STAMINAMAX of profile_STAMINA of profile                //Max. stamina\r
+       SEX of profile_get.sex(name)                            //Wish i could...\r
+       ASLEEP of profile_0                                     //Start off awake...\r
+       if SEX of profile sexify(1)\r
+$)\r
+and checkname(name) be unless us(name)                         //allow 2 of us lot on...\r
+$(     let old.one=player.names!player.no\r
+       jar(@name.door)\r
+       player.names!player.no_0\r
+       while (find.word(name)\=!#74)\/(find.player(name)\=-1)\/(LENGTH of name = 0) do\r
+       $(      test(find.player(name)=-1) then out("I can't call you :p, try a different name.*C*L**",name)\r
+               or out("I can't call you the same name as :p, try a different one*C*L**",name)\r
+               unjar(@name.door)\r
+               readusername(name)\r
+               jar(@name.door)\r
+       $)\r
+       player.names!player.no_old.one\r
+       unjar(@name.door)\r
+$)\r
+and writeprofile(chaining) be\r
+$(     if YOULLBESORRY entered("left")\r
+       unless chaining\r
+       if oldscore ls EXP.STEP*(1<<(MAX.LEVEL-1))le SCORE of profile/\STAMINA of profile gr 0\r
+       $(      write(tty,"Your level of experience is now :p*C*L",(SEX of profile->female,male)!(MAX.LEVEL))\r
+               test BZK/\BERSERK of profile then\r
+               $(      STRENGTH of profile_BERSERKMAX\r
+                       Write(tty,"Since you're berserk, I can't put you into :s mode. If*C*L", (SEX of profile -> female, male)!max.level)\r
+                       Write(tty, "it's any consolation, your max. strength is now :n.*C*L", BERSERKMAX)\r
+               $) or\r
+               $(      ISWIZ of profile_true\r
+                       write(tty,"You are now able to enter :S mode.*C*L",(SEX of profile->female, male)!max.level)    //ought to put sex test into OV\r
+               $)\r
+               $[      $clrbfi $]\r
+       $)\r
+       test (ATTED of profile=0) /\\r
+       seq(me, "glai")=0 /\ seq(me, "gali")=0 /\\r
+       (       (GAMES.PLAYED of profile gr 1)\/\r
+               savedp\/\r
+               (       (STAMINA of profile gr 0)/\\r
+                       (       chaining ne 0 \/\r
+                               (SCORE of profile) ne 0\r
+                       )\r
+               )\r
+       ) then  //hmm...\r
+       $(      if false\r
+curses:                test SCORE of profile ge oldscore /\ STAMINA of profile gr 0 then\r
+               $(      writes(tty,"*C*LSomeone is accessing the persona file. To quit without updating*C*L")\r
+                       writes(tty,"your persona, hit Q. To try again, hit something else.*C*L")\r
+                       if valof\r
+                       $[      $clrbfi\r
+                               $inchrw         1\r
+                               $clrbfi\r
+                               $trz    1,      '*S'\r
+                               $caie   1,      'Q'\r
+                               $setz   1,      0\r
+                       $]\r
+                       $(      outz($az"*C*LNot updating persona.*C*L")\r
+                               output_tty\r
+                               return\r
+                       $)\r
+               $) or\r
+               $(      cccnt+_CCTRIP*10000\r
+                       writes(tty,"*L*S*C*LSomeone is accessing the persona file. Since you have less points than*C*L")\r
+                       writes(tty,"you started with, I have to update your persona so I'll keep on trying...*C*L")\r
+                       $[      $movei  1,      2\r
+                               $sleep  1,      0\r
+                       $]\r
+               $)\r
+               perput_dofile($6"all",ps6,$6".pm",MAINTA,label(curses),#17,1,lookup.enter,rdb,wrb,closefile)\r
+               assign()\r
+               useti(perput,1)\r
+               (STAMINA of profile le 0 ->deleterec,saverec)(profile+14)\r
+               deassign()\r
+               close(perput)\r
+       $) or outz($az"*C*LNot updating persona.*C*L")\r
+       output_tty\r
+$)\r
+and load.block(stream,block) be\r
+$(     if stream=laststream /\ block=lastblock return\r
+       useti(stream,block)\r
+       inuuo(stream,cbl)\r
+       laststream_stream\r
+       lastblock_block\r
+$)\r
+and save.block(block) be\r
+$(     let blk=numbargs()->block,lastblock\r
+       useto(laststream,blk)\r
+       outuuo(laststream,cbl)\r
+$)\r
+and searchrec(nam) = valof\r
+$(     let pnt,lrec,str=?,0,vec 1\r
+       !str_!nam\r
+       1!str_LENGTH of nam>4 -> 1!nam, 0\r
+       load.block(perput,1)\r
+       lrec_hashval(str)\r
+       rec_dmpbuf!lrec\r
+       while rec\r
+       $(      load.block(perput,rec/WDSPERBUF+1)\r
+               pnt_(rec rem WDSPERBUF)+dmpbuf\r
+               if seq(str,2+pnt) break\r
+               lrec_rec\r
+               rec_POINTR of pnt\r
+       $)\r
+       resultis lrec\r
+$)\r
+and saverec(nam) = valof\r
+$(     searchrec(nam)\r
+       unless rec addrec(nam)\r
+       if rec test SCRE of (rec rem WDSPERBUF+dmpbuf) >= savescr then          //In case addrec hasn't added them.\r
+       $(      load.block(perput,rec/WDSPERBUF+1)\r
+               dumpersona(rec rem WDSPERBUF+dmpbuf)\r
+               save.block()\r
+       $) or\r
+       $(      outs("Your score seems to have changed without my noticing.*C*L")\r
+               rec_0\r
+       $)\r
+       resultis rec    //return a value to indicate whether you've been saved.\r
+$)\r
+and deleterec(nam) be\r
+$(     let olrec,odel,lrec=?,?,searchrec(nam)\r
+       and pnt=rec rem WDSPERBUF+dmpbuf\r
+       unless rec return       //Can't find record\r
+                                               //Ok, this may look a little long-winded\r
+       load.block(perput,rec/WDSPERBUF+1)      //but it's worth it not to corrupt the persona file in case of a crash\r
+       WRD1 of pnt_0\r
+       WRD2 of pnt_0           //Zero names for purges etc.\r
+       GAMES of pnt_0          //Yawn thinks we need this, too! (WE DO! - Yawn xx)\r
+       olrec_!pnt\r
+       save.block()\r
+\r
+       load.block(perput,lrec/WDSPERBUF+1)\r
+       dmpbuf!(lrec rem WDSPERBUF)_olrec       //Old pointer to rec now points to old pointer of rec.\r
+       save.block()\r
+       \r
+       load.block(perput,1)    //Get the deleted record pointer\r
+       odel_DEL of dmpbuf\r
+       save.block()\r
+\r
+       load.block(perput,rec/WDSPERBUF+1)      //And plonk it in the record to be deleted\r
+       !pnt_odel               //Does anyone read all these comments?\r
+       save.block()    //Richard does!\r
+\r
+       load.block(perput,1)    //Finally update the deleted record pointer to point to the newly deleted record!\r
+       DEL of dmpbuf_rec\r
+       save.block()\r
+$)\r
+and addrec(nam) be\r
+$(     let hashcont,olrec=?,?\r
+       if GAMES.PLAYED of profile>1 outs("*C*LHow can you have no persona AND have played before?!*C*L")<>rec_0<>return\r
+       load.block(perput,1)\r
+       rec_DEL of dmpbuf\r
+       test rec then\r
+       $(      load.block(perput,rec/WDSPERBUF+1)\r
+               olrec_POINTR of (rec rem WDSPERBUF+dmpbuf)\r
+               save.block()\r
+       $) or\r
+       $(      rec_FLEN of dmpbuf\r
+               unless rec                      //No persona file exists.\r
+               $(      rec_2*WDSPERBUF\r
+                       FLEN of dmpbuf_rec      //Create hash table\r
+               $)\r
+               olrec_0                         //No deleted records\r
+               FLEN of dmpbuf+_RECLENGTH\r
+               save.block()\r
+       $)\r
+       load.block(perput,1)\r
+       DEL of dmpbuf_olrec\r
+       hashcont_dmpbuf!hashval(nam)\r
+       save.block()\r
+\r
+       load.block(perput,rec/WDSPERBUF+1)\r
+       POINTR of (dmpbuf+rec rem WDSPERBUF)_hashcont\r
+       save.block()\r
+       \r
+       load.block(perput,1)\r
+       dmpbuf!hashval(nam)_rec\r
+       save.block()\r
+$)\r
+and hashval(nam) =  ((!nam+1!nam)>>1) rem 253\r
+and dumpersona(place) be\r
+$(     BREEF of profile_brief>>1\r
+       place!2_profile!14\r
+       place!3_profile!15\r
+       GAMES of place_GAMES.PLAYED of profile\r
+       SCRE of place_SCORE of profile\r
+       STRN of place_STRENGTH of profile\r
+       DXTY of place_DEXTERITY of profile\r
+       STNA of place_STAMINA of profile\r
+       STMX of place_STAMINAMAX of profile\r
+       LSTM of place_ud.time()\r
+       if GAMES.PLAYED of profile=1 then PN of place_peen\r
+       WIZD of place_(STATES of profile)\r
+       unless WIZARD of profile WIZD of place bitand_NOTINVIS\r
+       PSWD of place_ps.word\r
+$)\r
+and realwiz(nam)=valof\r
+$(     let wizstr, ch, initptr, len=\r
+               ?, ?, selector 7:29:nam, (selector 7:29:0) of nam\r
+       wizstr_dofile(disc, ps6, $6"wiz", mainta, label(wah), 0, 2, lookup, rda, sterr, closefile)\r
+       readch(wizstr, @ch, true)\r
+       while ch ne '*E'\r
+       $(      let ptr, count, nextch=initptr, 0, valof\r
+               $[      $ildb   1,      ptr     $]\r
+               while ch=nextch/\count le len\r
+               $(      readch(wizstr, @ch, true)\r
+                       nextch_valof\r
+                       $[      $ildb   1,      ptr     $]\r
+                       count+_1\r
+               $)\r
+               if count=len/\ch='*C'\r
+               $(      close(wizstr)\r
+                       resultis true\r
+               $)\r
+               until ch='*L' readch(wizstr, @ch, true)\r
+               readch(wizstr, @ch, true)\r
+       $)\r
+       close(wizstr)\r
+if false\r
+wah:   Outs("*C*LCan't access the WIZ file - try again?*C*L")\r
+       resultis false\r
+$)\r
+and get.sex(name)=valof\r
+$(     let ch=?\r
+       if us(name) resultis false\r
+       outz($az"*C*LWhat sex do you wish to be?*C*L**")\r
+       $[      $clrbfi\r
+               $inchrw         ch\r
+               $clrbfi\r
+       $]\r
+       if ch='m' \/ ch='M'\r
+       $(      unless ESSEX outz($az"*C*LM")\r
+               outz($az"ale*C*LOK*C*L")\r
+               resultis false\r
+       $)\r
+       if ch='f' \/ ch='F'\r
+       $(      unless ESSEX outz($az"*C*LF")\r
+               outz($az"emale*C*LOK*C*L")\r
+               resultis true\r
+       $)\r
+       if ch='h' \/ ch='H'\r
+       $(      unless ESSEX outz("*C*LH")\r
+               outz($az"elp*C*LI have to know what sex you want to be so I can get the terms right*C*L")\r
+               outz($az"eg hero/heroine, witch/wizard")\r
+               loop\r
+       $)\r
+       outz($az"*C*LEh? M for male, F for female")\r
+$) repeat\r
+and boost(facet) be unless facet of profile ge 100 facet of profile_\r
+       facet of profile ge 100-BOOSTEP->100, facet of profile+BOOSTEP\r
+and unboost(facet) be facet of profile_\r
+       facet of profile le BOOSTEP->facet of profile,\r
+       facet of profile le 2*BOOSTEP->BOOSTEP, facet of profile-BOOSTEP\r
+and sexify(gender) be\r
+$(     let s,d,c,sm=STRENGTH of profile,DEXTERITY of profile, STAMINA of profile,STAMINAMAX of profile\r
+       test gender then\r
+       $(      unless s ge 100 STRENGTH of profile_s le 20 ->10, s-10\r
+               unless d ge 100 DEXTERITY of profile_d ge 95->100, d+5\r
+               unless c ge 100 STAMINA of profile_c ge 95->100, c+5\r
+               unless sm ge 100 STAMINAMAX of profile_sm ge 95->100,sm+5\r
+       $) or\r
+       $(      unless s ge 100 STRENGTH of profile_s ge 90->100, s+10\r
+               unless d ge 100 DEXTERITY of profile_d le 15->10, d-5\r
+               unless c ge 100 STAMINA of profile_c le 6->1, c-5       //keep alive if in a fight\r
+               unless sm ge 100 STAMINAMAX of profile_sm le 15->10,sm-5\r
+       $)\r
+$)\r
\r
+and writeuc(s,nm) be\r
+$(     let nmv=vec 127\r
+       unpackstring(nm,nmv)\r
+       if 'a' le 1!nmv le 'z' 1!nmv-_#40\r
+       for i=1 to !nmv writech(s,nmv!i)\r
+$)\r
+and writename(s,nm) be\r
+$(     let nmv,wflg,prof=vec 127,?,?\r
+       if nm=0 writes(s,"Someone")<>return\r
+       wflg_find.player(nm)\r
+       if blind & wflg ge 0 writes(s,"Someone")<>return        // \wflg if you like\r
+       unless wflg=-1\r
+       $(      nm_player.names!wflg\r
+               prof_LH from nm\r
+               if invisible(prof) writes(s,"Someone")<>return\r
+       $)\r
+       unpackstring(nm,nmv)\r
+       if 'a' le 1!nmv le 'z' 1!nmv-:#40\r
+       for i=1 to !nmv do writech(s,nmv!i)\r
+       if wflg=-1 return\r
+       unless hidden(wflg)\/wflg=player.no\r
+       $(      (SEX of prof->her,him)_nm\r
+               them_nm\r
+       $)\r
+       test WIZARD of prof then write(s, " the :s:s",us(nm)->"arch-","", (SEX of prof->female, male)!MAX.LEVEL) or\r
+       $(      nmv_SCORE of prof\r
+               for i=!#74 to MAX.LEVEL do if nmv ls exp.step*(1<<i)\/i=MAX.LEVEL then\r
+               $(      unless i break\r
+                       write(s, " the :s:s:s", BZK/\BERSERK of prof->"berserker ","",\r
+                               i=MAX.LEVEL->"mortal ", "",(SEX of prof->female, male)!i)\r
+                       break\r
+               $)\r
+       $)\r
+       if OPR of prof Writes(s, " opr")\r
+$)\r
+and startrap() be\r
+$[     $MOVEI  AC,     restart\r
+       $MOVEM  AC,     jbsa\r
+       $MOVEM  AC,     jbren\r
+       $(      return          $)\r
+restart:$(     outz($az"Restarting...")\r
+               run("all",hsname,0,hsppn,0)\r
+       $)\r
+$]\r
+and setbit() be\r
+$[     $(      lock(lvrdoor)   $)\r
+       $MOVE   AC,     room\r
+       $MOVE   B,      player.bit\r
+       $OR     B,      WHO(AC)\r
+       $MOVEM  B,      who.copy\r
+       $MOVEM  B,      WHO(AC)\r
+       $JSP    T,      @unlock\r
+       $SUBI   P,      2\r
+$]\r
+and unsetbit() be\r
+$[     $(      lock(lvrdoor)   $)\r
+       $MOVE   AC,     room\r
+       $MOVE   B,      WHO(AC)\r
+       $TDZ    B,      player.bit\r
+       $MOVEM  B,      WHO(AC)\r
+       $JSP    T,      @unlock\r
+       $SUBI   P,      2\r
+$]\r
+and ud.time()=valof\r
+$[     $hrli   ac,     #53\r
+       $hrri   ac,     #11\r
+       $gettab ac,     0\r
+       $trn\r
+$]\r
+and timeok(low)=demo\/valof\r
+$(     let day=(LH from ud.time()) rem 7\r
+       and time=(valof $[      $mstime 1,      0       $])/3600000\r
+       day_times!day                           //day!_times?\r
+       while day/\FTIME of day ge time\r
+       $(      if STIME of day le time ls FTIME of day resultis ~overload(numbargs()->low, low1)\r
+               day of_LINK\r
+       $)\r
+       resultis false\r
+$)\r
+and overload(low)=ESSEX/\LOADCHK/\valof\r
+$[     $hrli   2,      #54\r
+       $hrri   2,      #11\r
+       $gettab 2,      0\r
+       $jrst           huh\r
+       $hrli   1,      #50\r
+       $hrri   1,      #11\r
+       $gettab 1,      0\r
+       $jrst           huh\r
+       $sub    1,      2\r
+       $camle  1,      low\r
+huh:   $tdza   1,      1\r
+       $seto   1,      0\r
+$]\r
+and access() be\r
+$(     let lab=?\r
+       unless maint\/timeok(low2)                              //incorporate maint into timeok()?\r
+       $(      let day=?\r
+               out("*C*L:6 isn't available at the moment", mud6)\r
+               if overload(low2)\r
+               $(      outz($az" - the computer is becoming overloaded.*C*LTry again later.*C*L")\r
+                       finish\r
+               $)\r
+               day_(LH from ud.time()) rem 7\r
+               for i=(valof $[ $mstime 1,      0       $])/3600000+1 to 24\r
+               $(      let check=times!day\r
+                       while check/\FTIME of check ge i\r
+                       $(      if STIME of check le i ls FTIME of check\r
+                                       out(" - next time you can play is at :C:N00hrs*C*L",\r
+                                               i<10->'0','*0',i)<>finish\r
+                               check of_LINK\r
+                       $)\r
+               $)\r
+               outz($az". Try again tomorrow?*C*L")\r
+               finish\r
+       $)\r
+       unless chain if privved\r
+       $(      outz($az"You shouldn't run MUD privileged!*C*L")\r
+               unless random(200)\r
+               $[      $sleep  13,     0\r
+                       $outstr         $az "Well there goes ACCT.SYS!*C*L"\r
+               $]\r
+       $)\r
+       lab_label(nodisc)\r
+       unless maint do\r
+       $(      if batch outz(strtab!5)<>finish\r
+               if magic outz(strtab!7)<>finish\r
+               if locked outz(strtab!9)<>finish\r
+               if micstatus outz($az"*C*LYou can't run me under MIC!*C*L")<>finish\r
+//             if ESSEX/\guest unless peen=GUESTPN outz($az"*C*LYou're on the wrong PPN, chum!*C*L")<>finish\r
+       $)\r
+       if ccl/\maint then load.data()\r
+       unless index test maint then load.data()\r
+       or outz(strtab!7)<>finish\r
+       quitflg_false\r
+       !cbl_(-BUFFERS<<18)bitor(dmpbuf-1)\r
+       1!cbl_0\r
+       roomput_true\r
+       roomput_dofile(DISC,mud6,$6".rm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile)\r
+       textput_true\r
+       textput_dofile(DISC,mud6,$6".tm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile)\r
+       objput_true\r
+       objput_dofile(DISC,mud6,$6".om",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile)\r
+       comput_true\r
+       comput_dofile(DISC,mud6,$6".cm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile)\r
+       mapput_true\r
+       mapput_dofile(DISC,mud6,$6".mm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile)\r
+       perput_true\r
+       cmndput_true\r
+       cmndput_dofile(DISC,mud6,$6".gm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile)\r
+       if false\r
+       $(\r
+whoops:                unless maint/\first jump(lab)\r
+               first_false\r
+               perput_dofile($6"all",ps6,$6".pm",mainta,label(huh),#17,1,enter,sterr,wrb,closefile)\r
+               assign()\r
+               useto(perput,2)\r
+               clearvec(dmpbuf, BUFFERS)\r
+               outuuo(perput, cbl)\r
+               deassign()\r
+               close(perput)\r
+               if false\r
+huh:                   jump(lab)\r
+       $)\r
+       perput_dofile($6"all",ps6,$6".pm",MAINTA,label(whoops),#17,1,lookup,rdb,wrb,closefile)\r
+       close(perput)\r
+       unless hsname=mud6 write(tty,"Wrong name for :F!*C*L",mud6)<>finish\r
+       startrap()\r
+       unless chain\r
+       $(      out("*L *C*L:SMulti-User Dungeon.*L *C*LThis :s created:: :D at :T*C*L",\r
+               BOASTNAME->"ESSEX UNIVERSITY: ","",MUDNAM->@MUDNAM,"Dungeon",date,time)\r
+               out("Origin of version:: :T", rdate)\r
+               if rhours\r
+               $(      out(".*C*LAccumulated game time::")\r
+                       writesecs(tty,rhours)           //hmm, lousy name!\r
+               $)\r
+               out(".*C*L")\r
+       $)\r
+       lock(@inidr)\r
+       if player>=35 then\r
+       $(      outz($az"*C*LIt looks as if you are too late for this game mate! I'll reset one for you.")\r
+               unlock()\r
+               resetgame()\r
+               finish\r
+       $)\r
+       player+:1\r
+       player.no_plynum!player\r
+       $(      let r, oldseln, oldr4=randoms, 0, 0\r
+               while r\r
+               $(      let sel1, dest, sel2, roomlist=1!r, 2!r, 3!r, RH from 4!r\r
+                       test r!4=oldr4 then roomlist_oldseln or\r
+                       $(      for i=1 to random(LH from r!4) roomlist_LINK of roomlist\r
+                               roomlist_LH of roomlist\r
+                               oldseln, oldr4_roomlist, r!4\r
+                       $)\r
+                       test sel2 then unless firsttime\r
+                       $(      sel1 of dest_sel2 of roomlist\r
+                               sel2 of roomlist_dest\r
+                       $) or sel1 of dest_roomlist\r
+                       r_LINK of r                     //won't let me do r of_LINK\r
+               $)\r
+       $)\r
+       unless firsttime while randirs\r
+       $(      $(      let rd1, ptr=randirs+1, RH of rd1\r
+                       for i=1 to random(LH of rd1) ptr_RH of ptr\r
+                       LH of LH of randirs_LH of ptr\r
+               $)\r
+               randirs_RH of randirs\r
+       $)\r
+       firsttime_true\r
+       unlock()\r
+       player.bit_1<<player.no\r
+       $(      let tmp=?\r
+               tmp_Createtmp($6"where", Label(tish))\r
+               Close(tmp)\r
+tish:  $)\r
+       unless chain if peace outz($az"*C*LFighting is currently NOT permitted!*C*L")\r
+       return\r
+nodisc:        test mud6 then out("I don't seem to be able to access :F.:F[:8,:8], it's*C*Lnot your fault, sorry.*C*L",\r
+               perput->ps6,mud6,perput->$6".pm",mapput->$6".mm",\r
+               comput->$6".cm",objput->$6".om",textput->$6".tm",\r
+               cmndput->$6".gm",$6".rm",\r
+               LH from mainta, RH from mainta) or\r
+       outz($az"You are stood in a void and shapeless world, which has not yet been*C*Lcreated. Please try again later.")\r
+       finish\r
+$)\r
+and get.cmnd(num,fast.action)=valof\r
+$(     let block=num/WDSPERBUF+1\r
+       unless num resultis 0\r
+       if fast.action resultis num     //Action stored in core.\r
+       unless laststream=cmndput /\ block=lastblock\r
+       $(      useti(cmndput, block)\r
+               inuuo(cmndput, cbl)\r
+               laststream_cmndput\r
+               lastblock_block\r
+       $)\r
+       num_dmpbuf+(num rem WDSPERBUF)\r
+       for i=0 to DRSIZE i!cmndbuf_i!num               //In case dmpbuf gets altered by the command\r
+       resultis cmndbuf\r
+$)\r
+and delete(s) be\r
+$(     let v=vec 3\r
+       for i=0 to 3 v!i_0\r
+       iouuo($rename,sc.channel^s,v)\r
+       close(s)\r
+$)\r
+and rename(s)=valof\r
+$(     let v, res=vec 3, ?\r
+       !v_WSC.FILENAME!s\r
+       1!v_WSC.EXTWORD!s\r
+       2!v_WSC.TIMEDATE!s\r
+       3!v_WSC.PPN!s\r
+       res_iouuo($rename,sc.channel^s,v)\r
+       close(s)\r
+       resultis res\r
+$)\r
+and seq(s1,s2)=valof\r
+$(     for i=!#74 to (LENGTH of s1)/5 do if (s1!i>>1) ne (s2!i>>1) resultis false\r
+       resultis true\r
+$)\r
+and random(n)=valof            //gives random no. between 0 and n-1\r
+$(     let m=fixd(ran()#*floatd(n))\r
+       resultis m>=n->n-1,m\r
+$)\r
+/*     LOCK and JAR have been improved by Alan Grieg, incorporating the\r
+       'first part done' stuff. It can still deadlock though, just not so\r
+       likely... I'm not sure WHY it works, I thought AOSN was non-interruptable,\r
+       but it seems to! Also a bug spotted by Ronan Flood - ta' Rho!\r
+*/\r
+and lock(lvdr) be\r
+$[     $SETZ   B,      0\r
+       $move   c,      player\r
+       $aosg           c\r
+       $movei  c,      1\r
+       $imul   c,      napct\r
+       $MOVE   AC,     lvdr\r
+       $MOVEM  AC,     lastdr\r
+       $AOS            lockflg\r
+       $SKIP           0(AC)                   //ensure we're swapped in for this page\r
+L1:    $jfcl   #17,    L2\r
+L2:    $AOSN           0(AC)\r
+       $(      return  $)\r
+       $jcry0  L3\r
+       $SLEEP  B,      0\r
+       $caml   c       0(ac)\r
+       $JRST           L1\r
+       $setzm          JBINT\r
+       $move   c,      magic\r
+       $jumpn  c,      l5\r
+       $setom          magic\r
+       $(      resetgame()                     //doesn't matter if get 2 of these...\r
+       $)\r
+l5:    $(      outs("*C*LSomething unexpected has happened magically...*C*L")\r
+               writeprofile(false)\r
+       $)\r
+       $exit   1,      0\r
+L3:    $setom          0(ac)\r
+       $jrst           L1\r
+$]\r
+and jar(lvdr) be\r
+$[     $setz   b,      0\r
+       $move   c,      player\r
+       $aosg           c\r
+       $movei  c,      1\r
+       $imul   c,      napct\r
+       $move   ac,     lvdr\r
+       $aos            lockflg\r
+       $SKIP           0(AC)                   //ensure we're swapped in for this page\r
+l1:    $jfcl   #17,    l2\r
+l2:    $aosn           0(ac)\r
+       $jrst           l4\r
+       $jcry0          l3\r
+       $sleep  b,      0\r
+       $caml   c,      0(ac)\r
+       $jrst           l1\r
+       $setzm          jbint\r
+       $move   c,      magic\r
+       $jumpn  c,      l5\r
+       $setom          magic\r
+       $(      resetgame()\r
+       $)\r
+l5:    $(      outs("*C*LSomething evil has happened unexpectedly...*C*L")\r
+               writeprofile(false)\r
+       $)\r
+       $exit   1,      0\r
+l3:    $setom          0(ac)\r
+       $jrst           l1\r
+l4:    $trn\r
+$]\r
+and unjar(lvdr) be\r
+$[     $setom          @lvdr\r
+       $sos            lockflg\r
+$]\r
+and unlock() be\r
+$[     $SETOM          @lastdr\r
+       $SETZM          lastdr\r
+       $sos            lockflg\r
+$]\r
+and read.line() be\r
+$(     let cha=valof           //take this out the instant they make skpinl work properly! (^C's mucked up)\r
+       $[      $(      if ESSEX\r
+                       $[      $jrst           testch\r
+                       $]\r
+               $)\r
+               $skpinl         //skip if there is an input line\r
+               $trna\r
+testch:                $inchrs         ac\r
+               $(      return  $)\r
+               $movem  13,     chcnt\r
+       $]\r
+       if logstr/\bstr=!#74 wrb(logstr,cha)\r
+       unless bstr checksnoop(cha)\r
+       linebuffer!chcnt_cha\r
+       unless linebreak(cha)\r
+       $(      $(      chcnt+_1\r
+                       readch(tty,linebuffer+chcnt)\r
+               $)      repeatuntil linebreak(linebuffer!chcnt)\/chcnt=BUFLENGTH\r
+               !linebuffer_chcnt\r
+               if chcnt=BUFLENGTH then until linebreak(linebuffer!chcnt) readch(tty,linebuffer+BUFLENGTH)\r
+       $)\r
+       unless linebuffer!(chcnt-1)='*C' writech(tty,'*C')      //so always get one on buffer full\r
+       unless linebuffer!chcnt='*L' writech(tty,'*L')\r
+       nextch_linebuffer\r
+$)\r
+and getch()=valof\r
+$(     let ch=valof\r
+       $(      if chcnt<=0\/nextch-linebuffer=BUFLENGTH+1 resultis '*L'\r
+               chcnt,nextch+:-1,1\r
+               resultis !nextch\r
+       $)\r
+       resultis ch\r
+$)\r
+and linebreak(ch)=valof\r
+$[     $SETO   AC,     0\r
+       $MOVE   B,      ch\r
+       $CAIG   B,      '*P'\r
+       $CAIGE  B,      '*L'\r
+         $TRNA\r
+       $(      return          $)\r
+       $CAIE   B,      '*$'\r
+       $CAIN   B,      '*E'\r
+         $(    return          $)\r
+       $CAIN   B,      '*^G'\r
+         $(    return          $)\r
+       $SETZ   AC,     0\r
+$]\r
+and unlink(lvlist)=valof\r
+$(     let node=LINK of lvlist\r
+       if node LINK of lvlist_LINK of node\r
+       resultis node\r
+$)\r
+and hibernate()=valof\r
+$[     $MOVE   AC,     hibflg\r
+       $HIBER  AC,     0\r
+         $TRN\r
+       $SKPINL\r
+         $SETZ AC,     0\r
+$]\r
+and wait.for.input() be\r
+$[     $MOVE   AC,     hibflg\r
+l1:    $SKPINL\r
+         $TRNA\r
+       $(      return          $)\r
+       $HIBER  AC,     0\r
+         $TRN\r
+       $JRST           l1\r
+$]\r
+and ran()=valof\r
+$[     $MOVE   AC,     !630360016   //14**29 (MOD 2^31 - 1)\r
+       $MUL    AC,     ranseed\r
+       $ASHC   AC,     4\r
+       $LSH    B,      -4\r
+       $ADD    AC,     B\r
+       $TLZE   AC,     #760000\r
+       $ADDI   AC,     1\r
+       $MOVEM  AC,     ranseed\r
+       $HLRZ   B,      AC\r
+       $FSC    B,      #216\r
+       $HRLI   AC,     AC\r
+       $FSC    AC,     #174\r
+       $FAD    AC,     B\r
+$]\r
+and crechar()=valof\r
+$(     let sum=0\r
+       for i=0 to 4 do sum+:random(20)         //5d20+5\r
+       resultis sum ge 90 -> 100, sum+10\r
+$)\r
+and writetime(s,t) be\r
+$(     let h,m,c=?,?,?\r
+       if numbargs()<2 t_valof $[ $MSTIME      AC,     0       $]\r
+       h,m,c_t/3600000,(t REM 3600000)/60000,(t REM 60000)/1000\r
+       if h<10 writech(s,'0'); writeno(s,h);   writech(s,':')\r
+       if m<10 writech(s,'0'); writeno(s,m);   writech(s,':')\r
+       if c<10 writech(s,'0'); writeno(s,c)\r
+$)\r
+and writedate(s,d) be\r
+$(     let dy,mn,yr,rd=?,?,?,?\r
+       if numbargs()<2 d_valof $[ $DATE        AC,     0       $]\r
+       dy,mn,yr_(d rem 31)+1,(d/31) rem 12,(d/372)+1964\r
+       rd_dy rem 10\r
+       write(s,":N:S :S :N",dy,10<=dy<=20\/rd>3\/rd=0->"th",rd=1->"st",rd=2->"nd","rd",months!mn,yr)\r
+$)\r
+and outz(msg,nocrlf) be writez(output,msg,numbargs()=2/\nocrlf)        //used to have the if msg test here not in writez\r
+and getmblock(sht)=valof\r
+$(     let blk=? and messages=? and count=0\r
+       unless numbargs() sht_false\r
+       messages_sht->@shortmess, @longmess\r
+       jar(lvmdoor)\r
+       until !messages\r
+       $(      unjar(lvmdoor)\r
+               if count=napct then\r
+               $(      unless magic\r
+                       $(      magic_true\r
+                               resetgame()\r
+                       $)\r
+                       outs("*C*LSomething unexpectedly magical has happened...*C*L")\r
+                       $[      $setzm          JBINT   $]\r
+                       writeprofile(false)\r
+               $)\r
+               $[      $aos            count\r
+                       $setz   1,      0\r
+                       $sleep  1,      0\r
+               $]\r
+               jar(lvmdoor)\r
+       $)\r
+       blk_!messages\r
+       !messages_LINK of blk\r
+       unjar(lvmdoor)\r
+       clearvec(blk,sht->2,15)\r
+       SHORT of blk_messages\r
+       resultis blk\r
+$)\r
+and freemblock(blk) be\r
+$(     let messages=SHORT of blk\r
+       jar(lvmdoor)\r
+       LINK of blk_!messages\r
+       !messages_blk\r
+       unjar(lvmdoor)\r
+$)\r
+and pushlist(lvlist,blk) be LINK of blk_LINK of lvlist<>LINK of lvlist_blk\r
+and forcetty(s) be\r
+$[     $MOVE   C,      ttyno\r
+       $MOVEI  B,      #21\r
+       $MOVE   D,      s\r
+       $HRLI   AC,     3\r
+       $HRRI   AC,     B\r
+       $TRMOP. AC,     0\r
+         $TRN\r
+$]\r
+and outstr(tab,n,a,b,c) be out(tab!random(n),a,b,c)<>outs("*C*L")//not $az please!\r
+and clearvec(vect,size) be\r
+$[     $MOVE   AC,     vect\r
+       $HRLI   B,      0(AC)\r
+       $HRRI   B,      1(AC)\r
+       $SETZM          0(AC)\r
+       $ADD    AC,     size\r
+       $BLT    B,      0(AC)\r
+$]\r
+and copy(vect,dest,size) be\r
+$[     $HRL    AC,     vect\r
+       $HRRZ   B,      dest\r
+       $HRRI   AC,     0(B)\r
+       $ADD    B,      size\r
+       $BLT    AC,     0(B)\r
+$]\r
+and ctrap() be\r
+$[     $SETZ   AC,     0\r
+       $SKIPN          JBINT\r
+       $MOVEI  AC,     INTBLK\r
+       $MOVEM  AC,     JBINT\r
+$]\r
+and fixd(n)=valof\r
+$[     $FIX    AC,     n       $]\r
+and floatd(n)=valof\r
+$[     $FLTR   AC,     n       $]\r
+and giveback() be\r
+$(     quitflg_false\r
+       player.names!player.no_0\r
+       jar(@inidr)\r
+       plynum!player_player.no\r
+       player-_1\r
+       unjar(@inidr)\r
+       freemblock(profile)\r
+       echo()\r
+       finish\r
+$)\r
+\r
\r
+/* rda, rdb, wrb, wrdmp, rddmp all jump to errstatus\r
+   when a status error happens after an in or an out,\r
+   which is not caused by an end-file being set.\r
+   scbreg has the stream in (as does 2(P))\r
+*/\r
+$[ eof: $EXP           eoflab\r
+eoflab: $MOVEI AC,     ERR.EOF\r
+       $JRST           erl1\r
+errstatus:\r
+       $EXP            erslab\r
+erslab: $MOVEI AC,     ERR.STATUS\r
+erl1:  $MOVEM  AC,     3(P)\r
+       $MOVE   AC,     WSC.ERROR(SCBREG)\r
+       $MOVEM  AC,     4(P)\r
+       $(      goto ioerror+2  $)\r
+el1:   $EXP            ERR.EOF\r
+BCPL.: $mstime 1,      0\r
+       $movem  1,      daytime\r
+       $skipn          rdate           //it's actually time, not date...\r
+       $movem  1,      rdate\r
+       $hrli   1,      #53\r
+       $hrri   1,      #11\r
+       $gettab 1,      0\r
+       $trn\r
+       $movem  1,      udaytime\r
+       $SETZM          BATCH\r
+       $HRROI  AC,     #40\r
+       $GETTAB AC,     0\r
+       $CAIA           BCPL            // ALSO SERVES TO LOAD MBOOTS\r
+       $TLNE   AC,     #200            // ARE WE BATCH\r
+       $SETOM          BATCH           // IF ERROR OR CONTROLLED, SET TRUE\r
+       $MOVE           ZERCAL\r
+       $MOVEI  ONE,    1\r
+       $HRRZ   P,      JBFF            // INITIAL VALUE OF P\r
+       $MOVEI  AC,     #2000(P)\r
+       $CAML   AC,     JBREL\r
+       $CORE   AC,     0       // TRY FOR 2K INITIAL CORE (MINIMUM)\r
+       $TRN                    // IGNORE ERROR RETURN\r
+       $MOVE   AC,     JBREL\r
+       $MOVEM  AC,     SL\r
+       $MOVEI  AC,     #400000\r
+       $MOVEM  AC,     FL\r
+       $MOVEM  P,      stackbase\r
+       $MOVE   PDL     stack\r
+       $SETO   AC,     0\r
+       $WAKE   AC,     0\r
+         $TRN\r
+       $MOVEI  AC,     1\r
+       $HIBER  AC,     0       //no wait protection\r
+         $TRN\r
+       $MOVEI  AC,     intloc\r
+       $HRRM   AC,     intblk\r
+       $MOVEI  AC,     intblk\r
+       $MOVEM  AC,     jbint\r
+       $PJOB   B,      0\r
+       $MOVEM  B,      jobno\r
+       $TRMNO. B,      0\r
+         $SETZ B,      0\r
+       $MOVEM  B,      ttyno\r
+       $MOVEI  AC,     #22\r
+       $MOVE   D,      trmpar\r
+       $(      if ESSEX\r
+               $[      $TRMOP. D,      0\r
+               $]\r
+       $)\r
+         $SETZ C,      0\r
+       $MOVEM  C,      micstatus\r
+       $SETZ   B,      0\r
+       $GETPPN AC,     0\r
+         $TRN\r
+       $MOVEM  AC,     ppn\r
+       $HRRZM  AC,     peen\r
+       $HLLM   AC,     hwmain\r
+       $CAME   AC,     hwmain\r
+       $CAMN   AC,     mainta\r
+         $SETO B,      0\r
+       $MOVEM  B,      maint\r
+       $(      if ESSEX guest_valof $[\r
+       $setob  1,      2\r
+       $trmno. 2,      0\r
+       $move   2,      tty6\r
+       $gtntn. 2,      0\r
+       $seto   2,      0\r
+       $hlrz   3,      2\r
+       $hrli   2,      0\r
+       $cain   3,      #3\r
+       $caige  2,      #21\r
+       $setz   1,      0\r
+       $] $)\r
+       $MOVE   AC,     jobno\r
+       $CTLJOB AC,     0\r
+         $SETO AC,     0\r
+       $MOVEM  AC,     ctlno\r
+       $MOVE   AC,     getarg1\r
+       $GETTAB AC,     0\r
+         $MOVE AC,     ppn\r
+       $MOVEM  AC,     hsppn\r
+       $MOVE   AC,     getarg2\r
+       $GETTAB AC,     0\r
+         $SETZ AC,     0\r
+       $MOVEM  AC,     hsname\r
+       $SETO   AC,     0\r
+       $MOVE   B,      ttyno\r
+       $DVURS. B,      0\r
+         $SETZ AC,     0\r
+       $MOVEM  AC,     privved\r
+       $MSTIME AC,     0\r
+       $MOVEM  1,      ranseed\r
+       $JSP    T,      @START\r
+       $SUBI   P,      2\r
+fn:    $EXIT   1,      0\r
+       $JRST           fn\r
+intloc: $PUSH  PDL,    retadr\r
+       $SETZM          retadr\r
+       $CLRBFI\r
+       $outstr         $az "ouch!*C*L"\r
+       $sosg           cccnt\r
+       $jrst           whoops\r
+conted:\r
+       $SKIPE          lockflg\r
+         $POPJ PDL,    0\r
+       $aos            pain\r
+       $SKIPN          quitflg\r
+         $POPJ PDL,    0\r
+       $SKIPL          quitflg\r
+         $JRST         startin\r
+       $JSP    T,      @quit\r
+       $SUBI   P,      2\r
+       $JRST           fn\r
+whoops:        $clrbfo\r
+       $outstr         $az"*C*LToo many ^C's for me - I'm off! CONT to continue.*C*L"\r
+       $exit   1,      0\r
+       $movem  1,      cccnt\r
+       $movei  1,      CCTRIP\r
+       $exch   1,      cccnt\r
+       $jrst           conted\r
+startin:$(     giveback()      $)\r
+ZERCAL: $JRST          ZERO\r
+arg:   $XWD    2,      B\r
+getarg1:$XWD   #777776,2\r
+getarg2:$XWD   #777776,3\r
+NUMBARGS:$EXP          numl1\r
+numl1: $MOVE   AC,     0(P)    // LINK ADDRESS\r
+       $MOVE   AC,     0(AC)   // ADDRESS OF INFO WORD\r
+       $LDB    AC,     SELCTR  // LOAD 12 BIT FIELD\r
+       $JRST   2,      1(T)    // RETURN PAST SUBI\r
+SELCTR: $EXP   0,      (SELECTOR 12:23:0) + (AC << 18)\r
+TTY:   $EXP            TTYSTR\r
+TTYSTR: $EXP           #030001                 // 3 WORD SCB\r
+       $EXP            TTYRD\r
+       $EXP            TTYWR\r
+       $EXP            TTYCL\r
+ttyrd: $ADDI   P,      @0(T)\r
+       $MOVEM  T,      0(P)\r
+       $INCHWL         AC\r
+       $MOVEM  AC,     @3(P)\r
+       $JRST           ttyret\r
+ttywr: $ADDI   P,      @0(T)\r
+       $MOVEM  T,      0(P)\r
+       $pjob   1,      0\r
+       $setz   2,      0\r
+       $trmno. 1,      0\r
+       $seto   2,      0\r
+       $skipn          2\r
+       $OUTCHR         3(P)\r
+       $MOVE   AC,     3(P)\r
+ttyret: $CAIG  AC,     '*P'\r
+       $CAIGE  AC,     '*L'\r
+         $TRNA\r
+       $SETZM          prompted\r
+       $CAIE   AC,     '*$'\r
+       $CAIN   AC,     '*E'\r
+         $SETZM        prompted\r
+       $CAIN   AC,     '*^G'\r
+         $SETZM        prompted\r
+       $(      return          $)\r
+TTYCL: $ADDI   P,      @0(T)\r
+       $MOVEM  T,      0(P)\r
+       $(      return          $)\r
+zero:  $SKPINC\r
+       $TRN\r
+       $OUTSTR $AZ "*C*L?MUDJTZ jump to zero"\r
+nogo:  $EXIT   1,      0\r
+       $SKPINC\r
+       $TRN\r
+       $OUTSTR $AZ "*C*L?MUDCCT can't continue"\r
+       $JRST           nogo\r
+$]\r
\r
diff --git a/MUDLIB.GET b/MUDLIB.GET
new file mode 100644 (file)
index 0000000..b4fc35d
--- /dev/null
@@ -0,0 +1,632 @@
+$nolist\r
\r
+/*\r
+Copyright (C) 1980 by\r
+Roy Trubshaw & Richard Bartle,\r
+Essex University, Colchester. CO4 3SQ.\r
\r
+       This software is furnished on the understanding that\r
+it may be used and or copied only with the inclusion of this\r
+notice.  No title or ownership of this software is hereby\r
+transferred. The information in this software is subject to\r
+change without notice. No responsibility is assumed for the\r
+use or reliability of this software.\r
+*/\r
\r
+external //Statics common to all\r
+$(     cmndbuf                 //buffer for current command\r
+       ctcflg                  //Fourth word of interrupt block.\r
+       hibflg                  //Hibernate flags.\r
+       quitflg                 //Set true if ^C gets u out.\r
+       rec                     //pointer to dmpbuf record\r
+       lastdr                  //Last door LOCKed.\r
+       ccnt                    //character count\r
+       savedp                  //saved a persona?\r
+       pain                    //number of unnecessary ^C's typed\r
+       hsppn                   //his ppn...\r
+       strtab                  //Table of random messages.\r
+       fight                   //Table of people u r fighting.\r
+       who.copy                //Who's in the room last.\r
+       lvmdoor                 //Address of message freelist door.\r
+       lvqdoor                 //Address of our queue door.\r
+       lvrdoor                 //Address of current room door.\r
+       lvqueue                 //Address of our queue entry.\r
+       lvcarry                 //Address of carrying freelist.\r
+       name                    //Our name 15 and 16 words of profile.\r
+       oldscore                //Old score..!\r
+       savescore               //Score at last save.!\r
+       profile                 //Our player profile so far.\r
+       player.no       :pno    //Our player number.\r
+       player.bit      :pbit   //The bit corresonding to player.no.\r
+       ppn                     //Players's ppn.\r
+       him                     //last male mentioned\r
+       her                     //last female mentioned\r
+       them                    //last player mentioned\r
+       there                   //Last room mentioned\r
+       me                      //my player name\r
+       roomput                 //SCB for .RM file\r
+       textput                 //SCB for .TM file\r
+       objput                  //SCB for .OM file\r
+       comput                  //SCB for .CM file\r
+       perput                  //SCB for .PM file\r
+       mapput                  //SCB for .MM file\r
+       laststream              //last SCB used\r
+       lastblock               //last block in the last stream\r
+       peen                    //RH of player's PPn\r
+       jobno                   //Player's job.\r
+       ttyno                   //Player's tty udx.\r
+       ctlno                   //Controlling job, if any.\r
+       cccnt                   //^C chuckout count\r
+       room                    //Current room.\r
+       oldroom                 //Last room we were alive in!\r
+       carry                   //The carry freelist.\r
+       verb                    //Last valid verb.\r
+       objct                   //Last valid object or player.\r
+       instrmnt                //Last valid intrument.\r
+       dmpbuf                  //dump mode buffer.\r
+       cbl                     //argument block for the above.\r
+       rep2            :pno    //player number for resetting\r
+       low1                    //quit if this or less free sys jobs\r
+       low2                    //let in if more than this free sys jobs\r
+       linebuffer              //Line buffer for read.line and getch\r
+       chcnt                   //Characters left.\r
+       nextch                  //L-Value of next character.\r
+       logstr                  //Non zero indicates logging enabled.\r
+       bstr                    //Bug stream.\r
+       level                   //The scores on the doors\r
+       snooping                //If not snooping then you're snooping...\r
+       snoopedon               //Who's snooping on you\r
+       snoopbuffer             //No. of characters in snoop buffer\r
+       scanch                  //The last character read.\r
+       scan.info               //The last word read.\r
+       name.string             //A string.\r
+       fake.string             //Space for another string.\r
+       mbuffer                 //Buffer for quote mode.\r
+       mainloop                //Contains the mainloop.\r
+       prompted                //Whether you've prompted.\r
+       somethingarrived        //Whether some creature just arrived\r
+       firstsnoop              //if this is the first snoop line or not\r
+       lineflg                 //True if typed a line.\r
+       fake                    //Fake node.\r
+       bcplrm                  //bcpl version of a 6bit room\r
+       lastdir                 //The last direction you went\r
+       autowho                 //auto-who seconds count (spectacularing)\r
+       autoint                 //how long to wait txixt autowho's\r
+       kept                    //kept object\r
+       events                  //events due to demons\r
+       leading                 //true if not following\r
+       pwcnt                   //no. of times you've said "password"\r
+       followers               //People following\r
+       frontman                //true if not assisted\r
+       joined                  //people joined to you\r
+       animal                  //animal you're following\r
+       snobj                   //object you're snooping on\r
+       brief                   //whether in brief mode or not...\r
+       lastmoments             //whether closing soon or not\r
+       verbname                //To make printing errors easier\r
+       objname                 //ditto\r
+       insname                 //ditto\r
+       fodsville               //was I just fodded?\r
+       pretend                 //Pretending not playing?\r
+       holdfirst               //A hack into the actions...\r
+       it                      //name of last thing mentioned\r
+       flipping                //flipping between characters\r
+       fodded                  //Whether you've fodded anyone yet\r
+       mins\r
+       hrs\r
+       days\r
+       res6                    //for no.-to-6bit result\r
+       at                      //reversed object and instrument\r
+       ps.word                 //user's persona password\r
+       conversing              //in conversation mode?\r
+       deaf                    //\\r
+       dumb                    // \\r
+       blind                   // / has this ailment afflicted me?\r
+       paralysed               ///\r
+       olog                    //save place for logstr\r
+       osnop                   //save place for snoopedon\r
+       savescr                 //your score when you last saved\r
+       justforced              //true if you've just been forced\r
+$)\r
\r
+external //Routines\r
+$(     encrypt\r
+       get.cmnd\r
+       load.block\r
+       searchrec                       //Does a certain persona exist?\r
+       visible\r
+       invisible\r
+       desc.short      :       dshort\r
+       luminous\r
+       swapobjins\r
+       announcechange\r
+       adjustdown      :       adown\r
+       get.rid.of\r
+       parse.command\r
+       execute.command\r
+       full.up\r
+       adjustup        :       aup\r
+       bashfull\r
+       break.off\r
+       dud\r
+       stopmoving\r
+       inform\r
+       killmonster\r
+       sb\r
+       assign\r
+       ATTACH\r
+       BUG\r
+       CHECKOUT\r
+       CH.SENDLEVEL\r
+       deassign\r
+       DESTROY\r
+       DETACH\r
+       DETCH\r
+       DISENABLE\r
+       DROP\r
+       DSCRIBE\r
+       EMPTY\r
+       ENABLE          :       enbl\r
+       ENABLED         :       enbld\r
+       EXORCISE\r
+       EXTRA\r
+       FLUSH\r
+       GETNUM\r
+       GETT\r
+       GETTRUE\r
+       HERE\r
+       INSERT\r
+       LOCKDOWN\r
+       LOCKUP\r
+       LOOKINSIDE\r
+       NEXTNUM\r
+       OBJMATCH\r
+       OPEN\r
+       PERSON\r
+       PLACE\r
+       PLAYING\r
+       PURGE\r
+       REMOVE\r
+       SAVE\r
+       SAYINSIDES\r
+       SAYROOM\r
+       SAYWHERE\r
+       SCANNER\r
+       SENDALL\r
+       SENDLEVEL\r
+       SETEXP\r
+       SETIT\r
+       SETPROP\r
+       SUSPEND\r
+       TIDY\r
+       TOTING          :       tot\r
+       TRANSMIT\r
+       UNFOLLOW\r
+       UNSNOOP\r
+       DROP.CLASS\r
+       DROP.DELAY\r
+       GET.ALL\r
+       GET.CLASS\r
+       HERE.CLASS\r
+       HERE.OR.TOTING  :       h.o.t\r
+       HERE.OR.TOTING.CLASS    :       h.o.tc\r
+       OBJECT\r
+       MOVE.SER\r
+       TAB12\r
+       TOTING.CLASS    :       totc\r
+       retaliated\r
+       player.level    :       plalev\r
+       drop.everything\r
+       setscore\r
+       check.stuff\r
+       infrm\r
+       holding\r
+       fightmess\r
+       plonk\r
+       occupied\r
+       reinstate\r
+       instate\r
+       start.leading\r
+       lose.followers\r
+       carrying.class  :       carrc\r
+       carrying        :       carr\r
+       is.or.was.here\r
+       longdescribe\r
+       max.obj\r
+       max.wt\r
+       broadcast\r
+       doownthing\r
+       lose.joiners\r
+       classmatch\r
+       stop.fighting\r
+       interact\r
+       wake.up\r
+       can.wake\r
+       new.stamina\r
+       error\r
+       private\r
+       public\r
+       moveobject\r
+       special\r
+       normalise\r
+       dormant\r
+       alive\r
+       check.gone      :       cgone\r
+       handledemons\r
+       swap\r
+       move\r
+       action\r
+       read.message\r
+       initialise              //Initialisation stuff.\r
+       send                    //from MUD rather than MUDLIB\r
+       hidden                  //ditto\r
+       us                      //hardwired maintainer names\r
+       newpersona              //set up a new persona\r
+       sexify                  //adjust str, dex and sta for sex\r
+       jar                     //a sort of lock\r
+       realwiz                 //verifies wiz's by looking in a file\r
+       rationalise             //put characteristics within right limits\r
+       unjar                   //a sort of unlock!\r
+       fake.node               //Needed in initialisation...\r
+       ud.time                 //Universal date-time\r
+       ctrap                   //control-c toggle\r
+       load.data               //Load data would you believe.\r
+       resetgame               //renames the .exe file\r
+       readusername    :rnm    //read the user name up to 9 chars.\r
+       createprofile   :cpr    //Create a user profile from file or new.\r
+       writeprofile    :wpr    //Write out a user profile.\r
+       setbit          :sbt    //Set player bit in current room.\r
+       unsetbit        :usb    //Unset bit in current room.\r
+       access                  //Can I play now?\r
+       boost                   //add 10 to my attributes\r
+       unboost                 //take 10 off my attributes!\r
+       seq                     //String equality.\r
+       random                  //Random numbers.\r
+       lock                    //Loack doors.\r
+       unlock                  //Unlock doors.\r
+       maint                   //Am I the maintainer?\r
+       checksnoop              //For when being snooped on\r
+       unlink                  //First off a list.\r
+       read.ch                 //Same as readch bit quit if control C.\r
+       hibernate               //Hibernate for a sec or until a line ready.\r
+       crechar                 //Create a characteristic.\r
+       deleterec       :delrec //Delete a persona from .pm file\r
+       saverec                 //Save a persona in .pm file\r
+       getmblock               //Get a message block.\r
+       freemblock              //Free a message block.\r
+       pushlist                //Push onto list.\r
+       forcetty                //Push string into input buffer of tty.\r
+       clearvec                //Clear a vector.\r
+       fixd                    //Same as FIX using machine code fix not luuos.\r
+       floatd                  //Ditto above but for FLOAT.\r
+       been.in                 //been in this room before or not?\r
+       locked                  //Whether game is wizard locked\r
+       outstr                  //Stick one of n messages randomly.\r
+       find.word       :fwrd   //Find a word in dictionary.\r
+       find.player     :fply   //Find a player.\r
+       find.room       :frm    //Find a room.\r
+       quit                    //Quit from t' game.\r
+       describe                //A room and contents.\r
+       copy                    //Move contents of vectors about.\r
+       read.line       :rline  //Read line.\r
+       getch                   //get next character.\r
+       linebreak               //True if character.\r
+       reset                   //Reset linebuffer stuff.\r
+       wait.for.input          //What it says.\r
+       inventory               //Take an inventory.\r
+       timeok                  //Now is an acceptable playing time\r
+$)\r
+/*\r
+       The following part of the GETfile is distilled from various BCPL\r
+       library get files. Only those procedures declared as external here\r
+       will be found in MUDLIB. Beware using standard library modules\r
+       with this file. If you want to use BCPLIB.REL then don't load\r
+       MUDLIB.\r
+*/\r
+MANIFEST\r
+$(     LH              =       BYTE 18:18\r
+       RH              =       BYTE 18:0\r
+       TIMECHK         =       10000   //give 4 seconds for MUD to load\r
+       WHOLEDAY        =       86400000        //Whole day in milliseconds\r
+       DELAY           =       120000  //before you get timed out\r
+       TOOLOW          =       4       //<= this no. of jobs left and you're chucked out\r
+       BITLOW          =       TOOLOW+2        //no. of jobs left before lets you in\r
+$)\r
\r
+EXTERNAL\r
+$(     start\r
+$)\r
\r
+EXTERNAL       "%"\r
+$(     newvec\r
+       free\r
+       freevec         :       free\r
+       outo\r
+       writeo          :       wro\r
+       outs\r
+       writes          :       wrs\r
+       writesecs       :       wrsx\r
+       outno\r
+       writeno         :       wrno\r
+       outoct          :       outo\r
+       writeoct        :       wro\r
+       out\r
+       write\r
+       outch\r
+       writech         :       wrch\r
+       inno\r
+       readno          :       rno\r
+       rdno\r
+       inch\r
+       readch          :       rch\r
+       rdch\r
+       close\r
+       tty\r
+       input\r
+       output\r
+       label\r
+       jump\r
+       numbargs\r
+       packstring\r
+       unpackstring\r
+       run\r
+       ccl\r
+       callnm\r
+       batch\r
+       daytime\r
+       udaytime\r
+       ran\r
+       ranseed\r
+       bufull\r
+       eof\r
+       errstatus\r
+       dofile\r
+       createtmp\r
+       enter\r
+       closefile       :       clsfl\r
+       rda\r
+       rdb\r
+       rddmp\r
+       wrb\r
+       wrdmp\r
+       ioerror         :       ioerr\r
+       sterr           :       strmr\r
+       storeerror\r
+       inuuo\r
+       useti\r
+       outz\r
+       writez          :       wrz\r
+       out6\r
+       write6          :       wr6\r
+       out8\r
+       write8          :       wr8\r
+       outdate\r
+       writedate       :       wrdat\r
+       outtime\r
+       writetime       :       wrtim\r
+       iowd\r
+       iomessage       :       iomsg\r
+       sixbit\r
+       echo\r
+       noecho\r
+       appendfile\r
+       words\r
+       lookup\r
+       lookup.enter    :       luent\r
+$)\r
\r
+EXTERNAL       "%%"\r
+$(     stackbase\r
+$)\r
\r
+EXTERNAL       "."\r
+$(     er\r
+       fn\r
+       sl\r
+       sy\r
+       bcpl.\r
+       fl\r
+       bcpl            :       ".bcpl"\r
+       zero\r
+$)\r
\r
+EXTERNAL       "."\r
+$(     //Job data area symbols\r
+       JBUUO;          JB41;           JBERR;          JBREL\r
+       JBBLT;          JBDDT;          JBCN6;          JBPFI\r
+       JBHRL;          JBSYM;          JBUSY;          JBSA\r
+       JBFF;           JBREN;          JBAPR;          JBCNI\r
+       JBTPC;          JBOPC;          JBCHN;          JBCOR\r
+       JBINT;          JBOPS;          JBCST;          JBVER\r
+       JBDA;           JBHSA;          JBH41;          JBHCR\r
+       JBHRN;          JBHVR;          JBHNM;          JBNSM\r
+       JBHDA\r
+$)\r
+//BCPL library error codes\r
\r
+MANIFEST\r
+$(     //subsystem codes\r
+       IO              =       #010000         //I/O system\r
+       ST              =       #020000         //free storage system\r
+       USER            =       #700000         //reserved for user\r
+       ERR.BIG         =       ST+4            //biggest system code\r
+       //I/O error codes\r
+       ERR.NOCHANNEL   =       IO+1\r
+       ERR.NODEV       =       IO+2\r
+       ERR.NOFILE      =       IO+3\r
+       ERR.RENAME      =       IO+4\r
+       ERR.STATUS      =       IO+5\r
+       ERR.EOF         =       IO+6\r
+       ERR.BADMODE     =       IO+7\r
+       ERR.DIRECTION   =       IO+8\r
+       ERR.FINDTMP     =       IO+9\r
+       ERR.CREATETMP   =       IO+10\r
+       ERR.REWIND      =       IO+11\r
+       ERR.REWFILE     =       IO+12\r
+       ERR.IO.BIG      =       IO+12\r
+       //Storage error codes\r
+       ERR.FREEBAD     =       ST+1\r
+       ERR.NEWVEC      =       ST+2\r
+       ERR.NEWFAIL     =       ST+3\r
+       ERR.NEWPAGE     =       ST+4\r
+       ERR.ST.BIG      =       ST+4\r
+$)\r
\r
+EXTERNAL       "%"\r
+$(     ERR             //Holds latest system error code (all systems)\r
+       SCB             //Holds stream on which latest I/O error occured\r
+$)\r
\r
+MANIFEST\r
+$(     AC              =       1\r
+       B               =       2\r
+       C               =       3\r
+       D               =       4\r
+       E               =       5\r
+       F               =       6\r
+       G               =       7\r
+       H               =       8\r
+       I               =       9\r
+       J               =       10\r
+       K               =       11\r
+       T               =       12\r
+       P               =       14\r
+       SCBREG          =       3\r
+       ONE             =       13\r
+       COVER           =       11\r
+       PDL             =       15\r
+$)\r
\r
+//Layout of a stream-control block\r
+MANIFEST\r
+$(\r
+SC.FLAGS=SELECTOR 36:0:0                       // FLAG WORD\r
+SC.MONITORSTREAM=SELECTOR 1:35:0               // B0 - SET IN A MONITOR STREAM\r
+SC.SIZE=SELECTOR 6:12:0                        // B18-23 SIZE OF THIS SCB\r
+SC.SCB=SELECTOR 1:0:0                          // B35 - ALWAYS SET IN AN SCB\r
+WSC.FLAGS=0                                    // FLAG WORD\r
+SC.READER=SELECTOR 36:0:1                      // READ ROUTINE FOR THIS STREAM\r
+WSC.READER=1\r
+SC.WRITER=SELECTOR 36:0:2                      // WRITE ROUTINE\r
+WSC.WRITER=2\r
+SC.CLOSER=SELECTOR 36:0:3                      // CLOSE ROUTINE\r
+WSC.CLOSER=3\r
+SC.ERROR=SELECTOR 36:0:4                       // ERROR PARAMETER\r
+WSC.ERROR=4\r
+SC.PUTSTACK=SELECTOR 18:18:5                   // STACK OF CHARACTERS PUT BACK INTO A READ STREAM\r
+SC.OLDREAD=SELECTOR 18:0:5                     // SAVED ORIGINAL READ ROUTINE ON PUTBACK'D STREAM\r
+WSC.PUTBACK=5\r
+SC.USER6=SELECTOR 36:0:6                       //Ought to use for helping not doing usetis unnecessarily\r
+WSC.USER6=6\r
+SC.USER7=SELECTOR 36:0:7\r
+WSC.USER7=7\r
+SC.USER10=SELECTOR 36:0:#10\r
+WSC.USER10=#10\r
+SC.STATUS=SELECTOR 36:0:#11                    //  MONITOR OPEN BLOCK\r
+WSC.STATUS=#11\r
+SC.DEV=SELECTOR 36:0:#12\r
+WSC.DEV=#12\r
+SC.OBUFHDR=SELECTOR 18:18:#13\r
+SC.IBUFHDR=SELECTOR 18:0:#13\r
+WSC.BUFHDR=#13\r
+SC.IBUF=SELECTOR 18:0:#14                      // INPUT BUFFER HEADER FOR MONITOR\r
+WSC.IBUF=#14\r
+SC.IBYTE=SELECTOR 36:0:#15\r
+SC.IWD=SELECTOR 18:0:#15\r
+WSC.IBYTE=#15\r
+SC.ICOUNT=SELECTOR 36:0:#16\r
+WSC.ICOUNT=#16\r
+// 17 - RESERVED\r
+// 20 - RESERVED\r
+// 21 - RESERVED\r
+SC.OBUF=SELECTOR 18:0:#22                      // OUTPUT BUFFER HEADER FOR MONITOR\r
+WSC.OBUF=#22\r
+SC.OBYTE=SELECTOR 36:0:#23\r
+SC.OWD=SELECTOR 18:0:#23\r
+WSC.OBYTE=#23\r
+SC.OCOUNT=SELECTOR 36:0:#24\r
+WSC.OCOUNT=#24\r
+// 25 - RESERVED\r
+// 26 - RESERVED\r
+// 27 - RESERVED\r
+SC.CHANNEL=SELECTOR 4:23:#30                   // CHANNEL WORD ( CHANNEL IN AC FIELD - REST 0 )\r
+WSC.CHANNEL=#30\r
+SC.IN=SELECTOR 36:0:#31                        // IN CHANNEL,0 ORDER\r
+WSC.IN=#31\r
+SC.OUT=SELECTOR 36:0:#32                       // OUT CHANNEL,0 ORDER\r
+WSC.OUT=#32\r
+SC.USETI=SELECTOR 36:0:#33                     // USETI CHANNEL,@3(#16)\r
+WSC.USETI=#33\r
+SC.USETO=SELECTOR 36:0:#34                     // USETO CHANNEL,@3(#16)\r
+WSC.USETO=#34\r
+SC.STATZ=SELECTOR 36:0:#35\r
+WSC.STATZ=#35\r
+SC.APPENDCL=SELECTOR 36:0:#36\r
+WSC.APPENDCL=#36\r
+SC.COUNT=SELECTOR 36:0:#37                     // LOOKUP BLOCK WORD COUNT\r
+WSC.COUNT=#37\r
+SC.PPN=SELECTOR 36:0:#40\r
+SC.PROJ=SELECTOR 18:18:#40\r
+SC.PROG=SELECTOR 18:0:#40\r
+WSC.PPN=#40\r
+SC.FILENAME=SELECTOR 36:0:#41                  // MONITOR LOOKUP/ENTER/RENAME BLOCK\r
+WSC.FILENAME=#41\r
+SC.MONERROR=SELECTOR 18:0:#42\r
+SC.EXT=SELECTOR 18:18:#42\r
+SC.HIDATE=SELECTOR 3:15:#42                    // HIGH ORDER 3 BITS OF CREATE DATE\r
+SC.ACCESSDATE=SELECTOR 15:0:#42\r
+WSC.EXTWORD=#42\r
+SC.PROTECTION=SELECTOR 9:27:#43\r
+SC.MODE=SELECTOR 4:23:#43\r
+SC.TIME=SELECTOR 11:12:#43\r
+SC.CREATEDATE=SELECTOR 12:0:#43\r
+WSC.TIMEDATE=#43\r
+SC.WORDS=SELECTOR 36:0:#44\r
+WSC.WORDS=#44\r
+SC.VMAJOR=SELECTOR 9:12:#45\r
+SC.VMINOR=SELECTOR 6:18:#45\r
+SC.VEDIT=SELECTOR 18:0:#45\r
+SC.VWHO=SELECTOR 3:33:#45\r
+SC.VERSION=SELECTOR 36:0:#45\r
+WSC.VERSION=#45\r
+SC.PATH=SELECTOR 36:0:#46\r
+WSC.PATH=#46           //PATH BLOCK IS 8 WORDS LONG\r
+SC.DEFAULT.SIZE=#55\r
+SC.TMPNAME=SELECTOR 36:0:#11                   // TMPCOR SCB ASSIGNMENTS\r
+WSC.TMPNAME=#11\r
+SC.TMPBYTEP=SELECTOR 36:0:#12\r
+SC.TMPWORD=SELECTOR 18:0:#12\r
+WSC.TMPBYTEP=#12\r
+SC.TMPLIMIT=SELECTOR 36:0:#13\r
+WSC.TMPLIMIT=#13\r
+SC.TMPCOR.SIZE=#14\r
+$)\r
\r
+EXTERNAL       "%"\r
+$(     SCBSIZE\r
+$)\r
\r
+//Bit definitions\r
+MANIFEST\r
+$(\r
+B0 =#400000000000;     B1 =#200000000000;      B2 =#100000000000\r
+B3 =#040000000000;     B4 =#020000000000;      B5 =#010000000000\r
+B6 =#004000000000;     B7 =#002000000000;      B8 =#001000000000\r
+B9 =#000400000000;     B10=#000200000000;      B11=#000100000000\r
+B12=#000040000000;     B13=#000020000000;      B14=#000010000000\r
+B15=#000004000000;     B16=#000002000000;      B17=#000001000000\r
+B18=#000000400000;     B19=#000000200000;      B20=#000000100000\r
+B21=#000000040000;     B22=#000000020000;      B23=#000000010000\r
+B24=#000000004000;     B25=#000000002000;      B26=#000000001000\r
+B27=#000000000400;     B28=#000000000200;      B29=#000000000100\r
+B30=#000000000040;     B31=#000000000020;      B32=#000000000010\r
+B33=#000000000004;     B34=#000000000002;      B35=#000000000001\r
+$)\r
\r
+EXTERNAL\r
+$(     DISC\r
+       MAINTA\r
+$)     //for MBOOTS to put stuff in...\r
\r
+$list\r
\r
diff --git a/MUDTXT.SUB b/MUDTXT.SUB
new file mode 100644 (file)
index 0000000..4292fc0
--- /dev/null
@@ -0,0 +1,18 @@
+MUDTXT.SUB\r
+VALLEY.TXT\r
+TXTCBT.GET\r
+TXTLEV.GET\r
+TXTHRS.GET\r
+TXTRMS.GET\r
+TXTMAP.GET\r
+TXTVOC.GET\r
+TXTCSY.GET\r
+TXTOBJ.GET\r
+TXTOSY.GET\r
+TXTMTN.GET\r
+TXTTOP.GET\r
+TXTBTM.GET\r
+TXTDAC.GET\r
+TXTDMN.GET\r
+TXTTXT.GET\r
+TALK.TXT\r
diff --git a/TXTBTM.GET b/TXTBTM.GET
new file mode 100644 (file)
index 0000000..4b06c27
--- /dev/null
@@ -0,0 +1,475 @@
+       visible none    none    ifinvis null    0       21\r
+       visible none    none    unlesswiz       null    19      0\r
+       visible .vis    none    none    null    null    23      0\r
+       rubbish none    none    unlesswiz       null    19      0\r
+       rubbish .ignore none    none    null    null    0       0\r
+       invisible       none    none    ifinvis null    1       20\r
+       invisible       none    none    unlesswiz       null    19      0\r
+       invisible       .invis  none    none    null    null    22      0\r
+       shelve  .shelve none    none    null    null    0       0\r
+       unshelve        .unshelve       none    none    null    null    0       0\r
+       mix     medication      liquid  destroyinc      second  573     0\r
+       mix     liquid  medication      incdestroy      second  573     0\r
+       climb   forest  none    null    null    381     0\r
+       invent  none    none    null    null    8       0\r
+       i       .inven  none    none    null    null    0       0\r
+       level   none    none    null    null    833     0\r
+       taste   none    none    null    null    869     0\r
+       wear    headdress       none    null    null    382     0\r
+       thanks  none    none    null    null    822     0\r
+       keywords        none    none    null    null    823     0\r
+       sorry   none    none    null    null    13      0\r
+       hammer  none    none    null    null    714     0\r
+       god     none    none    null    null    739     0\r
+       help    none    1       null    null    1       0\r
+       help    .assist none    none    null    null    0       0\r
+       h       none    none    null    null    1       0\r
+       refuse  .refuse none    none    null    null    0       0\r
+       command none    none    ifwiz   null    6       0\r
+       command none    none    null    null    5       0\r
+       explain none    none    null    null    2       0\r
+       xyzzy   none    none    null    null    9       0\r
+       hours   .hours  none    none    null    null    0       0\r
+       newhours        .newhours       none    none    null    null    0       0\r
+       go      .go     none    none    null    null    0       0\r
+       sget    .sget   none    none    ifwiz   null    0       0\r
+       sgo     .sgo    none    none    null    null    0       0\r
+       pi      none    none    null    null    654     0\r
+       pu      none    none    unlesswiz       null    486     0\r
+       pu      .remove anything        container       null    null    0       0\r
+       pu      .remove anything        flame   null    null    0       0\r
+       pu      .get    none    none    null    null    0       0\r
+       letgo   none    none    unlesswiz       null    486     0\r
+       letgo   .drop   none    none    null    null    0       0\r
+       swear   none    none    ifin    null    limbo   4\r
+       swear   none    none    iffighting      null    3       0\r
+       swear   none    none    dead    null    49      0\r
+       kiss    person  none    emotion null    50      328\r
+       stroke  familiar        none    ifprop  null    9       443\r
+       stroke  familiar        none    null    null    444     0\r
+       stroke  person  none    emotion null    25      552\r
+       wake    .wake   none    none    null    null    0       0\r
+       piss    none    none    ifin    null    limbo   4\r
+       piss    none    none    iffighting      null    3       0\r
+       piss    none    none    dead    null    49      0\r
+       rape    .blind  person  none    ifself  null    540     0\r
+       rape    familiar        none    testsex null    473     981\r
+       rape    none    none    ifin    null    limbo   4\r
+       rape    none    none    iffighting      null    3       0\r
+       rape    none    none    dead    null    49      0\r
+       masturbate      .blind  none    none    null    null    540     0\r
+       unlock  access  none    ifprop  null    0       185\r
+       unlock  access  none    ifprop  null    1       185\r
+       unlock  access  yale    set     null    1       186\r
+       unlock  access  none    ifhave  key     559     0       ;only works for one set of keys\r
+       unlock  access  none    null    null    184     0\r
+       lock    access  none    ifprop  null    2       189\r
+       lock    access  yale    set     null    2       188\r
+       lock    access  none    null    null    505     0\r
+       back    .back   none    none    null    null    0       0\r
+       light   torch   none    unlesswiz       null    588     0\r
+       light   torch   none    dec     null    131     4\r
+       fell    access  tool    destroydestroy  second  88      0\r
+       fell    access  none    null    null    90      0\r
+       feed    serpent none    null    null    976     0\r
+       feed    familiar        none    null    null    433     0\r
+       feed    none    none    null    null    778     0\r
+       dig     none    none    null    null    596     0\r
+       drink   none    water   null    null    862     0\r
+       drink   none    none    null    null    158     0\r
+       eat     victuals        none    ifprop  null    1       985\r
+       eat     victuals        none    destroy null    115     0\r
+       eat     none    none    null    null    873     0\r
+       kill    knob    none    null    null    45      0\r
+       kill    access  tool    destroydestroy  second  88      0\r
+       kill    access  none    null    null    90      0\r
+       kill    something       tool    hurt    null    20      0       -4\r
+       kill    .kill   serpent none    enable  null    1       970     -4\r
+       kill    .kill   none    none    null    null    0       0       -4\r
+       proof   .proof  none    none    null    null    0       0\r
+       move    .go     none    none    null    null    0       0\r
+       debug   .debug  none    none    null    null    0       0\r
+       demo    .demo   none    none    null    null    0       0\r
+       laugh   .laugh  none    none    null    null    0       0\r
+       freeze  none    none    unlesswiz       null    4       0\r
+       freeze  .freeze none    none    null    null    577     0\r
+       melt    none    none    unlesswiz       null    4       0\r
+       melt    .unfreeze       none    none    null    null    578     0\r
+       mobile  .mobile none    none    null    null    0       0\r
+       haste   .haste  none    none    null    null    0       0\r
+       stamina .stamina        none    none    null    null    0       0\r
+       att     .attach none    none    null    null    0       0\r
+       det     .detach none    none    null    null    0       0\r
+       humble  .humble none    none    null    null    0       0\r
+       tell    .tell   none    none    null    null    0       0\r
+       get     bowl    none    null    null    828     0\r
+       get     serpent none    null    null    971     0       -1\r
+       get     .get    none    none    null    null    0       0\r
+       say     .say    none    none    null    null    0       0\r
+       who     .who    none    none    null    null    0       0\r
+       awho    .autowho        none    none    null    null    0       0\r
+       qwho    .quickwho       none    none    null    null    0       0\r
+       set     .set    none    none    null    null    0       0\r
+       purge   .purge  none    none    null    null    0       0\r
+       save    .save   none    none    null    null    0       0\r
+       quit    .quit   none    none    null    null    0       0\r
+       q       none    none    null    null    1508    0\r
+       score   .score  none    none    null    null    0       0\r
+       bye     .bye    none    none    null    null    0       0\r
+       bug     .bug    none    none    null    null    0       0\r
+       log     .log    none    none    null    null    0       0\r
+       ctrap   .ctrap  none    none    null    null    0       0\r
+       follow  .follow none    none    null    null    0       0\r
+       lose    .lose   none    none    null    null    0       0\r
+       begone  .begone none    none    null    null    849     0\r
+       peace   none    none    unlesswiz       null    4       0\r
+       peace   .peace  none    none    null    null    979     0       979\r
+       spectacular     .spectacular    none    none    null    null    0       0\r
+       war     none    none    unlesswiz       null    4       0\r
+       war     .war    none    none    null    null    980     0       980\r
+       l       .look   none    none    null    null    0       0\r
+       map     .map    none    none    null    null    0       0\r
+       brief   .brief  none    none    null    null    0       0\r
+       verbose .verbose        none    none    null    null    0       0\r
+       p       .p      none    none    null    null    0       0\r
+       exits   .exits  none    none    null    null    0       0\r
+       pronouns        .pronouns       none    none    null    null    0       0\r
+       unsnoop .unsnoop        none    none    null    null    0       0\r
+       direct  .direct none    none    null    null    0       0\r
+       exorcise        .exorcise       none    none    null    null    0       0\r
+       open    access  none    ifprop  null    0       183\r
+       open    access  2       set     null    0       100\r
+       open    access  yale    set     null    0       100\r
+       open    access  none    ifprop  null    2       184\r
+       open    access  none    set     null    0       100\r
+       close   access  yale    set     null    2       188\r
+       close   access  none    ifprop  null    1       187\r
+       close   access  none    set     null    1       101\r
+       spells  none    none    null    null    7       0\r
+       flush   lavatory        none    iflevel null    2       831\r
+       flush   lavatory        none    exp     null    1       831\r
+       flush   none    none    flush   null    762     0\r
+       sleep   .sleep  none    none    unlessobjplayer null    171     0\r
+       sleep   .sleep  none    none    ifwiz   null    171     0\r
+       sleep   none    none    unlessrlevel    null    6       650     -50\r
+       sleep   .sleep  none    none    null    null    756     0\r
+       wish    .flush  none    none    ifdumb  null    1       26\r
+       wish    .flush  none    none    unlessplaying   null    10      882     -50\r
+       wish    .sleep  none    none    sendlevel       null    10      882\r
+       crash   .crash  none    none    null    null    0       0\r
+       change  .change none    none    ifwiz   null    0       0\r
+       change  none    none    ifsmall null    27      0\r
+       change  .flush  none    none    unlessrlevel    null    10      968     -50\r
+       change  .change none    none    null    null    756     0\r
+       enchant .enchant        none    none    flush   null    0       0\r
+       police  .police none    none    flush   null    0       0\r
+       unveil  .unveil none    none    null    null    0       0\r
+       resurrect       .resurrect      none    none    null    null    0       0\r
+       reset   none    none    unlesswiz       null    486     0\r
+       reset   .reset  none    none    null    null    889     0\r
+       keep    .keep   none    none    null    null    0       0\r
+       unkeep  .unkeep none    none    null    null    0       0\r
+       putin   .insert none    none    null    null    0       0\r
+       takeout .remove none    none    null    null    0       0\r
+       fod     .fod    none    none    null    null    0       0\r
+       sick    none    none    ifdisenable     null    1       834\r
+       sick    none    none    ifdisenable     null    3       871\r
+       sick    none    none    ifdisenable     null    16      871\r
+       sick    none    none    null    null    834     0\r
+       fix     .insert torch   container       unlessprop      null    0       0\r
+       fix     torch   container       destroydestroy  second  771     0\r
+       fix     .insert anything        flame   null    null    781     0\r
+       fix     .insert none    none    null    null    0       0\r
+       search  none    none    null    null    370     0\r
+       how     none    none    null    null    11      0\r
+       please  none    none    null    null    14      0\r
+       consume none    none    null    null    874     0\r
+       winter  none    none    ifwiz   null    958     0       -33\r
+       summer  none    none    ifwiz   null    974     0       -41\r
+       flee    none    none    ifberserk       null    814     0\r
+       flee    .flee   none    none    null    null    0       0\r
+       drop    .drop   none    none    null    null    0       0\r
+       locations       .rooms  none    none    null    null    0       0\r
+       summon  none    none    null    null    4       0\r
+       make    none    none    null    null    4       0\r
+       where   none    none    null    null    4       0\r
+       wizards none    none    iflevel null    10      504\r
+       berserk .berserk        none    none    null    null    0       0\r
+       weigh   .weigh  none    none    null    null    0       0\r
+       value   .value  none    none    null    null    0       0\r
+       converse        .converse       none    none    null    null    0       0\r
+       write   none    none    flush   null    888     0\r
+       read    forum   none    null    null    548     0\r
+       password        .password       none    none    null    null    0       0\r
+       retaliate       tool    none    retal   null    10      0\r
+       retaliate       none    none    iffighting      null    46      0\r
+       retaliate       none    none    null    null    47      0\r
+       when    .time   none    none    null    null    0       0\r
+       diagnose        .diagnose       none    none    ifwiz   null    0       0\r
+       deafen  person  none    ifdeaf  null    1       32\r
+       deafen  .deafen person  none    unlessrlevel    null    4       44\r
+       deafen  person  none    noifr   null    0       0\r
+       deafen  person  none    ssendemon       null    52      756     -56\r
+       deafen  none    none    null    null    24      0\r
+       blind   person  none    ifblind null    1       31\r
+       blind   .blind  person  none    unlessrlevel    null    4       41\r
+       blind   person  none    noifr   null    0       0\r
+       blind   person  none    ssendemon       null    53      756     -56\r
+       blind   none    none    null    null    24      0\r
+       paralyse        person  none    ifparalysed     null    1       30\r
+       paralyse        .paralyse       person  none    unlessrlevel    null    4       38\r
+       paralyse        person  none    noifr   null    0       0\r
+       paralyse        person  none    ssendemon       null    54      756     -56\r
+       paralyse        none    none    null    null    24      0\r
+       dumb    person  none    ifdumb  null    1       29\r
+       dumb    .dumb   person  none    unlessrlevel    null    4       35\r
+       dumb    person  none    noifr   null    0       0\r
+       dumb    person  none    ssendemon       null    55      756     -56\r
+       dumb    none    none    null    null    24      0\r
+       cure    person  none    unlessrlevel    null    8       755\r
+       cure    person  none    noifr   null    0       0\r
+       cure    person  none    ssendemon       null    57      756     -56\r
+       cure    none    none    null    null    24      0\r
+       examine none    none    null    null    245     0\r
+;;vocabulary action synonyms\r
+syn    info    explain\r
+       diag    diagnose\r
+       cripple paralyse\r
+       deaf    deafen\r
+       daytime when\r
+       da      when\r
+       persona purge\r
+       personas        purge\r
+       personae        purge\r
+       delete  purge\r
+       dump    save\r
+       levels  level\r
+       apologies       sorry\r
+       oops    sorry\r
+       apologise       sorry\r
+       ta      thanks\r
+       thank   thanks\r
+       attatch att\r
+       attach  att\r
+       assist  help\r
+       instruction     command\r
+       commands        command\r
+       instructions    command\r
+       information     explain\r
+       syntax  command\r
+       shut    close\r
+       raise   open\r
+       lower   close\r
+       lift    open\r
+       retreat back\r
+       logout  bye\r
+       plugh   xyzzy\r
+       ignite  light\r
+       burn    light\r
+       cremate light\r
+       extinguish      douse\r
+       quench  douse\r
+       chop    fell\r
+       cut     fell\r
+       flip    toss\r
+       roast   cook\r
+       bake    cook\r
+       thaw    melt\r
+       unfreeze        melt\r
+       ptrans  go\r
+       propel  drop\r
+       grasp   get\r
+       ingest  eat\r
+       expel   swear\r
+       mtrans  score\r
+       speak   tell\r
+       sen     tell\r
+       attend  l\r
+       mbuild  log\r
+       atrans  drop\r
+       vomit   sick\r
+       spew    sick\r
+       puke    sick\r
+       pronoun pronouns\r
+       pn      pronouns\r
+       pns     pronouns\r
+       ex      exorcise\r
+       inventory       i\r
+       hrs     hours\r
+       times   hours\r
+       k       kill\r
+       ki      kill\r
+       skin    kill\r
+       smash   kill\r
+       break   kill\r
+       upturn  kill\r
+       strangle        kill\r
+       tip     kill\r
+       empty   kill\r
+       swat    kill\r
+       press   kill\r
+       depress kill\r
+       push    kill\r
+       attack  kill\r
+       exterminate     kill\r
+       sacrifice       kill\r
+       slay    kill\r
+       flog    kill\r
+       hit     kill\r
+       fight   kill\r
+       strike  kill\r
+       frig    enchant\r
+       b       back\r
+       restore resurrect\r
+       res     resurrect\r
+       supercede       reset\r
+       chill   freeze\r
+       mobiles mobile\r
+       rest    sleep\r
+       nap     sleep\r
+       kip     sleep\r
+       doze    sleep\r
+       speed   haste\r
+       sp      haste\r
+       hasten  haste\r
+       directory       direct\r
+       dir     direct\r
+       force   make\r
+       chase   follow\r
+       pursue  follow\r
+       track   follow\r
+       unbrief brief\r
+       unverbose       verbose\r
+       banish  begone\r
+       chant   say\r
+       recite  say\r
+       snopp   snoop\r
+       unsnopp unsnoop\r
+       watch   snoop\r
+       nsnoop  unsnoop\r
+       unwatch unsnoop\r
+       unwatch unsnoop\r
+       observe snoop\r
+       dot     fod\r
+       bung    fix\r
+       insert  fix\r
+       hang    fix\r
+       put     fix\r
+       manipulate      fix\r
+       wizad   wizard\r
+       wicth   witch\r
+       wiard   wizard\r
+       wiazrd  wizard\r
+       wiz     wizard\r
+       wi      with\r
+       locs    locations\r
+       loc     locations\r
+       shit    piss\r
+       urinate piss\r
+       wee     piss\r
+       cunt    swear\r
+       arse    swear\r
+       anus    swear\r
+       fuck    rape\r
+       fucking swear\r
+       bugger  swear\r
+       bloody  swear\r
+       penis   swear\r
+       vagina  swear\r
+       prick   swear\r
+       fanny   swear\r
+       masterbate      masturbate\r
+       wank    masturbate\r
+       g       get\r
+       remove  get\r
+       steal   get\r
+       give    drop\r
+       tether  fix\r
+       sh      shout\r
+       bellow  shout\r
+       yell    shout\r
+       call    summon\r
+       goto    go\r
+       supergo sgo\r
+       superget        sget\r
+       sg      sget\r
+       slide   move\r
+       moveto  go\r
+       sc      score\r
+       experience      score\r
+       status  score\r
+       points  score\r
+       pts     score\r
+       diary   log\r
+       script  log\r
+       look    l\r
+       describe        l\r
+       desc    l\r
+       pour    drop\r
+       spill   drop\r
+       splash  drop\r
+       throw   drop\r
+       dr      drop\r
+       cast    drop\r
+       run     flee\r
+       f       flee\r
+       fl      flee\r
+       ask     tell\r
+       whisper tell\r
+       take    get\r
+       carry   get\r
+       catch   get\r
+       screw   rape\r
+       bang    rape\r
+       pause   quit\r
+       qq      quit\r
+       qu      quit\r
+       players who\r
+       autowho awho\r
+       aw      awho\r
+       quickwho        qwho\r
+       qw      qwho\r
+       wq      qwho\r
+       wa      awho\r
+       pretend p\r
+       whom    who\r
+       player  who\r
+       suggestion      bug\r
+       suggest bug\r
+       complaint       bug\r
+       complain        bug\r
+       question        bug\r
+       typo    bug\r
+       moan    bug\r
+       report  bug\r
+       idea    bug\r
+       query   bug\r
+       memo    bug\r
+       message tell\r
+       feature bug\r
+       devour  eat\r
+       pinch   steal\r
+       pickup  pu\r
+       lg      letgo\r
+       putdown letgo\r
+       pd      letgo\r
+       donate  drop\r
+       gi      drop\r
+       st      steal\r
+       fling   drop\r
+       pw      password\r
+       newpassword     password\r
+       witches wizards\r
+       sta     stamina\r
+       snog    kiss\r
+       ret     retaliate\r
+       pat     stroke\r
+       rub     stroke\r
+       hug     stroke\r
+       pet     stroke\r
+       cuddle  stroke\r
+       dep     visible\r
+       vis     visible\r
+       indep   invisible\r
+       invis   invisible\r
+       undemo  demo\r
diff --git a/TXTCBT.GET b/TXTCBT.GET
new file mode 100644 (file)
index 0000000..3f2e8af
--- /dev/null
@@ -0,0 +1,260 @@
+*combat        9                       ;1\r
+       sneering\r
+       looking\r
+       staring\r
+       snarling\r
+       glaring\r
+       coming\r
+       scowling\r
+       grimacing\r
+       rushing\r
+       12                      ;2\r
+       fiercely\r
+       ferociously\r
+       aggressively\r
+       ominously\r
+       purposefully\r
+       angrily\r
+       madly\r
+       hatefully\r
+       menacingly\r
+       threateningly\r
+       venomously\r
+       furiously\r
+       13                      ;3\r
+       strike home at\r
+       take aim at\r
+       hit\r
+       strike\r
+       beat\r
+       catch\r
+       smite\r
+       bash\r
+       thrash\r
+       wallop\r
+       strike at\r
+       hit out at\r
+       strike out at\r
+       16                      ;4\r
+       crushing\r
+       weighty\r
+       glancing\r
+       vicious\r
+       violent\r
+       hefty\r
+       mighty\r
+       powerful\r
+       tremendous\r
+       forceful\r
+       severe\r
+       furious\r
+       punishing\r
+       savage\r
+       fierce\r
+       stunning\r
+       13                      ;5\r
+       blow\r
+       blow\r
+       swing\r
+       thump\r
+       whack\r
+       punch\r
+       lunge\r
+       thrust\r
+       clout\r
+       slash\r
+       backhand\r
+       forehand\r
+       cross\r
+       10                      ;6\r
+       beat\r
+       evade\r
+       elude\r
+       dodge\r
+       side-step\r
+       avoid\r
+       duck\r
+       shrug off\r
+       take\r
+       parry\r
+       14                      ;7\r
+       terrible\r
+       clumsy\r
+       dreadful\r
+       weak\r
+       hasty\r
+       wild\r
+       limp\r
+       feeble\r
+       puny\r
+       tame\r
+       poor\r
+       bungled\r
+       pathetic\r
+       mis-timed\r
+       10                      ;8\r
+       affray\r
+       contest\r
+       battle\r
+       melee\r
+       engagement\r
+       action\r
+       tussle\r
+       carnage\r
+       slaughter\r
+       fight\r
+       2                       ;9\r
+       from\r
+       by\r
+       14                      ;10\r
+       easily matched by\r
+       way off\r
+       no problem for\r
+       a mile off\r
+       nowhere near\r
+       easily dodged by\r
+       avoided with ease by\r
+       parried effortlessly by\r
+       side-stepped by\r
+       a yard off\r
+       blocked by\r
+       too weak to hurt\r
+       too feeble to worry\r
+       hardly noticed by\r
+       13                      ;11\r
+       worried\r
+       grazed\r
+       stricken\r
+       stunned\r
+       dazed\r
+       jolted\r
+       hurt\r
+       numbed\r
+       wounded\r
+       troubled\r
+       bruised\r
+       jarred\r
+       winded\r
+       14                      ;12\r
+       power\r
+       energy\r
+       vigour\r
+       viciousness\r
+       speed\r
+       furiosity\r
+       savageness\r
+       fierceness\r
+       violence\r
+       weight\r
+       strength\r
+       might\r
+       force\r
+       momentum\r
+       2                       ;13\r
+       feel\r
+       sense\r
+       9                       ;14\r
+       strength\r
+       life-blood\r
+       energy\r
+       final breath\r
+       life force\r
+       last seconds\r
+       soul\r
+       final moments\r
+       time\r
+       6                       ;15\r
+       ebbing away\r
+       leaving you\r
+       departing\r
+       slipping away\r
+       draining away\r
+       slipping\r
+       7                       ;16\r
+       see\r
+       spot\r
+       notice\r
+       sense\r
+       perceive\r
+       discern\r
+       can see\r
+       13                      ;17\r
+       However\r
+       But\r
+       With renewed vigour\r
+       But courageously\r
+       Gritting your teeth\r
+       With a vast effort\r
+       Groggily\r
+       Summoning strength\r
+       Dazedly\r
+       Indomitably\r
+       Yet\r
+       Yet courageously\r
+       With tremendous willpower\r
+       8                       ;18\r
+       pull through\r
+       pull together\r
+       recover\r
+       compose\r
+       revitalise\r
+       carry on\r
+       bear up\r
+       concentrate\r
+       11                      ;19\r
+       charge back\r
+       launch yourself\r
+       stagger forward\r
+       wade\r
+       head back\r
+       hurl yourself\r
+       throw yourself\r
+       start\r
+       advance\r
+       press forward\r
+       hurtle\r
+       7                       ;20\r
+       retaliatory\r
+       retributive\r
+       counter\r
+       follow-up\r
+       follow-through\r
+       next\r
+       return\r
+       9                       ;21\r
+       sideways\r
+       reeling\r
+       staggering\r
+       flying\r
+       to the floor\r
+       sprawling\r
+       backwards\r
+       to the ground\r
+       spinning\r
+       5                       ;22\r
+       simply\r
+       easily\r
+       effortlessly\r
+       comfortably\r
+       narrowly\r
+       8                       ;23\r
+       absorbed\r
+       dodged\r
+       avoided\r
+       parried\r
+       ducked\r
+       side-stepped\r
+       shrugged off\r
+       taken\r
+       11                      ;24\r
+       took the life of\r
+       did away with\r
+       slayed\r
+       killed\r
+       was the end of\r
+       finished off\r
+       polished off\r
+       murdered\r
+       killed\r
+       was enough to kill\r
+       disposed of\r
diff --git a/TXTCSY.GET b/TXTCSY.GET
new file mode 100644 (file)
index 0000000..728d798
--- /dev/null
@@ -0,0 +1,8 @@
+syn    valuables       treasure\r
+       t       treasure\r
+       treas   treasure\r
+       presents        present\r
+       coins   money\r
+       torches torch\r
+       brands  torch\r
+       food    victuals\r
diff --git a/TXTDAC.GET b/TXTDAC.GET
new file mode 100644 (file)
index 0000000..c793f9a
--- /dev/null
@@ -0,0 +1,56 @@
+       $null   none    none    null    null    0       0\r
+       $flush  none    none    flush   null    0       0\r
+       $poison none    none    ifenabled       null    1       0\r
+       $poison none    none    ifenabled       null    3       0\r
+       $poison none    none    ifenabled       null    16      0\r
+       $poison none    none    null    null    765     0       -3\r
+       $poison1        none    none    null    null    907     0       -16\r
+       $poison2        none    none    dead    null    48      0\r
+       $provoke        none    none    ifasleep        null    1       0\r
+       $provoke        none    none    ifinvis null    1       0\r
+       $provoke        none    none    ifwiz   null    0       0\r
+       $provoke        .provoke        something       none    ifrstas null    0       0       -4\r
+       $cure   none    none    destroy medicine        0       0\r
+       $calm   none    none    sendeffect      rain    955     0       -28\r
+       $brewing        none    none    set     rain    1       0       -31\r
+       $brewing1       none    none    sendeffect      rain    956     0       -29\r
+       $pouring        none    none    set     rain    0       0       -32\r
+       $pouring1       none    none    sendeffect      rain    957     0       -30\r
+       $winter none    none    ifdisenable     null    28      0       -34\r
+       $winter none    none    ifdisenable     null    29      0       -34\r
+       $winter none    none    ifdisenable     null    30      0       -34\r
+       $winter none    none    ifdisenable     null    31      0       -34\r
+       $winter none    none    ifdisenable     null    32      0       -34\r
+       $summer none    none    ifdisenable     null    28      0       -42\r
+       $summer none    none    ifdisenable     null    29      0       -42\r
+       $summer none    none    ifdisenable     null    31      0       -42\r
+       $summer none    none    ifdisenable     null    32      0       -42\r
+       $summer none    none    ifdisenable     null    33      0       -42\r
+       $summer none    none    ifdisenable     null    34      0       -42\r
+       $summer none    none    ifdisenable     null    35      0       -42\r
+       $summer none    none    ifdisenable     null    36      0       -42\r
+       $summer none    none    ifdisenable     null    37      0       -42\r
+       $summer none    none    ifdisenable     null    38      0       -42\r
+       $summer none    none    ifdisenable     null    39      0       -42\r
+       $summer1        none    none    set     rain    0       0       -30\r
+       $snow   none    none    set     rain    2       0       -35\r
+       $snow1  none    none    sendeffect      rain    959     0       -36\r
+       $snow2  none    none    set     rain    0       0       -37\r
+       $snow3  none    none    sendeffect      rain    960     0       -38\r
+       $snow4  none    none    sendeffect      rain    955     0       -39\r
+       $snake  none    none    ifr     null    90      0\r
+       $snake  none    none    null    null    973     0       -1\r
+       $change .sleep  none    none    null    null    0       0\r
+       $dead   none    none    dead    null    0       0\r
+       $deaf   none    none    ifwiz   null    42      0\r
+       $deaf   .deafen none    none    null    null    43      0\r
+       $blind  none    none    ifwiz   null    39      0\r
+       $blind  .blind  none    none    null    null    40      0\r
+       $paralyse       none    none    ifwiz   null    36      0\r
+       $paralyse       .paralyse       none    none    null    null    37      0\r
+       $dumb   none    none    ifwiz   null    33      0\r
+       $dumb   .dumb   none    none    null    null    34      0\r
+       $cured  none    none    unlessill       null    0       0\r
+       $cured  .cure   none    none    null    null    28      0\r
+       $alter  none    none    stamina null    100     0       -58\r
+       $firework       none    none    sendeffect      rain    1502    1502\r
diff --git a/TXTDMN.GET b/TXTDMN.GET
new file mode 100644 (file)
index 0000000..b94c37c
--- /dev/null
@@ -0,0 +1,32 @@
+0      $null   none    none    -1\r
+1      $poison none    none    60\r
+3      $poison1        none    none    30\r
+4      $smash  none    none    -1      always\r
+6      $provoke        whichever       none    -1\r
+16     $poison2        none    none    30\r
+23     $cure   none    none    -1      always\r
+28     $brewing        none    none    15-30   global\r
+29     $pouring        none    none    300-600 global\r
+30     $calm   none    none    600-1500        global  enabled\r
+31     $brewing1       none    none    -1      global\r
+32     $pouring1       none    none    -1      global\r
+33     $winter none    none    -1      global\r
+34     $snow   none    none    -1      global\r
+35     $snow1  none    none    -1      global\r
+36     $snow2  none    none    300-1200        global\r
+37     $snow3  none    none    -1      global\r
+38     $snow4  none    none    300-1200        global\r
+39     $snow   none    none    15-30   global\r
+40     $snake  none    none    -1\r
+41     $summer none    none    -1      global\r
+42     $summer1        none    none    -1      global\r
+49     $dead   none    none    -1\r
+50     $change none    none    -1\r
+52     $deaf   none    none    -1\r
+53     $blind  none    none    -1\r
+54     $paralyse       none    none    -1\r
+55     $dumb   none    none    -1\r
+56     $flush  none    none    -1\r
+57     $cured  none    none    -1\r
+58     $alter  none    none    5\r
+59     $firework       none    none    5\r
diff --git a/TXTHRS.GET b/TXTHRS.GET
new file mode 100644 (file)
index 0000000..985366d
--- /dev/null
@@ -0,0 +1,24 @@
+*hours\r
+;0     0       24\r
+;1     0       24\r
+;2     0       24\r
+;3     0       24\r
+;4     0       24\r
+;5     0       24\r
+;6     0       24\r
+;0     0       10\r
+;0     16      24\r
+;1     0       7\r
+;2     1       7\r
+;3     1       7\r
+;4     1       7\r
+;5     1       7\r
+;6     1       10\r
+;6     16      24\r
+0      0       24\r
+1      0       7\r
+2      2       7\r
+3      2       7\r
+4      2       7\r
+5      2       7\r
+6      2       24\r
diff --git a/TXTLEV.GET b/TXTLEV.GET
new file mode 100644 (file)
index 0000000..d48b08e
--- /dev/null
@@ -0,0 +1,21 @@
+*levels\r
+male   novice\r
+       warrior\r
+       hero\r
+       champion\r
+       superhero\r
+       enchanter\r
+       sorcerer\r
+       necromancer\r
+       legend\r
+       wizard\r
+female novice\r
+       warrior\r
+       heroine\r
+       champion\r
+       superheroine\r
+       enchantress\r
+       sorceress\r
+       necromancess\r
+       legend\r
+       witch\r
diff --git a/TXTMAP.GET b/TXTMAP.GET
new file mode 100644 (file)
index 0000000..696247c
--- /dev/null
@@ -0,0 +1,15 @@
+*maps\r
+12\r
+0/\eM/          clear screen\r
+|/\19-%/         vertical line\r
+-/\19 ,/         horizontal line\r
+3/\19-'/         lower left corner\r
+4/\19 */         upper left corner\r
+5/\19 ./         upper right corner\r
+6/\19-#/         lower right corner\r
+7/\19-!/         cross between | and -\r
+8/\19#l/         symbol for a door\r
+[/\eO2/         dim on\r
+]/\eO0/         dim off\r
+</\19-'/         LH of right-justified tree\r
+>/\19("/         RH of right-justified tree\r
diff --git a/TXTMTN.GET b/TXTMTN.GET
new file mode 100644 (file)
index 0000000..7dbdf06
--- /dev/null
@@ -0,0 +1,88 @@
+conj   and\r
+fprep  with\r
+bprep  at\r
+quant  all\r
+pron   it\r
+mpron  him\r
+fpron  her\r
+ppron  them\r
+place  there\r
+self   me\r
+inst   whichever\r
+universal      shout\r
+noclass        none\r
+persn  person\r
+sthing something\r
+athing anything\r
+motion in\r
+       out\r
+       up\r
+       down\r
+       north\r
+       south\r
+       east\r
+       west\r
+       southeast\r
+       northwest\r
+       northeast\r
+       southwest\r
+       jump\r
+       $special\r
+       swamp\r
+       $unswamp\r
+syn    u       up\r
+       above   up\r
+       exit    out\r
+       away    out\r
+       upwards up\r
+       d       down\r
+       downwards       down\r
+       below   down\r
+       upward  up\r
+       ascend  up\r
+       descend down\r
+       downward        down\r
+       e       east\r
+       easterly        east\r
+       w       west\r
+       westerly        west\r
+       n       north\r
+       northerly       north\r
+       s       south\r
+       southerly       south\r
+       se      southeast\r
+       sw      southwest\r
+       ne      northeast\r
+       nw      northwest\r
+       inside  in\r
+       outside out\r
+       o       out\r
+       leap    jump\r
+       to      at\r
+       do      and\r
+       that    and\r
+       then    and\r
+       using   with\r
+       into    with\r
+       unto    and\r
+       from    with\r
+       on      with\r
+       onto    with\r
+       lot     all\r
+       everything      all\r
+       do      and\r
+       em      them\r
+       they    them\r
+       er      her\r
+       she     her\r
+       im      him\r
+       he      him\r
+noise  the\r
+       a\r
+       an\r
+       someone                 ;To prevent people from having this 'name'\r
+       bartle                  ;why should anyone have my surname?!\r
+       mallett                 ;he made me do it, guv!\r
+       is\r
+       again\r
+       repeat\r
diff --git a/TXTOBJ.GET b/TXTOBJ.GET
new file mode 100644 (file)
index 0000000..dac1896
--- /dev/null
@@ -0,0 +1,63 @@
+object sack    container       300     0\r
+       pin     tack    1       30\r
+       bouquet flowers 1000    16\r
+       bag     container       4000    0\r
+       button  knob    100000  0\r
+       water   h2o     100000  0\r
+       trees   forest  100000  0\r
+       coin    money   15      15\r
+       beads   decoration      100     13\r
+       coinval headstails      0       0\r
+       jewels  gems    50      100\r
+       starstone       gem     10      37\r
+       jet     gem     50      20\r
+       topaz   gem     30      50\r
+       bloodstone      gem     10      100\r
+       amethyst        gem     40      100\r
+       clasp   decoration      50      25\r
+       garnet  gem     500     38\r
+       banger  firework        40      70\r
+       rocket  missile 40      100\r
+       sparkler        spark   20      10\r
+       holly   present 20      10\r
+       xmastree        present 1000    50\r
+       mousse  present 250     15\r
+       mouse   present 400     15\r
+       candle  present 100     10\r
+       snowman present 1000    50\r
+       cracker present 100     10\r
+       carolbook       present 100     10\r
+       reindeer        present 1000    50\r
+       sleigh  present 1000    10\r
+       santaclaus      present 1000    50\r
+       mincepies       present 20      10\r
+       plumpudding     present 100     10\r
+       turkey  present 100     10\r
+       buckle  decoration      150     15\r
+       potion  liquid  0       25\r
+       sapphire        gem     10      100\r
+       doubloons       money   1000    30\r
+       pieces  money   800     32\r
+       groats  money   1000    18\r
+       firestone       stone   10      30\r
+       cat     familiar        6000    49\r
+       snake   serpent 5000    10\r
+       wall    space   100000  0\r
+       painting        decoration      4000    35\r
+       candlestick     decoration      2500    10\r
+       toilet  lavatory        0       0\r
+       river   stream  0       0\r
+       basin   bowl    0       0\r
+       diamond gem     30      235\r
+       medicine        medication      100     -100\r
+       key     yale    100     10\r
+       door    access  0       0        \r
+       crown   headdress       1500    900\r
+       rain    weather 0       0\r
+       axe     tool    7000    13\r
+       brand   torch   1000    0\r
+       fire    flame   0       0\r
+       off     toggles 0       0\r
+       curiosity       toggles 0       0\r
+       sesame  cliche  0       0\r
+       almanac forum   20000   0       ;heavy reading\r
diff --git a/TXTOSY.GET b/TXTOSY.GET
new file mode 100644 (file)
index 0000000..3b7fc80
--- /dev/null
@@ -0,0 +1,44 @@
+syn    snow    rain\r
+       ax      axe\r
+       union   key\r
+       lf      key\r
+       landf   key\r
+       poison  potion\r
+       fs      firestone\r
+       fstone  firestone\r
+       medecine        medicine        ;well I sometimes misspell, see...\r
+       medicines       medicine\r
+       viper   snake\r
+       adder   snake\r
+       bough   holly\r
+       pine    xmastree\r
+       father  santaclaus\r
+       stnicholas      santaclaus\r
+       rudolph reindeer\r
+       mince   mincepies\r
+       pies    mincepies\r
+       plum    plumpudding\r
+       pudding plumpudding\r
+       santa   santaclaus\r
+       claus   santaclaus\r
+       christmas       santaclaus\r
+       fatherchristmas santaclaus\r
+       sledge  sleigh\r
+       cs      candlestick\r
+       picture painting\r
+       bog     toilet\r
+       lavy    toilet\r
+       cistern toilet\r
+       lav     toilet\r
+       lavvy   toilet\r
+       thunderbox      toilet\r
+       you     off     \r
+       feline  cat\r
+       pussy   cat\r
+       puss    cat\r
+       moggy   cat\r
+       vial    potion\r
+       fence   wall\r
+       keys    key\r
+       stick   brand\r
+       panther cat\r
diff --git a/TXTRMS.GET b/TXTRMS.GET
new file mode 100644 (file)
index 0000000..5a05338
--- /dev/null
@@ -0,0 +1,22 @@
+home   hide\r
+       Wizards' room.\r
+       This is a room reserved exclusively for wizards. Its ornate oaken\r
+       panelling and antique furniture make it the perfect place for its\r
+       honoured users to relax in the style to which they are justly\r
+       entitled. To find exits type exits.\r
+store  hide    hideaway\r
+       Wizards' storeroom.\r
+       The immensity of this room is enough to fill any mortal with awe and\r
+       insignificance, but you are naturally unimpressed. This is the room\r
+       used by wizards as a store for things to be dumped at random out on\r
+       the poor unsuspecting adventurers to add a bit of spice to the game.\r
+limbo  light   hideaway        nolook  silent\r
+       Limbo.\r
+       Everything around you is a glowing white, and there are no walls you\r
+       can focus on. You feel as if you are floating on air. You are.\r
+xmasbx light   death   hide    hideaway        sanctuary\r
+       Christmas box.\r
+       This room is for the benefit only of those wizards and witches who\r
+       want to make Christmas a nice time of year. Use no other season, please!\r
+       The command to make it snow instead of rain is WINTER. Oh, and don't\r
+       forget the mistletoe and the ivy! Merry Christmas!\r
diff --git a/TXTTOP.GET b/TXTTOP.GET
new file mode 100644 (file)
index 0000000..3a4c356
--- /dev/null
@@ -0,0 +1,91 @@
+       swing   familiar        none    testsmall       null    792     793\r
+       write   forum   none    writein null    0       0\r
+       melt    something       torch   ifprop  null    1       308\r
+       light   container       flame   destroy null    771     0\r
+       light   torch   flame   dec     null    109     4\r
+       light   something       torch   unlessgot       second  391     0\r
+       light   something       torch   ifprop  second  1       307\r
+       light   container       torch   destroy null    771     0\r
+       light   firework        torch   expdestroy      null    17      0       16\r
+       light   firework        none    null    null    18      0\r
+       light   missile none    unlesshere      rain    1500    0\r
+       light   missile torch   expdestroy      null    1501    0       -59\r
+       light   missile none    null    null    18      0\r
+       light   spark   torch   dec     null    1503    1504\r
+       light   spark   none    null    null    18      0\r
+       light   torch   torch   ifprop  second  1       242\r
+       light   torch   torch   dec     null    131     4\r
+       light   torch   stone   null    null    67      0\r
+       stroke  torch   torch   null    null    132     4\r
+       douse   none    none    holdfirst       null    0       0\r
+       douse   flame   none    null    null    177     0\r
+       douse   torch   none    inc     null    110     4\r
+       douse   stone   none    null    null    68      0\r
+       douse   spark   none    null    null    1505    0\r
+       cook    familiar        none    null    null    640     0\r
+       cook    serpent none    null    null    975     0\r
+       fell    something       tool    unlesslevel     null    3       845\r
+       fell    none    forest  null    null    436     0\r
+       feed    familiar        none    ifprop  null    9       519\r
+       drink   liquid  medication      destroydestroy  second  575     0\r
+       drink   medication      liquid  destroydestroy  second  575     0\r
+       drink   liquid  none    ifprop  null    0       574     -1\r
+       drink   liquid  none    expdestroy      null    365     0\r
+       drink   .sleep  medication      none    ifdisenable     null    1       139     -23\r
+       drink   .sleep  medication      none    ifdisenable     null    3       914     -23\r
+       drink   .sleep  medication      none    ifdisenable     null    16      914     -23\r
+       drink   .sleep  medication      none    expset  null    1       139\r
+       eat     familiar        none    unlessprop      null    9       637\r
+       eat     familiar        none    expdestroy      null    638     0\r
+       eat     serpent none    null    null    969     0\r
+       kill    something       tool    unlesslevel     null    3       845\r
+       kill    person  tool    unlesslevel     null    3       845\r
+       kill    lavatory        none    null    null    830     0\r
+       kill    .empty  container       none    null    null    0       0\r
+       kill    person  tool    hurt    null    15      0       -4\r
+       kill    .kill   person  torch   ifprop  second  1       0       -4\r
+       kill    person  torch   hurt    null    5       0       -4\r
+       kill    familiar        none    ifinsis curiosity       560     0\r
+       kill    .kill   familiar        none    ifprop  null    10      488     -4\r
+       kill    familiar        none    inc     null    431     432     -4\r
+       drop    .insert torch   container       unlessprop      null    0       0\r
+       drop    torch   container       destroydestroy  second  771     0\r
+       drop    .insert anything        flame   null    null    781     0\r
+       drop    .insert anything        container       null    null    0       0\r
+       drop    .insert something       flame   null    null    781     0\r
+       drop    medication      liquid  destroyinc      second  573     0       ;don't need drop liquid medication\r
+       drop    something       lavatory        ifweighs        null    2001    826\r
+       drop    something       stream  ifweighs        null    2001    836\r
+       drop    tack    none    null    null    1506    0       1507\r
+       toss    money   none    ifrprop coinval 0       724\r
+       toss    money   none    null    null    725     0\r
+       summon  .summon none    none    ifwiz   null    0       0\r
+       summon  .summon none    none    ifrlevel        null    4       756\r
+       snoop   .snoop  none    none    ifwiz   null    0       0\r
+       l       none    none    ifblind null    1       25\r
+       l       flame   none    unlesswiz       null    0       782\r
+       make    .make   none    none    ifwiz   null    0       0\r
+       make    .flush  none    none    ifin    null    limbo   590\r
+       make    .make   none    none    ifrlevel        null    4       756\r
+       where   .where  none    none    iflevel null    9       0       ;let legends where anyway\r
+       where   .where  none    none    ifrlevel        null    6       756\r
+       fix     none    none    holdfirst       null    0       0\r
+       fix     something       lavatory        ifweighs        null    2001    826\r
+       fix     something       stream  ifweighs        null    2001    836\r
+       piss    none    none    ifobjis off     846     0\r
+       rape    none    none    ifobjis off     846     0\r
+       open    none    none    ifobjis sesame  344     0\r
+       open    container       none    unlessobjis     bag     809     0\r
+       open    container       none    dec     null    811     810\r
+       close   container       none    unlessobjis     bag     809     0\r
+       close   container       none    inc     null    812     813\r
+       quit    .quit   none    none    ifwiz   null    0       0\r
+       quit    none    none    ifin    null    limbo   696\r
+       bye     none    none    ifin    null    limbo   696\r
+       piss    none    lavatory        null    null    829     0\r
+       get     .get    anything        person  null    null    0       0\r
+       get     anything        container       ifprop  null    1       816\r
+       get     .remove anything        container       unlessobjis     cat     0       0\r
+       get     .remove anything        container       unlessinsis     bag     0       0\r
+       get     .remove anything        container       null    null    764     0\r
+       get     anything        flame   null    null    780     0\r
diff --git a/TXTTXT.GET b/TXTTXT.GET
new file mode 100644 (file)
index 0000000..599b408
--- /dev/null
@@ -0,0 +1,285 @@
+1      ?\r
+2      ?\r
+3      Not during a fight!\r
+4      Nothing happens.\r
+5      ?\r
+6      ?\r
+7      ?\r
+8      Don't be silly, it takes years to invent something REALLY useful.\r
+9      That's a very adventurous thing to say. Some people will try anything if\r
+       they're especially desperate...\r
+11     Work it out yourself, where's the fun in asking me if you get stuck?\r
+12     I'm afraid nothing happens. Well now what are you going to do?\r
+13     Oh that's quite all right, no need to apologise.\r
+14     It's very polite of you to say please, but I can't help. Well, I\r
+       won't...\r
+16     *You hear a sudden\r
+       BBBBBB   AAAAA  NN   NN  GGGGG\r
+       BBBBBBB AAAAAAA NNN  NN GGGGGGG\r
+       BB   BB AA   AA NNN  NN GG   GG\r
+       BB   BB AA   AA NNNN NN GG\r
+       BBBBBB  AAAAAAA NNNN NN GG GGGG\r
+       BBBBBBB AAAAAAA NN NNNN GG GGGG\r
+       BB   BB AA   AA NN NNNN GG   GG\r
+       BB   BB AA   AA NN  NNN GG   GG\r
+       BBBBBBB AA   AA NN  NNN GGGGGGG\r
+       BBBBBB  AA   AA NN   NN  GGGGG\r
+       in the distance.\r
+17     *BBBBBB   BBBBB  NN   NN  GGGGG\r
+       BBBBBBB AAAAAAA NNN  NN GGGGGGG\r
+       BB   BB AA   AA NNN  NN GG   GG\r
+       BB   BB AA   AA NNNN NN GG\r
+       BBBBBB  AAAAAAA NNNN NN GG GGGG\r
+       BBBBBBB AAAAAAA NN NNNN GG GGGG\r
+       BB   BB AA   AA NN NNNN GG   GG\r
+       BB   BB AA   AA NN  NNN GG   GG\r
+       BBBBBBB AA   AA NN  NNN GGGGGGG\r
+       BBBBBB  AA   AA NN   NN  GGGGG\r
+18     Light it from a lit torch, you want to burn yourself or something?!\r
+       Remember the firework code...\r
+19     You can't do that, you're not a high enough level.\r
+20     You're already invisible!\r
+21     You're already visible!\r
+22     You've just become invisible!\r
+23     You've just become visible!\r
+24     That spell only works on people, I'm afraid.\r
+25     You can't look, you're blind, aren't you?\r
+26     You NEED to wish when you're dumb, like you are! The only thing is, you\r
+       can't speak the words...\r
+27     You can't make the necessary hand movements to execute the spell\r
+       in such a small room as this.\r
+28     You are cured of all your disablements!\r
+29     The spell won't work if you're dumb yourself.\r
+30     The spell won't work if you're crippled yourself.\r
+31     The spell won't work if you're blind yourself.\r
+32     The spell won't work if you're deaf yourself.\r
+33     If you weren't a wiz you'd have just been struck dumb!\r
+34     You have been struck dumb magically!\r
+35     The spell doesn't work, and you are struck dumb yourself!\r
+36     If you weren't a wiz you'd have just been crippled!\r
+37     You have been crippled magically!\r
+38     The spell doesn't work, and you are crippled yourself!\r
+39     If you weren't a wiz you'd have just gone blind!\r
+40     You have gone blind magically!\r
+41     The spell doesn't work, and you go blind yourself!\r
+42     If you weren't a wiz you'd have just gone deaf!\r
+43     You have gone deaf magically!\r
+44     The spell doesn't work, and you go deaf yourself!\r
+45     There's not enough in the swamp for me to oblige.\r
+46     You need to retaliate with a weapon.\r
+47     You're not fighting anyone to retaliate against!\r
+48     There is a sudden burning sensation in your chest, which grows\r
+       sharply in intensity and spreads to your throat. Coughing and\r
+       choking, you fall to your knees as it worsens, and you feel wracking\r
+       pains all through your body. Your eyesight grows blurred, and you\r
+       start to froth at the mouth. At once, your eyes roll upwards, your\r
+       tongue flops out, and you keel over backwards, dead...\r
+49     In an attempt to keep the game uncorrupted, you have been killed.\r
+67     This firestone GLOWS! You can't light other stuff from it!\r
+68     The firestone glows, and you can't stop it...\r
+88     You swing your mighty axe, and the next moment the portal is but\r
+       matchwood, and the doorway passable. Your axe breaks too, however,\r
+       due to the force of the chop. Delinquent vandal, I don't know...\r
+90     Use an axe if you want to break down a door. You don't expect them\r
+       to be made out of balsa, do you?\r
+100    The door creaks slowly open.\r
+101    The door swings shut.\r
+109    Your brand is now lit.\r
+110    Your brand is now doused.\r
+115    Ok, hope you're hungry!\r
+131    The stick is now alight.\r
+132    Nice try, but the sticks here are too thick for an old boy-scout\r
+       trick like that...\r
+139    Ugh! It is foul! Hastily you stop drinking, but too late. Everything\r
+       swims about you and you feel giddy. You fall unconcious to the floor.\r
+158    Drinking stuff in this land rarely has any effect. Now is no exception.\r
+171    ZZZzzz...\r
+177    This is a MAGIC fire so you can't extinguish it! How do you think it\r
+       keeps burning all the time?\r
+183    The door is already open.\r
+184    The door is locked shut, and needs keys to open it.\r
+185    The door is already unlocked.\r
+186    The key grates in the lock and unlocks the door.\r
+187    The door is already closed.\r
+188    The key grates in the lock and locks the door shut.\r
+189    The door is already locked.\r
+242    You have to be holding something alight to ignite something.\r
+245    You can examine 'til your heart's content, you won't find anything\r
+       special. Heavens, if I let folk examine things they'd spend the whole\r
+       game doing it!\r
+307    The torch isn't lit so you can't light anything from it...\r
+308    The torch isn't lit so you can't melt anything with it...\r
+328    You give them a great big sloppy kiss.\r
+344    Think of something else sesaME...\r
+365    You take a great draught, and a power swells through your body. The\r
+       liquid has a taste quite unlike any you have tasted before, and you\r
+       feel fully invigorated. Then, quite by surprise, the empty bottle\r
+       vanishes!\r
+370    You don't find anything.\r
+381    Far too difficult, I'm afraid, there are too many branches about. You\r
+       have to give up.\r
+382    And very regal you look too! Shame you don't get any points for it,\r
+       though..!\r
+391    You have to be carrying a lit brand if you want to light anything.\r
+431    The cat tries to get out of your way but you graunch its head in.\r
+432    It's dead for heaven's sake! They only have nine lives you know...\r
+433    The cat isn't hungry. It's been living off enchanted sugar mice for\r
+       the past hundred and fifty years...\r
+436    This is an enchanted forest. Hence, virtually every tree resists your\r
+       chops as if you'd been using an axe of wet paper. There might be a few\r
+       which you CAN chop down though, if you can find them...\r
+443    Your hand gets cacked up with red goo from the cat's corpse...\r
+444    The cat mioaws.\r
+473    Oh my god, that's disgusting! I can't let you do that in THIS Land!\r
+486    What?\r
+488    The usually complacent cat suddenly becomes a spitting, biting,\r
+       clawing killer!\r
+504    ?\r
+505    If you want to lock it, try using a key.\r
+519    How the hell do you expect a dead cat to eat anything?!\r
+540    You know what happens to people who do that, don't you..?\r
+548    I already told you what it said!\r
+552    You give them an enormous big hug!\r
+558    Light it with what? If you want to burn it with a torch, say so!\r
+559    Unlock the door with what? If you want to unlock the door with keys,\r
+       why not say so? Just to please me?\r
+560    Mere curiosity won't kill THIS cat, I'm afraid!\r
+573    The clear, coloured liquid becomes cloudy when the medicine is added. Soon\r
+       you have added all the medicine and the container disintigrates. You\r
+       are now left with the potion only. Is it safe to drink..?\r
+574    You take a gulp, but nothing seems to happen. The level of liquid in the\r
+       vial doesn't seem to lower.\r
+575    You drink them both, and nothing happens. Maybe you should have mixed\r
+       them first?\r
+577    OK, the mobiles are immobile.\r
+578    The mobiles are mobile.\r
+588    With what do you want to light the torch? Say things in full,\r
+       bedlamite!\r
+590    The force isn't with you...\r
+596    You can't dig here; wait until some tunnel or something collapses if\r
+       you REALLY want to get your hands dirty.\r
+637    It's still alive! Kill it first, you moron - don't you know\r
+       ANYTHING about eating cats?\r
+638    MMmm, yum-yum! That tasted good!\r
+640    One doesn't cook cats, one eats them raw. I thought EVERYONE knew\r
+       that...\r
+650    Your spell doesn't work, but the power of the magic involved makes you\r
+       fall asleep yourself instead!\r
+654    3.14159, or thereabouts.\r
+696    Limbo is nowhere, so there is nowhere to go when you leave the game.\r
+714    Hammering things may be fun, but apart from that there's no effect.\r
+724    It comes up heads.\r
+725    It comes up tails.\r
+739    Yes?\r
+755    Your spell doesn't work.\r
+756    Your spell worked!\r
+762    OK, I've flushed out the last object you typed and all your pronouns.\r
+764    That's let the cat out of the bag!\r
+765    You start feeling queasy all of a sudden...\r
+771    The flame catches hold, and burns the container to ashes, along\r
+       with everything inside it, at quite some considerable speed (magic?).\r
+       Well that was clever, wasn't it?\r
+778    The syntax is FEED <creature> WITH <food> .\r
+780    You reach into the fire but its magical flames are too hot, and you\r
+       are forced to withdraw hastily before you are burned!\r
+781    The magical flame consumes anything put in it.\r
+782    The flames flicker around, and you can't see anything in them.\r
+792    There's not enough room to swing a cat here.\r
+793    There's enough room, and the cat swings quite well.\r
+809    It doesn't make much difference with the sack, opened or closed.\r
+       Nothing will fall out anyway, and it's airtight.\r
+810    It's already open, why don't you read the description?\r
+811    The bag creaks open slowly.\r
+812    The bag is now closed.\r
+813    It's already closed.\r
+814    Not when you're berserk!\r
+816    The bag is closed.\r
+823    Yale, union, lf.\r
+826    There's not enough room down the toilet.\r
+828    The basin is fixed down so you can't get it.\r
+829    Better to be safe than sorry!\r
+830    Not that old, "smash the cistern" joke again...\r
+831    The toilet flushes.\r
+833    *Levels of experience in MUD & VALLEY:\r
+       Level   Points          Male            Female\r
+       1       0               Novice          Novice\r
+       2       400             Warrior         Warrior\r
+       3       800             Hero            Heroine\r
+       4       1600            Champion        Champion\r
+       5       3200            Superhero       Superheroine\r
+       6       6400            Enchanter       Enchantress\r
+       7       12800           Sorcerer        Sorceress\r
+       8       25600           Necromancer     Necromancess\r
+       9       51200           Legend          Legend\r
+       10      102400          Wizard          Witch\r
+834    I suppose you must have a reason for being sick, but there's no\r
+       advantage in it. Still, it'd be a dull world if we were all the same,\r
+       eh?\r
+836    You put it in, but it's too heavy to be carried off by the current so\r
+       you take it out again.\r
+845    You have to be a hero or heroine before you are experienced enough to\r
+       wield an axe.\r
+846    You can guarantee that some bright spark is going to type that just to\r
+       show how clever it is to swear at a dumb program.\r
+849    Don't forget it's wizard locked...\r
+862    That was refreshing!\r
+871    A second or so later, as you wipe the vomit from your chin, you feel\r
+       much better.\r
+873    You can't eat that!\r
+874    By 'consume' I don't know whether you mean eat or drink. Since people\r
+       try some weird things in The Land, I'd appreciate your saying which\r
+       you meant to do explicitly, please.\r
+879    I'm afraid you don't seem to be able to at the moment!\r
+882    Your spell works, but the power of the magic you have invoked causes you\r
+       to fall into a deep slumber...\r
+888    You have to say what it is you're writing in, followed by a comma, then\r
+       the message you wish to write.\r
+889    OK, you're in a superseded version now.\r
+907    Your stomach turns over and you feel quite giddy. You are feeling\r
+       very unwell, in fact.\r
+914    You feel much better for the medicine, but it makes you feel EVER so\r
+       tired...>YAWN<...\r
+955    Clouds are beginning to gather in the sky.\r
+956    It has started to rain.\r
+957    The skies clear, and it stops raining.\r
+958    OK, it's winter...\r
+959    It has started to snow.\r
+960    The skies clear, and it stops snowing.\r
+968    Your spell doesn't work. All of a sudden, you feel drowsy...ZZZ...zzz...\r
+969    If you want to eat it you'll have to pick it up first.\r
+970    The snake bites its fangs into your leg! You feel the poison flood\r
+       through your body...\r
+971    As you reach to pick it up, the viper sinks its fangs into your arm!\r
+       You withdraw it, sucking at the wound, but it seems too late to stop\r
+       the poison infusion taking effect...\r
+974    It's summer!\r
+975    Cooked snake? Pick it up first then...\r
+976    It ignores you. It's a full adder...\r
+973    The viper suddenly bites deep into your foot with its fangs! You\r
+       manage to shake it off, but the poison is now in your blood...\r
+979    Fighting is forbidden.\r
+980    Fighting is allowed.\r
+981    The cat is male, and it'll be buggered if it'll let you do THAT!\r
+982    Well you chopped it up. Fun, eh?\r
+1500   You're not in a clear enough space to let off a rocket, pick somewhere\r
+       out in the open more.\r
+1501   It skeets up into the sky, leaving a blood-red trail behind it. You\r
+       watch, breathless...\r
+1502   *High up in the sky you see an enormous red\r
+       ~~~~~~~ ~~       ~~~~~   ~~~~~  ~~   ~~\r
+       ~~~~~~~ ~~      ~~~~~~~ ~~~~~~~ ~~   ~~\r
+       ~~      ~~      ~~   ~~ ~~   ~~ ~~   ~~\r
+       ~~      ~~      ~~   ~~ ~~      ~~   ~~\r
+       ~~~~    ~~      ~~~~~~~ ~~~~~~  ~~~~~~~\r
+       ~~~~    ~~      ~~~~~~~  ~~~~~~ ~~~~~~~\r
+       ~~      ~~      ~~   ~~      ~~ ~~   ~~\r
+       ~~      ~~      ~~   ~~ ~~   ~~ ~~   ~~\r
+       ~~      ~~~~~~~ ~~   ~~ ~~~~~~~ ~~   ~~\r
+       ~~      ~~~~~~~ ~~   ~~  ~~~~~  ~~   ~~.\r
+1503   Your sparkler starts to sparkle!\r
+1504   It's already lit! It's sparkling away quite happily!\r
+1505   It's a magic sparkler, it won't go out...\r
+1506   You hear a pin drop.\r
+1507   In the distance you hear a pin drop.\r
+1508   Type QUIT to quit, some dozy people keep hitting Q by accident.\r
+1509   >>>>>SPARE<<<<<\r
diff --git a/TXTVOC.GET b/TXTVOC.GET
new file mode 100644 (file)
index 0000000..d7c918b
--- /dev/null
@@ -0,0 +1,37 @@
+*vocabulary\r
+class  treasure\r
+       gem\r
+       gems\r
+       tack\r
+       h2o\r
+       headstails\r
+       flowers\r
+       lavatory\r
+       stream\r
+       decoration\r
+       headdress\r
+       serpent\r
+       bowl\r
+       liquid\r
+       container\r
+       present\r
+       money\r
+       stone\r
+       space\r
+       medication\r
+       torch\r
+       forest\r
+       victuals\r
+       weather\r
+       access\r
+       yale\r
+       tool\r
+       flame\r
+       familiar\r
+       toggles\r
+       cliche\r
+       forum\r
+       firework\r
+       missile\r
+       spark\r
+       knob\r
diff --git a/VALLEY.TXT b/VALLEY.TXT
new file mode 100644 (file)
index 0000000..f1353fa
--- /dev/null
@@ -0,0 +1,1715 @@
+;Copyright (C) 1983 by\r
+;Richard Bartle & Roy Trubshaw,\r
+;Essex University, Colchester. CO4 3SQ.\r
+;\r
+;      This software is furnished on the understanding that\r
+;it may be used and or copied only with the inclusion of this\r
+;notice.  No title or ownership of this software is hereby\r
+;transferred. The information in this software is subject to\r
+;change without notice. No responsibility is assumed for the\r
+;use or reliability of this software.\r
+*name valley\r
+*persona       mud\r
+@txtcbt\r
+@txtlev\r
+@txthrs\r
+*rooms 96\r
+;Apart from rooms in the .GET file, this and the travel table are in\r
+;alphabetical order. Keep it that way or you'll be sorry...\r
+@txtrms\r
+bank1  light\r
+       Bank of river.\r
+       You are stood on the grassy, west bank of a fast-flowing river. The\r
+       river flows from the north to the south, where can be seen a ford\r
+       across it. To the west you can see a tumble-down stable, and in the\r
+       distance north of that, mountains. On the opposite bank of the river\r
+       is dense forest.\r
+bank2  light\r
+       %bank1\r
+       This is the west bank of a river, which flows north to south very\r
+       quickly. The opposite bank is forested, but here the ground is clear.\r
+       To the northwest rise the steep slopes of a tall mountain, its peak\r
+       towering high above the clouds.\r
+bank3  light\r
+       %bank1\r
+       This is a narrow strip of land wedged between a fast-flowing river to\r
+       the east, and a (climbable) mountain to the west. The river cuts its\r
+       way north-south, and makes quite some noise. You can't see much of what\r
+       the landscape on the opposite bank is like for the trees there.\r
+bank4  light\r
+       %bank1\r
+       You find yourself on the bank of a fast-flowing river, where the\r
+       heath to the west is parted from the forest on the opposite bank. The\r
+       river flows from the north, and continues to the south, cutting off a\r
+       narrow strip of land trapped between it and the steep mountain you spy\r
+       to the southwest.\r
+bank5  light\r
+       %bank1\r
+       Flowing from the northeast and curving viciously to the south is a\r
+       fast-flowing river, upon the banks of which you now find yourself\r
+       situated. On the opposite bank are trees, although the river is too\r
+       quick to enable your swimming across. To the north is a curious, ornate\r
+       wall, decorated in exotic, colourful designs of seemingly eastern\r
+       origin. The wall is too tall to climb, as is the enormous hedge you find\r
+       to the west, over the top of which you can just see what looks to be a\r
+       belfry. The hedge stops on the edge of some trees, which are clumped\r
+       together to the southwest.\r
+belfry small\r
+       Inside belfry.\r
+       You find yourself at the bottom of a belfry stood in a forest clearing.\r
+       Outside, to the east the way is blocked by a huge hedge, and to the\r
+       north is an ornate wall, decorated in colourful, oriental friezes.\r
+       Elsewhere is more forest. The tower of the belfry rises high above\r
+       you, but you can't climb the walls.\r
+briar  light\r
+       Briar patch.\r
+       You are gingerly pushing your way through a prickly briar patch,\r
+       skillfully avoiding being scratched from the many thorns about. To\r
+       the north runs an east-west road, and to the east is a yard outside\r
+       an old inn. South lies pasture, beyond which is a river, and west are\r
+       the foothills of a majestic mountain, spearing its way through the\r
+       fluffy clouds.\r
+bridge light\r
+       Bridge over river.\r
+       You are crossing a narrow, wooden bridge over a fast-flowing river.\r
+       To the west lie the dark oaks of an evil wood, with the noise made by\r
+       the river only adding to the eerie effect of their hideous shadows. At\r
+       the eastern end of the bridge is a small island, bereft of trees, yet\r
+       looking quite lush compared to the fearsome dark of the forest.\r
+dead1  light   death\r
+       Did you think you could fly? Sorry if I gave that impression...\r
+dead2  light   death\r
+       You jump up and down, but the extra force is too much for the part\r
+       of the swamp where you stand, and to your horror you find yourself\r
+       being sucked under! Well that's something not to try again, eh?\r
+dead3  light   death\r
+       The volatile marsh gases catch light from your naked flame, and before\r
+       you know it, #WHOOMSH#...\r
+efrst1 light\r
+       Dense forest.\r
+       You are wandering around in some dense forest on the west bank of a\r
+       fast-flowing river. To the north, the river is crossed by a ford, and\r
+       to the south it runs beside a meadow, beyond which you can see what\r
+       looks like a belvedere of some kind. At that point the river splits,\r
+       and curves round to the southwest of where you stand. West, the forest\r
+       seems to be primarily of fruit trees, and northwest through the greenery\r
+       you can see what looks like a well.\r
+epstre light\r
+       East pasture.\r
+       You are standing in lush pasture, irrigated by a river which curves from\r
+       being to the east round to the north and continuing west of there to the\r
+       northwest of where you stand. The pasture carries on to the west and\r
+       southwest, but south is some rougher pasture which isn't so good.\r
+ewd1   light\r
+       Evil wood.\r
+       You are wandering around in among the hideously deformed oaks of an evil\r
+       wood. To the north and east runs a river, and west is a rough pasture.\r
+       The wood gets thicker to the south, where it continues in an almost\r
+       impenetrable darkness...\r
+ewd2   light\r
+       %ewd1\r
+       You are forcing your way through the ancient, misshapen oaks which make\r
+       up an evil wood. The only ways out which do not involve continuing\r
+       into the denseness of the trees are to the north and west. Otherwise,\r
+       the darkness envelops...\r
+ewd3   light\r
+       %ewd1\r
+       You are thrusting your way through a mangled assortment of aged oak\r
+       trees which are part of an evil wood. Northwards, the trees give way to\r
+       a rough pasture, and to the easterly directions they continue in the\r
+       same density as here. Other directions, however, the forest becomes too\r
+       thick for you to force your way through...\r
+ewd4   light\r
+       %ewd1\r
+       You are in the midst of an evil wood, surrounded by gnarled oaks of\r
+       ancient origin. The forest continues all around you, in a darkness\r
+       which seems unnatural, although to the south and southwest it appears\r
+       too thick to move through...\r
+ewd5   light\r
+       %ewd1\r
+       You are in the depths of a murky, evil wood, its gloomy oaks seeming to\r
+       stare down at you as though watching your every movement. All around,\r
+       the forest continues, although in the southerly directions it appears\r
+       too thick to enable passage...\r
+ewd6   light\r
+       %ewd1\r
+       You are in an evil wood, on the west bank of a fast-flowing river. The\r
+       malformed oaks which enclose the area loom over you, throwing the whole\r
+       place into deep shadow. The wood continues in all directions except the\r
+       east, where the river runs, although to the south it is too dense for\r
+       you to venture that way...\r
+ewd7   light\r
+       %ewd1\r
+       You are in the middle of an evil wood, built up over many centuries from\r
+       a ghastly assortment of wizened oaks, twisted into a tangled\r
+       conglomeration. The forest continues in all directions...\r
+ewd8   light\r
+       %ewd1\r
+       This is part of an evil wood, on the west bank of a fast-flowing river.\r
+       The knotted, wicked-looking oaks continue in the south and westerly\r
+       directions, but other ways is the river. Through the trees, to the east,\r
+       can be seen a small bridge which spans the river to an island in mid-\r
+       stream...\r
+ewd9   light\r
+       %ewd1\r
+       You are pushing your way through the forlorn branches of some ancient\r
+       oaks in the middle of an evil wood. All around, the wood continues, its\r
+       oppressive gloom enveloping the entire scene...\r
+ewd10  light\r
+       %ewd1\r
+       You are stood in the very heart of an evil wood, its intense blackness\r
+       and eerie silence casting fear into your soul. The dense, warped oaks\r
+       carry on in all directions, and their thick branches obscure the sky\r
+       from view...\r
+gazebo light   small   silent\r
+       Inside gazebo.\r
+       This is an ornate and elegant gazebo, built on a small eminence to\r
+       afford a better prospect of the surrounding countryside. North can\r
+       be seen a lush meadow, beyond which is a forest, and further still\r
+       a mountain. East is a fast-flowing river, which splits in two and\r
+       curves from the north round to the west, as well as continuing to the\r
+       south. Over the river can be seen forest, although south the trees are\r
+       of a hideous, misshapen form.\r
+heath1 light\r
+       Rough heath.\r
+       You are striding across a rough heath, between a forest in the north\r
+       and a mountain to the south. East is the bank of a river, and west the\r
+       heath continues. Through the trees to the north can be glimpsed a\r
+       small tower of some kind.\r
+heath2 light\r
+       %heath1\r
+       You are walking across a rough heath, which continues to the east, west\r
+       and southwest. South is the base of a large mountain, the peak of which\r
+       is partly obscured by the clouds which flank it some way up. North from\r
+       here is mainly forest, although in the distance to the northwest is an\r
+       enormous mountain, more majestic than the other.\r
+heath3 light\r
+       %heath1\r
+       This is a band of rough heathland, which curves from the south to\r
+       continue to the east. Southeast lies the base of a large mountain, but\r
+       northwest are the foothills of one even larger, and far more majestic.\r
+       North is forest, through which can be espied an ornate wall.\r
+heath4 light\r
+       %heath1\r
+       You are scrambling over a rough heath, which rises out of a deep valley\r
+       to the south and carries on to the north and northeast. East is the\r
+       bottom of a large mountain, and west lie the foothills of an even\r
+       greater peak. The ground here is very awkward to walk on, but you can\r
+       keep your footing without too much trouble.\r
+inn    light\r
+       Inside the "Admiral Bombow" inn.\r
+       You stand inside what used to be a cheery, hospitable tavern, which has\r
+       now unfortunately fallen into a state of gross disrepair. All the\r
+       windows have long since been smashed, and now only a howling wind\r
+       whistles through where once there was warmth and light.\r
+island light\r
+       Small island.\r
+       You are stood on a small island in the middle of a fast-flowing river.\r
+       The only exit is via a bridge to the west, which crosses the river into\r
+       a dark, evil wood. The island itself, mysteriously enough, has no trees,\r
+       but apart from that there is plenty of vegetation.\r
+meadow light\r
+       Riverside meadow.\r
+       You are strolling through a pleasant meadow on the west bank of a fast-\r
+       flowing river. The river splits further to the south, and one branch\r
+       meanders northwards to end up to the west of where you stand. North\r
+       is a forest, and northwest a more cultivated section which seems to be\r
+       an orchard. South, by the fork in the river, stands a gazebo.\r
+mmtn1  light\r
+       Middle mountain.\r
+       You are on the north face of a steep, yet climbable, mountain. Above\r
+       you to the south the slopes rise into the clouds, and poking out\r
+       through the top you espy the peak. The mountain continues at this level\r
+       to the southeast and southwest, whereas northwards is heathland.\r
+mmtn2  light\r
+       %mmtn1\r
+       This is the west face of a steep mountain. The summit lies beyond a\r
+       mantle of cloud which encircles the mountain just above you. Southwards\r
+       and to the northeast the mountain continues at this level, but to the\r
+       southwest it descends into a deep valley. North and west lie heaths,\r
+       and beyond them the mighty slopes of another mountain.\r
+mmtn3  light\r
+       %mmtn1\r
+       You are clambering about the southwest face of the Middle mountain.\r
+       Just above you, to the northeast, lie clouds hugging the slopes and\r
+       obscuring the summit. The mountain continues at roughly your present\r
+       altitude to the north and east, but to the west the gradient increases\r
+       dramatically and plunges into a deep valley. Southwards is a badly-paved\r
+       road running east to west, and beyond that to the southeast is another\r
+       mountain thrusting above the clouds.\r
+mmtn4  light\r
+       %mmtn1\r
+       This is a steep, yet thankfully climbable, mountain. The present height\r
+       above sea level is maintained to the west and northeast, but to the\r
+       north the mountain rises into the clouds and beyond. To the east you can\r
+       see a stable, and further still, a deep river. To the south is a badly-\r
+       paved road running east-west, on the opposite side of which there is an\r
+       inn.\r
+mmtn5  light\r
+       %mmtn1\r
+       You are now scaling the rugged east face of the middle mountain.\r
+       Although steep, it is still possible to ascend (into the mists which\r
+       drape the mountain beneath the peak) and descend (onto the banks of a\r
+       river to the east). At the same altitude, the mountain continues to the\r
+       northwest and southwest, and ceases to the south where is nestled a\r
+       ramshackle old stable.\r
+mmtn6  light\r
+       Misty part of middle mountain.\r
+mmtn7  light\r
+       %mmtn6\r
+mmtn8  light\r
+       %mmtn6\r
+mmtn9  light\r
+       %mmtn6\r
+mmtn10 light\r
+       Top of middle mountain.\r
+       The marvellous panoramic view this spot affords is breath-taking in its\r
+       splendour. Lower down the mountain, beyond the wreaths of cloud which\r
+       circle this peak, are heaths to the north, beyond which is forest. To\r
+       the east at the bottom can be seen a fast-flowing river, running from\r
+       the north to diverge some way south, by a meadow. South, there is an\r
+       old inn close by an east-west road, and southwest is another mountain.\r
+       The scene is dominated, however, by a third mountain to the northwest,\r
+       so immense that it dwarfs either of the other two. Its ancient slopes\r
+       are shrouded in mist, with rugged cliffs running for hundreds of feet\r
+       just below.\r
+nfrst1 light\r
+       %efrst1\r
+       You are wandering around in some dense forest. East, the forest\r
+       continues, and to the south lie heathlands. West are the foothills of a\r
+       majestic mountain, which towers high up above the clouds. Your progress\r
+       north is blocked by an ornate wall, decorated in exotic, eastern\r
+       patterns, which stops at the base of an enormous cliff at roughly the\r
+       same spot the forest ends to the west.\r
+nfrst2 light\r
+       %efrst1\r
+       You find yourself stood in a section of dense forest, which continues to\r
+       the west and southeast. Through the trees to the east can be seen the\r
+       tower of what looks to be a belfry, and south is heath. Northwards is\r
+       a strange, ornate wall, curiously enlivened by all manner of stylised\r
+       eastern symbols.\r
+nfrst3 light\r
+       %efrst1\r
+       You are wandering around in some dense forest to the north of some\r
+       sprawling heathlands. Eastwards is the bank of a fast-flowing river,\r
+       and northwest the forest continues. To the north, however, through the\r
+       trees, can be seen a clearing containing some sort of edifice.\r
+nhill1 light\r
+       Foothills.\r
+       These are the rolling foothills of a majestic mountain which towers\r
+       high above you some way to the north, beyond some higher foothills.\r
+       South is an east-west road, across which can be seen yet more foothills\r
+       of a slightly smaller mountain. East lies a deep valley, which rises up\r
+       into a heath to the northeast of where you stand. West is a sturdy wall,\r
+       too large to scale.\r
+nhill2 light\r
+       %nhill1\r
+       You are stood amongst the foothills of a majestic mountain, which rises\r
+       to the north. South and northeast are more foothills, and east lies a\r
+       heath. Your movement west is prevented by a large wall, built to repel\r
+       intruders such as yourself.\r
+nhill3 light\r
+       %nhill1\r
+       You are clambering about the foothills of a majestic mountain which\r
+       climbs above the clouds to the north. Unfortunately, there is a towering\r
+       cliff there, too large to ascend, but part of the mountain, to the west,\r
+       is accessible. Southwest lie further foothills, and southeast is all\r
+       heath. Northeast is a forest.\r
+nmtn1  light\r
+       Forested part of north mountain.\r
+       You are stood in amongst some trees which cloak the lower slopes of a\r
+       majestic mountain, rising to the north above the timber-line. West, the\r
+       forest becomes too dense for you to proceed, and south is a wall, also\r
+       blocking your way. All other directions, the mountain continues,\r
+       although southeast is only foothills.\r
+nmtn2  light\r
+       North mountain.\r
+       You are scaling the lower slopes of a majestic mountain. Its peak lies\r
+       high above the clouds far to the north, although progress that way is\r
+       only limited due to an interposing cliff which stands out boldly after\r
+       some more climbable slopes. South are foothills.\r
+nmtn3  light\r
+       %nmtn2\r
+       You are standing in the lower slopes of a majestic mountain, which\r
+       rises to the north and descends to the east and south into foothills.\r
+nmtn4  light\r
+       %nmtn2\r
+       You are scrambling up the slopes of a majestic mountain which spears\r
+       through the clouds far to the north, above a steep cliff. East lie\r
+       foothills, and there are lower slopes to the south. The sheer\r
+       immensity of the mountain takes your breath away.\r
+nmtn5  light\r
+       %nmtn2\r
+       You are stood in the lower slopes of a majestic mountain beside a\r
+       huge cliff to the north, which towers high above you. So rugged is the\r
+       cliff that you cannot climb it, only gasp at the geological wonder of\r
+       it all. The mountain slopes downwards to the south, and continues at the\r
+       same level to the west.\r
+nmtn6  light\r
+       %nmtn2\r
+       You are in the corner of a horseshoe-shaped cliff, which curves round\r
+       from the north to the west, blocking your way. All around you in other\r
+       directions lie the slopes leading up to the cliff, which towers high\r
+       above you, ending just below the clouds.\r
+nmtn7  light\r
+       %nmtn2\r
+       You are ascending the lower slopes of a majestic mountain, which\r
+       forces its way through the clouds further to the north, above a rugged\r
+       cliff beyond where the slopes end. The cliff curves round, and blocks\r
+       your immediate passage to the west, although in other directions the\r
+       comparatively gentle slopes lead down to the foothills.\r
+nmtn8  light\r
+       %nmtn2\r
+       You are climbing the slopes of a majestic mountain, which continue to\r
+       rise awesomely in the northern and western directions, and descend less\r
+       spectacularly to the south and east.\r
+npstre light\r
+       North pasture.\r
+       You are treading over the soft grass of a gorgeous pasture. To the north\r
+       is a river, which continues to the northeast and flows beneath a\r
+       mountain to the northwest. East, west and south, the pasture continues,\r
+       yet to the southeast it becomes much rougher and more desolate. To the\r
+       southwest lies forest.\r
+orchrd light\r
+       Ancient orchard.\r
+       You stand among the aged trees of an orchard. Most of them are apple\r
+       trees, but there is the occasional pear tree to add character. None\r
+       bear fruit or leaves, however, which makes the scene unnaturally\r
+       desolate. East and west from here are normal forests, and southeast is a\r
+       sweet meadow. South and southwest is a river, and north is a yard,\r
+       beyond which is an inn.\r
+pines1 light\r
+       Pine forest.\r
+       You are pushing your way through the pine needles in a dense forest.\r
+       Eastwards, the make-up of the forest changes to normal, deciduous trees.\r
+       Northeast is a pasture, and north can be smelled a fuming swamp. In all\r
+       other directions the pines get thicker, and you probably won't be able\r
+       to get through.\r
+river1 light   death   hideaway\r
+       You have left The Land.\r
+river2 light\r
+       Fast-flowing river.\r
+       You are wading through a fast-flowing, yet shallow, river, which\r
+       originates from a fork in a much faster river to the southeast, and\r
+       continues to the northwest. North is an orchard, which by the northeast\r
+       has become a normal forest. East is a meadow, south of which is a\r
+       gazebo. To the west lies a lush pasture, but southwest it is rough and\r
+       desolate.\r
+river3 light\r
+       %river2\r
+       This is a river flowing from the southeast to the west. On the south\r
+       bank lie exclusively pastures, and on the north, forest. The forest\r
+       directly to the north seems to be an orchard of some kind, and through\r
+       the trees there can be seen a building.\r
+river4 light\r
+       %river2\r
+       You are stood by a river, flowing from the east to the west, where it\r
+       disappears under a mountain. Foothills of the mountain are to the\r
+       northwest, covered in forest which extends to the north of your current\r
+       position, and become an orchard to the northeast. In all southerly\r
+       directions are pastures of soft, deep-green grass.\r
+road1  light\r
+       Badly-paved road.\r
+       You are stood on a badly-paved road between a mountain, to the north,\r
+       and a wayside inn, to the south. East, the road fords a fast-flowing\r
+       river, and west it continues. To the northeast is a ramshackle old\r
+       building, and southeast there seems to be a well of some kind.\r
+road2  light\r
+       %road1\r
+       You find yourself on a badly-paved road, which continues to the east and\r
+       west. North and northeast are the lower regions of a mountain, which\r
+       rises up beyond the clouds. Southeast is a yard, belonging to an inn\r
+       which can be seen just beyond it. South is a briar patch, and southwest\r
+       the foothills of a more impressive mountain. Northwest is a deep valley,\r
+       whose western slopes rise up to the foothills of a mountain more\r
+       majestic still. The view is quite breathtaking.\r
+road3  light\r
+       %road1\r
+       You are walking along a badly-paved east-west road. From here can be\r
+       seen three mountains: one to the northeast; one to the south and south-\r
+       west; and one to the northwest, which is the largest. To the north,\r
+       between two of the mountains, lies a deep valley. The only other nearby\r
+       feature is a briar patch to the southeast.\r
+road4  light\r
+       %road1\r
+       You are stood on a badly-paved road, which runs from the east to stop\r
+       at a large wall constructed to the west. There is a narrow gap in this\r
+       blockage, but it is so tight that if you wanted to go that way you'd\r
+       have to drop everything to get through. North and south are the foot-\r
+       hills of a pair of majestic mountains, and northeast is a deep valley.\r
+rough  light\r
+       Rough pasture.\r
+       You are stood in a bleak, rough pasture. This seems to be due to the\r
+       presence of an evil wood to the east and south, for north and west are\r
+       more pastures which seem to be far greener and lusher than here. South-\r
+       west is a forest, and northeast there seems to be a fast-flowing river.\r
+sfrst1 light\r
+       %efrst1\r
+       You are standing in a dense forest. It continues to the southeast at\r
+       a passable level, but south it is too thick to allow movement through.\r
+       Westwards it becomes a pine forest. North, northeast and east are\r
+       pastures, and northwest lies a festering, fuming swamp.\r
+sfrst2 light\r
+       %efrst1\r
+       This is a forest, to the south of a pasture. The trees continue in most\r
+       directions, but only to the northwest are they thinly spread enough to\r
+       enable your walking through. Northwest is another pasture, but rougher\r
+       than the first.\r
+shill1 light\r
+       %nhill1\r
+       You are stood in among the foothills of a majestic mountain to the\r
+       south. North is a narrow road which runs east-west, and everywhere else\r
+       is more mountain. Your progress to the west is impeded by a strong wall,\r
+       built to keep out trespassers.\r
+shill2 light\r
+       %nhill1\r
+       You are standing in the foothills of a tall mountain, which rises away\r
+       to the southwest. North is a badly-paved road, which runs east-west, and\r
+       east is a briar patch. There are more foothills to the west, and to the\r
+       south are forested slopes of the mountain.\r
+smtn1  light\r
+       South mountain.\r
+       You are clambering around the slopes of a tall mountain, which rises up\r
+       to the northeast into the clouds. North and east the mountain is at the\r
+       same level as here, and to the southeast it slops down into a gentle\r
+       pasture. Southwest is a swamp, fuming with marsh-gases, and west is the\r
+       top of a tall cliff, which looks very dangerous...\r
+smtn2  light\r
+       %smtn1\r
+       This is a steep climb at the base of a tall mountain. Further heights\r
+       are to the west and northeast at this level (the latter area covered in\r
+       forest), and north and northwest where the clouds hug the slopes. The\r
+       mountain lowers slowly in the southerly directions to become pastures.\r
+       East, a river flows and disappears under the mountain beneath where you\r
+       now stand.\r
+smtn3  light\r
+       Forested part of south mountain.\r
+       Your are stood amongst the trees in the forested slopes of the south\r
+       mountain. There is more forest to the east, and the mountain ascends to\r
+       the west, its peak hidden from view by the clouds near the top. North\r
+       are foothills, and northeast a briar patch. Southeast flows a river.\r
+smtn4  light\r
+       Misty part of south mountain.\r
+smtn5  light\r
+       %smtn4\r
+smtn6  light\r
+       %smtn4\r
+smtn7  light\r
+       %smtn1\r
+       You are on a steep slope to the west of a tall mountain. The mountain\r
+       continues in all directions, although to the east you can see nothing\r
+       for the clouds, and to the west there is a large wall in the way.\r
+smtn8  light\r
+       %smtn4\r
+smtn9  light\r
+       Top of south mountain\r
+       You are standing at the very peak of the south mountain. A glorious\r
+       view is to be beheld all around. To the northeast is a mountain, on\r
+       the opposite side of a road from some building. To the north is a third\r
+       mountain much larger than either of the other two, and far more\r
+       majestic. South lie pastures, and southeast is an evil-looking wood,\r
+       hard up against the side of a river, in which can be seen a small\r
+       island. West, over a wall just visible through the clouds, is a stange,\r
+       anachronistic world, centred around a house.\r
+spstre light\r
+       South pasture.\r
+       This is a pleasant pasture, which spreads far away in all the northerly\r
+       directions; eastwards, it becomes rougher. There is forest everywhere\r
+       else.\r
+swamp1 light   hideaway        sanctuary       nolook  dmove   uswamp\r
+       You are waylaid in a fuming swamp.\r
+stable\r
+       Stable.\r
+       This ramshackle old stone building is what is left of a once proud\r
+       stable. It has sadly fallen into disrepair, due to the constant\r
+       battering of the elements, nestled as it is to the southeast of a\r
+       towering mountain. To the east is a river bank, the river running\r
+       north-south and forded to the southeast of where you now stand. To\r
+       the southwest, running west from the ford, is a badly-paved road,\r
+       beside which is an inn, the patrons of which stabled their horses here\r
+       before The Land became what it is today.\r
+start  light   startrm\r
+       Ford across river.\r
+       You are stood on a ford across a fast-flowing river. To the west is a\r
+       badly-paved road, which carries on into the distance. Northwest is a\r
+       ramshackle old building, and southwest is some sort of well. South lies\r
+       a forest, and north is the west bank of the river you now cross. The\r
+       east bank leads away, out of The Land.\r
+uswamp light   death   sanctuary\r
+       Bottom of swamp.\r
+       If you can read this, you used magic!\r
+valley light\r
+       Valley between mountains.\r
+       This is a beautiful and awesome sight. You are stood in a deep valley,\r
+       carved between two tall mountains, to the west and east, eons ago. The\r
+       steep slopes are barely climbable, and abound in curious fauna and\r
+       strange, half-shadowed creatures. South, outside the valley, is an\r
+       east-west road, and north is heathland. This place is very eerie.\r
+wayout light   nolook  chain   mud     start\r
+       You force yourself through the narrow gap...\r
+wellrm light\r
+       Well near inn.\r
+       You stand beside what used to be a well, but which on closer inspection\r
+       seems to be blocked off now. West is an inn, for which the well was\r
+       probably originally constructed, although some way to the east can be\r
+       heard running water. North is an east-west road, and southwest an\r
+       orchard of mainly apple trees. Southeast is dense forest.\r
+wfrst1 light\r
+       %efrst1\r
+       This is dense forest, at the bottom of a majestic mountain to the west.\r
+       The trees continue up the mountain, and there is an orchard to the east.\r
+       North is a briar patch, and south is an east-west flowing river. To the\r
+       Northeast is a yard adjacent to an old inn.\r
+wpstre light\r
+       West pasture.\r
+       This is a pasture which sprawls at the feet of a majestic mountain to\r
+       the north. The pasture continues to the east and southeast, but south\r
+       and southwest are forests. West, the pasture ends beside a fuming swamp.\r
+yard1  light\r
+       Side yard of inn.\r
+       This is a narrow yard at the western side of an inn. North is a badly-\r
+       paved raod, and west a briar patch. Southeast, the yard becomes the back\r
+       yard of the inn.\r
+yard2  light\r
+       Back yard of inn.\r
+       This is a wide yard to the south of an old tavern, and continues to the\r
+       side of it to the northwest. South is an orchard, and southwest is a\r
+       forest. To the east there seems to be a well, near the inn.\r
+@txtmap\r
+@txtvoc\r
+       bats\r
+       beacon\r
+       bolt\r
+       bow\r
+       clove\r
+       coat\r
+       crucifix\r
+       denizen\r
+       edge\r
+       hawthorn\r
+       insect\r
+       lucifer\r
+       mb\r
+       mist\r
+       pit\r
+       quiver\r
+       sheep\r
+       undead\r
+@txtcsy\r
+@txtobj\r
+       flock   bats    50000   17\r
+       beacon1 beacon  0       0\r
+       beacon2 beacon  0       0\r
+       beacon3 beacon  0       0\r
+       box     mb      5       7\r
+       butterfly       insect  2       30\r
+       case    quiver  1000    0\r
+       cliff   edge    0       0\r
+       cross   crucifix        100     10\r
+       crossbow        bow     6000    0\r
+       fleece  coat    2000    18\r
+       fog     mist    0       0\r
+       garlic  clove   20      3\r
+       hedge   hawthorn        0       0\r
+       match   lucifer 1       3\r
+       quarrel bolt    100     0\r
+       ram     sheep   70000   50\r
+       troll   denizen 80000   75\r
+       vampire undead  120000  200\r
+       well    pit     0       0\r
+       wraith  undead  100000  200\r
+@txtosy\r
+       bf      butterfly\r
+       cb      crossbow\r
+       matchbox        box\r
+       cloud   mist\r
+       silver  cross\r
+       tree    trees\r
+       qu      quarrel\r
+@txtmtn\r
+action drop    none    none    holdfirst       null    0       0\r
+       drop    none    none    flipat  null    0       0\r
+       drop    something       stream  move    null    store   1022\r
+       drop    something       lavatory        move    null    store   1023\r
+       drop    lucifer container       ifprop  null    0       1051\r
+@txttop\r
+       blow    lucifer none    unlessprop      null    0       1041\r
+       blow    lucifer none    set     null    2       0\r
+       climb   space   none    null    null    1013    0\r
+       climb   forest  none    null    null    1067    0\r
+       climb   hawthorn        none    null    null    1070    0\r
+       close   mb      none    inc     null    1033    1034\r
+       douse   lucifer none    unlessprop      null    0       1041\r
+       douse   lucifer none    set     null    2       1042    ;as $burning\r
+       douse   beacon  none    ifzero  null    1056    1057\r
+       drop    anything        mb      ifprop  box     1       1053\r
+       drop    .insert lucifer mb      unlessprop      null    0       0\r
+       drop    .insert lucifer mb      destroydestroy  second  1052    0\r
+       drop    .insert anything        mb      null    null    0       0\r
+       drop    .insert anything        quiver  null    null    0       0       ;let them put lit brands in etc\r
+       drop    .drop   familiar        pit     expdestroy      null    1060    0\r
+       drop    coat    sheep   inc     null    1064    1063\r
+       eat     clove   none    expdestroy      null    1029    0\r
+       enter   none    none    null    null    1014    0\r
+       fell    none    none    null    null    1021    0\r
+       fix     something       stream  move    null    store   1022\r
+       fix     something       lavatory        move    null    store   1023\r
+       fix     anything        mb      ifprop  box     1       1053\r
+       fix     .insert lucifer mb      unlessprop      null    0       0\r
+       fix     .insert lucifer mb      destroydestroy  second  1052    0\r
+       fix     .insert anything        mb      null    null    0       0\r
+       fix     .insert anything        quiver  null    null    0       0\r
+       fix     coat    sheep   inc     null    1064    1063\r
+       fly     none    none    null    null    1018    0\r
+       get     anything        mb      unlessprop      null    0       1059\r
+       get     .remove anything        mb      null    null    0       0\r
+       get     .remove anything        quiver  null    null    0       0\r
+       get     .get    crucifix        none    null    null    1030    0\r
+       get     anything        denizen null    null    1068    0\r
+       get     familiar        none    unlessprop      null    9       1069\r
+       hints   none    none    null    null    1012    0\r
+       kill    .kill   undead  none    unlessobjis     vampire 0       0\r
+       kill    undead  crucifix        null    null    1027    0\r
+       kill    undead  clove   null    null    1027    0\r
+       kill    .kill   undead  none    ifgot   cross   0       0\r
+       kill    .kill   undead  none    ifgot   garlic  0       0\r
+       kill    .kill   undead  none    loseexp null    200     1028\r
+       kill    lucifer none    unlessgot       box     1043    0\r
+       kill    lucifer none    ifprop  null    0       1035\r
+       kill    lucifer none    ifprop  null    2       1036\r
+       kill    lucifer none    dec     null    1037    0       -44\r
+       kill    mb      none    unlessprop      null    0       1058\r
+       kill    .empty  mb      none    null    null    0       0\r
+       kill    .empty  quiver  none    null    null    0       0\r
+       kill    .kill   denizen torch   ifprop  second  1       0       -4\r
+       kill    denizen torch   hurt    null    40      1061    -4\r
+       kill    insect  none    destroy null    1065    0       -4\r
+       leave   none    none    null    null    1015    0\r
+       light   beacon  torch   ifprop  null    0       1047\r
+       light   beacon  torch   dec     null    1046    1047    -45\r
+       light   lucifer torch   null    null    1045    0\r
+       light   lucifer none    unlessgot       box     1043    0\r
+       light   lucifer none    ifprop  null    0       1035\r
+       light   lucifer none    ifprop  null    2       1036\r
+       light   lucifer none    dec     null    1037    0       -44\r
+       light   something       lucifer ifprop  second  1       1038\r
+       light   something       lucifer ifprop  second  2       1039\r
+       light   torch   lucifer dec     null    109     1040\r
+       light   something       lucifer null    null    1044    0\r
+       light   mb      torch   destroy null    771     0\r
+       light   mb      flame   destroy null    771     0\r
+       light   something       beacon  unlessprop      second  0       1054\r
+       light   torch   beacon  dec     null    109     4\r
+       light   something       beacon  null    null    1055    0\r
+       load    bow     none    ifprop  null    0       1072\r
+       load    bow     bolt    decdestroy      second  1073    0\r
+       load    bow     none    null    null    1074    0\r
+       make    none    none    null    null    1050    0\r
+       open    mb      none    dec     null    1031    1032\r
+       shear   sheep   none    null    null    1062    0\r
+       shoot   bow     none    unlessprop      crossbow        0       1079\r
+       shoot   something       bow     unlessprop      crossbow        0       1079\r
+       shoot   person  bow     unlessprop      crossbow        0       1079\r
+       shoot   person  bow     sendemon        null    47      1077    -51\r
+       shoot   person  bow     null    null    1083    0\r
+       shoot   sheep   bow     injure  null    10      1077    -51\r
+       shoot   denizen bow     injure  null    10      1077    -51\r
+       shoot   bats    bow     injure  null    10      1077    -51\r
+       shoot   serpent bow     injure  null    10      1077    -51\r
+       shoot   feline  bow     null    null    1080    0\r
+       shoot   undead  bow     null    null    1081    0       -51\r
+       shoot   insect  bow     null    null    1082    0       -51\r
+       shoot   bow     none    inc     crossbow        1078    1079\r
+       shoot   something       bow     inc     crossbow        1078    1079\r
+       summon  none    none    null    null    1050    0\r
+       swim    none    river   null    null    1016    0\r
+       swim    none    h2o     null    null    1025    0\r
+       swim    none    none    null    null    1017    0\r
+       tap     none    none    null    null    1020    0\r
+       unload  bow     none    ifzero  null    1075    1076\r
+       where   none    none    null    null    1050    0\r
+       worship none    none    null    null    1019    0\r
+@txtbtm\r
+       pray    worship\r
+       hint    hints\r
+       lo      load\r
+;;vocabulary demon actions\r
+action $alllit none    none    ifprop  beacon1 1       0\r
+       $alllit none    none    ifprop  beacon2 1       0\r
+       $alllit none    none    ifprop  beacon3 1       0\r
+       $alllit none    none    exp     null    45      1049\r
+       $burning        none    none    set     match   2       0\r
+       $deaded none    none    destroy butterfly       0       0\r
+       $ouch   none    none    losestamina     null    7       1071\r
+       $shoot  none    none    set     crossbow        1       0\r
+       $smash  .vis    none    none    null    null    0       0\r
+       $vampire        none    none    ifwiz   null    0       0       \r
+       $vampire        none    none    ifgot   garlic  1027    0\r
+       $vampire        none    none    ifgot   cross   1027    0\r
+       $vampire        .provoke        something       none    ifgot   cross   0       0\r
+       $vampire        .provoke        something       none    ifgot   garlic  0       0\r
+       $vampire        .provoke        something       none    loseexp null    200     0\r
+@txtdac\r
+*demons        59\r
+@txtdmn\r
+43     $vampire        whichever       none    -1\r
+44     $burning        none    none    12      always\r
+45     $alllit none    none    -1\r
+46     $deaded none    none    120-300 global  enabled\r
+47     $ouch   none    none    -1\r
+51     $shoot  none    none    -1      always\r
+*objects\r
+case   island  0       0       1       contains        1000    transparent     opened\r
+0      A quarrel case lies here.\r
+bouquet        store   0       0       0\r
+0      A beautiful bouquet of fragrant flowers lines by your feet.\r
+pin    store   0       0       0\r
+0      A shiny new pin lies at your feet!\r
+crossbow       smtn3   1       1       2\r
+0      A loaded crossbow has been dropped here.\r
+1      An unloaded crossbow lies on the ground.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+quarrel        case    0       0       1\r
+0      A crossbow bolt has fallen here.\r
+almanac        store   0       0       1       noget   bright\r
+0      ?\r
+bag    stable  0       1       2       contains        7000    opened\r
+0      A musty old bag is here, opened.\r
+1      A musty old bag is here, closed.\r
+sack   bag     0       0       1       contains        5000\r
+0      There is an old sack here.\r
+coin   inn     0       0       0\r
+0      A golden coin lies here, bearing on one side the image of a head, on\r
+       the reverse a picture of a tail.\r
+beads  belfry  0       0       0\r
+0      Some smoked-glass beads are strewn at your feet.\r
+coinval        store   0       -1      2       noget\r
+0      Someone tossed a heads.\r
+1      Someone tossed a tails.\r
+jewels store   0       0       0\r
+0      Some fabulous jewels here make you catch your breath in amazement!\r
+starstone      store   0       0       0\r
+0      A loose starstone has tumbled here.\r
+jet    store   0       0       0\r
+0      A piece of jet has been left here.\r
+topaz  store   0       0       0\r
+0      At your feet lies a large topaz.\r
+troll  15      0       6       mmtn9   0       0       0       80      noget   contains        20000   disguised\r
+0      A slimy troll is lurking here...\r
+bloodstone     troll   0       0       0\r
+0      To one side, a deep-red bloodstone attracts your attention.\r
+amethyst       store   0       0       0\r
+0      Glinting in the light you espy a polished amethyst.\r
+clasp  store   0       0       0\r
+0      A silver clasp has been dropped on the ground here.\r
+garnet store   0       0       0\r
+0      You notice a strangely-carven piece of garnet by your feet.\r
+;banger        nfrst1  0       0       0\r
+;0     A firework marked "banger" lies at your feet.\r
+;rocket        nfrst1  0       0       0\r
+;0     A rocket (firework variety) has been discarded here.\r
+;sparkler      nfrst1  1       1       1       bright\r
+;0     There is a sparkling sparkler here, its pretty, glittering flecks of\r
+;      light cascading around it!\r
+;1     There is an unlit sparkler here.\r
+holly  xmasbx  0       0       0\r
+0      A bough of holly is not decking the hall here.\r
+xmastree       xmasbx  0       0       0\r
+0      A beautiful Christmas tree is here, bedecked with baubles.\r
+mousse xmasbx  0       0       0\r
+0      The heady aroma of a shockingly pink-flavoured mousse here tempts your\r
+       palate!\r
+mouse  xmasbx  0       0       0\r
+0      A sugar mouse is not-quite-enchanted here.\r
+candle xmasbx  0       0       0       bright\r
+0      A candle shines brightly here, and the darkness has never quenched it.\r
+snowman        xmasbx  0       0       0\r
+0      A snowman nearby gives you a frosty stare.\r
+cracker        xmasbx  0       0       0\r
+0      A Christmas cracker lies here.\r
+carolbook      xmasbx  0       0       0\r
+0      There is a Christmas carol book here, full of Christmas carols too\r
+       numerous to recount and too twee to sing.\r
+reindeer       20      0       6       xmasbx  0       0       0       bright  noget\r
+0      A sturdy reindeer lumbers past you nearby.\r
+sleigh xmasbx  0       0       0\r
+0      Nearby is a sleigh.\r
+santaclaus     0       0       6       xmasbx  0       0       0       noget\r
+0      Ho ho ho, Father Christmas here again, with your Christmas gifts!\r
+mincepies      xmasbx  0       0       0\r
+0      Some prettily-mouldy mince pies sit sumptiously on the floor, beautiful\r
+       to behold.\r
+plumpudding    xmasbx  0       0       0\r
+0      There is some plum pudding here, recently doused.\r
+turkey 5       0       6       xmasbx  0       0       0       50      noget\r
+0      A turkey here tries frantically to put its feathers back in.\r
+buckle gazebo  0       0       0\r
+0      A shiny buckle has somehow found its way here.\r
+potion island  0       1       1\r
+0      A vial of clear purple potion has been placed here.\r
+1      A vial of cloudy purple potion has been placed here.\r
+sapphire       store   0       0       0\r
+0      A deep blue sapphire draws your attention nearby.\r
+doubloons      store   0       0       0\r
+0      A pile of doubloons glisters here!\r
+pieces inn     0       0       0\r
+0      Some pieces of eight lie scattered around here.\r
+groats inn     0       0       0\r
+0      Some golden groats lie here!\r
+firestone      store   0       0       0       bright  nosummon\r
+0      A beautiful, irridescent firestone glows nearby.\r
+cat    300     0       6       ewd6    0       9       9\r
+9      A dead cat has been left here.\r
+8      A panther the size of a house, with sabre-teeth, billowing forth roars\r
+       of flame, stares at you in a maddened rage with its fiery eyes!\r
+7      A massive, enraged, sabre-toothed panther roars uncontrollably\r
+       before you!\r
+6      An enormous, fire-breathing panther roars terrifyingly at you!\r
+5      A large, fiery-eyed panther growls loudly at you!\r
+4      A lithe panther stands here, growling darkly.\r
+3      A gigantic, jet-black cat arches its back here, menacingly.\r
+2      An enormous, coal-black cat is here, hissing and spitting angrily.\r
+1      A large, velvet-black cat is here, purring discontentedly.\r
+0      A small, sleek, black cat sits here, purring happily to itself.\r
+snake  15      0       40      ewd2    0       0       0       90\r
+0      A viper slithers past your feet.\r
+wall   nfrst1  0       0       1       noget   noit\r
+wall   nfrst2  0       0       1       noget   noit\r
+wall   belfry  0       0       1       noget   noit\r
+wall   bank5   0       0       1       noget   noit\r
+wall   nmtn1   0       0       1       noget   noit\r
+wall   nhill2  0       0       1       noget   noit\r
+wall   nhill1  0       0       1       noget   noit\r
+wall   road4   0       0       1       noget   noit\r
+wall   shill1  0       0       1       noget   noit\r
+wall   smtn6   0       0       1       noget   noit\r
+wall   smtn7   0       0       1       noget   noit\r
+hedge  belfry  0       0       1       noget   noit\r
+hedge  bank5   0       0       1       noget   noit\r
+cliff  smtn1   0       0       1       noget   noit\r
+trees  nfrst1  0       0       1       noget   noit\r
+trees  nfrst2  0       0       1       noget   noit\r
+trees  nfrst3  0       0       1       noget   noit\r
+trees  nmtn1   0       0       1       noget   noit\r
+trees  smtn3   0       0       1       noget   noit\r
+trees  orchrd  0       0       1       noget   noit\r
+trees  efrst1  0       0       1       noget   noit\r
+trees  wfrst1  0       0       1       noget   noit\r
+trees  sfrst1  0       0       1       noget   noit\r
+trees  sfrst2  0       0       1       noget   noit\r
+trees  pines1  0       0       1       noget   noit\r
+trees  ewd1    0       0       1       noget   noit\r
+trees  ewd2    0       0       1       noget   noit\r
+trees  ewd3    0       0       1       noget   noit\r
+trees  ewd4    0       0       1       noget   noit\r
+trees  ewd5    0       0       1       noget   noit\r
+trees  ewd6    0       0       1       noget   noit\r
+trees  ewd7    0       0       1       noget   noit\r
+trees  ewd8    0       0       1       noget   noit\r
+trees  ewd9    0       0       1       noget   noit\r
+trees  ewd10   0       0       1       noget   noit\r
+painting       store   0       0       0\r
+0      Catching your attention is a beautiful painting, which has not\r
+       yet been finished.\r
+candlestick    store   0       0       0\r
+0      A richly decorated brass candlestick lies on the ground.\r
+toilet store   0       0       1       noget   noit\r
+river  bank1   0       0       1       noget   noit\r
+river  bank2   0       0       1       noget   noit\r
+river  bank3   0       0       1       noget   noit\r
+river  bank4   0       0       1       noget   noit\r
+river  bank5   0       0       1       noget   noit\r
+river  start   0       0       1       noget   noit\r
+river  river1  0       0       1       noget   noit\r
+river  river2  0       0       1       noget   noit\r
+river  river3  0       0       1       noget   noit\r
+river  river4  0       0       1       noget   noit\r
+river  efrst1  0       0       1       noget   noit\r
+river  meadow  0       0       1       noget   noit\r
+river  gazebo  0       0       1       noget   noit\r
+river  ewd1    0       0       1       noget   noit\r
+river  ewd8    0       0       1       noget   noit\r
+river  bridge  0       0       1       noget   noit\r
+river  island  0       0       1       noget   noit\r
+river  ewd6    0       0       1       noget   noit\r
+water  bank1   0       0       1       noget   noit\r
+water  bank2   0       0       1       noget   noit\r
+water  bank3   0       0       1       noget   noit\r
+water  bank4   0       0       1       noget   noit\r
+water  bank5   0       0       1       noget   noit\r
+water  start   0       0       1       noget   noit\r
+water  river2  0       0       1       noget   noit\r
+water  river3  0       0       1       noget   noit\r
+water  river4  0       0       1       noget   noit\r
+water  efrst1  0       0       1       noget   noit\r
+water  meadow  0       0       1       noget   noit\r
+water  gazebo  0       0       1       noget   noit\r
+water  ewd1    0       0       1       noget   noit\r
+water  ewd8    0       0       1       noget   noit\r
+water  bridge  0       0       1       noget   noit\r
+water  island  0       0       1       noget   noit\r
+water  ewd6    0       0       1       noget   noit\r
+water  wellrm  0       0       1       noget   noit\r
+basin  store   0       0       1       noget   noit\r
+well   wellrm  0       0       1       noget   noit\r
+diamond        store   0       0       0\r
+0      A diamond weighing about an ounce catches your gaze here!\r
+medicine       inn     0       1       0\r
+0      There is some medicine here.\r
+1      There is some partially-drunk medicine here.\r
+key    store   0       0       1\r
+0      A set of rusty keys can be seen on the ground.\r
+key    store   0       0       0\r
+0      A set of shiny keys can be seen on the ground.\r
+door   store   2       2       3\r
+0      The door is open.\r
+1      The door is closed.\r
+2      The door is locked shut.\r
+crown  store   0       0       0\r
+0      Gleaming in front of you is a magnificent crown!\r
+rain   bank1   bank2   bank3   bank4   bank5   briar   bridge  epstre  heath1  heath2  heath3  heath4  island  meadow  mmtn1   mmtn2   mmtn3   mmtn4   mmtn5   nhill1  nhill2  nhill3  nmtn2   nmtn3   nmtn4   nmtn5   nmtn6   nmtn7   nmtn8   npstre  river2  river3  river4  road1   road2   road3   road4   rough   shill1  shill2  smtn1   smtn2   smtn7   spstre  start   valley  wellrm  wpstre  xmasbx  yard1   yard2   0       2       3       noit    noget\r
+1      It is raining.\r
+2      It is snowing.\r
+fog    mmtn6    mmtn7  mmtn8   mmtn9   smtn4   smtn5   smtn6   smtn8   0       0       1       noit    noget\r
+axe    <nfrst2 sfrst2> 0       -1      0\r
+0      A mighty axe lies on the ground here.\r
+1      A mighty axe shines on the ground here.\r
+beacon1        mmtn10  1       1       2       bright  noget\r
+0      A warning beacon shines here, brightly.\r
+1      There is a long-disused warning beacon here.\r
+beacon2        nmtn6   1       1       2       bright  noget\r
+0      %beacon1\r
+1      %beacon1\r
+beacon3        smtn9   1       1       2       bright  noget\r
+0      %beacon1\r
+1      %beacon1\r
+brand  <ewd1   pines1  sfrst1  wfrst1  efrst1  nfrst1> 1       1       2       bright\r
+0      There is a burning fire brand here.\r
+1      There is a large stick on the ground.\r
+brand  nhill1  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  efrst1  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  smtn3   1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  nmtn1   1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  orchrd  1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+brand  ewd6    1       1       2       bright\r
+0      %brand\r
+1      %brand\r
+fire   store   0       0       1       bright  contains        256000  noget   disguised\r
+0      A roaring fire is burning in the grate, spreading a cosy feeling around\r
+       the room.\r
+off    store   0       0       1       noget\r
+curiosity      store   0       0       1       noget\r
+sesame store   0       0       1       noget\r
+box    <road3  rough   heath1> 1       2       1       contains        40      opened\r
+0      There is an open matchbox here.\r
+1      There is a closed matchbox here.\r
+match  box     1       3       3       bright\r
+0      You can see a lit match.\r
+1      You can see an unused safety match.\r
+2      You can see a spent match.\r
+flock  20      0       6       belfry  0       0       0       60      noget\r
+0      A flock of bats swoops around your head.\r
+flock  3       0       6       ewd3    0       0       0       80      noget\r
+0      A flock of vampire bats swoops around your head.\r
+vampire        7       0       43      ewd4    0       0       0       200     noget\r
+0      A powerful vampire materialises before you!\r
+wraith 9       0       6       ewd5    0       0       0       100     noget\r
+0      A wraith of death glides silently towards you...\r
+garlic yard1   0       0       0\r
+0      A clove of garlic lies by your feet.\r
+cross  belfry  0       0       0\r
+0      You see a silver cross here!\r
+butterfly      1       0       6       valley  0       0       0       1\r
+0      A butterfly flutters by.\r
+fleece ewd5    0       1       1\r
+0      The fleece of a sheep is here.\r
+1      A silver fleece glisters before you!\r
+ram    2       0       6       smtn6   0       0       0       70      noget\r
+0      A recently-sheared ram grazes here.\r
+*travel        go\r
+home   n       store   in\r
+       n       start   [o      n       ne      e]\r
+       n       swamp1  swamp\r
+store  n       road4   n       ne      e       se      s       sw      w       nw      in      o       swamp   jump    u       d\r
+limbo  door    limbo   o\r
+xmasbx n       xmasbx  n\r
+bank1  n       bank2   nw      n       ne      u\r
+       1002    e\r
+       n       start   se      s       sw      swamp   o       d\r
+       n       stable  w       in\r
+bank2  n       bank3   n       ne      u\r
+       1002    e\r
+       n       bank1   se      s       swamp   o       d\r
+       n       stable  sw      in\r
+       n       mmtn5   w       nw\r
+bank3  n       bank4   n       ne      u\r
+       1002    e\r
+       n       bank2   se      s       swamp   o       d\r
+       n       mmtn5   sw      w       nw\r
+bank4  n       bank5   n       ne      u\r
+       1002    e\r
+       n       bank3   se      s       o       d\r
+       n       mmtn5   sw      swamp\r
+       n       heath1  w\r
+       n       nfrst3  nw\r
+bank5  1003    nw      n\r
+       1002    ne      e       u\r
+       n       bank4   se      s       swamp   o       d\r
+       n       nfrst3  sw\r
+       1004    w\r
+belfry 1003    n       ne\r
+       1004    e       se\r
+       n       nfrst3  s       sw      swamp   o       d\r
+       n       nfrst2  w       nw\r
+briar  n       road2   n\r
+       n       road1   ne      o\r
+       n       yard1   e\r
+       n       yard2   se\r
+       n       wfrst1  s\r
+       n       smtn3   sw      swamp   u\r
+       n       shill2  w\r
+       n       road3   nw\r
+bridge 1002    n       ne      se      s       sw      nw      u       d\r
+       n       island  e\r
+       n       ewd8    w       swamp   o\r
+dead1  n       dead2   n\r
+dead2  n       dead3   n\r
+dead3  n       dead1   n\r
+efrst1 n       start   n       ne      o       u\r
+       1002    e\r
+       n       meadow  se      s       d\r
+       n       river2  sw      swamp\r
+       n       orchrd  w       in\r
+       n       wellrm  nw\r
+epstre n       river3  n       ne\r
+       n       river2  e       o\r
+       n       rough   se      s\r
+       n       spstre  sw\r
+       n       npstre  w       swamp\r
+       n       river4  nw\r
+ewd1   serpent 0       n       ne      o       u       w       nw      swamp\r
+       bats    0       n       ne      o       u       w       nw      swamp\r
+       undead  0       n       ne      o       u       w       nw      swamp\r
+       n       river2  n       ne      o       u\r
+       1002    e       d\r
+       n       <ewd8   ewd9    ewd2>   se\r
+       n       ewd9    s\r
+       n       ewd2    sw\r
+       n       rough   w       nw      swamp\r
+ewd2   serpent 0       w       nw      n       swamp\r
+       bats    0       w       nw      n       swamp\r
+       undead  0       w       nw      n       swamp\r
+       n       rough   w       nw      n       swamp\r
+       n       <ewd1   ewd9    ewd10>  ne      o\r
+       n       ewd9    e\r
+       n       ewd10   se\r
+       n       ewd4    s\r
+       n       ewd3    sw\r
+ewd3   serpent 0       nw      n       swamp   o\r
+       bats    0       nw      n       swamp   o\r
+       undead  0       nw      n       swamp   o\r
+       n       rough   nw      n       swamp   o\r
+       n       ewd2    ne      e\r
+       n       ewd4    se\r
+       1005    s       sw      w\r
+ewd4   n       ewd2    n\r
+       n       ewd9    ne      o\r
+       n       ewd10   e\r
+       n       ewd7    se\r
+       1005    s       sw\r
+       n       ewd3    w       nw      swamp\r
+ewd5   n       ewd7    n       o\r
+       n       ewd6    ne      e       se\r
+       1005    s       sw      w\r
+       n       ewd4    nw      swamp\r
+ewd6   n       ewd8    n       o       u\r
+       1002    ne      e       se      d\r
+       1005    s\r
+       n       ewd5    sw\r
+       n       ewd7    w\r
+       n       ewd10   nw      swamp\r
+ewd7   n       ewd10   n\r
+       n       ewd8    ne      o\r
+       n       ewd6    e       se\r
+       n       ewd5    s\r
+       1005    sw\r
+       n       ewd4    w       nw      swamp\r
+ewd8   serpent 0       e\r
+       bats    0       e\r
+       undead  0       e\r
+       1002    ne      se      u\r
+       n       bridge  e\r
+       n       ewd6    s       d\r
+       n       ewd10   sw\r
+       n       ewd9    w\r
+       n       ewd1    nw      swamp   o\r
+ewd9   n       <ewd1   ewd4>   n       ne      o\r
+       n       ewd8    e       se\r
+       n       ewd10   s\r
+       n       ewd4    sw\r
+       n       ewd2    w       nw      swamp\r
+ewd10  n       ewd9    n       o\r
+       n       <ewd8   ewd6    ewd7    ewd4>   ne      e\r
+       n       ewd6    se\r
+       n       ewd7    s\r
+       n       ewd4    sw      w\r
+       n       ewd2    nw      swamp\r
+gazebo n       meadow  n       ne      o       u\r
+       1002    e       se      s       sw      d\r
+       n       river2  w       nw      swamp\r
+heath1 n       nfrst3  n\r
+       n       bank4   ne      e\r
+       n       mmtn5   se      swamp   o\r
+       n       mmtn1   s       sw      u\r
+       n       heath2  w       nw\r
+heath2 n       nfrst2  n\r
+       n       nfrst3  ne\r
+       n       heath1  e\r
+       n       mmtn1   se\r
+       n       mmtn2   s       o\r
+       n       heath4  sw      swamp   u\r
+       n       heath3  w\r
+       n       nfrst1  nw\r
+heath3 n       nfrst1  n\r
+       n       nfrst2  ne\r
+       n       heath2  e\r
+       n       mmtn2   se      u\r
+       n       heath4  s       swamp   o\r
+       n       nhill2  sw\r
+       n       nhill3  w       nw\r
+heath4 n       heath3  n\r
+       n       heath2  ne\r
+       n       mmtn2   e       u\r
+       n       mmtn3   se      o\r
+       n       valley  s       swamp   d\r
+       n       nhill1  sw\r
+       n       nhill2  w       nw\r
+inn    n       road1   nw      n\r
+       n       start   ne      o\r
+       n       wellrm  e       se\r
+       n       yard2   s       sw      swamp\r
+       n       yard1   w\r
+island 1002    nw      n       ne      e       se      s       sw      u       d\r
+       n       bridge  w       swamp   o\r
+meadow n       efrst1  n       ne      o       u\r
+       1002    e\r
+       n       gazebo  se      s       in      d\r
+       n       river2  sw      w       swamp\r
+       n       orchrd  nw\r
+mmtn1  n       heath1  n       ne      d\r
+       n       mmtn5   e       se      o\r
+       n       mmtn7   s       u\r
+       n       mmtn2   sw      swamp\r
+       n       heath2  w       nw\r
+mmtn2  n       heath2  n\r
+       n       mmtn1   ne\r
+       n       mmtn7   e\r
+       n       mmtn8   se      u\r
+       n       mmtn3   s       o\r
+       n       valley  sw      swamp   in      d\r
+       n       heath4  w\r
+       n       heath3  nw\r
+mmtn3  n       mmtn2   n\r
+       n       mmtn9   ne      u\r
+       n       mmtn4   e\r
+       n       road1   se      o\r
+       n       road2   s\r
+       n       road3   sw      swamp\r
+       n       valley  w       in      d\r
+       n       heath4  nw\r
+mmtn4  n       mmtn9   n       u\r
+       n       mmtn5   ne\r
+       n       stable  e       se      in\r
+       n       road1   s       o       d\r
+       n       road2   sw      swamp\r
+       n       mmtn3   w\r
+       n       mmtn8   nw\r
+mmtn5  n       heath1  n\r
+       n       bank4   ne\r
+       n       bank3   e       d\r
+       n       bank2   se\r
+       n       stable  s       o       in\r
+       n       mmtn4   sw      swamp\r
+       n       mmtn6   w       u\r
+       n       mmtn1   nw\r
+mmtn6  n       mmtn1   nw      n\r
+       n       mmtn5   ne      e       se      o       d\r
+       n       mmtn9   s       sw      swamp\r
+       n       mmtn7   w       u\r
+mmtn7  n       mmtn1   nw      n       ne      d\r
+       n       mmtn6   e\r
+       n       mmtn10  se      s       u\r
+       n       mmtn8   sw      swamp   o\r
+       n       mmtn2   w\r
+mmtn8  n       mmtn7   n       ne\r
+       n       mmtn10  e       u\r
+       n       mmtn4   se      o\r
+       n       mmtn3   s       sw      swamp\r
+       n       mmtn2   w       nw      d\r
+mmtn9  n       mmtn10  n       u\r
+       n       mmtn6   ne\r
+       n       mmtn5   e\r
+       n       stable  se      o       in      d\r
+       n       mmtn4   s\r
+       n       mmtn3   sw      swamp\r
+       n       mmtn8   w       nw\r
+mmtn10 n       mmtn7   nw      n       d\r
+       n       mmtn6   ne      e\r
+       n       mmtn9   se      s       swamp   o\r
+       n       mmtn8   sw      w\r
+nfrst1 1003    n\r
+       n       nfrst2  ne      e\r
+       n       heath2  se      o\r
+       n       heath3  s       swamp\r
+       n       nhill3  sw      w       nw      u\r
+nfrst2 bats    0       s       o       sw      swamp   w       nw\r
+       1003    n\r
+       n       belfry  ne      e       in\r
+       n       nfrst3  se\r
+       n       heath2  s       o\r
+       n       heath3  sw      swamp\r
+       n       nfrst1  w       nw\r
+nfrst3 bats    0       ne      e       se      o       s       sw      w       swamp\r
+       n       belfry  n       in\r
+       n       bank5   ne      e\r
+       n       bank4   se      o\r
+       n       heath1  s\r
+       n       heath2  sw      w       swamp\r
+       n       nfrst2  nw\r
+nhill1 n       nhill2  nw      n       u\r
+       n       heath4  ne\r
+       n       valley  e       in      d\r
+       n       road3   se      o\r
+       n       road4   s       sw      swamp\r
+       1006    w\r
+nhill2 n       nmtn2   n       u\r
+       n       nhill3  ne\r
+       n       heath4  e\r
+       n       valley  se      o       in      d\r
+       n       nhill1  s       sw      swamp\r
+       1006    w\r
+       n       nmtn1   nw\r
+nhill3 1007    n       u\r
+       n       nfrst1  ne\r
+       n       heath3  e       se      d\r
+       n       nhill2  s       sw      swamp   o\r
+       n       nmtn4   w\r
+       n       nmtn5   nw\r
+nmtn1  n       nmtn7   nw      n\r
+       n       nmtn8   ne      u\r
+       n       nmtn2   e\r
+       n       nhill2  se      swamp   o       d\r
+       1006    s       sw\r
+       1005    w\r
+nmtn2  n       nmtn8   n       u\r
+       n       nmtn3   ne      e\r
+       n       nhill2  se      s       sw      swamp   o       d\r
+       n       nmtn1   w\r
+       n       nmtn7   nw\r
+nmtn3  n       nmtn4   n\r
+       n       nhill3  ne      e       d\r
+       n       nhill2  se      s       swamp   o\r
+       n       nmtn2   sw      w\r
+       n       nmtn8   nw      u\r
+nmtn4  n       nmtn5   nw      n       u\r
+       n       nhill3  ne      e       se      o       d\r
+       n       nmtn2   s       sw      swamp\r
+       n       nmtn8   w\r
+nmtn5  1007    n       ne      u\r
+       n       nhill3  e       o       d\r
+       n       nmtn4   se\r
+       n       nmtn8   s       swamp\r
+       n       nmtn7   sw\r
+       n       nmtn6   w       nw\r
+nmtn6  1007    w       nw      n       u\r
+       n       nmtn5   ne      e\r
+       n       nmtn8   se      o       d\r
+       n       nmtn7   s       sw      swamp\r
+nmtn7  n       nmtn6   nw      n       u\r
+       n       nmtn5   ne\r
+       n       nmtn8   e\r
+       n       nmtn2   se      o       d\r
+       n       nmtn1   s       sw      swamp\r
+nmtn8  n       nmtn5   n       ne\r
+       n       nmtn4   e\r
+       n       nmtn3   se      o\r
+       n       nmtn2   s       swamp   d\r
+       n       nmtn1   sw\r
+       n       nmtn7   w\r
+       n       nmtn6   nw      u\r
+npstre n       river4  n\r
+       n       river3  ne      o\r
+       n       epstre  e\r
+       n       rough   se\r
+       n       spstre  s\r
+       n       sfrst1  sw\r
+       n       wpstre  w       swamp\r
+       n       smtn2   nw      u\r
+orchrd n       yard2   nw      n\r
+       n       wellrm  ne      o\r
+       n       efrst1  e\r
+       n       meadow  se\r
+       n       river3  s       swamp\r
+       n       river4  sw\r
+       n       wfrst1  w\r
+pines1 torch   dead3   nw      n       swamp   in\r
+       lucifer dead3   nw      n       swamp   in\r
+       spark   dead3   nw      n       swamp   in\r
+       n       swamp1  nw      n       swamp   in\r
+       n       wpstre  ne      o\r
+       n       sfrst1  e       se\r
+       1008    s       sw      w\r
+river1 e       start   w       swamp\r
+river2 n       orchrd  nw      n       in\r
+       n       efrst1  ne      o\r
+       n       meadow  e\r
+       n       gazebo  se      in      u\r
+       n       ewd1    s\r
+       n       rough   sw\r
+       n       epstre  w       swamp\r
+       n       river3  nw      d\r
+river3 n       orchrd  n       ne      o\r
+       n       meadow  e\r
+       n       river2  se      u\r
+       n       epstre  s\r
+       n       npstre  sw      swamp\r
+       n       river4  w       d\r
+       n       wfrst1  nw\r
+river4 n       wfrst1  n\r
+       n       orchrd  ne      o       in\r
+       n       river3  e       u\r
+       n       epstre  se\r
+       n       npstre  s       sw      swamp\r
+       n       smtn2   w\r
+       n       smtn3   nw\r
+road1  n       mmtn4   n       u\r
+       n       stable  ne\r
+       n       start   e       o\r
+       n       wellrm  se\r
+       n       inn     s       in\r
+       n       yard1   sw      swamp\r
+       n       road2   w\r
+       n       mmtn3   nw\r
+road2  n       mmtn3   n       u\r
+       n       mmtn4   ne\r
+       n       road1   e       o\r
+       n       yard1   se\r
+       n       briar   s\r
+       n       shill2  sw      swamp\r
+       n       road3   w\r
+       n       valley  nw      in\r
+road3  n       valley  n       in      d\r
+       n       mmtn3   ne      u\r
+       n       road2   e       o\r
+       n       briar   se\r
+       n       shill2  s       swamp\r
+       n       shill1  sw\r
+       n       road4   w\r
+       n       nhill1  nw\r
+road4  n       nhill1  nw      n\r
+       n       valley  ne      in      d\r
+       n       road3   e       o\r
+       n       shill2  se\r
+       n       shill1  s       sw      u       swamp\r
+       e       wayout  west\r
+       1026    west\r
+rough  n       epstre  n\r
+       n       river2  ne      o\r
+       n       ewd1    e\r
+       n       ewd2    se\r
+       n       ewd3    s\r
+       n       sfrst2  sw\r
+       n       spstre  w       swamp\r
+       n       spstre  nw\r
+sfrst1 n       wpstre  n\r
+       n       npstre  ne      o\r
+       n       spstre  e\r
+       n       sfrst2  se\r
+       1005    s\r
+       n       pines1  sw      w\r
+       torch   dead3   nw      swamp   in\r
+       lucifer dead3   nw      swamp   in\r
+       spark   dead3   nw      swamp   in\r
+       n       swamp1  nw      swamp   in\r
+sfrst2 n       spstre  n\r
+       n       rough   ne      o\r
+       1005    e       se      s       sw      w\r
+       n       sfrst1  nw      swamp\r
+shill1 sheep   0       n       ne      nw      o       d\r
+       n       road4   nw      n       d\r
+       n       road3   ne      o\r
+       n       shill2  e\r
+       n       smtn5   se      u\r
+       n       smtn6   s       sw      swamp\r
+       1006    w\r
+shill2 sheep   0       n       ne      e       se      nw      o       d\r
+       n       road3   n       d\r
+       n       road2   ne      o\r
+       n       briar   e\r
+       n       wfrst1  se\r
+       n       smtn3   s       swamp\r
+       n       smtn4   sw      u\r
+       n       shill1  w\r
+       n       road4   nw\r
+smtn1  sheep   0       se      s       sw      swamp   in      d       jump\r
+       n       smtn7   nw      n\r
+       n       smtn8   ne      u\r
+       n       smtn2   e       o\r
+       n       wpstre  se      s\r
+       torch   dead3   sw      swamp   in      d\r
+       lucifer dead3   sw      swamp   in      d\r
+       spark   dead3   sw      swamp   in      d\r
+       n       swamp1  sw      swamp   in      d\r
+       1009    w\r
+       n       dead1   jump\r
+smtn2  sheep   0       e       se      s       sw      swamp   d\r
+       n       smtn4   n\r
+       n       smtn3   ne      o\r
+       n       river4  e\r
+       n       npstre  se      s       d\r
+       n       wpstre  sw      swamp\r
+       n       smtn1   w\r
+       n       smtn8   nw      u\r
+smtn3  sheep   0       ne      e       se      s       swamp   o       d\r
+       n       shill2  n\r
+       n       briar   ne      o\r
+       n       wfrst1  e       d\r
+       n       river4  se\r
+       n       npstre  s       swamp\r
+       n       smtn2   sw\r
+       n       smtn4   w       nw      u\r
+smtn4  n       shill2  n       ne      o       d\r
+       n       smtn3   e       se\r
+       n       smtn2   s       swamp\r
+       n       smtn8   sw\r
+       n       smtn9   w       u\r
+       n       smtn5   nw\r
+smtn5  n       shill1  w       nw      n       d\r
+       n       shill2  ne      e       o\r
+       n       smtn4   se\r
+       n       smtn9   s       d\r
+       n       smtn6   sw      swamp\r
+smtn6  n       shill1  nw      n       d\r
+       n       smtn5   ne      o\r
+       n       smtn9   e       u\r
+       n       smtn8   se\r
+       n       smtn7   s       swamp\r
+       1006    sw      w\r
+smtn7  n       smtn6   n       ne\r
+       n       smtn8   e       o       u\r
+       n       smtn1   se      s       sw      swamp   d\r
+       1006    w       nw\r
+smtn8  n       smtn9   n       ne      u\r
+       n       smtn4   ne      e       o\r
+       n       smtn2   se      s       d\r
+       n       smtn1   sw      swamp\r
+       n       smtn7   w\r
+       n       smtn6   nw\r
+smtn9  n       smtn5   n\r
+       n       smtn4   ne      e       se      o       d\r
+       n       smtn8   s       sw      swamp\r
+       n       smtn6   w       nw\r
+spstre n       npstre  n\r
+       n       epstre  ne      o\r
+       n       rough   e\r
+       n       sfrst2  s       se      sw\r
+       n       sfrst1  w       swamp\r
+       n       wpstre  nw\r
+swamp1 1010    w       nw      n\r
+       n       smtn1   ne      u\r
+       n       wpstre  e       o\r
+       n       sfrst1  se\r
+       n       pines1  s       sw\r
+       1011    swamp\r
+       n       dead2   jump\r
+stable n       mmtn5   n\r
+       n       bank2   ne\r
+       n       bank1   e\r
+       n       start   se      s       o\r
+       n       road1   sw      swamp\r
+       n       mmtn4   w\r
+       n       mmtn9   nw      u\r
+start  n       bank1   n       ne      u\r
+       e       river1  e       o\r
+       n       efrst1  se      s       swamp   d\r
+       n       wellrm  sw\r
+       n       road1   w\r
+       n       stable  nw      in\r
+uswamp n       swamp1  o       u       swamp   in\r
+valley n       heath4  n\r
+       n       mmtn2   ne\r
+       n       mmtn3   e       u\r
+       n       road2   se      o\r
+       n       road3   s       swamp\r
+       n       road4   sw\r
+       n       nhill1  w\r
+       n       nhill2  nw\r
+wayout e       road4   e       o\r
+wellrm n       start   n       ne      o\r
+       n       efrst1  e       se\r
+       n       orchrd  s       sw      swamp\r
+       n       inn     w       in\r
+       n       road1   nw\r
+wfrst1 n       briar   n\r
+       n       yard2   ne\r
+       n       orchrd  e       o       in\r
+       n       river3  se\r
+       n       river4  s       sw      swamp\r
+       n       smtn3   w       u\r
+       n       shill2  nw\r
+wpstre n       smtn1   nw      n       u\r
+       n       smtn2   ne\r
+       n       npstre  e       o\r
+       n       spstre  se\r
+       n       sfrst1  s\r
+       n       pines1  sw\r
+       torch   dead3   w       swamp   in\r
+       lucifer dead3   w       swamp   in\r
+       spark   dead3   w       swamp   in\r
+       n       swamp1  w       swamp   in\r
+yard1  n       road1   n       ne      o\r
+       n       inn     e       in\r
+       n       yard2   se      s\r
+       n       wfrst1  sw      swamp\r
+       n       briar   w\r
+       n       road2   nw\r
+yard2  n       inn     n       in\r
+       n       wellrm  ne      e       o\r
+       n       orchrd  se      s\r
+       n       wfrst1  sw      swamp\r
+       n       briar   w\r
+       n       yard1   nw\r
+*text  1600\r
+@txttxt\r
+1001   Testing, testing, one two?\r
+       ?Illegal memory reference at user PC 100160\r
+1002   The river is flowing too fast for you to be able to cross.\r
+1003   Your way is blocked by the ornate wall.\r
+1004   You cannot move that way for the tall hedge.\r
+1005   The forest becomes too dense to move in that direction.\r
+1006   The wall is too high to climb.\r
+1007   The mountain is too steep to ascend in that direction.\r
+1008   The pines are too thick for you to go that way.\r
+1009   You can't go that way! It's an enormous cliff!\r
+1010   The swamp is too treacherous to travel in that direction.\r
+1011   You're already here! Have a look around if you don't believe me!\r
+1012   There's only one hint at the moment: it's useless asking for hints!\r
+1013   The surface of the wall is too smooth to climb.\r
+1014   Use "in" if you want to enter something, as "enter" is reserved for\r
+       entering objects within a room. At the moment, there aren't any such\r
+       objects, but the term is preserved for compatibility with MUD.\r
+1015   Use "out" if you want to leave somewhere, as "leave" is reserved for\r
+       leaving objects within a room. At the moment, there aren't any such\r
+       objects, but the term is preserved for compatibility with MUD.\r
+1016   The river's too fast to swim in, I'm afraid.\r
+1017   There's no water here!\r
+1018   You flap your wings and...nothing happens.\r
+1019   Why worship? There aren't any gods around.\r
+1020   Tap...tap...tappity-tap...\r
+1021   There aren't any trees here, and nothing else is fell-able.\r
+1022   That's the last time you'll see that! It floats off down the river\r
+       at a great speed, and fast disappears from view...\r
+1023   The object flushes away. Now where do you suppose THAT went?\r
+1024   >>>>>SPARE<<<<<\r
+1025   The water isn't deep enough to swim in.\r
+1026   The gap is too narrow, you'll have to drop everything to get through.\r
+1027   The vampire shies away from you.\r
+1028   The vampire's chilling touch makes you feel cold all over.\r
+1029   Your breath smells a bit, but it was quite tasty!\r
+1030   With a touch of annoyance, you pick it up.\r
+1031   The matchbox is now open.\r
+1032   It's already open, look at it!\r
+1033   The matchbox is now closed.\r
+1034   You can't close closed matchboxes, or is that too hard a concept for\r
+       you to grasp?\r
+1035   The match is already alight! Do something, before it goes out!\r
+1036   The match is spent, they only light the once...\r
+1037   The match bursts into flame!\r
+1038   The match isn't lit.\r
+1039   The match has gone out.\r
+1040   The stick is already alight.\r
+1041   The match isn't lit anyway.\r
+1042   The match goes out.\r
+1043   It's a safety match, you need the box.\r
+1044   The match's flame doesn't give off enough heat to do it.\r
+1045   The match is unaffected.\r
+1046   The beacon quickly catches fire, and is soon burning well.\r
+1047   It's already lit...sigh.\r
+1048   The match won't light anything as large as a beacon.\r
+1049   When you light the last unlit beacon, a great thrill runs through\r
+       your body at the magnificence of it all.\r
+1050   It doesn't work me old mate.\r
+1051   You'd set fire to the container!\r
+1052   The match and matchbox burn away.\r
+1053   The matchbox is closed, how do you expect to put anything in it? Let\r
+       me guess - you're thick.\r
+1054   The beacon isn't alight, chum.\r
+1055   The beacon is too hot to get close enough to light anything, although\r
+       you could perhaps be able to stand a stick held at arm's length.\r
+1056   You can't get close enough to the beacon to douse it, it's too hot.\r
+1057   It's not alight anyway.\r
+1058   The matchbox is closed, open it to empty it.\r
+1059   The matchbox is closed, open it if you want to remove something.\r
+1060   OK, so you know all the nursery rhymes...\r
+1061   The troll reels back in terror as you brandish your brand, but it's\r
+       too late and your strike scorches deep into its flesh.\r
+1062   It's just BEEN sheared, it's got no wool on!\r
+1063   The ram wants nothing to do with the silver fleece.\r
+1064   The fleece glows a white light for an instant, then transmutes to\r
+       silver! Naturally you remove it from the ram as soon as this happens,\r
+       about which the ram seems relieved.\r
+1065   You swat the butterfly stone dead, but it disintigrates in the process.\r
+       Don't be TOO upset, they don't live that long anyway!\r
+1066   >>>>>SPARE<<<<<\r
+1067   The trees are unclimbable, even the ones that aren't too tall are still\r
+       too branchy.\r
+1068   The troll won't let you near it, it's prepared to kill rather than\r
+       give up its treasure!\r
+1069   The cat doesn't want to be picked up, and successfully avoids your\r
+       attempts to do so.\r
+1070   Nope, it's too prickly.\r
+1071   A crossbow bolt thuds into your chest!\r
+1072   It's already loaded! They only take one bolt at a time, you know...\r
+1073   The crossbow is now loaded.\r
+1074   The crossbow can only be loaded with quarrels. If you've got one, why\r
+       not try loading it with that?\r
+1075   The bolt is in too tight to unload the crossbow, you'll have to shoot\r
+       it at something or someone to get it out.\r
+1076   It already is unloaded, don't you believe the descriptions you're given?\r
+1077   You score a direct hit!\r
+1078   The crossbow misfires and embeds the bolt deep in the ground where you\r
+       can't recover it.\r
+1079   It's not loaded...\r
+1080   Your crossbow jams when you aim at your target. Who says black cats\r
+       aren't lucky?\r
+1081   You score a direct hit, but it has no effect on the undead!\r
+1082   It's too small, you miss...\r
+1083   You can only shoot targets in the same room as you, the crossbow is only\r
+       effective over short ranges.\r