From 718b6720318ed6f7de3e0e356d74d9aad4e40ff6 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sat, 14 Jan 2017 19:32:39 +0100 Subject: [PATCH 1/1] Source files from Richard Bartle. --- DBADAT.MAC | 103 + DBASE.BCL | 1732 +++++++++++ DUNGEN.GET | 885 ++++++ MBOOTS.MAC | 1107 +++++++ MUD.BOX | 321 ++ MUD.SUB | 19 + MUD.TXT | 8810 ++++++++++++++++++++++++++++++++++++++++++++++++++++ MUD0.BCL | 157 + MUD1.BCL | 465 +++ MUD2.BCL | 463 +++ MUD3.BCL | 344 ++ MUD4.BCL | 245 ++ MUD5.BCL | 2068 ++++++++++++ MUD6.BCL | 674 ++++ MUD7.BCL | 413 +++ MUD8.BCL | 828 +++++ MUDLIB.BCL | 2172 +++++++++++++ MUDLIB.GET | 632 ++++ MUDTXT.SUB | 18 + TXTBTM.GET | 475 +++ TXTCBT.GET | 260 ++ TXTCSY.GET | 8 + TXTDAC.GET | 56 + TXTDMN.GET | 32 + TXTHRS.GET | 24 + TXTLEV.GET | 21 + TXTMAP.GET | 15 + TXTMTN.GET | 88 + TXTOBJ.GET | 63 + TXTOSY.GET | 44 + TXTRMS.GET | 22 + TXTTOP.GET | 91 + TXTTXT.GET | 285 ++ TXTVOC.GET | 37 + VALLEY.TXT | 1715 ++++++++++ 35 files changed, 24692 insertions(+) create mode 100644 DBADAT.MAC create mode 100644 DBASE.BCL create mode 100644 DUNGEN.GET create mode 100644 MBOOTS.MAC create mode 100644 MUD.BOX create mode 100644 MUD.SUB create mode 100644 MUD.TXT create mode 100644 MUD0.BCL create mode 100644 MUD1.BCL create mode 100644 MUD2.BCL create mode 100644 MUD3.BCL create mode 100644 MUD4.BCL create mode 100644 MUD5.BCL create mode 100644 MUD6.BCL create mode 100644 MUD7.BCL create mode 100644 MUD8.BCL create mode 100644 MUDLIB.BCL create mode 100644 MUDLIB.GET create mode 100644 MUDTXT.SUB create mode 100644 TXTBTM.GET create mode 100644 TXTCBT.GET create mode 100644 TXTCSY.GET create mode 100644 TXTDAC.GET create mode 100644 TXTDMN.GET create mode 100644 TXTHRS.GET create mode 100644 TXTLEV.GET create mode 100644 TXTMAP.GET create mode 100644 TXTMTN.GET create mode 100644 TXTOBJ.GET create mode 100644 TXTOSY.GET create mode 100644 TXTRMS.GET create mode 100644 TXTTOP.GET create mode 100644 TXTTXT.GET create mode 100644 TXTVOC.GET create mode 100644 VALLEY.TXT diff --git a/DBADAT.MAC b/DBADAT.MAC new file mode 100644 index 0000000..b13f51b --- /dev/null +++ b/DBADAT.MAC @@ -0,0 +1,103 @@ +;Copyright (C) 1980 by +;Roy Trubshaw, Richard Bartle & Ronan Flood, +;Essex University, Colchester. CO4 3SQ. +; +; This software is furnished on the understanding that +;it may be used and or copied only with the inclusion of this +;notice. No title or ownership of this software is hereby +;transferred. The information in this software is subject to +;change without notice. No responsibility is assumed for the +;use or reliability of this software. + + TITLE Database for MUD version 3 + TWOSEG 400K + SALL + .DIRECTIVE SFCOND + NOSYM + + MAXPLY==^D36 + + IF2 + + DEFINE FLIST(SIZE,NUM)< + EXP .+1 + REPEAT NUM-1,< + EXP .+SIZE + BLOCK SIZE-1> + BLOCK SIZE> + + DEFINE VEC(SIZE,VALUE<0>)< + EXP .+1 + IFE VALUE, + IFN VALUE, >> + +STARTL::EXP . ;Address of start of database. +INDEX:: EXP 0 ;Room index. +DICTIO::BLOCK 1 ;Dictionary hash table. +STLIST::BLOCK 1 ;Pointer to start location list. +MAX.RO::BLOCK 1 ;Max number of rooms. +MAX.DE::BLOCK 1 ;Max number of demons. +DEMONS::BLOCK 1 ;Table of demons +GDEMON::EXP 0 ;List of global demons +DATE:: BLOCK 1 ;DECsystem 10 date of creation. +RDATE:: EXP 0 ;DECsystem 10 date of last reset +RHOURS::EXP 0 ;Accumulated time since last Reset +RNDMS:: EXP 0 ;List of room lists for randomisation +FTIME:: EXP 0 ;First time played this version? +TIME:: BLOCK 1 ;DECsystem 10 time of creation. +BACKWD::BLOCK 1 ;Says if a direction has an opposite +TVERB:: BLOCK 1 ;movement check word +NAPCT:: 0 ;number of naps before assume crash +SUPERS::0 ;whether this is superseded by us or not +DEMO:: 0 ;is there a demo on? +RANDIR::0 ;random directions in travel table +CODES:: BLOCK 1 ;vdu manipulation codes. +LOW1:: EXP 0 ;overload measure +LOW2:: EXP 0 ;near-overload measure +TIMES:: EXP .+1 ;vector of lists of playing times + BLOCK 7 +MOTVEC:: BLOCK 1 ;Inverse movement no. to names +MOVERS:: BLOCK 1 ;Objects which are mobile +MVLOCK:: EXP -1 ;So don't try to move above twice at once +DELOCK:: EXP -1 ;Global demon lock +MELTED:: EXP -1 ;Whether objects can move +PEACE:: EXP 0 ;whether can fight or not +SPECT:: EXP 0 ;whether there's a spectacular on +MALE:: VEC ^D10 ;names for males + ;I bet I forget to alter with MAX.LEVEL... +FEMALE:: VEC ^D10 ;names for females +MUDNAM:: BLOCK ^D27 ;Name of dungeon as BCPL string +MUD6:: EXP 0 ;first 6 letters of above in 6bit +ESXWD:: BLOCK 1 ;memory location for manifest ESSEX constant +PS6:: BLOCK 1 ;first 6 letters of persona file +MAX.ME::BLOCK 1 ;Max number of text messages. +TEXT:: BLOCK 1 ;Table of text messages. +TXTVEC:: BLOCK 1 ;Word count for disc file +INIDR:: EXP -1 ;Initialisation door. +DELDR:: EXP -1 ;Delay door for timing out. +ACTIVE::VEC MAXPLY, -1 ;To ensure you're still playing +PLAYER::EXP -1 ;Stack pointer. + COUNT==MAXPLY+2 ;2 is the frig factor! +PLYNUM::VEC MAXPLY, <> + PURGE COUNT +MQUEUE::VEC MAXPLY ;Message queue. +PNAMES::VEC MAXPLY ;Player names. +JOBNOS::VEC MAXPLY ;Player job numbers. Forget locking it... +KIPS:: VEC MAXPLY ;Times at which people went to sleep. +QDOORS::VEC MAXPLY, -1 ;Doors to message queues. +PDOOR:: EXP -1 ;persona file door +MDOOR:: EXP -1 ;Door to message freelist. +NDOOR:: EXP -1 ;Door to name selection +TABS:: VEC ^D24 ;Combat tables +SHELF:: EXP 0 ;Shelf for arch-wiz items +SHORTM::FLIST 3, 200 ;Short message freelist. +LONGME::FLIST 20, 100 ;Long message freelist. +%RANSE::XWD 1, -1 ;Random number seed. +MAGIC:: EXP 0 ;If non zero u get thrown out. +NOWIZ:: EXP 0 ;true if no wiz's allowed +LOCKED::EXP 0 ;Whether the game is wizard-locked or not +ENDLOC::EXP HERE/^D512 ;Current page +FREE.S::EXP .+1 ;Freestore pointer + BLOCK 1 +HERE==. +END diff --git a/DBASE.BCL b/DBASE.BCL new file mode 100644 index 0000000..4a46301 --- /dev/null +++ b/DBASE.BCL @@ -0,0 +1,1732 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "bcl:acs" +get "bcl:rfs" +get "bcl:iolib" +get "dungen" +get "bcl:bits" +get "bcl:kernel" +get "bcl:jobdat" + +$ldtext "/runame:dbase" + +manifest +$( MSLEN = 127 + SCRSIZ = WDSPERBUF +$) + +STATIC +$( procs = vec S.TEXT + name.string = vec 26 + res = vec HASHSIZE + cbl = vec 1 + roomput = false + textput = false + objput = false + mapput = false + comput = false + cmndput = false + getput = 0 + nextroom = 0 + nexttext = 0 + nextcombat = 0 + nextobj = 1 //a hack... + nextmap = 1 //ditto + nextcmnd = 1 //ditto again! + filename = ? + scanch = 0 + mvec = vec 36 + scan.info = 0 + roomlist = ? + forward.ref = 0 + rmfwdref = 0 + list = (table #777777) + reserved = (TABLE + "richard", -1, 0, 0, + "roy", -1, 0, 0, + "ronan", -1, 0, 0, + "brian", -1, 0, 0, + "debugger", -1, 0, 0, + "rooms", S.ROOMS, 0, 0, + "vocabulary", S.VOCAB, 0, 0, + "travel", S.TRAVEL, 0, 0, + "objects", S.OBJECT, 0, 0, + "object", S.OBJECT, 0, 0, + "maps", S.MAP, 0, 0, + "map", S.MAP, 0, 0, + "hours", S.HOURS, 0, 0, + "combat", S.COMBAT, 0, 0, + "persona", S.PERSONA, 0, 0, + "text", S.TEXT, 0, 0, + "levels", S.LEVELS, 0, 0, + "demons", S.DEMONS, 0, 0, + "demon", S.DEMONS, 0, 0, + "name", S.MUDNAM, 0, 0, + "light", S.ATTR, 0, B35, + "water", S.ATTR, 0, B34, + "oil", S.ATTR, 0, B33, + "death", S.ATTR, 0, B32, + "sanctuary", S.ATTR, 0, B31, + "hideaway", S.ATTR, 0, B30, + "small", S.ATTR, 0, B29, + "chain", S.ATTR, 0, B28, + "hide", S.ATTR, 0, B27, + "dmove", S.ATTR, 0, B26, + "nolook", S.ATTR, 0, B25, + "silent", S.ATTR, 0, B24, + "startrm", S.ATTR, 0, B23, + "motion", S.MOTION, 0, 0, + "action", S.ACTION, 0, 0, + "fastatn", S.FASTATN, 0, 0, + "male", S.MALE, 0, 0, + "female", S.FEMALE, 0, 0, + "class", S.CLASS, 0, 0, + "bright", S.BRIGHT, 0, 0, + "noget", S.NOGET, 0, 0, + "contains", S.CONTAINS, 0, 0, + "transparent", S.TRANSPARENT, 0, 0, + "opened", S.OPENED, 0, 0, + "noit", S.NOIT, 0, 0, + "nosummon", S.NOSUMMON, 0, 0, + "always", S.ALWAYS, 0, 0, + "global", S.GLOBAL, 0, 0, + "enabled", S.ENABLED, 0, 0, + "disguised", S.DISGUISED, 0, 0, + "syn", S.SYN, 0, 0, + "synonym", S.SYN, 0, 0, + "noise", S.NOISE, 0, 0, + "conj", S.CONT, 0, 0, + "fprep", S.WITH, 0, 0, + "bprep", S.AT, 0, 0, + "quant", S.ALL, 0, 0, + "pron", S.IT, 0, 0, + "mpron", S.HIM, 0, 0, + "fpron", S.HER, 0, 0, + "ppron", S.THEM, 0, 0, + "place", S.THERE, 0, 0, + "self", S.ME, 0, 0, + "inst", S.WHICHEVER, 0, 0, + "universal", S.SPECIAL, 0, 0, + "noclass", S.NONE, 0, 0, + "persn", S.PERSON, #777777, 0, + "sthing", S.SOMETHING, #777776, 0, + "athing", S.ANYTHING, #777775, 0, + ".tell", S.SFUNC, SF.TELL, 0, + ".say", S.SFUNC, SF.SAY, 0, + ".get", S.SFUNC, SF.GET, 0, + ".drop", S.SFUNC, SF.DROP, 0, + ".kill", S.SFUNC, SF.KILL, 0, + ".quit", S.SFUNC, SF.QUIT, 0, + ".score", S.SFUNC, SF.SCRE, 0, + ".look", S.SFUNC, SF.LOOK, 0, + ".log", S.SFUNC, SF.LOG, 0, + ".inven", S.SFUNC, SF.INVN,0, + ".debug", S.SFUNC, SF.DBUG,0, + ".make", S.SFUNC, SF.FRCE, 0, + ".summon", S.SFUNC, SF.SUMMON, 0, + ".fod", S.SFUNC, SF.FOD, 0, + ".go", S.SFUNC, SF.GO, 0, + ".sget", S.SFUNC, SF.SGET, 0, + ".sgo", S.SFUNC, SF.SGO, 0, + ".back", S.SFUNC, SF.BACK, 0, + ".bug", S.SFUNC, SF.BUG, 0, + ".who", S.SFUNC, SF.WHO, 0, + ".autowho", S.SFUNC, SF.AUTOWHO, 0, + ".quickwho", S.SFUNC, SF.QUICKWHO, 0, + ".reset", S.SFUNC, SF.RESET, 0, + ".rooms", S.SFUNC, SF.ROOMS, 0, + ".berserk", S.SFUNC, SF.BERSERK, 0, + ".weigh", S.SFUNC, SF.WEIGH, 0, + ".value", S.SFUNC, SF.VALUE, 0, + ".ctrap", S.SFUNC, SF.CTRAP, 0, + ".follow", S.SFUNC, SF.FOLLOW, 0, + ".lose", S.SFUNC, SF.LOSE, 0, + ".begone", S.SFUNC, SF.BEGONE, 0, + ".demo", S.SFUNC, SF.DEMO, 0, + ".laugh", S.SFUNC, SF.LAUGH, 0, + ".provoke", S.SFUNC, SF.PROVOKE, 0, + ".purge", S.SFUNC, SF.PURGE, 0, + ".save", S.SFUNC, SF.SAVE, 0, + ".assist", S.SFUNC, SF.JOIN, 0, + ".refuse", S.SFUNC, SF.REFUSE, 0, + ".set", S.SFUNC, SF.SET, 0, + ".password", S.SFUNC, SF.PASSWORD, 0, + ".snoop", S.SFUNC, SF.SNOOP, 0, + ".p", S.SFUNC, SF.P, 0, + ".unveil", S.SFUNC, SF.UNVEIL, 0, + ".unsnoop", S.SFUNC, SF.UNSNOOP, 0, + ".direct", S.SFUNC, SF.DIRECT, 0, + ".where", S.SFUNC, SF.WHERE, 0, + ".brief", S.SFUNC, SF.BRIEF, 0, + ".ignore", S.SFUNC, SF.IGNORE, 0, + ".verbose", S.SFUNC, SF.VERBOSE, 0, + ".flee", S.SFUNC, SF.FLEE, 0, + ".diagnose", S.SFUNC, SF.DIAGNOSE, 0, + ".blind", S.SFUNC, SF.blind, 0, + ".deafen", S.SFUNC, SF.deafen, 0, + ".dumb", S.SFUNC, SF.dumb, 0, + ".paralyse", S.SFUNC, SF.paralyse, 0, + ".cure", S.SFUNC, SF.cure, 0, + ".exorcise", S.SFUNC, SF.EXORCISE, 0, + ".freeze", S.SFUNC, SF.FREEZE, 0, + ".unfreeze", S.SFUNC, SF.UNFREEZE, 0, + ".mobile", S.SFUNC, SF.MOBILE, 0, + ".humble", S.SFUNC, SF.HUMBLE, 0, + ".proof", S.SFUNC, SF.PROOF, 0, + ".shelve", S.SFUNC, SF.SHELVE, 0, + ".unshelve", S.SFUNC, SF.UNSHELVE, 0, + ".invis", S.SFUNC, SF.INVIS, 0, + ".vis", S.SFUNC, SF.VIS, 0, + ".peace", S.SFUNC, SF.PEACE, 0, + ".war", S.SFUNC, SF.WAR, 0, + ".haste", S.SFUNC, SF.HASTE, 0, + ".stamina", S.SFUNC, SF.STAMINA, 0, + ".sleep", S.SFUNC, SF.SLEEP, 0, + ".flush", S.SFUNC, SF.FLUSH, 0, + ".wake", S.SFUNC, SF.WAKE, 0, + ".change", S.SFUNC, SF.CHANGE, 0, + ".enchant", S.SFUNC, SF.ENCHANT, 0, + ".police", S.SFUNC, SF.POLICE, 0, + ".resurrect", S.SFUNC, SF.RESURRECT, 0, + ".keep", S.SFUNC, SF.KEEP, 0, + ".unkeep", S.SFUNC, SF.UNKEEP, 0, + ".attach", S.SFUNC, SF.ATTACH, 0, + ".detach", S.SFUNC, SF.DETACH, 0, + ".insert", S.SFUNC, SF.INSERT, 0, + ".remove", S.SFUNC, SF.REMOVE, 0, + ".pronouns", S.SFUNC, SF.PRONOUNS, 0, + ".hours", S.SFUNC, SF.HOURS, 0, + ".newhours", S.SFUNC, SF.NEWHOURS, 0, + ".spectacular", S.SFUNC, SF.SPECTACULAR, 0, + ".empty", S.SFUNC, SF.EMPTY, 0, + ".bye", S.SFUNC, SF.BYE, 0, + ".time", S.SFUNC, SF.TIME, 0, + ".crash", S.SFUNC, SF.CRASH, 0, + ".map", S.SFUNC, SF.MAP, 0, + ".exits", S.SFUNC, SF.EXITS, 0, + ".converse", S.SFUNC, SF.CONVERSE, 0, + "inc", S.AFUNC, F.INC, 0, + "dec", S.AFUNC, F.DEC, 0, + "null", S.AFUNC, F.NULL, 0, + "move", S.AFUNC, F.MOVE, 0, + "trans", S.AFUNC, F.TRANS,0, + "set", S.AFUNC, F.SET, 0, + "resetdest", S.AFUNC, F.RESETDEST, 0, + "toggle", S.AFUNC, F.TOGGLE, 0, + "fix", S.AFUNC, F.FIX, 0, + "float", S.AFUNC, F.FLOAT,0, + "destroy", S.AFUNC, F.DESTROY, 0, + "create", S.AFUNC, F.CREATE, 0, + "forrot", S.AFUNC, F.FORROT, 0, + "backrot", S.AFUNC, F.BACKROT, 0, + "expinc", S.AFUNC, F.EXPINC, 0, + "expset", S.AFUNC, F.EXPSET, 0, + "holdfirst", S.AFUNC, F.HOLDFIRST, 0, + "holdlast", S.AFUNC, F.HOLDLAST, 0, + "flipat", S.AFUNC, F.FLIPAT, 0, + "retal", S.AFUNC, F.RETALIATE, 0, + "ifzero", S.AFUNC, F.IFZERO, 0, + "testsex", S.AFUNC, F.TESTSEX, 0, + "ifobjcount", S.AFUNC, F.IFOBJCOUNT, 0, + "ifprop", S.AFUNC, F.IFPROP, 0, + "ifpropinc", S.AFUNC, F.IFPROPINC, 0, + "ifpropdec", S.AFUNC, F.IFPROPDEC, 0, + "ifrprop", S.AFUNC, F.IFRPROP, 0, + "ifrlevel", S.AFUNC, F.IFRLEVEL, 0, + "ifr", S.AFUNC, F.IFR, 0, + "noifr", S.AFUNC, F.NOIFR, 0, + "ifberserk", S.AFUNC, F.IFBERSERK, 0, + "unlessberserk", S.AFUNC, F.UNLESSBERSERK, 0, + "ifwiz", S.AFUNC, F.IFWIZ, 0, + "ifill", S.AFUNC, F.IFILL, 0, + "unlessill", S.AFUNC, F.unlessILL, 0, + "ifdeaf", S.AFUNC, F.IFDEAF, 0, + "ifblind", S.AFUNC, F.IFblind, 0, + "ifparalysed", S.AFUNC, F.IFparalysed, 0, + "ifdumb", S.AFUNC, F.IFdumb, 0, + "unlesswiz", S.AFUNC, F.UNLESSWIZ, 0, + "unlessrlevel", S.AFUNC, F.UNLESSRLEVEL, 0, + "flush", S.AFUNC, F.FLUSH, 0, + "unlessprop", S.AFUNC, F.UNLESSPROP, 0, + "incdestroy", S.AFUNC, F.INCDESTROY, 0, + "destroytrans", S.AFUNC, F.DESTROYTRANS, 0, + "floatdestroy", S.AFUNC, F.FLOATDESTROY, 0, + "decdestroy", S.AFUNC, F.DECDESTROY, 0, + "destroydec", S.AFUNC, F.DESTROYDEC, 0, + "decifzero", S.AFUNC, F.DECIFZERO, 0, + "swap", S.AFUNC, F.SWAP, 0, + "unlessin", S.AFUNC, F.UNLESSIN, 0, + "unlessobjis", S.AFUNC, F.UNLESSOBJIS, 0, + "ifobjis", S.AFUNC, F.IFOBJIS, 0, + "unlessinsis", S.AFUNC, F.UNLESSINSIS, 0, + "ifinsis", S.AFUNC, F.IFINSIS, 0, + "unlessobjplayer", S.AFUNC, F.UNLESSOBJPLAYER, 0, + "ifobjplayer", S.AFUNC, F.IFOBJPLAYER, 0, + "ifsmall", S.AFUNC, F.IFSMALL, 0, + "unlesssmall", S.AFUNC, F.UNLESSSMALL, 0, + "testsmall", S.AFUNC, F.TESTSMALL, 0, + "transwhere", S.AFUNC, F.TRANSWHERE, 0, + "ifin", S.AFUNC, F.IFIN, 0, + "exp", S.AFUNC, F.EXP, 0, + "stamina", S.AFUNC, F.STAMINA, 0, + "staminadestroy", S.AFUNC, F.STAMINADESTROY, 0, + "loseexp", S.AFUNC, F.LOSEEXP, 0, + "losestamina", S.AFUNC, F.LOSESTAMINA, 0, + "injure", S.AFUNC, F.INJURE, 0, + "writein", S.AFUNC, F.WRITEIN, 0, + "enable", S.AFUNC, F.ENABLE, 0, + "suspend", S.AFUNC, F.SUSPEND, 0, + "delaymove", S.AFUNC, F.DELAYMOVE, 0, + "disenable", S.AFUNC, F.DISENABLE, 0, + "unlessdisenable", S.AFUNC, F.UNLESSDISENABLE, 0, + "ifdisenable", S.AFUNC, F.IFDISENABLE, 0, + "ifenabled", S.AFUNC, F.IFENABLED, 0, + "unlessenabled", S.AFUNC, F.UNLESSENABLED, 0, + "unlessgot", S.AFUNC, F.UNLESSGOT, 0, + "ifgot", S.AFUNC, F.IFGOT, 0, + "ifdead", S.AFUNC, F.IFDEAD, 0, + "unlessdestroyed", S.AFUNC, F.UNLESSDESTROYED, 0, + "ifdestroyed", S.AFUNC, F.IFDESTROYED, 0, + "ifsnooping", S.AFUNC, F.IFSNOOPING, 0, + "unlesssnooping", S.AFUNC, F.UNLESSSNOOPING, 0, + "iffighting", S.AFUNC, F.IFFIGHTING, 0, + "unlessfighting", S.AFUNC, F.UNLESSFIGHTING, 0, + "ifpropdestroy", S.AFUNC, F.IFPROPDESTROY, 0, + "unlesspropdestroy", S.AFUNC, F.UNLESSPROPDESTROY, 0, + "unlessdead", S.AFUNC, F.UNLESSDEAD, 0, + "ifweighs", S.AFUNC, F.IFWEIGHS, 0, + "unlessweighs", S.AFUNC, F.UNLESSWEIGHS, 0, + "ifhave", S.AFUNC, F.IFHAVE, 0, + "unlesshave", S.AFUNC, F.UNLESSHAVE, 0, + "ifobjcontains", S.AFUNC, F.IFOBJCONTAINS, 0, + "unlessobjcontains", S.AFUNC, F.UNLESSOBJCONTAINS, 0, + "iflevel", S.AFUNC, F.IFLEVEL, 0, + "unlesslevel", S.AFUNC, F.UNLESSLEVEL, 0, + "ifplaying", S.AFUNC, F.IFPLAYING, 0, + "unlessplaying", S.AFUNC, F.UNLESSPLAYING, 0, + "ifself", S.AFUNC, F.IFSELF, 0, + "destroydestroy", S.AFUNC, F.DESTROYDESTROY, 0, + "ifinc", S.AFUNC, F.IFINC, 0, + "unlessinc", S.AFUNC, F.UNLESSINC, 0, + "expdestroy", S.AFUNC, F.EXPDESTROY, 0, + "expmove", S.AFUNC, F.EXPMOVE, 0, + "incmove", S.AFUNC, F.INCMOVE, 0, + "destroyinc", S.AFUNC, F.DESTROYINC, 0, + "transhere", S.AFUNC, F.TRANSHERE, 0, + "iflight", S.AFUNC, F.IFLIGHT, 0, + "ifsex", S.AFUNC, F.IFSEX, 0, + "ifinvis", S.AFUNC, F.IFINVIS, 0, + "ifasleep", S.AFUNC, F.IFASLEEP, 0, + "ifrstas", S.AFUNC, F.IFRSTAS, 0, + "unlessrstas", S.AFUNC, F.UNLESSRSTAS, 0, + "emotion", S.AFUNC, F.EMOTION, 0, + "zonk", S.AFUNC, F.ZONK, 0, + "dead", S.AFUNC, F.DEAD, 0, + "send", S.AFUNC, F.SEND, 0, + "sendeffect", S.AFUNC, F.SENDEFFECT, 0, + "sendmess", S.AFUNC, F.SENDMESS, 0, + "sendlevel", S.AFUNC, F.SENDLEVEL, 0, + "hurt", S.AFUNC, F.HURT, 0, + "sendemon", S.AFUNC, F.SENDEMON, 0, + "ssendemon", S.AFUNC, F.SSENDEMON, 0, + "incdec", S.AFUNC, F.INCDEC, 0, + "decinc", S.AFUNC, F.DECINC, 0, + "incsend", S.AFUNC, F.INCSEND, 0, + "ifhere", S.AFUNC, F.IFHERE, 0, + "ifheretrans", S.AFUNC, F.IFHERETRANS, 0, + "unlesshere", S.AFUNC, F.UNLESSHERE, 0, + "setsex", S.AFUNC, F.SETSEX, 0, + "togglesex", S.AFUNC, F.TOGGLESEX, 0, + "destroytogglesex", S.AFUNC, F.DESTROYTOGGLESEX, 0, + "destroycreate", S.AFUNC, F.DESTROYCREATE, 0, + "destroyset", S.AFUNC, F.DESTROYSET, 0, + "setdestroy", S.AFUNC, F.SETDESTROY, 0, + "setfloat", S.AFUNC, F.SETFLOAT, 0, + "n", S.TCOND, 0, 0, + "none", S.TCOND, 0, 0, + "e", S.TCOND, -1, 0, + "empty", S.TCOND, -1, 0, + "f", S.FORCED, 0, 0, + "forced", S.FORCED, 0, 0, + "d", S.DIFF, 0, 0, + "different", S.DIFF, 0, 0, + "dd", S.DD, 0, 0, + -1) +//Flags + class = 0 + mtion = 0 + object = 0 + roomflg = 0 + vocabflg = 0 + travelflg = 0 + objectflg = 0 + mapflg = 0 + hrflg = 0 + cmflg = 0 + psflg = 0 + textflg = 0 + levelsflg = 0 + demonsflg = 0 + fast = 0 +$) + +let start() be +$( let scan,save=?,? + initialise() + $( scan:=scanner() + switchon scan into + $( case S.ROOMS ... S.TEXT: + save:=free.space + out("*C*L:S ",scan.info) + (scan!procs)() + out("used :N",free.space-save) + endcase + case S.EOF: + date:=valof $[ $DATE AC, 0 $] + time:=valof $[ $MSTIME AC, 0 $] + break + case S.MUDNAM: + unless scanner()=S.NAME error("illegal name for dungeon") + for i=0 to 26 do (@mudnam)!i:=scan.info!i + mudnam bitand:=#776777777777 + for i=1 to 6 do + $( let letter=(selector 7:29-((7*i) rem 35):i/5) + mud6:=(mud6<<6)+(letter of (@mudnam)->(((letter of (@mudnam)) bitand \#40)-#40),0) + $) + unless mud6 = filename error("Name in **name section :6 not same as .txt file :6*C*L", mud6, filename) + endcase + default: + error("Unknown database section :s",scan.info) + $) + $) repeat + finalise() +$) +and load.rooms() be +$( let room,attribute,start.list,count=?,?,0,0 + checkflag(@roomflg,"Duplicate rooms sections") + unless scanner()=S.NUMBER error("No size given in rooms section") + max.room.no:=scan.info + index:=highvec(HASHSIZE) + unless fast writes(tty, "*C*L0") + for i=1 to max.room.no do + $( unless scanner()=S.NAME error("Not enough room names") + unless fast write(tty,"*C:n",i) + room:=find.room(scan.info,true) + LH of room:=highvec(ROOMSIZE) + init.room(LH of room,RNAME of room) + room:=LH of room + RNUMB of room:=i + while scanch='*T' do + $( unless scanner()=S.NAME error("No name read") + attribute:=checklook.up(scan.info,S.ATTR,"Unknown attribute read :s") + ATTRIB of room bitor_INFO of attribute + if INFO of attribute=A.START + $( let temp=newvec(0) + RH of temp_start.list + LH of temp_room + start.list_temp + $) + if INFO of attribute=A.CHAIN + $( let leavec = highvec(LEAVESIZE) + unless scanner()=S.NAME error("nothing to chain to in [:6]",!room) + INVADE of leavec _ copy(name.string) + unless scanner()=S.NAME error("no room to chain to in [:6]",!room) + BCHEAD of leavec _ copy(name.string) + LEAVE of room_leavec + $) + if INFO of attribute=A.DMOVE + $( let nd,sv,len=?,?,? + unless scanner()=S.NAME error("no room to dmove things to in [:6]",!room) + len_LENGTH of scan.info/5 + nd_newvec(len+1) + sv_nd+1 + for i=0 to len sv!i_scan.info!i + LH of nd_room + LINK of nd_rmfwdref + rmfwdref_nd + $) + $) + startlinech() + TITLE of room_nextroom + if scanch='*T' transfer.dsk(@nextroom, roomput, TITLE, room,true) + ROOMWD of room_nextroom + transfer.dsk(@nextroom, roomput) + $) + while rmfwdref do + $( let rm,linker=find.room(rmfwdref+1),LINK of rmfwdref + unless rm error("forward reference for DMOVE in [:6] not satisfied",LH of rmfwdref) + DMOVE of LH of rmfwdref_LH of rm + free(rmfwdref) + rmfwdref_linker + $) + stlist,count_highvec(0),0 + while start.list + $( let temp=start.list + count+_1 + !highvec(0)_LH of start.list + start.list of_ RH + free(temp) + $) + !stlist_count //Number of random starts stored first + unless count error("No START locations defined") + unless fast writes(tty," = last room number*C*L") +$) + +and load.vocab() be +$( let word,type,word1,temp,oldword=0,0,0,0,? + checkflag(@vocabflg,"Duplicate vocabulary section") + startlinech() scan.info:=0 + $( unless scanch='*T' then + $( unless scanner()=S.NAME error("No vocabulary type") + type:=look.up(scan.info) + $) + unless type test scan.info then error("Unknown vocabulary type [:s]",scan.info) + or error("No vocabulary type given at start of section") + unless scanner(true)=S.NAME error("No vocabulary word") + oldword_(PTYPE of type=S.ACTION) -> find.word(scan.info,S.FASTATN), 0 //Check it's a fast action verb. + word:=oldword -> oldword, find.word(scan.info,PTYPE of type,true) + switchon PTYPE of type into + $( case S.MOTION: + mtion+:1 + mvec!mtion_PNAME of word + DREC of word:=mtion + (byte 1:mtion) from backword_FIRSTCH of scan.info ne '$' + case S.NOISE: + case S.CONT: + case S.WITH: + case S.AT: + case S.ALL: + case S.IT: + case S.HIM: + case S.HER: + case S.THEM: + case S.THERE: + case S.ME: + case S.WHICHEVER: + endcase + case S.NONE: + PTYPE of word_S.CLASS + endcase + case S.PERSON: + case S.SOMETHING: + case S.ANYTHING: + DREC of word_P1 of type + endcase + case S.CLASS: + class+:1 + DREC of word:=class + endcase + case S.SYN: + scanner(true) + word1:=checkfind.word(scan.info,0,"Unknown synonym given [:s]") + PTYPE of word:=PTYPE of word1 + DREC of word_valof + $( switchon PTYPE of word into + $( case S.OBJECT: + $( let drc,sptr=DREC of word1,newvec(0) + LINK of sptr_D7 of drc + D7 of drc_sptr + LH of sptr_word + resultis -1 + $) + case S.ACTION: case S.FASTATN: + SYN of word_true + if SYN of word1 word1 of_ DREC //Each synonym points to the actual verb + resultis word1 + default: + resultis DREC of word1 + $) + $) + endcase + case S.OBJECT: + object+:1 + temp:=appenddr(word,newvec(ODRSIZE)) + D1 of temp:=object + scanner() + word1:=checkfind.word(scan.info,S.CLASS,"Word after object not a class [:s]") + D2 of temp:=DREC of word1 + unless scanner()=S.NUMBER error("No weight for object [:s]",PNAME of object) + D3 of temp:=scan.info + unless scanner()=S.NUMBER error("No value for object [:s]",PNAME of object) + D4 of temp:=scan.info + D7 of temp_0 + endcase + case S.FASTATN: + if find.word(PNAME of word,S.ACTION) error("Action already defined as a slow action [:s].",PNAME of word) + SAVED of word_true //Don't need to save it to disc. + endcase + case S.ACTION: + SYN of word_false //not an action synonym. + temp:=appenddr(word,PTYPE of word=S.ACTION->newvec(DRSIZE),highvec(DRSIZE)) + for i=0 to DRSIZE temp!i_0 + test scanner()=S.DOTNAME then + $( word1:=checklook.up(scan.info,S.SFUNC,"unknown Special function [:s]") + D7 of temp:=P1 of word1 + scanner() + $) or D7 of temp:=SF.ACTION + word1:=checkfind.word(scan.info,S.CLASS,"word not a class [:s]") + D1 of temp:=DREC of word1 + test scanner() = S.NUMBER then D2 of temp_scan.info + #400000 or + $( word1:=checkfind.word(scan.info,S.CLASS,"Word not a class [:s]") + D2 of temp:=DREC of word1 + $) + scanner() + word1:=checklook.up(scan.info,S.AFUNC,"Unknown action function [:s]") + D3 of temp:=P1 of word1 + unless scanner() = S.NAME then error("object expected after action function") + test seq(scan.info,"null") \/ seq(scan.info, "first") then D6 of temp:=0 or + test seq(scan.info,"second") then D6 of temp_-1 or + $( let note=newvec(1) + D6 of temp_checkfind.word(scan.info, S.OBJECT, "Unknown object after function [:s]") + !note_forward.ref + 1!note_temp + forward.ref_RH from note + $) + if scanner()=S.NAME then + $( word1:=checkfind.room(scan.info,"Unknown room specified [:s]") + test LH of word1 then scan.info_word1 or + $( scan.info:=highvec(0) + randomise(0, LH, scan.info) + $) + $) + D4 of temp:=scan.info + if scanner()=S.NAME then + $( word1:=checkfind.room(scan.info,"Unknown room specified [:s]") + test LH of word1 then scan.info_word1 or + $( scan.info:=highvec(0) + randomise(0, LH, scan.info) + $) + $) + D5 of temp:=scan.info + D9 of temp_-1 + while scanch='*T' nextch() + if '0' le scanch le '9' \/ scanch='-'\/scanch='+' then + $( unless scanch='-' + $( scanner() + D8 of temp_scan.info + while scanch='*T' nextch() + $) + if scanch='-' + $( nextch() + scanner() + D9 of temp_scan.info + $) + $) + endcase + $) + startlinech() + if scanch=';' startlinech(true) + $) repeatuntil scanch='**' +$) +and isaction(word) = word->PTYPE of word=S.ACTION\/PTYPE of word=S.FASTATN,false +and load.travel() be +$( let room,cond,condwrd,newrm,word,type,t=?,?,?,?,?,?,? + unless roomflg/\vocabflg error("Needs predefined vocabulary and rooms") + checkflag(@travelflg,"Duplicate travel table") + unless fast writes(tty, "*C*L0") + unless scanner()=S.NAME error("travel word expected") + tverb_checkfind.word(scan.info, S.ACTION, "unknown travel action [:s]") + for i=1 to max.room.no do + $( let ptr, tptr=0, @ptr + unless fast write(tty,"*C:n",i) + unless scanner()=S.NAME error("Can't read room name") + room:=LH of checkfind.room(scan.info,"Unknown room [:s]") + TRAVEL of room:=free.space + $( let notted=0 + while scanch='*T' nextch() + if scanch='~' nextch()<>notted_6 + t:=scanner() + switchon t into + $( case S.NAME: + cond:=look.up(scan.info) + test cond then switchon PTYPE of cond into + $( case S.TCOND: + condwrd:=P1 of cond + endcase + case S.FORCED: + unless scanner()=S.NAME error("Cannot read room name") + newrm:=checkfind.room(scan.info,"Room after forced not known [:s]") + FORCED of room:=LH of newrm + startlinech() + loop + case S.DIFF: + condwrd_4<<18 + endcase + case S.DD: + condwrd_(10<<18)+valof + $( t_scanner() + unless t=S.NUMBER error("number expected after DD condition") + resultis scan.info + $) + endcase + default: + error("Illegal condition specified [:s]",scan.info) + $) or + $( cond:=find.word(scan.info,S.CLASS) + unless cond cond:=checkfind.word(scan.info,S.OBJECT,"Unknown condition [:s]") + test PTYPE of cond=S.CLASS then condwrd:=((1+notted)<<18)+DREC of cond or + $( cond:=DREC of cond + condwrd:=((2+notted)<<18)+D1 of cond + $) + $) + endcase + case S.NUMBER: + condwrd:=((scan.info<0->9,3)<<18)+abs(scan.info) + endcase + default: + error("Illegal condition [:s]",scan.info) + $) + unless t=S.NUMBER then + test scanner()=S.NAME then + $( newrm:=LH of checkfind.room(scan.info,"Destination not a room [:s]") + t_newrm + $) or + $( newrm_scan.info + LH from condwrd+_4 + t_true + $) + word_0 + while scanch='*T' do + $( switchon scanner() into + $( + case S.NAME: + word bitor_1<<(DREC of checkfind.word(scan.info,S.MOTION,"Word not a motion [:s]")) + case S.RAND: + endcase + default: + error("Can't read motion word") + $) + unless t + $( let nd=Newvec(1) + LINK of tptr_nd + tptr_nd + !nd_free.space<<18 + 1!nd_roomlist + roomlist_0 + $) + $) + getcore(2) + !free.space:=(word<<18)\/newrm + 1!free.space:=condwrd + free.space+:2 + startlinech() + $) repeatwhile scanch='*T' + getcore(1) + !free.space:=-1 + free.space+:1 + while ptr + $( let temp=LINK of ptr + roomlist_ptr!1 + randomise(0, RH, LH of ptr) + free(ptr) + ptr_temp + $) + $) + randirs_translate(randirs) + unless fast writes(tty," = last travel number*C*L") +$) +and translate(ptr)=ptr->valof +$( let r, r1, ptr1=highvec(1), r+1, ptr+1 + LH of r_LH of ptr + LH of r1_LH of ptr1 + RH of r1_translatelist(RH of ptr1) + RH of r_translate(RH of ptr) + resultis r +$), 0 +and translatelist(ptr)=ptr->valof +$( let r=highvec(0) + LH of r_LH of ptr + RH of r_translatelist(RH of ptr) + resultis r +$), 0 +and load.maps() be //Doesn't have to be maps - any picture will do +$( let mapcnt,cdesize=0,? + unless roomflg error("needs predefined rooms") + checkflag(@mapflg,"duplicate maps section") + unless fast Writes(tty, "*C*L0") + unless scanner()=S.NUMBER Error("Number of codes defined expected") + cdesize_scan.info + codes_highvec(cdesize) + nextch() repeatuntil scanch='*L' + for i=0 to cdesize codes!i_valof + $( let key, delim, b, count, sel= + nextch(),nextch(),vec MSLEN/5,0,selector 7:36:b + nextch() + until scanch=delim | count=MSLEN-1 | scanch='*E' + $( $[ $move 1, scanch + $Idpb 1, sel + $aos count + $] + nextch() + $) + unless scanch=delim error("max length of delimited strings=:n",MSLEN) + until scanch='*L' nextch() + count/_5 + highvec(count) + $[ $setz 2, 0 + $idpb 2, sel + $hrl 1, key + $hrrzi 3, 0(1) + $hrl 2, b + $hrri 2, 0(3) + $add 3, count + $blt 2, 0(3) + $] + $) + nextch() + until scanch='**' + $( let rm, sel, byt, count,ch,lettercount,room= + vec SCRSIZ,selector 7:36:rm, byte 7:36, SCRSIZ*5,?,?,? + mapcnt+_1 + unless fast write(tty,"*C:n",mapcnt) + unless scanner()=S.NAME Error("room name expected") + room_LH of checkfind.room(scan.info,"unknown room [:s]") + nextch() repeatuntil scanch='*L' + ch, scanch_nextch(),nextch() + test ch='%' then + $( ch_scanch + unless scanner()=S.NAME error("room name expected after %") + scan.info_LH of checkfind.room(scan.info,"unknown room [:s] after %") + MAPWD of room_MAPWD of scan.info + $) or + $( MAPWD of room_nextmap + until scanch=ch + $( let coded=false + for i=0 to cdesize if LH from codes!i=scanch + $[ $setom coded + $move 2, codes + $add 2, i + $move 2, 0(2) + $hll 2, byt +come: $ildb 1, 2 + $jumpe 1, gone + $idpb 1, sel + $sose count + $jrst come + $( too.big() + $) +gone: $] + unless coded + $[ $move 1, scanch + $idpb 1, sel + $sose count + $jrst past + $( too.big() + $) +past: $] + nextch() + $) + $[ $setz 1, 0 + $idpb 1, sel + $] + ch_nextch() repeatuntil ch='*L' + ch_nextch() + lettercount_SCRSIZ*5-count + if ~mapput + $( writez(mapput, rm) + writech(mapput, '*0') + for i=2 to 5-(lettercount rem 5) writech(mapput, '*P') + $) + nextmap+_lettercount/5+1 + $) + $) + unless fast writes(tty, " = last map number*C*L") +$) +and too.big() be Error("too many characters in map - max is :n", SCRSIZ*5) +and load.hours() be +$( checkflag(@hrflg, "duplicate hours section") + for i=0 to 6 times!i_0 + until scanch='**' + $( let nd, oldday, day=highvec(0),?,? + unless scanner()=S.NUMBER error("day number expected") + oldday, day_times+(scan.info+4) rem 7, !oldday + unless scanner()=S.NUMBER error("start time expected") + unless 0 le scan.info le 24 error("start time :n should be between 0 & 24", scan.info) + STIME of nd_scan.info + unless scanner()=S.NUMBER Error("finish time expected") + unless 0 le scan.info le 24 error("finish time :n should be between 0 & 24", scan.info) + unless scan.info gr STIME of nd error("time window error: :n >= :n", scan.info, STIME of nd) + FTIME of nd_scan.info + while day/\scan.infoRH, LH) from t!(j/2)_nextcombat + transfer.dsk(@nextcombat, comput, 0, 0, false) + $) + $) + unless scanch='**' error("Need 24 entries in combat section, no more") +$) + +and load.persona() be +$( checkflag(@psflg, "duplicate persona section") + unless scanner()=S.NAME error("illegal name for persona file") + for i=1 to LENGTH of scan.info + $( (byte 6:36-6*i) from ps6_(selector 7:29-((7*i) rem 35):i/5) of scan.info + if i=6 break + $) +$) + +and load.objects() be +$( let room,name,obj,adj,cprop,mprop,destr,rndm,sprop,mobile,inside,drc,done + =0,0,0,0,0,0,0,0,0,0,0,0,0 + and nd,oldnd,twoplace,fixd,objcnt=?,?,false,vec 26,0 + unless roomflg/\demonsflg/\vocabflg error("Predefined rooms, demons and vocabulary needed") + checkflag(@objectflg,"Duplicate objects definition") + unless fast writes(tty, "*C*L0") + startlinech() + until scanch='**' do + $( unless scanner()=S.NAME error("No object name after :s",PNAME of name) + name:=checkfind.word(scan.info,S.OBJECT,"Unknown object specified [:s]") //if use for errors, take PNAME of name + if DREC of name=RHMASK error("synonym used for [:s] instead of object name",scan.info) + if DREC of name le class error("class name used for [:s] instead of object name",scan.info) + room_scanner() + if room=S.NUMBER + $( mobile_highvec(MOTIONSIZE) + MOTION of mobile_scan.info + room_scanner() + unless room=S.NUMBER error("instincts demon indicator for mobile object required [:s]", PNAME of name) + if scan.info>max.demon.no error("demon no. [:n] too big for [:s]",scan.info,PNAME of name) + INSTINCTS of mobile_demons+(DEMONSIZE+DOF)*scan.info + room_scanner() + unless room=S.NUMBER error("actions demon indicator for mobile object required [:s]", PNAME of name) + if scan.info>max.demon.no error("demon no. [:n] too big for [:s]",scan.info,PNAME of name) + ACTIONS of mobile_demons+(DEMONSIZE+DOF)*scan.info + MOVECOUNT of mobile_0 + FIGHTS of mobile _ 0 + SNOOPERS of mobile _ 0 + room_scanner() + $) + unless room=S.NAME error("No room name") + room:=find.room(scan.info) + test room then room, inside_LH of room,0 or + $( let prev=Checkfind.word(scan.info,S.OBJECT,"Object or room name expected for position, found [:s]") + inside_(DREC of prev) gr #400000 -> D3 of DREC of prev,0 + unless inside error("need to have previously defined [:s] in the object section to go inside it", scan.info) + unless CONTENTS of inside error(":s isn't a container so can't hold :s",inside,PNAME of name) + $) + if mobile test room then CURROOM of mobile_room + or error("can't have random starts for mobiles [:s]", name) + for i=0 to 26 do fixd!i_scan.info!i //BLT would be better... + cprop:=scanner() + if seq(scan.info,fixd)/\cprop=S.NAME then twoplace:=1<>cprop:=scanner() + if cprop=S.NAME/\inside error("Can't have multi-placed objects inside containers") + while cprop=S.NAME do + $( twoplace:=1 + nd,oldnd:=ROBJT of room,room+4 + while nd do + $( oldnd:=nd + nd:=LINK of nd + $) + LINK of oldnd:=free.space + room:=LH of checkfind.room(scan.info,"Undefined next room [:s]") + cprop:=scanner() + $) + unless cprop=S.NUMBER error("No prop value given") + cprop:=scan.info + unless scanner()=S.NUMBER error("No maxprop value given") + mprop:=scan.info + unless scanner()=S.NUMBER error("no scoreprop value given") + sprop:=scan.info + rndm:=mprop<0 + destr:=cprop<0 + mprop,cprop:=abs mprop,abs cprop + obj:=highvec(OBJECTSIZE+mprop/2+1) + PNAME of obj:=PNAME of name + if forward.ref then + $( let linker=@forward.ref + until RH from !linker = 0 do + test name = D6 of (1!!linker) then + $( let temp=!linker + D6 of (1!temp)_obj + RH from !linker_RH from !temp + free(temp) + $) or linker_!linker + $) + drc_name + name:=DREC of name + done_name gr #400000-> valof + $( name_D3 of name + resultis true + $), 0 + objcnt+_1 + unless fast write(tty,"*C:n",objcnt) + PTYPE of obj,P1 of obj:=(done->PTYPE,D1) of name,(done->P1,D2) of name + SCOREPROP of obj:=sprop + MOTN of obj_mobile + if mobile + $( let mover=highvec(0) + LH of mover_obj + RH of mover_RH from movers + RH from movers_mover + mobile_false + $) + P5 of obj, P4 of obj_mprop, cprop + FIXED of obj, RANDM of obj_twoplace, rndm + WEIGHT of obj,VALUE of obj:=(done->WEIGHT,D3) of name,(done->VALUE,D4) of name + DESTROYED of obj:=destr + CONTENTS of obj_0 //for the moment - unnecessary if obj guaranteed initialised 0 + while scanch='*T' test scanner()=S.NUMBER then DESTROYED of obj_scan.info or + $( let nd=look.up(scan.info) + unless nd error("Unknown fixed property [:s] for [:s]*C*L",scan.info,PNAME of obj) + switchon PTYPE of nd into + $( case S.BRIGHT: + BRIGHT of obj_true + endcase + case S.NOGET: + NOGET of obj_true + endcase + case S.NOIT: + NOIT of obj_true + endcase + case S.NOSUMMON: + NOSUMMON of obj_true + endcase + case S.CONTAINS: + $( let container=highvec(CONTSIZE) + unless scanner()=S.NUMBER Error("No maxweight after container prop for [:s]*C*L",PNAME of obj) + MAXWT of container_scan.info + WTUSED of container_0 + !container_0 + CONTENTS of obj_container + endcase + $) + case S.DISGUISED: + unless CONTENTS of obj error("Non-containers cannot be disguised*C*L") + DISGUISED of CONTENTS of obj_true + endcase + case S.OPENED: + unless CONTENTS of obj error("Non-containers cannot be opened*C*L") + OPENED of CONTENTS of obj_true + endcase + case S.TRANSPARENT: + unless CONTENTS of obj error("Non-containers cannot be transparent*C*L") + TRANSPARENT of CONTENTS of obj_true + default: endcase + $) + $) + startlinech() + while '0'<=scanch<='9' do + $( scanner() + unless 0<=scan.info<=mprop error("Prop description out of range [:s]",PNAME of obj) + sprop:=selector 18:18*(scan.info rem 2):scan.info/2+OBJECTSIZE+1 + sprop of obj:=nextobj + transfer.dsk(@nextobj, objput, sprop, obj) + $) + test inside then + $( let insides=CONTENTS of inside + LINK of obj_LINK of insides + LINK of insides_obj + WTUSED of insides+_WEIGHT of obj + WEIGHT of inside+_WEIGHT of obj + $) or + test twoplace then + $( nd,oldnd:=ROBJT of room,room+4 + while nd do + $( oldnd:=nd + nd:=LINK of nd + $) + LINK of oldnd:=obj + $) or test room then + $( LINK of obj:=ROBJT of room + ROBJT of room:=obj + $) or unless inside randomise(0, LINK, obj, ROBJT) + test done then D3 of DREC of drc_obj or + $( DREC of drc_highvec(DDRSIZE) + drc_DREC of drc + D1 of drc_D1 of name + D2 of drc_D2 of name + D3 of drc_obj + $( let sptr=D7 of name + while sptr + $( let next=LINK of sptr + DREC of LH of sptr_drc + free(sptr) + sptr_next + $) + $) + free(name) + $) + twoplace:=false + $) + if forward.ref then + $( let linker=forward.ref + until linker=0 do + $( out("*C*LForward reference not mentioned [:s]*C*L", PNAME of D6 of 1!linker) + linker_RH from !linker + $) + error("unsafe to continue.") + $) + unless fast writes(tty,"= last object number*C*L") +$) +and load.demons() be +$( let indx,pt,token=?,?,? + unless fast writes(tty,"*C*L0") + unless vocabflg error("needs predefined vocabulary") + checkflag(@demonsflg, "Duplicate demons dection") + unless scanner()=S.NUMBER error("no demons table size given") + max.demon.no_scan.info + demons_highvec((DEMONSIZE+DOF)*(max.demon.no+1)-1) + startlinech() + while '0' le scanch le '9' + $( let demonum=? + scanner() + unless 0 le scan.info le max.demon.no error("invalid demon number") + unless fast write(tty, "*C:N",scan.info) + indx_((DEMONSIZE+DOF)*scan.info)+demons + demonum_scan.info + unless scanner(true)=S.NAME error("no demons verb name") + token_find.word(scan.info) + unless token/\isaction(token) error("not a verb name [:s]", scan.info) + D.VERB of indx_token + unless scanner()=S.NAME error("no demons object name") + token_find.word(scan.info) + pt_PTYPE of token + unless token/\(pt=S.CLASS\/pt=S.OBJECT\/pt=S.WHICHEVER) + error("not class or object for demon object [:s]",scan.info) + D.OBJECT of indx_pt=S.WHICHEVER->#777777, token + unless scanner()=S.NAME error("no demons instrument name") + token_find.word(scan.info) + pt_PTYPE of token + unless token/\(pt=S.CLASS\/pt=S.OBJECT\/pt=S.WHICHEVER) + error("not class or object for demon instrument [:s]",scan.info) + D.INSTRUMENT of indx_pt=S.WHICHEVER->#777777, token + unless scanner()=S.NUMBER error("no demons time number") + D.TIME of indx_scan.info + D.OFFSET of indx_scanch='-'->valof + $( readno(input, @scan.info) + if D.TIME of indx ge scan.info error("demon event time range has smallest number first :n-:n*C*L", + D.TIME of indx, scan.info) + nextch() + resultis scan.info-(D.TIME of indx)+1 + $), 1 + D.ATTRIBUTES of indx_0 + while scanch='*T' test scanner()=S.NAME then + (valof switchon PTYPE of look.up(scan.info) into + $( + case S.ALWAYS: resultis D.ALWAYS //could put D.ALWAYS in reserved insetad of S.ALWAYS? + case S.GLOBAL: resultis D.GLOBAL + case S.ENABLED: + $( let demon, d1=longmess, demon+DOF + unless D.GLOBAL of indx Error("Demon must be global to be enabled") + longmess_LINK of demon + for i=0 to DEMONSIZE d1!i_indx!i + E.TIME of demon+_random(D.OFFSET of indx) + !demon_(demonum<<18) bitor gdemons + gdemons_demon + loop + $) + default: Error("Name is not demon attribute [:s]*C*L") + $) ) of indx_true + or error("Demon attribute expected [:s]*C*L") + startlinech() repeatwhile scanch=';' + $) + unless fast writes(tty," = last demon number*C*L") +$) +and load.levels() be +$( let dunmen,dunwomen=false,false + checkflag(@levelsflg,"Duplicate levels section") + for i=0 to 1 do + $( let t=scanner() + t_look.up(scan.info) + unless t error("Unknown keyword [:s] in levels section",scan.info) + switchon PTYPE of t into + $( case S.MALE: + checkflag(@dunmen,"Duplicate male section") + readlevels(male) + endcase + case S.FEMALE: + checkflag(@dunwomen,"Duplicate female section") + readlevels(female) + endcase + default: error("Unknown level flag [:s]",scan.info) + $) + $) +$) +and readlevels(vector) be for i=0 to MAX.LEVEL do +$( unless scanner()=S.NAME error("Name expected in levels section") + $( let node=find.word(scan.info, S.LEVEL, true) + vector!i_PNAME of node + DREC of node_i + $) +$) +and load.text() be +$( unless fast writes(tty, "*C*L0") + checkflag(@textflg,"Duplicate text section") + unless scanner()=S.NUMBER error("No text table size given") + max.message.no:=scan.info + text:=highvec(scan.info/36+1) + txtvec_highvec(scan.info/2) + startlinech() + while '0'<=scanch<='9' do + $( scanner() + unless 0<=scan.info<=max.message.no error("Invalid text number") + unless fast write(tty,"*C:n ",scan.info) + (selector 1:scan.info rem 36:scan.info/36) of text_valof + $( let olds, ch=scanch, nextch() + if ch='?' startlinech()<>resultis true + putback(input,ch) + scanch_olds + (scan.info rem 2 -> LH, RH) from txtvec!(scan.info/2)_nexttext + transfer.dsk(@nexttext, textput) + resultis false + $) + $) + unless fast writes(tty," = last text number*C*L") +$) +and seq(s1,s2)=valof +$( for i=0 to (LENGTH of s1)/5 do if s1!i\=s2!i resultis false + resultis true +$) +and randomise(tst, sel1, dest, sel2) be +$( let res, ptr, lst=?, 0, RH from roomlist + if tst return + unless numbargs()=4 sel2_0 + res_highvec(4) + test lst then + $( res!4_0 + while lst + $( let t=LINK of lst + ptr_highvec(0) + LINK of ptr_res!4 + res!4_ptr + LH of ptr_LH of lst + free(lst) + lst_t + $) + LH of (res+4)_LH from roomlist + $) or res!4_randoms!4 + 1!res_sel1 + 2!res_dest + 3!res_sel2 + LINK of res_randoms + randoms_res +$) +and startlinech(print) be +$( unless numbargs() print_false + until scanch='*L' do + $( nextch() + if print writech(tty,scanch) + $) + nextch() +$) +and init.room(room,name) be +$( !room:=name + for i=1 to roomsize do i!room:=0 + DOOR!room:=-1 +$) +and highvec(n)=valof +$( let chunk=free.space + getcore(n+1) + free.space+:n+1 + resultis chunk +$) +and getcore(size) be +$( let t=free.space+size + if t>>9 gr endloc unless valof + $[ $hrlz 1, t + $core 1, 0 + $jrst fail + $move 1, t + $lsh 1, -9 + $movem 1, endloc + $seto 1, 0 + $trna +fail: $setz 1, 0 + $] Error("Out of high segment freestore - page :8", endloc) +$) +and read.name() be +$( let n,linev=0,vec 127 + while 'a'<=(scanch bitor #40)<='z'\/'0'<=scanch<='9'\/scanch='.'\/scanch='$' do + $( n+:1 + unless n>127 linev!n:= 'A'<=scanch<='Z'->scanch+#40,scanch + nextch() + $) + !linev:=n>127->127,n + scan.info:=packstring(linev,name.string) +$) +and read.number() be +$( putback(input,scanch) + readno(input,@scan.info) + nextch() +$) +and copy(s)=valof +$( let size=(LENGTH of s)/5 and new=highvec(size) + for i=0 to size do new!i:=s!i + resultis new +$) +and initialise() be +$( let node,n=?,0 + $[ $rescan + $inchrs node + $setzm node + $setz 1, 0 + $setuwp 1, 0 + $halt + $movei 1, HUNG + $movem 1, napct + $hrrei 1, ESSEX + $movem 1, ESXWD + $] + input_tty + test node then + $( nextch() repeatuntil scanch='-' \/ '*L' le scanch le '*P' \/ '*E' le scanch le '*$' + unless scanch='-' filename_$6 "mud"<>break + filename_0 + nextch() + while 'a' le scanch le 'z' \/ 'A' le scanch le 'Z' do + filename_(filename<<6) bitor ((scanch bitand #137)-' ')<>nextch() + unless filename filename_$6 "mud" <> break + until filename>>30 do filename<<_6 + $) repeatwhile false or filename_$6"mud" + while scanch='/' + $( scanch_nextch() bitand \#40 + switchon scanch into + $( + case 'C': + comput_true + endcase + case 'F': + fast_true + endcase + case 'M': + mapput_true + endcase + case 'O': + objput_true + endcase + case 'R': + roomput_true + endcase + case 'T': + textput_true + case 'G': + cmndput_true + default 0 ... #137: + endcase + $) + nextch() + $) + $[ $clrbfi $] + input:=findfile($6"all",filename,$6"txt") + unless roomput roomput_createfile($6"all",filename,$6".rm",0,0,0,1) + unless textput textput_createfile($6"all",filename,$6".tm",0,0,0,1) + unless mapput + $( mapput_createfile($6"all",filename,$6".mm",0,0,0,1) + for i=0 to 4 do writech(mapput,'*0') + $) + unless objput + $( objput_createfile($6"all",filename,$6".om",0,0,0,1) + for i=0 to 4 do writech(objput,'*0') + $) + unless comput comput_createfile($6"all",filename,$6".cm",0,0,0,1) + unless cmndput + $( cmndput_createfile($6"all",filename,$6".gm",0,0,#14) + writech(cmndput,0) + $) + output:=tty + nextch() + S.ROOMS!procs:=load.rooms + S.VOCAB!procs:=load.vocab + S.TRAVEL!procs:=load.travel + S.OBJECT!procs:=load.objects + S.LEVELS!procs:=load.levels + S.DEMONS!procs:=load.demons + S.MAP!procs:=load.maps + S.HOURS!procs_load.hours + S.COMBAT!procs_load.combat + S.PERSONA!procs_load.persona + S.TEXT!procs:=load.text + until reserved!n=-1 do + $( node:=look.up(reserved!n,reserved!(n+1)) + P1 of node:=reserved!(n+2) + INFO of node:=reserved!(n+3) + n+:4 + $) + dictionary,n:=highvec(HASHSIZE),0 + out("initialisation used :n",free.space-startloc) +$) +and find.room(name,creating)=valof +$( let node,hash=?,? + if name=list resultis name + if numbargs()<2 creating:=false + name:=sixbit(name) + hash:=(name>>1) rem HASHSIZE + node:=index!hash + while node do test name=RNAME of node then + $( if creating error("Duplicate room :6", name) + resultis node + $) + or node:=LINK of node + unless creating resultis false + node:=highvec(1) + LINK of node,RNAME of node:=index!hash,name + index!hash:=node + resultis node +$) +and find.word(word,type,cont)=valof +$( let dec,hash=false,(!word>>1) rem HASHSIZE and node=dictionary!hash + switchon numbargs() into + $( case 1: + type:=0 + case 2: + cont:=0 + $) + if cont test cont=-1 then dec:=true or node:=LINK of cont + while node do + $( if seq(word,PNAME of node)/\(PTYPE of node=type\/type=0) resultis node + node:=LINK of node + $) + if dec then + $( node:=highvec(NODESIZE) + LINK of node:=dictionary!hash + dictionary!hash:=node + PNAME of node,PTYPE of node:=copy(word),type + $) + resultis node +$) +and look.up(word,type)=valof +$( let hash=(!word>>1) rem HASHSIZE and node=res!hash + if numbargs()<2 type:=false + while node do + $( if seq(word,PNAME of node) then + $( if type error("duplicate reserved word") + resultis node + $) + node:=LINK of node + $) + unless type resultis false + node:=newvec(2) + PTYPE of node,LINK of node:=type,res!hash + PNAME of node,res!hash:=word,node + resultis node +$) +and appenddr(node,dr)=valof +$( let nd,oldnd=DREC of node,? + unless nd DREC of node:=dr<>resultis dr + while nd do + $( oldnd:=nd + nd:=LINK of nd + $) + LINK of oldnd:=dr + resultis dr +$) +and transfer.dsk(next, stream, sptr, obj, crlf) be +$( let lettercount, olds,lineonly,nocrlf= + 0, scanch,numbargs()=5,lineonly/\crlf=0 + if numbargs() ge 4 + $( let ch=nextch() + if ch='?' + $( sptr of obj_#777777 + startlinech() + return + $) + if ch='%' + $( let prev=? + nextch() + unless scanner()=S.NAME error("Name required after %") + test numbargs()=5 then + $( prev_checkfind.room(scan.info, "unknown room after % [:s]") + sptr of obj_sptr of (LH of prev) + $) or + $( prev_checkfind.word(scan.info, S.OBJECT, "unknown object after % [:s]") + sptr of obj_sptr of (D3 of (DREC of prev)) + $) + startlinech() + return + $) + putback(input, ch) + scanch_olds + $) +$( let count, rcount, ocount, b,wrap=0, ?, ?, vec TTYWIDTH*50,true + while scanch='*T' + $( nextch() + if scanch='**' unless count + $( nextch() + wrap_false + $) + until scanch='*C' + $( if scanch='*T' if wrap + $( outs("*C*L") + for i=0 to count outch(b!i) + error("*C*LTab found in text.") + $) + b!count_scanch + count+_1 + nextch() + $) + unless nocrlf test wrap then + $( b!count_'*S' + count+_1 + $) or + $( b!count, b!(count+1)_'*C', '*L' + count+_2 + $) + nextch() + nextch() + if lineonly break + $) + test wrap then + $( for i=count to count+TTYWIDTH b!i_0 + rcount_-1 + ocount_0 + $) or rcount, ocount_count-1, 0 + $( if wrap + $( rcount+_TTYWIDTH + until rcount ls ocount | b!rcount='*S' | (b!rcount ne 0 /\ nocrlf) rcount-_1 + if rcount ls ocount + $( unless b!ocount break + rcount+_TTYWIDTH + $) + $) + for i=ocount to rcount + $( if \stream then writech(stream, (b!i)) + lettercount+_1 + unless lettercount rem 5 then !next+_1 + $) + unless wrap break + unless nocrlf + $( if \stream writech(stream,'*C') //I know this is horrible, but I'm in a BIG hurry! + lettercount+_1 + unless lettercount rem 5 then !next+_1 + if \stream writech(stream, '*L') + lettercount+_1 + unless lettercount rem 5 then !next+_1 + $) + ocount_rcount+1 + $) repeat + if \stream + $( writech(stream, '*0') + for i=2 to 5-(lettercount rem 5) writech(stream, '*P') + $) + !next+_1 +$) +$) +and transfer.service(select)=valof +$( let room=? + nextch() + unless scanner()=S.NAME error("Name required after %") + room:=checkfind.room(scan.info,"Room name required after %") + room:=LH of room + unless room error("Predefined room required after %") + startlinech() + resultis select of room +$) +and scanner(numasstring)=valof +$( switchon Numbargs()->scanch='*T'->'*T', 'A', scanch into + $( case '*E': + resultis S.EOF + case '*T': + while scanch='*T' do nextch() + loop + case '[': + $( let count, lst=0, 0 + nextch() + until scanch=']' + $( let elmt=newvec(0) + unless scanner()=S.NAME error("direction expected in list") + count+_1 + RH of elmt_lst + lst_elmt + LH of elmt_1<"", "es", + object, object=1->"", "s", + mtion, mtion=1->"", "s") + out("*C*LTotal space used :n",free.space-startloc) + run("all","mud",0,0,1) +what: write(tty, "*C*LCan't create mud.dmp*C*L") +$) +and error(fmt,a,b,c) be +$( writes(tty,"*C*L") + write(tty,fmt,a,b,c) + $[ L1: $exit 1, 0 + $jrst L1 + $] +$) +and checkflag(lvf, err) =valof +$( if !lvf error(err) + !lvf_true +$) +and checklook.up(word,type,err) =valof +$( let wrd=look.up(word) + unless wrd /\(PTYPE of wrd=type) error(err,word) + resultis wrd +$) +and checkfind.word(word,type,err)=valof +$( let wrd=find.word(word) + unless wrd error(err, word) //Huh? So where's the type come in? + resultis wrd +$) +and checkfind.room(name,err)= valof +$( let wrd=find.room(name) + unless wrd error(err,name) + resultis wrd +$) +and random(n)=valof //gives random no. between 0 and n-1 +$[ $mstime 1, 0 + $timer 2, 0 + $add 1, 2 + $runtim 2, 0 + $sub 1, 2 + $tlz 1, #400000 + $idiv 1, n + $move 1, 2 +$] +$[ +BCPL.: $JRST ENDRIPPLE // Jump past initial stuff when next here + $TRN BCPL // Here initially, also loading MBOOTS + $RESET + $JRST #430010 // Start ripple through +ENDRIPPLE: + $MOVE ZERCAL + $MOVEI ONE, 1 + $HRRZ P, JBFF // INITIAL VALUE OF P + $MOVEI AC, #7777(P) + $CAML AC, JBREL + $CORE AC, 0 // TRY FOR 2K INITIAL CORE (MINIMUM) + $JFCL // IGNORE ERROR RETURN + $( SL := JBREL + FL := #430000 + $[ $MOVEM P, STACKBASE $] + START() + FINISH + $) + $EXIT // JUST IN CASE! +ZERCAL: $JRST ZERO +$] diff --git a/DUNGEN.GET b/DUNGEN.GET new file mode 100644 index 0000000..448e47f --- /dev/null +++ b/DUNGEN.GET @@ -0,0 +1,885 @@ +$nolist +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + + +MANIFEST +$( +//Environment manifests + ESSEX = true //Essex University specials + LOADCHK = FALSE //want to check if m/c is overloaded? + RELAXED = true //want wiz's to have unrestricted powers? + BOASTNAME = true //Shall we say who wrote this? + TTYWIDTH = 79 //how wide is the terminal? + WIZVWIZ = false //true if you don't want wiz's to be able to fight each other + YOULLBESORRY = true //shall MUD record all entries/exits to game in MUD.LOG? + BZK = FALSE //true if you allow berserkers + CORELOW = false //do routines need to be cut 'cos of low core? + OTHERS = false //true if there are other arch's + MPPN = #2600002776//#322500000001 //where to look for log files +//other important manifests + WORD = SELECTOR 36: 0: 0 + LENGTH = SELECTOR 7:29: 0 + FIRSTCH = SELECTOR 7:22: 0 +//Room descriptor. +/* + +-------------------------------+ + ! Sixbit room name ! + +---------------+---------------+ + ! LEAVE ! TITLE ! + +---------------+---------------+ + ! DOOR ! + +-------------------------------+ + ! ATTRIB ! + +---------------+---------------+ + ! TRAVEL ! ROBJT ! + +---------------+---------------+ + ! WHO ! + +---------------+---------------+ + ! RNUMB ! FORCED ! + +---------------+---------------+ + ! DMOVE ! ROOMWD ! + +---------------+---------------+ + ! MAPWD ! (UNUSED) ! + +---------------+---------------+ +*/ + TITLE = RH+1 + LEAVE = LH+1 + DOOR = 2 + ATTRIB = WORD+3 + ROBJT = RH+4 + TRAVEL = LH+4 + WHO = 5 + RNUMB = LH+6 + FORCED = RH+6 + DMOVE = LH+7 + ROOMWD = RH+7 + MAPWD = LH+8 + ROOMSIZE = 8 + + BCHEAD = LH + INVADE = RH + LEAVESIZE = 0 +//Object descriptor. +/* + +---------------+---------------+ + ! (PTYPE) ! (LINK) ! + +---------------+---------------+ + ! (P1) ! (PNAME) ! + +---------------+---------------+ + ! MOTN ! CONTENTS ! + +---------------+---------------+ + ! DESTROYED ! + +---------------+---------------+ + ! RSIGBF!SCPRP! P4 ! P5 ! //random,nosummon,noit,noget,bright,fixed + +---------------+---------------+ + ! VALUE ! WEIGHT ! + +---------------+---------------+ +*/ + P2 = RH+2 + P3 = LH+2 + INFO = WORD+2 //P2 + P3 + CONTENTS = RH+2 + MOTN = LH+2 + DESTROYED = WORD+3 +// Object number,,Link to next object +// Object class,,Print name of object +// motion record if a mobile,,contents if a bag +// P5 is Maximum prop value, P4 is Current prop value + FPROP = LH+4 //all the fixed props + RANDM = selector 1:23:4 + NOSUMMON = selector 1:22:4 + NOIT = selector 1:21:4 + NOGET = selector 1:20:4 + BRIGHT = selector 1:19:4 + FIXED = selector 1:18:4 + SCOREPROP = selector 6:12:4 + P4 = selector 6:6:4 + P5 = selector 6:0:4 + VALUE = LH+5 + WEIGHT = RH+5 + OBJECTSIZE = 5 +/* object format in vocab. section + [ ]? * ? + [ bright | noget | noit | [ contains ] | disguised | opened | transparent ]? + + cprop<0 means destroyed, mprop<0 means random prop +*/ +//Dictionary node. +/* + +---------------+---------------+ + !1!2! PTYPE ! LINK ! //1=SAVED, 2=SYN + +---------------+---------------+ + ! P1 ! PNAME ! + +---------------+---------------+ +*/ +//Declaration record +/* +---------------+---------------+ + ! D1 ! Link ! + +---------------+---------------+ + ! D3 ! D2 ! + +---------------+---------------+ + ! D5 ! D4 ! + +---------------+---------------+ + ! D7 ! D6 ! + +---------------+---------------+ + ! D9 ! D8 ! + +---------------+---------------+ +*/ + PTYPE = selector 16:18:0 + SYN = selector 1:34:0 + SAVED = selector 1:35:0 + LINK = RH + PNAME = RH+1 + P1 = LH+1 + DREC = LH+1 + DICTNODESIZE = 3 + RESERVEDSIZE = 2 + NODESIZE = 1 + D1 = LH + D2 = RH+1 + D3 = LH+1 + D4 = RH+2 + D5 = LH+2 + D6 = RH+3 + D7 = LH+3 + D8 = RH+4 + D9 = LH+4 //can always use 9 bits for some of these + DRSIZE = 4 + ODRSIZE = 3 + DDRSIZE = 1 +//Demon node +/* + +---------------+---------------+ + ( E.DEMONUM : LINK ) + +---------------+---------------+ + ( SHORT : (unused) ) + +---------------+---------------+ + ! D.VERB ! D.TIME ! + +---------------+---------------+ + ! D.OBJECT ! D.INSTRUMENT ! + +---------------+---------------+ + ! D.OFFSET ! SPGA! A=always, G=global, P=Plonk, S=Suspended + +---------------+---------------+ (P & S for system use) +*/ + DOF = 2 + DEMONSIZE = 2 + D.VERB = LH + D.TIME = RH; E.TIME=D.TIME+DOF + D.OBJECT = LH+1 + D.INSTRUMENT = RH+1 + D.ALWAYS = selector 1:0:2 + D.GLOBAL = selector 1:1:2 + D.PLONK = selector 1:2:2; E.PLONK=D.PLONK+DOF + D.SUSPENDED = selector 1:3:2; E.SUSPENDED=D.SUSPENDED+DOF + D.ATTRIBUTES = RH+2 + D.OFFSET = LH+2 + E.DEMONUM = LH +//Message block. +/* + +---------------+---------------+ + ! SENDER ! (LINK) ! + +---------------+---------------+ + ! SHORT ! FUNC ! + +-------------------------------+ + ! (INFO) ! + +-------------------------------+ + ! ! + ! ! +*/ + SENDER = LH + SHORT = LH+1 + FUNC = RH+1 + //Function codes. + K.IWKU = 1 //I want to kill you. + K.IACPT = 2 //I accept. + K.IMDD = 3 //I'm definitely dead. + K.ISAM = 4 //I swung and missed. + K.ISAH = 5 //I swung and hit. + K.TEXT = 6 //A text message. + K.SNOP = 7 //I want to snoop. + K.MAKE = 8 //Do this! + K.ITTE = 9 //I tried to enter + K.DIST = 10 //Text message from "A distance" + K.IWSU = 11 //I want to steal from you + K.INCI = 12 //I'm not carrying it + K.IFYO = 13 //I found you out + K.YSFM = 14 //You stole from me + K.WAF = 15 //We are fighting + K.IWTF = 16 //I want to follow + K.IHHU = 17 //I have hit you + K.STTE = 18 //Something tried to enter + K.ISFY = 19 //I've stopped following you + K.IWJY = 20 //I want to join you + K.ISJY = 21 //I've stopped following you + K.SJM = 22 //Stop joining me + K.IFM = 23 //I'm fighting a monster + K.ISAHM = 24 //I swung and hit monster + K.ISAMM = 25 //I swung and missed monster + K.IWGU = 26 //I want to give to you + K.BGON = 27 //Begone! + K.ITHM = 28 //It's too heavy for me + K.SNPA = 29 //Snoop packet + K.IWSS = 30 //I want to stop snooping + K.SSNO = 31 //Stop snooping + K.BELW = 32 //Bellow! + K.IFFY = 33 //I fled from you + K.TYVM = 34 //Thank you very much! + K.SFM = 35 //Stop following me + K.YFIM = 36 //You're following I moved + K.SJL = 37 //Something just left + K.SJA = 38 //Something just arrived + K.SFO = 39 //Something fighting object + K.OHD = 40 //Object has died + K.IGOT = 41 //I got object + K.IDROPT = 42 //I dropped object + K.TTH = 43 //Trans to here + K.IINS = 44 //I inserted + K.IREM = 45 //I removed + K.SHBD = 46 //Something has been dropped + K.MESS = 47 //Message + K.MGOT = 48 //Monster got object + K.MDROPT = 49 //Monster dropped object + K.TSEX = 50 //Toggle Sex! + K.OHM = 51 //Object has moved + K.MFM = 52 //Monster fighting me! + K.WU = 53 //Wake up! + K.LOUD = 54 //Loud noise... + K.ZZZ = 55 //Fall asleep + K.IAA = 56 //I'm already asleep + K.IHFA = 57 //I have fallen asleep + K.IMOF = 58 //I'm in the middle of a fight! + K.IHWU = 59 //I have woken up + K.GRO = 60 //Get rid of + K.FOD = 61 //Finger of death! + K.INH = 62 //I'm new here + K.IGIV = 63 //I've given an object + K.ITAK = 64 //I've taken an object + K.ISCY = 65 //I shall contact you + K.OHDS = 66 //Object has done something + K.WM = 67 //Wizard mode + K.YCSM = 68 //You cannot summon me + K.SHBE = 69 //Someone has been exorcised + K.IHPO = 70 //I have passed on + K.SPEC = 71 //Spectacular! + K.DTD = 72 //Do this demon + K.TOLD = 73 //Told you the message (not said it) + K.IHD = 74 //I have died + K.IHSE = 75 //I have shown emotion + K.IHKS = 76 //I have kissed someone + K.PIM = 77 //Proof it's me + K.GOWM = 78 //Get out of wizard mode + K.IHR = 79 //I have retaliated + K.IHCL = 80 //I have changed level + K.LAUGH = 81 //Laugh..! + K.SHBF = 82 //Someone has been forced + K.IHBF = 83 //I have been forced + K.IHA = 84 //I have attached + +//Mobile objects' information nodes +/* + +---------------+---------------+ + ! PREVROOM ! CURROOM ! + +---------------+---------------+ + ! MOVECOUNT ! MOTION ! + +---------------+---------------+ + ! FIGHTS ! + +---------------+---------------+ + ! SNOOPERS ! + +---------------+---------------+ + ! CHASERS ! + +---------------+---------------+ + ! INSTINCTS ! ACTIONS ! + +---------------+---------------+ +*/ + MOTIONSIZE = 5 + CURROOM = RH + PREVROOM = LH + MOVECOUNT = LH+1 + MOTION = RH+1 + FIGHTS = WORD+2 + SNOOPERS = WORD+3 + CHASERS = WORD+4 + INSTINCTS = LH+5 + ACTIONS = RH+5 + +//Containers information nodes +/* + +---------------+---------------+ + ! ODT! CONTS ! //O=opened,D=disguised,T=transparent + +---------------+---------------+ + ! MAXWT ! WTUSED ! + +---------------+---------------+ +*/ + CONTSIZE = 1 + TRANSPARENT = selector 1:18:0 + DISGUISED = selector 1:19:0 + OPENED = selector 1:20:0 + CONTS = RH + MAXWT = LH+1 + WTUSED = RH+1 + +//Player profile. +/* + +---------------+---------------+ + ! (SENDER) ! (LINK) ! + +---------------+---------------+ + ! unused ! (PNAME) ! //when full, use unused as a list - non-shareable stuff can be statics + +---------------+---------------+ + ! (INFO) player.bit ! + +-------------------------------+ + ! STATES ! + +---------------+---------------+ + ! (JBNUM) ! (ROBJT) ! + +-------+-------+---------------+ + ! O.C ! O.E ! CARRY.COUNT ! //O.C=OBJ.CARRIED, O.E=OBJ.EXTRA + +-------+-------+---------------+ + ! SCORE ! + +-------------------------------+ + ! STRENGTH ! + +-------------------------------+ + ! STAMINA ! + +-------------------------------+ + ! DEXTERITY ! + +-------------------------------+ + ! GAMES.PLAYED ! + +-------------------------------+ + ! STAMINAMAX ! + +-------------------------------+ + ! CROOM ! + +---------------+---------------+ + ! (unused) ! WT.EXTRA ! + +---------------+---------------+ + ! 6 ! M ! y ! n ! a !?! // ? means sex (1=fem, 0=mal) + +-------------------------------+ + ! m ! e ! ! ! !?! // ? means dormancy (1=asleep, 0=awake) + +-------------------------------+ +*/ + STATES = WORD+3 + WIZARD = selector 1:0:3 + OPR = selector 1:1:3 + BERSERK = selector 1:2:3 ; BERSERKMASK=#4 + SNOOPBIT = selector 1:3:3 + ATTED = selector 1:4:3 + BREEF = selector 1:5:3 + INVIS = selector 1:6:3 ; NOTINVIS=#777777777677 + IGNORE = selector 1:7:3 + ISWIZ = selector 1:8:3 ; WIZMASK=1<<8 + JBNUM = LH+4 + CARRY.COUNT = RH+5 + OBJ.CARRIED = selector 9:18:5 + OBJ.EXTRA = SELECTOR 9:27:5 + SCORE = WORD+6 + STRENGTH = WORD+7 + STAMINA = WORD+8 + DEXTERITY = WORD+9 + GAMES.PLAYED = WORD+10 + CROOM = WORD+12 + WT.EXTRA = RH+13 + STAMINAMAX = WORD+11 + SEX = SELECTOR 1:0:14 + ASLEEP = SEX+1 +//Various other selectors. + RNAME = WORD+1 //For a dictionary node. + CONDTYPE = LH+1 //For the travel table. + CONDVAL = RH+1 //For the travel table. + STIME = selector 9:27:0 //For start time + FTIME = selector 9:18:0 //For finish time +//Constants (numbers not selectors) + CCTRIP = 30 //^C's to get out divided by 10 + HUNG = 200 //hung count! + HASHSIZE = 127 //Size of hash table. + MAXWEIGHT = 1000 //Max weight is 1000g/strength pt + EXP.STEP = 400 //Number doubled per experience level + DEADPTS = 75 //Base score for killing people + FLEELOSS = 50 //pts/level lost when fleeing + BOOSTEP = 10 //Amount added to attributes when go up a level + MAX.LEVEL = 9 //1 less than maximum level! + TIMEOUT = 5 //no. of minutes to get out after closing time + NAMELENGTH = 9 //Max length of player name. + STRINGSIZE = 127 //Max length of string. + CHPERWORD = 5 //Characters per word. + PACKEDSTRING = STRINGSIZE/CHPERWORD+1 + BERSERKMAX = 200 //Maximum str/stamina for berserkers + LHMASK = #777777000000 //Left hand mask + RHMASK = #777777 //Right hand mask + DUMPSIZE = 10 //Size of dumplist. + WTHRESHOLD = 20000 //Weight threshold + SNOOPROMPT = '|' //Snoop prompt so know snooping + INTERVAL = 60 //default seconds between auto-who + RNGE = 20 //range within which diagnosed stamina lies + SDIV = 18 //sleep divisor, 18 is ~10 secs + F.DMGE1 = 2 //Divides the original damage. + F.DMGE2 = 4 //Ditto above, differing times. + F.ENCMB = 2000 //Encumberance affects chance to hit (bigger number is more chance) + E.DIV = 3 //people shown emotion get + E.MULT = 2 // mult/div times amount person showing it loses + GUESTPN = #2653 //PPn of guests from outside +//this next lot should be selectors REALLY... + A.LIGHT = #1 //Room attributes. + A.WATER = #2 //Water is here. + A.OIL = #4 //Oil is here. + A.DEATH = #10 //This room kills you! + A.SANCTUARY = #20 //Score points for objects here + A.HIDEAWAY = #40 //Can't see objects here! + A.SMALL = #100 //Only 1 person can fit + A.CHAIN = #200 //run another MUD + A.HIDE = #400 //People in here can't be seen from outside + A.DMOVE = #1000 //die, and objects move to this room + A.NOLOOK = #2000 //can't look into this room from another + A.SILENT = #4000 //silent to loud noises. + A.START = #10000 //Starting room. +//Tokens + S.ROOMS = 1 //Said *Rooms. + S.VOCAB = S.ROOMS+1 //or *Vocabulary. + S.TRAVEL = S.VOCAB+1 //or *Travel. + S.OBJECT = S.TRAVEL+1 //*Objects or *Object. + S.LEVELS = S.OBJECT+1 //*Levels. + S.DEMONS = S.LEVELS+1 //or *Demons. + S.MAP = S.DEMONS+1 //or *Map or *Maps + S.HOURS = S.MAP+1 //or *Hours + S.COMBAT = S.HOURS+1 //or *Combat + S.PERSONA = S.COMBAT+1 //or *Persona + S.TEXT = S.PERSONA+1 //or *Text. + S.EOF = S.TEXT+1 + S.NAME = S.EOF+1 + S.NUMBER = S.NAME+1 + S.MOTION = S.NUMBER+1 + S.ACTION = S.MOTION+1 + S.FASTATN = S.ACTION+1 + S.LEVEL = S.FASTATN+1 + S.SPECIAL = S.LEVEL+1 + S.BRIGHT = S.SPECIAL+1 + S.UNCONVERSE = S.BRIGHT+1 + S.SYN = S.UNCONVERSE+1 + S.RAND = S.SYN+1 + S.AFUNC = S.RAND+1 + S.SFUNC = S.AFUNC+1 + S.TCOND = S.SFUNC+1 + S.WITH = S.TCOND+1 + S.CONT = S.WITH+1 + S.FORCED = S.CONT+1 + S.NOISE = S.FORCED+1 + S.PLAYER = S.NOISE+1 + S.MUDNAM = S.PLAYER+1 + S.DOTNAME = S.MUDNAM+1 + S.DIFF = S.DOTNAME+1 + S.DD = S.DIFF+1 + S.THERE = S.DD+1 + S.IT = S.THERE+1 + S.HIM = S.IT+1 + S.HER = S.HIM+1 + S.THEM = S.HER+1 + S.ME = S.THEM+1 + S.TRANSPARENT = S.ME+1 + S.NOGET = S.TRANSPARENT+1 + S.DISGUISED = S.NOGET+1 + S.OPENED = S.DISGUISED+1 + S.NOIT = S.OPENED+1 + S.NOSUMMON = S.NOIT+1 + S.ATTR = S.NOSUMMON+1 + S.CONTAINS = S.ATTR+1 + S.MALE = S.CONTAINS+1 + S.FEMALE = S.MALE+1 + S.ALWAYS = S.FEMALE+1 + S.GLOBAL = S.ALWAYS+1 + S.WHICHEVER = S.GLOBAL+1 + S.ALL = S.WHICHEVER+1 + S.CLASS = S.ALL+1 + S.ENABLED = S.CLASS+1 + S.AT = S.ENABLED+1 + S.NONE = S.AT+1 + S.PERSON = S.NONE+1 + S.SOMETHING = S.PERSON+1 + S.ANYTHING = S.SOMETHING+1 +//Interact function codes + I.KILL = 1 + I.TELL = 2 + I.MAKE = 3 + I.STEAL = 4 + I.FOLLOW = 5 + I.LOSE = 6 + I.JOIN = 7 + I.REFUSE = 8 + I.GIVE = 9 + I.SNOOP = 10 + I.WAKE = 11 + I.CHANGE = 12 + I.SUMMON = 13 + I.SLEEP = 14 + I.FOD = 15 +//Special verb function codes. + SF.TELL = 1 + SF.SAY = 2 + SF.GET = 3 + SF.DROP = 4 + SF.KILL = 5 + SF.QUIT = 6 + SF.SCRE = 7 + SF.LOOK = 8 + SF.QOTE = 9 //Not really a verb but (") + SF.LOG = 10 + SF.INVN = 11 + SF.DBUG = 12 + SF.FRCE = 13 + SF.GO = 14 + SF.BUG = 15 + SF.WHO = 16 + SF.CTRAP = 17 + SF.ACTION = 18 + SF.SHOUT = 19 + SF.BACK = 20 + SF.FOLLOW = 21 + SF.LOSE = 22 + SF.JOIN = 23 + SF.REFUSE = 24 + SF.UNKEEP = 25 + SF.SET = 26 + SF.SPECLOG = 27 + SF.SNOOP = 28 + SF.UNSNOOP = 29 + SF.P = 30 + SF.DIRECT = 31 + SF.WHERE = 32 + SF.BRIEF = 33 + SF.FLEE = 34 + SF.EXORCISE = 35 + SF.FREEZE = 36 + SF.UNFREEZE = 37 + SF.MOBILE = 38 + SF.HASTE = 39 + SF.SLEEP = 40 + SF.WAKE = 41 + SF.CHANGE = 42 + SF.ENCHANT = 43 + SF.RESURRECT = 44 + SF.KEEP = 45 + SF.SUMMON = 46 + SF.ATTACH = 47 + SF.DETACH = 48 + SF.INSERT = 49 + SF.REMOVE = 50 + SF.PRONOUNS = 51 + SF.EMPTY = 52 + SF.FOD = 53 + SF.BEGONE = 54 + SF.PROVOKE = 55 + SF.PURGE = 56 + SF.SAVE = 57 + SF.FLUSH = 58 //this is just same as action fn. flush + SF.BYE = 59 + SF.TIME = 60 + SF.CRASH = 61 + SF.MAP = 62 + SF.EXITS = 63 + SF.PEACE = 64 + SF.WAR = 65 + SF.HOURS = 66 + SF.NEWHOURS = 67 + SF.SPECTACULAR = 68 + SF.AUTOWHO = 69 + SF.QUICKWHO = 70 + SF.RESET = 71 + SF.ROOMS = 72 + SF.BERSERK = 73 + SF.WEIGH = 74 + SF.VERBOSE = 75 + SF.SGO = 76 + SF.PASSWORD = 77 + SF.NOPASSWORD = 78 + SF.STAMINA = 79 + SF.HUMBLE = 80 + SF.PROOF = 81 + SF.CONVERSE = 82 + SF.DIAGNOSE = 83 + SF.DEAFEN = 84 + SF.BLIND = 85 + SF.PARALYSE = 86 + SF.DUMB = 87 + SF.CURE = 88 + SF.SGET = 89 + SF.VALUE = 90 + SF.INVIS = 91 + SF.VIS = 92 + SF.SHELVE = 93 + SF.UNSHELVE = 94 + SF.UNVEIL = 95 + SF.DEMO = 96 + SF.LAUGH = 97 + SF.IGNORE = 98 + SF.POLICE = 99 + +//Function types for verbs (cf. 1.5 address computer!) + F.INC = 1 + F.DEC = F.INC+1 + F.NULL = F.DEC+1 + F.FLUSH = F.NULL+1 + F.MOVE = F.FLUSH+1 + F.TRANS = F.MOVE+1 + F.SET = F.TRANS+1 + F.TOGGLE = F.SET+1 + F.FIX = F.TOGGLE+1 + F.FLOAT = F.FIX+1 + F.DESTROY = F.FLOAT+1 + F.CREATE = F.DESTROY+1 + F.FORROT = F.CREATE+1 + F.BACKROT = F.FORROT+1 + F.EXPINC = F.BACKROT+1 + F.EXPSET = F.EXPINC+1 + F.HOLDFIRST = F.EXPSET+1 + F.HOLDLAST = F.HOLDFIRST+1 + F.FLIPAT = F.HOLDLAST+1 + F.IFOBJCOUNT = F.FLIPAT+1 + F.IFPROP = F.IFOBJCOUNT+1 + F.IFPROPINC = F.IFPROP+1 + F.IFPROPDEC = F.IFPROPINC+1 + F.IFPROPDESTROY = F.IFPROPDEC+1 + F.UNLESSPROPDESTROY = F.IFPROPDESTROY+1 + F.IFRPROP = F.UNLESSPROPDESTROY+1 + F.IFRLEVEL = F.IFRPROP+1 + F.UNLESSRLEVEL = F.IFRLEVEL+1 + F.NOIFR = F.UNLESSRLEVEL+1 + F.IFR = F.NOIFR+1 + F.IFBERSERK = F.IFR+1 + F.UNLESSBERSERK = F.IFBERSERK+1 + F.IFWIZ = F.UNLESSBERSERK+1 + F.UNLESSWIZ = F.IFWIZ+1 + F.IFSMALL = F.UNLESSWIZ+1 + F.UNLESSSMALL = F.IFSMALL+1 + F.IFDEAF = F.UNLESSSMALL+1 + F.IFBLIND = F.IFDEAF+1 + F.IFPARALYSED = F.IFBLIND+1 + F.IFDUMB = F.IFPARALYSED+1 + F.UNLESSPROP = F.IFDUMB+1 + F.IFZERO = F.UNLESSPROP+1 + F.IFDISENABLE = F.IFZERO+1 + F.UNLESSDISENABLE = F.IFDISENABLE+1 + F.IFENABLED = F.UNLESSDISENABLE+1 + F.UNLESSENABLED = F.IFENABLED+1 + F.TESTSEX = F.UNLESSENABLED+1 + F.UNLESSIN = F.TESTSEX+1 + F.UNLESSOBJIS = F.UNLESSIN+1 + F.IFOBJIS = F.UNLESSOBJIS+1 + F.UNLESSINSIS = F.IFOBJIS+1 + F.IFINSIS = F.UNLESSINSIS+1 + F.UNLESSOBJPLAYER = F.IFINSIS+1 + F.IFOBJPLAYER = F.UNLESSOBJPLAYER+1 + F.UNLESSOBJCONTAINS = F.IFOBJPLAYER+1 + F.IFOBJCONTAINS = F.UNLESSOBJCONTAINS+1 + F.TESTSMALL = F.IFOBJCONTAINS+1 + F.TRANSWHERE = F.TESTSMALL+1 + F.IFIN = F.TRANSWHERE+1 + F.EXP = F.IFIN+1 + F.STAMINA = F.EXP+1 + F.RESETDEST = F.STAMINA+1 + F.STAMINADESTROY= F.RESETDEST+1 + F.LOSEEXP = F.STAMINADESTROY+1 + F.LOSESTAMINA = F.LOSEEXP+1 + F.INJURE = F.LOSESTAMINA+1 + F.SUSPEND = F.INJURE+1 + F.DELAYMOVE = F.SUSPEND+1 + F.WRITEIN = F.DELAYMOVE+1 + F.ENABLE = F.WRITEIN+1 + F.DISENABLE = F.ENABLE+1 + F.UNLESSGOT = F.DISENABLE+1 + F.IFGOT = F.UNLESSGOT+1 + F.UNLESSHAVE = F.IFGOT+1 + F.IFHAVE = F.UNLESSHAVE+1 + F.IFLEVEL = F.IFHAVE+1 + F.IFSELF = F.IFLEVEL+1 + F.UNLESSLEVEL = F.IFSELF+1 + F.IFPLAYING = F.UNLESSLEVEL+1 + F.UNLESSPLAYING = F.IFPLAYING+1 + F.IFLIGHT = F.UNLESSPLAYING+1 + F.IFSEX = F.IFLIGHT+1 + F.IFINVIS = F.IFSEX+1 + F.IFILL = F.IFINVIS+1 + F.UNLESSILL = F.IFILL+1 + F.IFASLEEP = F.UNLESSILL+1 + F.IFRSTAS = F.IFASLEEP+1 + F.UNLESSRSTAS = F.IFRSTAS+1 + F.UNLESSWEIGHS = F.UNLESSRSTAS+1 + F.IFWEIGHS = F.UNLESSWEIGHS+1 + F.UNLESSDEAD = F.IFWEIGHS+1 + F.IFDEAD = F.UNLESSDEAD+1 + F.UNLESSDESTROYED = F.IFDEAD+1 + F.IFDESTROYED = F.UNLESSDESTROYED+1 + F.UNLESSSNOOPING = F.IFDESTROYED+1 + F.IFSNOOPING = F.UNLESSSNOOPING+1 + F.IFFIGHTING = F.IFSNOOPING+1 + F.UNLESSFIGHTING = F.IFFIGHTING+1 + F.HURT = F.UNLESSFIGHTING+1 + F.RETALIATE = F.HURT+1 + F.SENDEMON = F.RETALIATE+1 + F.SSENDEMON = F.SENDEMON+1 + F.EMOTION = F.SSENDEMON+1 + F.ZONK = F.EMOTION+1 + F.DEAD = F.ZONK+1 + F.SEND = F.DEAD+1 + F.SENDEFFECT = F.SEND+1 + F.SENDMESS = F.SENDEFFECT+1 + F.SENDLEVEL = F.SENDMESS+1 + F.INCSEND = F.SENDLEVEL+1 + F.IFHERE = F.INCSEND+1 + F.IFHERETRANS = F.IFHERE+1 + F.UNLESSHERE = F.IFHERETRANS+1 + F.SETSEX = F.UNLESSHERE+1 + F.TOGGLESEX = F.SETSEX+1 + F.TRANSHERE = F.TOGGLESEX+1 + F.DESTROYTOGGLESEX = F.TRANSHERE+1 +//From here onwards the functions are double ie do both indicated things + F.INCDESTROY = F.DESTROYTOGGLESEX+1 + F.DESTROYTRANS = F.INCDESTROY+1 + F.FLOATDESTROY = F.DESTROYTRANS+1 + F.DECDESTROY = F.FLOATDESTROY+1 + F.DESTROYDEC = F.DECDESTROY+1 //Nothing personal Digital Electronics C.! + F.DECIFZERO = F.DESTROYDEC+1 + F.SWAP = F.DECIFZERO+1 + F.IFINC = F.SWAP+1 + F.UNLESSINC = F.IFINC+1 + F.EXPDESTROY = F.UNLESSINC+1 + F.EXPMOVE = F.EXPDESTROY+1 + F.INCMOVE = F.EXPMOVE+1 + F.DESTROYDESTROY = F.INCMOVE+1 + F.DESTROYSET = F.DESTROYDESTROY+1 + F.SETDESTROY = F.DESTROYSET+1 + F.SETFLOAT = F.SETDESTROY+1 + F.DESTROYINC = F.SETFLOAT+1 + F.DESTROYCREATE = F.DESTROYINC+1 + F.DECINC = F.DESTROYCREATE+1 + F.INCDEC = F.DECINC+1 + + B.START = 0 + B.IHIT = B.START+1 + B.THEYMISS = B.IHIT+1 + B.IMISS = B.THEYMISS+1 + B.THEYHIT = B.IMISS+1 + B.IMDEAD = B.THEYHIT+1 + B.IMOK = B.IMDEAD+1 + B.IHITBACK = B.IMOK+1 + B.IMISSAGAIN = B.IHITBACK+1 + B.VICTORY = B.IMISSAGAIN+1 + + FULLBUFSIZE = 639 + BUFFERS = (FULLBUFSIZE+1)/5*2 + WDSPERBUF = 128 +/* +-------------------------------+ + ! POINTR ! + +---------------+---------------+ + ! PN ! GAMES ! + +---------------+---------------+ + ! WRD1 ! + +---------------+---------------+ + ! WRD2 ! + +---------------+---------------+ + ! SCRE ! + +---------------+---------------+ + ! STRN ! DXTY ! STNA ! STMX ! + +---------------+---------------+ + ! LSTM ! + +---------------+---------------+ + ! WIZD ! + +---------------+---------------+ + ! PSWD ! + +---------------+---------------+ + ! UNUSED ! + +---------------+---------------+ + ! UNUSED ! + +---------------+---------------+ + ! UNUSED ! + +---------------+---------------+ +*/ + POINTR : WORD + RECLENGTH : 12 + PN : LH+1 + GAMES : RH+1 + WRD1 : WORD+2 + WRD2 : WORD+3 + SCRE : WORD+4 + STRN : selector 9: 27: 5 + DXTY : selector 9: 18: 5 + STNA : selector 9: 9: 5 + STMX : selector 9: 0: 5 + LSTM : WORD+6 + WIZD : WORD+7 + PSWD : WORD+8 + DEL : 254+WORD + FLEN : 255+WORD + LASTREC : 2*WDSPERBUF-RECLENGTH +$) + +EXTERNAL +$( //Locations (as opposed to routines) + INDEX + DICTIONARY + STLIST + MAX.ROOM.NO + MAX.MESSAGE.NO + MAX.DEMON.NO + TEXT + DEMONS + TXTVEC + MOVERS + MVLOCK + DELOCK + MELTED + PEACE + FREE.SPACE + MALE + FEMALE + STARTLOC + ENDLOC + BACKWORD : BACKWD + TVERB + DATE + RDATE + RHOURS + TIMES + TIME + MUDNAM + MUD6 + PS6 + INIDR + PLAYER + PLYNUM + JOBNOS + KIPS + TABS + SHELF + GDEMONS : GDEMON //GEVENTS would have been better + QUEUE : MQUEUE + PLAYER.NAMES : PNAMES + QUEUE.DOORS : QDOORS + PERSONA.DOOR : PDOOR + MESSAGE.DOOR : MDOOR + NAME.DOOR : NDOOR + REP1 : PNAMES + ESXWD + MOTVEC + CODES + NAPCT + SUPERS + demo + randirs : randir + SHORTMESS + LONGMESS + MAGIC + SPECTACULAR : SPECT + nowiz + randoms : rndms + firsttime : ftime + deldr + active +$) +$list + diff --git a/MBOOTS.MAC b/MBOOTS.MAC new file mode 100644 index 0000000..3ae86dd --- /dev/null +++ b/MBOOTS.MAC @@ -0,0 +1,1107 @@ +;Copyright (C) 1980 by +;Roy Trubshaw, Richard Bartle & Brian Mallett, +;Essex University, Colchester. CO4 3SQ. +; +; This software is furnished on the understanding that +;it may be used and or copied only with the inclusion of this +;notice. No title or ownership of this software is hereby +;transferred. The information in this software is subject to +;change without notice. No responsibility is assumed for the +;use or reliability of this software. + + TITLE BCPL + TWOSEG 400K + + SEARCH UUOSYM + + CODE1==617022 + CODE2==13731 + CODE3==26262 + + JRST .BCPL.## ; CATCH FALL THROUGH +..BCPL::TDZA 1, 1 + SETO 1, 0 ; SET UP CCL VALUE + MOVEM 1, %CCL## ;Store it. + MOVEM 0, %CALLNM## ;Save name of this game... + CAIN .SGPPN, 75 ;Frig for 7.001 monitor - get 75 instead of ppn + MOVE .SGPPN, 77 ;Real ppn is in 77 (part of lookup block) + MOVEM .SGPPN, MAINTA## ;Save as maintainer's ppn + MOVEM .SGPPN, PATHPP ;Save for assigning MUD: + CAIN .SGDEV, 75 ;Same palaver for device now + MOVE .SGDEV, 75 ;Device is 1st entry in lookup block + SKIPN .SGDEV ;Did he give a disc? + MOVEI .SGDEV, 'DSK' ;No so assume dsk... + MOVEM .SGDEV, DISC ;stow away... + MOVEM .SGDEV, PATHDV ;...again. + came .sgdev, [ sixbit /dsk/ ] + camn .sgdev, [ sixbit /all/ ] + jrst past + camn .sgdev, [ sixbit /lib/ ] + jrst past + movei 2, 4 +lop: move 1, [ xwd 3, loc] + jobstr 1, + jrst past + move 1, loc + jumpe 1, over + camn 1, addr+1 + jrst past + movem 1, addr(2) + addi 2, 3 + jrst lop +over: sos 2 + hrli 1, @2 + hrri 1, addr + struuo 1, + trn +past: hrri 1, pathbk + hrli 1, 12 + path. 1, + trn + RESET + setz 1, + setuwp 1, + halt + SKIPE 74 + JRST [ OUTSTR [ ASCIZ / +If you think I'll let you DDT me you've another think coming, squire... +/ ] + JRST @. + EXIT + ] + movei 1, imrtrp + movem 1, .jbapr + movei 1, ap.pov+ap.ilm+ap.nxm+ap.par + aprenb 1, 0 + moveI 1,vec + piini. 1,0 + trn + movei 1,swint + movem 1,vec+4 + movei 1,imrtrp + movem 1,vec+10 + move 1,[ ps.fon+ps.fac+args] + pisys. 1,0 + trn + move 1,[ ps.fon+ps.fac+args1] + pisys. 1,0 + trn + skipn esxwd## + jrst ripple + movei 1, 2 + hrli 1, 3 + movei 2, 2036 + seto 3, + trmno. 3, + trn + setz 4, + trmop. 1, + trn + movei 2, 2003 + trmop. 1, + trn +ripple: JRST 400010 ;Start ripple through +swint: movem 1, sumadd + hrrz 1, status + cain 1, code1 + jrst cone + caie 1, code2 + cain 1, code3 + jrst ctwo +wally: setzm half +okok: move 1, sumadd + debrk. + halt +cone: setom half + jrst okok +ctwo: skipn half + jrst wally + caie 1, code2 + jrst nice + skipe maint## + jrst [ outstr [asciz / +Someone has just tried to do something magical to you nastily. +/ ] + jrst wally + ] + outstr [asciz / +Someone has done something magical to you, nastily... +/ ] + exit + halt +nice: outstr [asciz / +Someone has done something magical to you, nicely... +/] + setom ctcflg## + jrst wally + +imrtrp: movei 1, imrext + movem 1, .jbapr + outstr [asciz / +Something amazingly magical has happened! +/] + skipe magic## + jrst imrext + setom magic## + jsp 14, @resetgame## + subi 16, 2 +imrext: exit 1, + +reloc + +sumadd: block 1 +half: 0 +vec: block 4 +new: 0 +old: 0 +flags: 0 +status: 0 +new1: 0 +old1: 0 +flags1: 0 +stats1: 0 + +args: .pcjbi + xwd 4,0 + xwd 2,0 +args1: .pciuu + xwd 10,0 + xwd 2,0 + +pathbk: -5 + 0 + sixbit /MUD/ + 0 +pathdv: exp 0, 0, 0 +pathpp: exp 0, 0, 0, 0 +addr: .fssrc +disc:: block 1 + 0 + 0 + block ^d21 ;should be enough for most searchlists... +loc: exp -1,0,0 + END ..BCPL + + + + +\\\\\ + SUBFILE: POWER.BCL @11:29 13-NOV-1986 <477> (3816) +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "bcl:acs" +get "bcl:scb" +get "bcl:iolib" +get "dungen" +get "bcl:rfslib" + +$LDTEXT "/RUNAME:power" + +external "." +$( fn +$) + +manifest +$( TREESIZE = RECLENGTH+2 + RIGHT = RH | TREESIZE-1 + LEFT = LH | TREESIZE-1 + CHAIN = RH | TREESIZE + PPPN = #2011002011//MPPN +$) + +static +$( lastblock = 0 + cbl = vec 1 + dmpbuf = vec BUFFERS + cbll = vec 1 + perputt = ? + dmpbuff = vec BUFFERS + bcntt = 1 + nextrec = ? + game = $6"mud" + rock = $6"rock" + blud = $6"blud" + perput = ? + rec = ? + gender = 0 + me = 0 + ch = ? + name = vec 1 + room = 0 + tree = 0 +$) + +let start() be +$( let bcnt=1 + output:=tty + outs("The power program!*C*L") + $[ $rescan +zonk: $inchrs 1 + $jrst plonk + $caie 1, '-' + $jrst zonk +cronk: $inchrs 1 + $jrst plonk + $trz 1, #40 + $caie 1, 'M' + $cain 1, 'V' + $jrst wonk + $caie 1, 'B' //spot the hacks... + $cain 1, 'R' + $trna + $jrst cronk + $move 2, rock + $cain 1, 'B' + $move 2, blud + $movem 2, game +wonk: $inchrs 1 + $trna + $jrst wonk +plonk: $] + input:=tty + Readname(name, "Password: ") + test !name=!"bushbaby" then outs("*C*LThat'll do...*C*L") or + $( Outs("*C*LEek! Go away!*C*L") + finish + $) + $( Outs("Frig, Start, League, Transfer, Enumerate, Password, Dot, Reveal, Mud, Kill*C*Lor One-off? ") + switchon valof + $[ $clrbfi + $inchrw 1 + $trz 1, #40 + $] into + $( + case 'R': outs("eveal*C*L") + reveal() + finish + case 'M': outs("ud*C*L") + run($6"dsk", $6"mud", $6"exe", PPPN) + case 'S': outs("tart*C*L") + strat() + finish + case 'D': outs("ot*C*L") + dot() + finish + case 'F': outs("rig*C*L") + break + case 'L': outs("eague*C*L") + league() + finish + case 'T': outs("ransfer*C*L") + Transfer() + finish + case 'E': outs("numerate*C*L") + Enumerate() + finish + case 'P': outs("assword*C*L") + password() + finish + case 'K': outs("ill*C*L") + kill() + finish + case 'O': outs("ne-off*C*L") + oneoff() + finish + default 0 ... #137: + Outs("*C*LEh?*C*L") + $) + $) repeat + setup() + readname(name, "Name: ") + if !name =!"richard" Outs("*C*LYou're so naive...*C*L")<>finish + searchrec(name) + if rec then rec_rec rem 128+dmpbuf + test rec then + $( let sc, sx=SCRE of rec, WRD1 of rec bitand 1 + outs("Current character profile is:*C*L") + 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) + 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", + dxty of rec,stna of rec,stmx of rec,games of rec, sx -> "fe", "",PSWD of rec) + dumpersona(true) + save.block() + $) or + $( out("No current persona! I'll make one for you, :s.*C*L",name) + addrec(name) + rec_rec rem 128+dmpbuf + games of rec_1 + WRD1 of rec_!name + WRD2 of rec_LENGTH of name>4 -> 1!name,0 + WIZD of rec_false + dumpersona() + save.block() + $) + Close(perput) + deq(sc.channel^perput) +$) +and dumpersona(pw) be +$( unless numbargs() pw_false + if pw pw_ESSEX + if pw pw_appendfile($6"dsk",$6"prolog",$6"prl", MPPN,label(oops)) + if pw + $( write(pw,"POWERing :S*C*LStr.*TDex.*TSta.*TScore*TSex*TP/w*C*L",name) + write(pw,":N*T:N*T:N*T:N*T:S*T:8*C*L",STRN of rec,DXTY of rec, + STMX of rec,SCRE of rec,((WRD1 of rec) bitand 1)->"f","m",PSWD of rec) + $) + outs("Prepare to fulfill your wildest dreams!*C*L") + outs("Strength ?"); STRN of rec_getno(STRN) + outs("Stamina (max) ?"); STNA of rec_getno(STMX); STMX of rec_STNA of rec + outs("Dexterity ?"); DXTY of rec_getno(DXTY) + outs("Score ?"); SCRE of rec_getno(SCRE) + outs("Sex ?") + $[ $CLRBFI + $INCHRW ch + $] + Gender_(WRD1 of rec) bitand 1 + TEST ch='M'\/ch='m' THEN OUTS("ale*C*L")<>gender_0 + OR if ch= 'F'\/ch='f' THEN OUTS("emale*C*L")<> + gender_1 + outs("Pn ?"); PN of rec_Getno(PN,true) + unless PN of rec PN of rec_valof $[ $getppn 1, 0 $] + WRD1 of rec_((WRD1 of rec) bitand ~1) bitor gender + LSTM of rec_valof + $[ $hrri ac, #11 + $hrli ac, #53 + $gettab ac, 0 + $trn + $] + if pw /\ (PSWD of rec ne 0) + $( outs("Zero p/w ?") + if valof + $[ $clrbfi + $inchrw 1 + $trz 1, #40 + $caie 1, 'Y' + $jrst render + $outstr $az"es*C*L" + $trna +render: $setz 1, 0 + $clrbfi + $] then PSWD of rec_0 + $) + if pw + $( write(pw,":N*T:N*T:N*T:N*T:S*T:8*C*L",STRN of rec,DXTY of rec, + STMX of rec,SCRE of rec,((WRD1 of rec) bitand 1)->"f","m",PSWD of rec) + close(pw) + $) + return +oops: Outs("*C*LI can't log this frig, so I won't do it, sorry.*C*L") +$) +and load.block(stream,block) be +$( if block=lastblock return + useti(perput,block) + inuuo(stream,cbl) + lastblock_block +$) +and save.block(block) be +$( let blk=numbargs()->block,lastblock + useto(perput,blk) + outuuo(perput,cbl) +$) +and searchrec(nam) = valof +$( let pnt,lrec,str=?,0,vec 1 + !str_!nam + 1!str_LENGTH of nam>4 -> 1!nam, 0 + load.block(perput,1) + lrec_hashval(str) + rec_dmpbuf!lrec + while rec + $( load.block(perput,rec/WDSPERBUF+1) + pnt_(rec rem WDSPERBUF)+dmpbuf + if namesame(str,2+pnt) break + lrec_rec + rec_POINTR of pnt + $) + resultis lrec +$) +and saverec(nam) = valof +$( searchrec(nam) + unless rec addrec(nam) + if rec //In case addrec hasn't added them. + $( load.block(perput,rec/WDSPERBUF+1) + dumpersona(rec rem WDSPERBUF+dmpbuf) + save.block() + $) + resultis rec //return a value to indicate whether you've been saved. +$) +and deleterec(nam) be +$( let olrec,odel,lrec=?,?,searchrec(nam) + and pnt=rec rem WDSPERBUF+dmpbuf + unless rec return //Can't find record + //Ok, this may look a little long-winded + load.block(perput,rec/WDSPERBUF+1) //but it's worth it not to corrupt the persona file in case of a crash + WRD1 of pnt_0 + WRD2 of pnt_0 //Zero names for purges etc. + GAMES of pnt_0 //Yawn thinks we need this, too! (WE DO! - Yawn xx) + olrec_!pnt + save.block() + + load.block(perput,lrec/WDSPERBUF+1) + dmpbuf!(lrec rem WDSPERBUF)_olrec //Old pointer to rec now points to old pointer of rec. + save.block() + + load.block(perput,1) //Get the deleted record pointer + odel_DEL of dmpbuf + save.block() + + load.block(perput,rec/WDSPERBUF+1) //And plonk it in the record to be deleted + !pnt_odel //Does anyone read all these comments? + save.block() + + load.block(perput,1) //Finally update the deleted record pointer to point to the newly deleted record! + DEL of dmpbuf_rec + save.block() +$) +and addrec(nam) be +$( let hashcont,olrec,str=?,?,vec 1 + !str_!nam + 1!str_LENGTH of nam>4 -> 1!nam,0 + load.block(perput,1) + rec_DEL of dmpbuf + test rec then + $( load.block(perput,rec/WDSPERBUF+1) + olrec_POINTR of (rec rem WDSPERBUF+dmpbuf) + save.block() + $) or + $( rec_FLEN of dmpbuf + unless rec //No persona file exists. + $( rec_2*WDSPERBUF + FLEN of dmpbuf_rec //Create hash table + $) + olrec_0 //No deleted records + FLEN of dmpbuf+_RECLENGTH + save.block() + $) + load.block(perput,1) + DEL of dmpbuf_olrec + hashcont_dmpbuf!hashval(str) + dmpbuf!hashval(str)_rec + save.block() + + load.block(perput,rec/WDSPERBUF+1) + POINTR of (dmpbuf+rec rem WDSPERBUF)_hashcont + save.block() +$) +and hashval(nam) = ((!nam+1!nam)>>1) rem 253 +and kill() be +$( setup() + readname(name, "Name: ") + if !name =!"richard" Outs("*C*LNot Richard...*C*L")<>finish + deleterec(name) + test rec then out(":s terminated.",name) + or out(":s already dead - you can only kill people once!",name) + + Close(perput) + deq(sc.channel^perput) +$) +and getno(sel,octal)=valof +$( let ch=valof + $[ $clrbfi + $inchrw 1 + $] + unless numbargs()=2 octal_false + unless '0' le ch le '9' + $( $[ $clrbfi $] + resultis sel of rec + $) + putback(input, ch) + ch_(octal->inoct,inno)() + $( let stk=SC.PUTSTACK^input + SC.PUTSTACK^input, SC.READER^input _ !stk, stk!2 + freevec(stk) + $) + resultis ch +$) +and inoct(nopb)=valof +$( let res=0 and ch=? + ch_inch() repeatuntil '0' le ch le '7' + while '0' le ch le '7' do + $( res_(res<<3)-'0'+ch + ch_inch() + $) + unless numbargs() putback(input,ch) + resultis res +$) +and readname(nm, pr) be +$( let n,ch,linev=0,?,vec NAMELENGTH + write(tty, pr) + readch(input,@ch) + while 'a'<=(ch bitor #40)<='z' do + $( n+:1 + unless n>NAMELENGTH linev!n:='A'<=ch<='Z'->ch+#40,ch + readch(input,@ch) + $) + !linev:=n>NAMELENGTH->NAMELENGTH,n + packstring(linev,nm) + until ch='*L' do readch(input,@ch) +$) repeatuntil LENGTH of nm +and dot() be +$( let stfl,no,ch=0,?,? + writes(tty,"Please enter the job number of the about to be dotted job*C*L(0 for all of them)*C*L") + writes(tty,"**") + no_rdno(tty) + $( let res=? + writes(tty,"dotted nicely or horribly N/H? ") + $[ $clrbfi + $inchrw ch + $] + stfl_0 + test ch='H' \/ ch='h' then stfl_#13731<>writes(tty,"orribly*C*L") or + if ch='N' \/ ch='n' then stfl_#26262<>writes(tty,"icely*C*L") + unless stfl writes(tty,"*Binvalid character*C*L")<>loop + for i=1 to 200 dispose(#617022,i) + test no then res_dispose(stfl, no) + or for i=1 to 200 if dispose(stfl, i) res_true + unless res Writes(tty, "*C*L?POWIDW - it didn't work so stop pissing around.*C*L") + finish + $) repeat +$) +and dispose(stfl, no) be +$[ $hrrz 2,stfl + $hrl 2,no + $calli 2,#175 + $setz 1,0 //uh? +$] +and namesame(nam1,nam2)= +(!nam1>>1)=(!nam2>>1)/\((LENGTH of nam1<=4)\/(1!nam1>>1)=(1!nam2>>1)) +and strat() be +$( let resp=? + $( writes(tty, "*C*LMud, Valley or Rock? ") + $[ $inchrw 1 + $trz 1, ' ' + $movem 1, resp + $] + $) repeatuntil resp='V' | resp='M' | resp='R' + write(tty, ":s*C*L", resp='R'->"ock", resp='V'->"alley", "ud") + resp_resp='R' -> $6"rock",resp='V'->$6"valley", $6 "mud" + output_createtmp(resp) + readname(name, "Name: ") + writes(tty, "*C*LRoom: ") + $[ $clrbfi $] + for i=0 to 5 do + $( let letter = byte 6:30-6*i + and next = valof $[ $inchrw 1 $] + if 'a' le next le 'z' next-_'a'-'A' + if next = '*C' break + letter from room _ next-' ' + $) + $[ $clrbfi $] + out(":s*^C:n*$:n*$:n", name, + valof $[ $mstime 1, 0 $], + valof $[ $mstime 1, 0 $], + room) + close(output) + run($6 "dsk", resp, $6 "exe", 0) +$) + +and setup() be +$( !cbl_(-BUFFERS<<18)bitor(dmpbuf-1) + 1!cbl_0 + if false + $( +dogoneit: perput_createfile($6"dsk",game,$6".pm",PPPN,0,#17,1) + enq(SC.CHANNEL^perput) + useto(perput,2) + outuuo(perput,cbl) + close(perput) + deq(sc.channel^perput) + $) + perput_updatefile($6"dsk",game,".pm",PPPN,label(dogoneit),#17,1) + enq(sc.channel^perput) + useti(perput,1) +$) +and reveal() be +$( let ch, f, fil, ext=?, ?, vec 1, vec 1 + readname(fil, "File part: ") + readname(ext, "Extension part: ") + f_findfile($6"dsk", fil, ext, 0, label(absent)) + if false +absent: f_findfile($6"dsk", fil, ext, PPPN, label(nowhere)) + input_f + ch_Inch() + while ch ne '*E' + $( outch(ch) + ch_inch() + $) + close(f) + input_tty + return +nowhere: out("Sorry, I can't find :S.:S*C*L", fil, ext) +$) + +and password() be +$( let num,numrecs,bcnt=?,?,3 + setup() + out("*C*LOctal password: ") + num_inoct(true) + + useti(perput,1) + inuuo(perput,cbl) + numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records + + useti(perput,bcnt) //Load in the first block of records + inuuo(perput,cbl) + + rec_dmpbuf + for i=1 to numrecs + $( if WRD1 of rec /\ num=PSWD of rec + out(":S on :N points*C*L", rec+2, SCRE of rec) + if (rec-dmpbuf)>128 + $( rec -_ 128 + bcnt +_ 1 + useti(perput,bcnt) + inuuo(perput,cbl) + $) + rec+_RECLENGTH + $) + + close(perput) + deq(sc.channel^perput) +$) + +and Lev(pts, fem)=valof +$( let sc=exp.step + for i=0 to 9 + $( if sc ge pts resultis i + sc+_sc + $) + resultis 9 +$)!(fem!(table + (table "novice", + "warrior", + "hero", + "champion", + "superhero", + "enchanter", + "sorcerer", + "necromancer", + "legend", + "wizard" + ), + (table "novice", + "warrior", + "heroine", + "champion", + "superheroine", + "enchantress", + "sorceress", + "necromancess", + "legend", + "witch" + ) + ) +) + +and Enq(chan) be +$( let addr=vec 4 + !addr_#1000005 + 1!addr_142857 + 2!addr_chan + 3!addr_$az"mud"+(-1<<18) + 4!addr_0 + Out("*C*LENQ. error code :8*C*L", valof + $[ $move 1, addr + $enq. 1, 0 + $trna + $( return $) + $]) +$) + +and Deq(chan) be +$( let addr=vec 1 + !addr_#1000005 + 1!addr_142857 + Out("*C*LDEQ.error code :8*C*L", valof + $[ $move 1, addr + $hrli 1, 1 + $deq. 1, 0 + $trna + $( return $) + $]) +$) +and transfer() be +$( let peep, bcnt, numrecs=?, 3, ? + outs("where from? (0 for everywhere) ") + peep_inoct(true) + setup() + + useti(perput,1) + inuuo(perput,cbl) + numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records + + useti(perput,bcnt) //Load in the first block of records + inuuo(perput,cbl) + + rec_dmpbuf + for i=1 to numrecs + $( if WRD1 of rec /\ (PN of rec=peep | peep=0) + $( out(":s: [**,:8] -> ", rec+2, PN of rec) + PN of rec_Getno(PN, true) + $) + + if (rec-dmpbuf)>128 + $( rec -_ 128 + useto(perput, bcnt) + outuuo(perput, cbl) + bcnt +_ 1 + useti(perput,bcnt) + inuuo(perput,cbl) + $) + rec+_RECLENGTH + $) + + close(perput) + deq(sc.channel^perput) +$) + +and League() be +$( let numrecs,bcnt=?,3 + setup() + useti(perput,1) + inuuo(perput,cbl) + numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records + + useti(perput,bcnt) //Load in the first block of records + inuuo(perput,cbl) + + rec_dmpbuf + for i=1 to numrecs + $( if WRD1 of rec tree_insert(SCRE of rec, tree) + if (rec-dmpbuf)>128 + $( rec -_ 128 + bcnt +_ 1 + useti(perput,bcnt) + inuuo(perput,cbl) + $) + rec+_RECLENGTH + $) + + + close(perput) + deq(sc.channel^perput) + outs("Writing to LEAGUE.ENM") + output_createfile("dsk","league","enm",0) + outree(tree) + while me + $( let p=LH of me + Out("richard*T*T[**,:8]:c*T34359738369*T9999*Tyes*TWIZARD*C*L",p, p ls #1000->'*T','*0') + me of_RH + $) + close(output) +$) +and today()=valof +$[ $hrli 1, #53 + $hrri 1, #11 + $gettab 1, 0 + $trn + $hlrz 1, 1 +$] +and Enumerate() be +$( let now,bcnt,numrecs=today(),3,? + setup() + outs("Writing to POWER.ENM*C*L") + output_Createfile($6"dsk",$6"power",$6"enm", 0, Label(rats)) + outs("Enumeration of personas as of ") + outtime() + outs(" on ") + outdate() + outs(":*C*L*L") + + useti(perput,1) + inuuo(perput,cbl) + numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records + + useti(perput,bcnt) //Load in the first block of records + inuuo(perput,cbl) + + rec_dmpbuf + for i=1 to numrecs + $( if WRD1 of rec + $( let t, sx, wz=now-(LH from LSTM of rec), (WRD1 of rec) bitand 1, WIZD of rec + 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", + rec+2,PN of rec,SCRE of rec,STRN of rec,DXTY of rec,STNA of rec,STMX of rec) + Out("Last game:*T:N day:S ago*C*Lgames:*T*T:N*C*Lsex:*T*T:Smale*C*L", + t,t=1->"","s",GAMES of rec,sx->"fe","") + if wz bitand WIZMASK Out("Mode:*T*TWI:S*C*L", sx->"TCH","ZARD") + if wz bitand 4 Outs("Mode:*T*TBERSERK*C*L") + Outs("*C*L*L") + $) + if (rec-dmpbuf)>128 + $( rec -_ 128 + bcnt +_ 1 + useti(perput,bcnt) + inuuo(perput,cbl) + $) + rec+_RECLENGTH + $) + + close(perput) + deq(sc.channel^perput) + close(output) + Writes(tty,"*C*LEnumerated in DSK:POWER.ENM*C*L") + if false +rats: Writes(tty,"*C*LCan't create DSK:POWER.ENM*C*L") +$) + +and insert(sc, tree)=valof +$( if tree test sc ls SCRE of tree then + $( LEFT of tree_insert(sc, LEFT of tree) + resultis tree + $) or if sc gr SCRE of tree then + $( RIGHT of tree_insert(sc, RIGHT of tree) + resultis tree + $) + sc_Newvec(TREESIZE) + for i=0 to RECLENGTH sc!i_rec!i + sc!(RH from RIGHT)_0 + if tree + $( CHAIN of sc_CHAIN of tree + CHAIN of tree_sc + resultis tree + $) + CHAIN of sc_0 + resultis sc +$) + +and outree(tree) be if tree +$( let l, r, n, p=LEFT of tree, RIGHT of tree, tree+2, PN of tree + outree(l) + test !n=!"richard" then + $( let m=newvec(0) + LH of m_p + RH of m_me + me_m + $) or + Out(":s:c*T[**,:8]:c*T:N*T:c:N*T:8:S:S*C*L", + 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, + PSWD of tree, (WIZD of tree bitand 4)-> "*TBERSERK", "",(WIZD of tree bitand WIZMASK)->WRD1 of tree bitand 1->"*TWITCH","*TWIZARD", "") + Outree(CHAIN of tree) + outree(r) +$) +and Oneoff() be +$( let now,newrec,lastrec,recptr,rec2,old.lastrec,hashbuf= + today(),0,?,?,0,?,vec 256 + !cbll_(-BUFFERS<<18)bitor(dmpbuff-1) + 1!cbll_0 + clearvec(dmpbuff, BUFFERS) + perputt_createfile($6"dsk",game,$6"off",0,0,#17,1) + useto(perputt,1) + nextrec_dmpbuff + setup() + $( inuuo(perput,cbl) + rec_dmpbuf + while LH of rec + $( +//Do the processing between here... + + let temp,pswrd=newrec,? //record list pointer + newrec_newvec(RECLENGTH) //new reclength + !newrec_temp + for i=0 to 7 do (2+i)!newrec_i!rec //copy over oldrec + for i=8 to RECLENGTH-2 do (2+i)!newrec_0 //and zero the rest + pswrd_9!newrec + 9!newrec_(pswrd rem ((1<<20)-1))*(pswrd rem ((1<<25)-1)) + if LENGTH of (rec+1)<5 4!newrec_0 + + +//...and here! + rec+_8 + $) + unless rec=dmpbuf+2*WDSPERBUF-8 & rec!1 then break + $) repeat + + + bcntt_3 + for hashno=0 to 252 + $( let nextrec=newrec + out("****************HASH=:N*****************C*L",hashno) + lastrec_0 + while nextrec + $( let recptr=rec2+dmpbuff + if hashno=hashval(nextrec+3) + $( out(":s :n*C*L",nextrec+3,bcntt) + 1!nextrec_lastrec + lastrec_rec2+(bcntt-1)*WDSPERBUF + old.lastrec_lastrec + for i=0 to 11 i!recptr_(i+1)!nextrec + rec2+_12 + if rec2>128 + $( useto(perputt,bcntt) + outuuo(perputt,cbll) + bcntt+_1 + rec2 rem_ 128 + for i=0 to rec2-1 do i!dmpbuff_(i+12-(rec2-1))!nextrec + $) + $) + nextrec_!nextrec + $) + hashno!hashbuf_lastrec + $) + useto(perputt,bcntt) //tidy up. + outuuo(perputt,cbll) + 255!hashbuf_old.lastrec+12 + 254!hashbuf_0 + + for hashno=0 to 255 hashno!dmpbuff_hashno!hashbuf + + useto(perputt,1) + outuuo(perputt,cbll) //Output hash table + + close(perput) + deq(sc.channel^perput) + close(perputt) + Writes(tty,"*C*LOne-offed in the .OFF file*C*L") +$) +and clearvec(vect,size) be +$[ $MOVE AC, vect + $HRLI B, 0(AC) + $HRRI B, 1(AC) + $SETZM 0(AC) + $ADD AC, size + $BLT B, 0(AC) +$] +and yes(rec, str) =valof +write(tty, ":s :s", rec+1, str)<> +$[ $clrbfi + $inchrw 1 + $caie 1, 'y' + $cain 1, 'Y' + $jrst ep + $cain 1, '*C' + $jrst yep + $clrbfi + $outstr $az"o*C*L" + $setz 1, 0 + $( return $) +yep: $outchr 'y' +ep: $outstr $az"es*C*L" +$] + +$[ fn: $exit 1, 0 + $jrst fn +$] + + + + +\\\\\ + SUBFILE: DBADAT.MAC @15:11 16-AUG-1986 <477> (786) +;Copyright (C) 1980 by +;Roy Trubshaw, Richard Bartle & Ronan Flood, +;Essex University, Colchester. CO4 3SQ. +; +; This software is furnished on the understanding that +;it may be used and or copied only with the inclusion of this +;notice. No title or ownership of this software is hereby +;transferred. The information in this software is subject to +;change without notice. No responsibility is assumed for the +;use or reliability of this software. + + TITLE Database for MUD version 3 + TWOSEG 400K + SALL + .DIRECTIVE SFCOND + NOSYM + + MAXPLY==^D36 + + IF2 + + DEFINE FLIST(SIZE,NUM)< + EXP .+1 + REPEAT NUM-1,< + EXP .+SIZE + BLOCK SIZE-1> + BLOCK SIZE> + + DEFINE VEC(SIZE,VALUE<0>)< + EXP .+1 + IFE VALUE, + IFN VALUE, >> + +STARTL::EXP . ;Address of start of database. +INDEX:: EXP 0 ;Room index. +DICTIO::BLOCK 1 ;Dictionary hash table. +STLIST::BLOCK 1 ;Pointer to start location list. +MAX.RO::BLOCK 1 ;Max number of rooms. +MAX.DE::BLOCK 1 ;Max number of demons. +DEMONS::BLOCK 1 ;Table of demons +GDEMON::EXP 0 ;List of global demons +DATE:: BLOCK 1 ;DECsystem 10 date of creation. +RDATE:: EXP 0 ;DECsystem 10 date of last reset +RHOURS::EXP 0 ;Accumulated time since last Reset +RNDMS:: EXP 0 ;List of room lists for randomisation +FTIME:: EXP 0 ;First time played this version? +TIME:: BLOCK 1 ;DECsystem 10 time of creation. +BACKWD::BLOCK 1 ;Says if a direction has an opposite +TVERB:: BLOCK 1 ;movement check word +NAPCT:: 0 ;number of naps before assume crash +SUPERS::0 ;whether this is superseded by us or not +DEMO:: 0 ;is there a demo on? +RANDIR::0 ;random directions in travel table +CODES:: BLOCK 1 ;vdu manipulation codes. +LOW1:: EXP 0 ;overload measure +LOW2:: EXP 0 ;near-overload measure +TIMES:: EXP .+1 ;vector of lists of playing times + BLOCK 7 +MOTVEC:: BLOCK 1 ;Inverse movement no. to names +MOVERS:: BLOCK 1 ;Objects which are mobile +MVLOCK:: EXP -1 ;So don't try to move above twice at once +DELOCK:: EXP -1 ;Global demon lock +MELTED:: EXP -1 ;Whether objects can move +PEACE:: EXP 0 ;whether can fight or not +SPECT:: EXP 0 ;whether there's a spectacular on +MALE:: VEC ^D10 ;names for males + ;I bet I forget to alter with MAX.LEVEL... +FEMALE:: VEC ^D10 ;names for females +MUDNAM:: BLOCK ^D27 ;Name of dungeon as BCPL string +MUD6:: EXP 0 ;first 6 letters of above in 6bit +ESXWD:: BLOCK 1 ;memory location for manifest ESSEX constant +PS6:: BLOCK 1 ;first 6 letters of persona file +MAX.ME::BLOCK 1 ;Max number of text messages. +TEXT:: BLOCK 1 ;Table of text messages. +TXTVEC:: BLOCK 1 ;Word count for disc file +INIDR:: EXP -1 ;Initialisation door. +DELDR:: EXP -1 ;Delay door for timing out. +ACTIVE::VEC MAXPLY, -1 ;To ensure you're still playing +PLAYER::EXP -1 ;Stack pointer. + COUNT==MAXPLY+2 ;2 is the frig factor! +PLYNUM::VEC MAXPLY, <> + PURGE COUNT +MQUEUE::VEC MAXPLY ;Message queue. +PNAMES::VEC MAXPLY ;Player names. +JOBNOS::VEC MAXPLY ;Player job numbers. Forget locking it... +KIPS:: VEC MAXPLY ;Times at which people went to sleep. +QDOORS::VEC MAXPLY, -1 ;Doors to message queues. +PDOOR:: EXP -1 ;persona file door +MDOOR:: EXP -1 ;Door to message freelist. +NDOOR:: EXP -1 ;Door to name selection +TABS:: VEC ^D24 ;Combat tables +SHELF:: EXP 0 ;Shelf for arch-wiz items +SHORTM::FLIST 3, 200 ;Short message freelist. +LONGME::FLIST 20, 100 ;Long message freelist. +%RANSE::XWD 1, -1 ;Random number seed. +MAGIC:: EXP 0 ;If non zero u get thrown out. +NOWIZ:: EXP 0 ;true if no wiz's allowed +LOCKED::EXP 0 ;Whether the game is wizard-locked or not +ENDLOC::EXP HERE/^D512 ;Current page +FREE.S::EXP .+1 ;Freestore pointer + BLOCK 1 +HERE==. +END + + + + +\\\\\ + \ No newline at end of file diff --git a/MUD.BOX b/MUD.BOX new file mode 100644 index 0000000..e2e3870 --- /dev/null +++ b/MUD.BOX @@ -0,0 +1,321 @@ +H=HARD +T=TEDIOUS +E=EASY +L=LONG-TERM +S=SUGGESTION +*=ASAP +!=TO BE TESTED +?=VERIFY + +! need %'s for maps +! make it chuck you out properly when it crashes - switch off ctrap +! make DBASE chuck out "our" names put in the database - stick in symbol table + +* make POWER non-runnable from [*,2653]. +* "Here stands the tomb of Maria the witch, shaped like a large button with + F1 written on the top" +* pss #121...#137, janet #22...#40 +* if you snoop on someone who's forced to do something illegal, you lose + the force snoop forever +* people in ROCK can run into MUD via SGO - stop 'em. Drop the MUD6 name? +* ensure "Everything has been reser to..." starts with an E +* cabn go BACK from ktreas and dwarfs don't stop you +* I killed dan the wiz as an (unfrigged) novice +* There is a bug with zaping the grate to get back to the land + if someone is in the wardrobe then you don't teleport - ok +* still told p/w to wiz mode revealed when you quit +* wiz's are told when arch-wiz's follow them +* stroked a dead rabbit and was bitten..! +* In the cupboard (to go to the attic), I am told that you can FLEE out of + it, even when it is latched shut. I have not actually tried this myself. +* More major bug: dwarfen realm. In the King's Treasure chamber, it is possible + to get out without killing the dwarf guards by typing BACK +* At the end of a BUG or TYPO report, Thankyou is printed as one word! +* Misspelling: Overgrown grounds of mausoleum... ...sweeping down into a steep >> + >escaprment<< +* WHHY CAN'T I DECK THE HALL WITH HOLLY?!! +* catch CATCH WATER IN POT and FILL POT F STREAM etc +* put a WIZVWIZ test in CHECKOUT (mud3) before add stuff. Also, make + wiz's not be checked if they're v an arch-wiz? ie de-wiz 'em? +* stop wiz's from being killed by novices! +* zapping grate triesto take you to wardrobe - but if it's full? +* try to feed rabbit to wolf - won't let you as it's a carnivore. make it + wolf it down? +* a WHO HERE command, savesyou looking +* stop wiz's being told when arch's follow 'em +* end of BUG gives word "thankyou" not "thank you" +* Howbout a way for mortals to get rid of the rain? Say gamble with + a god against some stamina or a sacrifice of a goat.. ( or human!) +* put back TALK +* Oh and how much is a MUD sweatshirt please. +* a REPLY (R) command, which replies to the last message you were TELLed +* put wiz's in a file to check +* can't use START in power - wants a p/w +* don't let people steal things you're keeping +* WHO +* only arch-wiz locks should lock out wiz's +* inventory +* forbid to stop it being used by non-wiz's +* drop in - should say the room for wiz's +* don't let you get points from stream (or poker?) above level 6. +* make screenwidth work properly +* G IVY F DIAL fails, G IVY F BBATH says concentrate on sundial +* stop people from being summoned if they're in fights +* i just cast a spell - it didn't work but i was in a room that would + 'nt let me go to sleep and i came back with more than my maximum endurance +* put random auto-logs for wiz's on my area +* can you set user name from inside the game? +* lightning mobile which strikes people at random as it moves about +* if play violin and drop it, still get message it's broken +* short messages for fights if you fbrief. Same as 3rd party messages to + othrs +* put TALK in access.usr +* have a MONITOR command (uses the WIZD word) which is for + whether you want trash messages to come up if you're a wiz +* have it so you can KISS/HUG with an adverb, too +* often says you7re not alone when you are +* knocking down with feathers +* when people die, say HOW they died, ie if in a fight or not (to wiz's) +* Can open brolly lots of times without closing it +* If the p command is removed....then why not the 'recite' and the 'chant' ?? +* trying to FELL TREE W WAND produces u need an axe (or wand) to fell a tree +* are mobiles carrying things immbole? +* if snoop on mobiles, hear what7s said in the room? see their commands? +* stop it giving double |'s for You cannot go that way messages +* smile might be nice +* WHO LEVEL tells you who is playing at that level only +* move panel says "i see no panel" in sliding panel room +* have a SPIT command like kiss +* TELL ALL EXCEPT bbb +* make logboo and almana writeable but not as obj's, ie you have to + type READ ALMANANAC and it then types out what's written in it +* witches become wiz's if you att to them (petal does anyway!) +* put up CLIVE's VALLEY +* make it so can't go into wiz mode if more than half the number of + mortals in wizards already +* all EXITS in the steps to cellar were CELLAR - even UP! +* having taken a bag - any LOOK i do looks in the bag! whoops +* should you hurtle down th chute with the umbrella? +* time-stamp yhe time when peopl egot big scores. Make it work + right for ATTATCHED personas too. +* switch echo off via SEM first thing so p/w7s not caught +* if you try manipulate something that isn't there, then type LOOK, you + get screwedup messages. MAKE IT SO LOOK ONLY WORKS ON DEFAULT OBJECT IF + YOU TYPED ONE< IE DON'T INHERIT - or is it something else that screws it? +* have 2 bits of uranium, and if you put them in a bag together... +* when begger is zapped, get the object RAGS from store +* a tiara +* OPEN BOOKCASE doesn't work even with help! +* does it let you snoop on someone who7s already snooping? +* You should be able to cross swolen rivers if you have a boat ! +* WIND to make you go BACK sometimes - screws up programs! +* put in 3rd person fights pretty soon - colourful but short descr's. +* STUN +* if someone goes into wiz mode and they're the only player, next player + gets the "changed to wiz mode" message too when they start up +* lose stamina for moving - 1 every 100 moves or so? +* PUSH X NORTH or PUSH X:NORTH - compare strengths +* gorier fight descriptions +* if in bunker it says the tunnel is collapsed etc even when door shut +* make it so have to cook the wafers for them to work?! + in for 10 mins to cook them ... then get points for eating + them if you leave them > 20 mins say they burn + are useless +* allow people to go down the well possibly to a watery grave? +* if you ^C out when there's a noecho() it keeps noecho'ed. Make it use + SEM? +* butterfly->destroyed->caterpillar->chrysalis->bf again. T when bf + butterfly net for ^? +* when people are asleep for long periods, let them dream (demons) and + get some clues + +E more interesting monsters +E there is no way of finding out stamina of ALL dwarves in 1 room +E Change laugh to I am so I am eating,proofs Polly the witch is eating ! +E make fight templates change each level +E How about a Mirror for Valley ?? +E have a destroydead, so can get rid of some more dead rooms +E put in a static for when you're fighting, rather than the for loop + - use a differnet name though! Also make player.names!snd a variable + in mud8 +E a GAG/NOGAG command? +E a POLICE command +E have a MACRO command +E have a SEN TTY facility +E have a message sending/leaving facility using remote files +E let wiz's attach adjectives to people's names? FRED the NICE WARRIOR? + could it be made permanent? +E Can u make it so that lines about to get truncated + are split up first. eg using " or speech. +E make it so wizards only appear with a crash of thunder when they GO + somewhere, and for walking just normal stuff +E send messages to other people in the room when you're fighting +E if you add Bardsley's RUN check stuff, make sure it only checks on a + valid NEXTGAME, not LOGOUT. +E HOW ABOUT MAKING 'SWAMP' DEFAULT TO 'OUT', THUS MEANING YOU COULD TYPE SWAMP + FROM NEARLY ANYWHERE! +E when people start to play, add their names to a file, MUD.PLY on + the MUD area, which looks for the persona file name.MUD. In this file + put your name and game. WHen you do a WHO, look in the file after normal + WHO, and read out players from other games and which one they're in. Make + it a LONGWHO command? +E allow WHO WIZARDS etc to let you know who of that rank is playing. + whethr just want that rank or all above I don't know... +E Why not have in wiz mode Inventory +E island: some seagul pecks you when asleep. for this and current, + need a 'silent' mobile +E a cage with something horrible behind it, hard luck if you open it. +E a pit leading to a cave with something ghastly in it. need to kill it + to get out +E some sort of book in valley +E assume +E let the database writer at the WIZARD word of the persona, ie let 'em + give props to people. Objects with binary props too? +E garbage collect +E auto- as a prefix to anything, eg auto-save. use demons. +E a few // rooms, eg 2 upstairs in house +E more toytown treasures for beginners, esp. north sectn. less pts for + easy-to-find ones. +E bale of hay in paddock, contains a silver needle feed it to goat/horse/ox + to get the needle +E make tombs toggle on keyword. put in some new problems... split up + in the.txt file +E if someone already in under your name and pswd, attach +E switch ini eg MUD/log/name:richard/brief etc +E make dbase handle @ properly in maps - might be an escape code! +E power's LEAGUE ok in MUD +E mobiles which follow you - use .provoke mechanism? Porters +E sliding the panel warn people in bluerm and diagps and spanel +E WIZARDS prints out know wizards by walking persona file +E if flee with no paramter, pick a random direction +E some command which speeds up time, ie add some number not 1 +E USE command which forces default instrument +E violin case +E current at sea - use CURRENT mobile which moves you when it arrives +E a way you can attach at start +E make keg eg blow up rost? Make cannon portable? +E if 1st whack kills something, say so & not your last one LH OF FIGHT!SND +E dwarf coin - see both sides at moment. change to tossing it and it + coming up whatever's appropriate. + +H summon mobiles +H possible for a RECLAIM which gets an object back no matter where it was? + Similarily a DISPOSE +H allow initialising of A in B in C - at present only works properly + weight-wise if do A in B. +H make time-ou detach you rather than exorcise, and when you wake up you + re-attach. assumes you have auto-attach at the beginning of the game for + people who start up with the name of someone who7s detached +H let travel table print out messages as well as letting you move. + Don't need more than 1 death room if you do this - moving prints out the + message. TRANS to deadrooms can use a weaker ZONK. +H adapt E constraint in TT to have rickety steps collapsing under too much + wt. have eg E250 to say you can do it if <250g carried +H put pattern-matcher on SAY option in mud - .response? +H when something has been destroyed, check it's not been dropped, inside + something +H MUD.DBA random access, 2 blcokc for each object etc +H messages from snooped objects which DO something using demons +H if someone you detached from gets a message, tell you? +H instead of having RAIN as a multiplaced object, have an A.OUTSIDE + property on rooms. Outside rooms always get the RAIN description, which + is turned on and off by the same demons. Opens the way for NIGHT and + DAY. SOFTWIRED ROOM PROPS NEEDED IN THE LONG RUN? ROOMS AS OBJECTS... + +T have a brightindark prop for objects - will-o-wisps? +T get shut of dead rooms and have a zonk-like thing +T more rooms near cavein +T use ADJECT field of objects as ATTRIBUTE. get rid of much of the + +ve/-ve props etc and use words like fixed, random, invisible. allow the words + anyway! Only need 1 bit for things like RANDOM so get more space +T keys that don7t fit all the locks +T alpine cottage and swiss alpine horn - blow in wromg place and avalanche, + right place and get a bridge (unless blow again...). +T hot air balloon to air castle +T can have echos in database +T someehwre where help is a disadvantage +T chicken hut near house +T animals beyond the leprm +T tide going in/out (also day/night?). Room under jetty can only get to + when it's out. Undersea village? Writing in sand? + +L privs +L put travel-table on disc, and vocab too + +S message in a bottle +S a ciborium +S a paten +S a reliquery +S a staurotheca +S orichalcum - mixture of copper and zinc, used in roman coins +S vestibule +S owl +S flagpole +S LOOK to give the standard desciption of the item (useful for the + statue, for example); +S INVENTORY to list the items of that class (useful for I T to + discover which of your items are treasure); +S VALUE to give a list of the items of that class and their values - + this is so that VALUE T can be used to get an idea of the total value. +S How about a pack of cards......?? + So that it has props......face up.....face down.... + Also.......players can look at a hand..... + +a method of putting the cards in an object called deck...... +S A handerchief (germ laden) which, if picked up will cause you to + have some embarrasing disease which can be transmitted to other players + and of which you will eventually die, unless you get the medicine (or + tablets..etc), +S a room with 4 masters. prev room has 4 globes. masters are bald. If you + smash a globe, it docks the master's stamina to really low. Otherwise + they're nigh on invincible +S fog - do by a mobile +S how about having varying degrees of severity of storm, eg bolts + of lightning, and high winds +S How about a hollow tree with something exciting inside, +S truffle +S beehive containing a swarm of bees and some treasure - honey? Can't + pick it up, but usable as a treasure-conatiner, non-transparent +S hermit in valley +S some sort of event where you have a limited time to do it +S hook +S mandrake root (?) in STUNS +S butterfly fluttering by, and net +S any possibility of having day and night in MUD/VALLEY. E.g. you + could have day for an hour, night for 20 minutes, something like the rain. +S effigy +S gilt/tinsel +S pearls +S heliodor, chrysoberyl, chrysoprase, chrysocolla, chrysolite, moonstone, + beryl, tortoiseshell, malachite, coral, carbuncle, tourmaline, + turquoise, odontolite, obsidian, jasper, sardius, sardonyx, agate, + lapis lazuli, carnelian (cornelian), peridot, chalcedony, jacinth, + aquamarine, quartz, citrine, malacon, zircon, goshenite, verobyerite, + (morganite), rubicelle, pleonaste (ceylonite), spinel, grossularite, + demantoid, melanite, topazolite, hessonite, almandine, kunzite, + hiddenite, spodumene, rubellite, indicolite, siberite, schorl, achroite, + prase, cacholong, hydrophane, jadeite, sard, staurolite, chiastolite +S grove +S ghost wandering around can't kill it normally - use wand? Makes you flee? +S bar - open/closing times (keys etc), gifts on tables, cloakroom with magic + cloaks, free info from elves if buy 'em a drink, need to visit WC, + drunkenness, pts for buying warm milk instead of alcahol. Club bar with + level restrictions on who's allowed in + +? if you are attacked by the ram,and win,why do you still loose some points?? +? the dryad got out again +? can Z's get to FALLIN on their own? +? when snooping on someone and attach, kill who you were snooping on doesn't + work +? if you jump off the cliff and you've got something with you, where's it + end up if you didn't have a brolly? +? close doors in mausolm gives funny stuff +? put FS in pot - says it(s too full but still puts it in +? If you empty a sack of treasure in the + swamp in valley it doesn't sink and score points put remains on the + surface & can be picked up +? VAMPIRE GOT TO START IN VALLEY... +? go to room CELLAR and type UP a few times.. It doesn't get you out.. + only OUT worx.. but isn't displayed in EXITS! Jez. +? Nsnoop didn't work.....!! + It said I had stopped snooping...... + And then commenced to give us the prompt ...aswell...!! + But Unsnoop works.......even tho it thinks you're not snooping....!! diff --git a/MUD.SUB b/MUD.SUB new file mode 100644 index 0000000..c778120 --- /dev/null +++ b/MUD.SUB @@ -0,0 +1,19 @@ +mud.sub ;This file! +mud.mic ;A mic file to compile it +mud.box ;Improvements/things to do/bugs to be found +dungen.get ;Main getfile +mudlib.get ;Another getfile +dbase.bcl ;Database loader +mud0.bcl ;Database interpreter statics +mud1.bcl ;Start, Check.stuff, parsing things +mud2.bcl ;demon stuff and Move +mud3.bcl ;general support routines +mud4.bcl ;communication parts +mud5.bcl ;Special and Action +mud6.bcl ;Drop, Get and description components +mud7.bcl ;Special's supporting routines +mud8.bcl ;Interact +mudlib.bcl ;Library routines and various other annoying bits and pieces +mboots.mac ;The start address stuff for initialisation +power.bcl ;For producing specified .MUD files! Frig, Start & Dot combined +dbadat.mac ;High segment skeleton of database diff --git a/MUD.TXT b/MUD.TXT new file mode 100644 index 0000000..2b603e2 --- /dev/null +++ b/MUD.TXT @@ -0,0 +1,8810 @@ +;Copyright (C) 1980 by +;Roy Trubshaw & Richard Bartle, +;Essex University, Colchester. CO4 3SQ. +; +; This software is furnished on the understanding that +;it may be used and or copied only with the inclusion of this +;notice. No title or ownership of this software is hereby +;transferred. The information in this software is subject to +;change without notice. No responsibility is assumed for the +;use or reliability of this software. +*name Mud +*persona mud +@txtcbt +@txtlev +@txthrs +*rooms 420 +@txtrms +nfrst1 light + Dense forest. + You are wandering around in some dense forest. +bunker + Coal bunker. + You are in a coal bunker, just off the cellar. The only way out is + to the east, where there is the cellar doorway. The atmosphere is thick + with coal dust. To the south is a very small tunnel which you couldn't + possibly enter even if you tried. The coal dust is particularly + thick and dusty in the region near the door. +rattun + Rat tunnel. +splair + Spider's lair. +nfrst2 light + %nfrst1 + You are wandering around in some dense forest to the west of the + foothills of some tall mountains. +nfrst3 light + %nfrst1 + You are wandering around in some dense forest. To the west is the + entrance to a misty graveyard. +nfrst4 light + %nfrst1 + You are wandering around in some dense forest, to the east of a + perilous cliff. +sfrst1 light + %nfrst1 + You are wandering around in some dense forest, to the southwest of a + pleasant pasture, to the east of a perilous cliff and to the south of + a thundering waterfall. To the southeast is a glade in the forest. +sfrst2 light + %nfrst1 + You are wandering around in some dense forest, to the south of a + pleasant pasture, and to the west of a fuming swamp. To the southwest + the forest opens up onto a magical glade. +glade light + Magical glade. + You are in a magical glade, surrounded by forest. East and west it + looks inpenetrable, but in the northerly directions the trees are + less dense. In the southerly directions, the trees are of soft pine, + and through them to the southwest can be glimpsed a sundial. +wabe light + Sundial in pine forest. + This is part of a large pine forest. To the northeast, the forest opens + up onto a magical glade, but in other directions is more forest, some + of it too dense to allow passage. Before you stands an old, stone + sundial, overgrown with ivy. +sett light + Entrance to badger's sett. + You are in part of a large pine forest. Northwest, the forest opens up + onto a magical glade, and in all other directions the forest continues, + although in some the trees are too thick to permit passage. In front of + you, in the ground, a hole leads downwards into a badger's sett. +insett small nolook + Inside badger's sett. + You are inside a small sett belonging to a badger. It looks as though + the badger is hidden in a smaller hole above the entrance, but there is + no conceivable way you can reach him. The room looks the ideal place to + store objects, since the badger acts as guard. The only way out is up. +pines1 light + Pine forest. + You are wandering about amongst some soft pine trees. To the north the + forest clears to become a glade, but everywhere else are more trees. + Through the foliage to the northwest can be glimpsed a sundial. +pines2 light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. +pines3 light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. + Eastwards, through the trees, can be glimpsed something resembling a + bandstand. +sqrm light nolook + Squirrel part of forest. + This is the part of the forest used by squirrels, however they all + scampered off when they heard you coming. All around you is forest, + some passable, some not. +sqroom light nolook dmove sqrm + %sqrm + This is the part of the forest used by squirrels, and when you enter + they all come scampering up to you, very playfully. In all directions + is forest. The squirrels (all of which are red, naturally) are very + happy to see you. +pines4 light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. To + the northeast through the trees can be made out a wooden building + something like a bandstand. To the southeast there looks to be some + sort of religious shrine. +pines5 light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. +pines6 light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. + Through the trees to the southeast you can see what appears to be a + bandstand. +pines7 light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. +bstand light + Bandstand. + You are stood in a bandstand in the midst of the pine forest. All around + you are trees, denser in the easterly directions than in the westerly + ones. The bandstand hasn't been used for some time, obviously with it + being in the middle of a forest, and in places its paint is peeling, but + it is nevertheless a surprisingly fine example. +gaptrm light + Golden appletree in pine forest. + This part of the forest was obviously once an orchard in years gone by, + since in among the firs can be seen appletrees, although they are + sadly fruitless. However, one tree is taller than the rest, and + coloured an enchanted golden. +whroom light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. +bbath light + Bird bath in pine forest. + You are stood in amongst the trees of a pine forest. All around, the + forest continues, although in some directions the trees are too thick + to allow passage. Stood before you is an ornate stone birdbath, but + the water it contains is not drinkable. +lionrm light + %pines1 + You are wandering around amongst some soft pine trees. All about you + are more, some densely packed and others allowing passage through. +clffst light + %nfrst1 + You are wandering around in some dense forest, to the east of a + perilous cliff. +wfrst1 light + %nfrst1 + You are wandering around in some dense forest. To the east can be seen + the entrance to a misty graveyard. +track1 light + Beaten track near cliff. + You are at the end of a rough track. There is a dangerous cliff to + the west marked "Lovers' leap". +track2 light + Beaten track. + You're on a rough east - west track with a dense forest to the + north and pasture to the south. +ostart light + Road opposite cottage. + You are standing on a badly paved road with a cemetery to the north + and the home of a grave-digger to the south. An inscription on the + cemetery gates reads, "RESTING PLACE OF LOST SOULS". +road2 light + Narrow road. + You are on a narrow east-west road with forest to the north and + gorse scrub to the south. +start light startrm + Narrow road between lands. + You are stood on a narrow road between The Land and whence you came. + To the north and south are the small foothills of a pair of majestic + mountains, with a large wall running round. To the west the road + continues, where in the distance you can see a thatched cottage opposite + an ancient cemetery. The way out is to the east, where a shroud of + mist covers the secret pass by which you entered The Land. +wayout light nolook chain valley road4 + You force yourself through the narrow, mist-covered gap... +wpstre light + West pasture. + You are in comparatively pleasant pasture. To the south is a river, to + the north a track. Eastwards the pasture is seen to continue, while to + the northeast is the flower garden of a strange cottage. To the south + flows a river. +clifff light + Cliff. + You are standing on the edge of a cliff surrounded by forest to the + north and a river to the south. A chill wind blows up the unclimbable and + unscaled heights. At the base of the cliff you can just make out the + shapes of jagged rocks. +fallin light dmove beach nolook + Falling off cliff. + You are falling off a very high cliff onto a beach. +slidin nolook dmove uland3 + Sliding down chute. + You are sliding down a slippery tunnel, twisting and turning tunnel at + great speed. +epstre light + East pasture. + Around you is a delightful pasture. To the south is a fast flowing + stream. Further north and east you can see a woodman's hut and to + the north is gorse scrub. Northwestwards you can see a strange, + forbidding cottage, which you can enter via its french windows. +spstre light + South pasture. + All about you is a pleasant pasture. To the north is a fast-flowing + stream, and to the south is forest. Westwards is a thundering waterfall. +garden light nolook + Flower garden. + You are in a well-kept garden. There is an unexpectedly sweet smell + here and you notice lots of flowers. To the east across a path there + is more garden. +path light + Path. + You are standing on a path which leads off a road to the north, to a + cottage south of you. To the west and east are separate gardens. +patch light + Vegetable garden. + You are standing in the middle of what was obviously a vegetable + garden. However it has not been tended for years and most of the + vegetables have run wild. +gorse light + Gorse. + You are in a tangled mass of prickly gorse. +wfall light + Waterfall. + Before you is an awe-inspiring sight; a waterfall plummets over a + cliff and explodes in a dazzling crescendo of rainbow colour on the + menacing rocks below. +river1 light + River. + You are on the bank of a fast flowing river with pasture to the north + and forest to the south. +river2 light + %river1 + You are on the bank of a fast flowing river with pasture to the north + and forest to the south. +rapids light + Rapids. + You are on the bank of some dangerous rapids. Beyond them to the east + the river goes underground; to the west it continues out of sight, and + you can hear a thundering as of falling water from that direction. To + the south can be seen (and smelled!) a fuming swamp, and southeast is a + small pond. +mfrst light + Forest near mountains. + You are in dense forest at the base of some snow-capped mountains, + wreathed in clouds. The foothills are so beautiful that you yearn to + be able to climb them and lie eternally in dew drenched grass, with + an air of inner peace and total tranquility. You realise, however, that + this is silly! +cave light + Cave. + This is a cave, wherein once dwelled a hermit in times long passed. + Above is a huge mountain towering amongst the clouds, and outside + can be seen a pasture, small cottage and a cemetery in the distance. + At the east end of the cave is a small opening in the wall. +pond1 light + Pond in swamp. + This is a small, shallow freshwater pond, fed by a small brook joining it + to the river. It is too shallow to swim, and there are no edible fish + living in it. Northwest are rapids, but everywhere else is swamp. +nhill1 light + Foothills. + You are in the foothills, such as they are, to a tall mountain. + To the south is an east-west road, and to the north more small hillocks. + Westwards lies a forest, but passage east is impossible because of + a huge stone wall which blocks the way, built to keep the denizens of + The Land away from the surrounding area... +nhill2 light + %nhill1 + You are in some higher foothills of the mountains, but the way north + and east is blocked by a huge wall. More foothills are downwards to + the south, and to the west is forest. In the distance can be seen a + small, thatched cottage, and some wide, open, pastures. +shill1 light + %nhill1 + These are some foothills to the tall mountains which tower above you + to the east. Travel in that direction is impossible because of a tall + stone wall, built by the locals when they learned of the creatures + dwelling within The Land... To the north runs an east-west road, and + to the west is forest. The hills rise slowly to the south. +shill2 light + %nhill1 + This is a small hillock atop a cave. To the north the hill slopes + downwards, but to the east and south curves a stone wall which is + impossible to scale. Below can be seen a stream cascading over another + cliff further west, and beyond that is the sea. +lounge light + Lounge. + This is the lounge. Around you are some pieces of elegant troll-hide + furniture, although all the portable ones have long been stolen so + there's no point in getting any... Ahead of you to the south is the + dining area, and to the west is the hall. An archway to the east leads + to the study. +dining light + Dining area. + You are standing in the dining area of a long narrow room. To the north + is the lounge, to the west is a serving hatch which, you surmise, leads + to the kitchen (although it's too small to climb through). To the south + are some french windows which open out over a pasture. +kitche light + Kitchen. + Around you is all the usual paraphernalia that can found in a kitchen, + although it is firmly fixed down so you can't take any of it away. + The pantry is to the northwest, and a doorway to the hall is to the + north. East is a small serving hatch through which you can see, if not + move to, the dining room. +hall light + Hall. + You are standing in an oddly shaped hall. To the south is a doorway, + the east is an archway, and some dark forbidding stairs lead upwards + to the southeast. Immediately to the west is a fitted wardrobe, and + some eerie, granite steps to the southwest lead downwards to the cellar. +study light + Study. + This is the old study used by the gravedigger who once owned this + cottage, where he read up his craft. It is decorated in sombre colours, + and the windows are small and dirty. On the south wall is a large + bookcase reaching up to the ceiling, made of an enchanted oak. +ssteps + Secret steps. + These are some secret steps leading downwards through a false wall to + the underworld. At the bottom, to the south, is darkness; at the top, + to the north, stands a large bookcase, acting as a doorway between here + and a study. +zroom + Zombie room. + This is a small room at the bottom of a short flight of steps leading + up to the north. The walls are damp, and covered in fungal stains. + To the south is a narrow passage leading downwards. +downps + Narrow passage. + This is a small passage leading downwards to the south. To the north + is a small room, and at the other end a door inscribed with strange + runes. +sorcrm light silent + Sorcerer's room. + You look around you in disbelief at the exotic room which you have + discovered. It seems to be a room used by some sorcerer, wherein he + bound his spells and worked his magic. The room is lit by an + illusory red light, and many of the strange objects you see defy + description. To the north is a door inscribed with strange runic + symbols, but there is no other exit. +stairs light + Halfway up the stairs. + You are sitting on a step halfway up the stairs, a ghostly voice + recites a poem by A. A. Milne to itself. Further up you can make out + a landing, downwards you can see a hallway. +landin light + Upstairs landing. + You are standing on the upstairs landing. There are doorways in most + directions, the stairs lead downwards and to the northwest. +bathrm light small + Bathroom. + The bathroom contains a toilet and a handbasin, and on the wall is a + shelf with "MEDICINES" written on it. The bath was removed long ago, + but the toilet and handbasin still look usable. The only exit is to the + east. +cupd1 light small + Airing cupboard. + This is a small cupboard, most of which is filled with a hot water + tank. The rest of the cupboard is filled with shelving. +bdrm01 light + Large bedroom. + You are standing in a large bedroom. To the south is a window out of + which, you can see a pleasant field with a stream flowing swiftly at + the bottom of it. There is a doorway to the north. +bdrm02 light + Main bedroom. + This is the main bedroom. There is a window to the north from which + you can see the road that runs past the front of the cottage. The way out + is south, onto the landing. +bdrm03 light + Small bedroom. + The room appears to have been used as a nursery at some time as the + walls are covered with pictures of elves and gnomes all smiling + happily. There is a fitted cupboard to the southwest and the way out + is to the northwest. +cupd2 small light + Fitted cupboard. + The cupboard appears to be bereft of any shelving, there are scratches + on the wall but there is nothing here which can explain them. +wrdbe light small + Fitted wardrobe. + You are inside the fitted wardrobe. The only apparent exit is to the + east, into a hallway. +pantry small + Pantry. + You are standing in the pantry. Around you are some marble slabs + and shelves which are badly damaged and not worth anything, but + which have obviously once held mouthwatering delicacies of rare + and ancient types. +hut light + Woodsman's hut. + The hut is obviously the home of a woodsman. There are various pieces + of rude wooden furniture scattered about. On the walls are stuffed + fish and birds, they appear old and are fixed firmly to the wall as + if the owner has treasured them for a long time. +maze1 light nolook + You are lost in a misty graveyard. +maze2 light nolook + %maze1 +maze3 light nolook + %maze1 +maze4 light nolook + %maze1 +maze5 light nolook + %maze1 +maze6 light nolook + %maze1 +maze7 light nolook + %maze1 +maze8 light nolook + %maze1 +maze9 light nolook + %maze1 +maze10 light nolook + %maze1 +maze25 light nolook + You are standing in front of a large tombstone. +uswamp light death sanctuary + Bottom of swamp. + Isn't it short of air here, beneath all that swamp? +swamp1 light hideaway sanctuary nolook dmove uswamp + You are waylaid in a treacherous swamp. +swamp2 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp3 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp4 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp5 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp6 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp8 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp9 light hideaway sanctuary nolook dmove uswamp + %swamp1 +swampa light hideaway sanctuary nolook dmove uswamp + %swamp1 +swampb light hideaway sanctuary nolook dmove uswamp + %swamp1 +swampc light hideaway sanctuary nolook dmove uswamp + %swamp1 +swampd light hideaway sanctuary nolook dmove uswamp + %swamp1 +swamp7 light nolook + You are in a drier part of the swamp. +ydead3 light death + The volatile marsh gases ignite from your light and in an instant you + are a charred corpse which is sucked unmercifully into the deep. +beach light nolook + Rocky Beach. + You are standing on a rocky beach. Above you is a mighty cliff which + extends out to the sea on either side of you, thus forming an enclosed + cove. Behind you is a forbidding tunnel, and to the south a mighty + waterfall smashes into the rocks in another part of the beach. Out to + the west, in the sea, can be seen a wrecked galleon, trapped on some + vicious rocks. +beach2 light nolook + Bottom of waterfall. + You are stood on a sandy part of a beach, at the bottom of a + thundering waterfall which smashes into the rocks from the cliff + above. To the north is a rockier part of the beach, but otherwise + the area is cut off by the sea apart from some slippery rocks to the + south. To the west, in the sea, can be seen the wreckage of a + galleon, torn against some vicious rocks. +bch1 light +bch2 light +srock1 light hideaway dmove beach2 nolook + Slippery rocks. + You are delicately attempting to cross some slippery rocks. To the + west can be seen a wrecked galleon over the sea, to the north a beach, + and in all other directions more rocks. +srock2 light hideaway dmove inlet nolook + %srock1 + You are delicately attempting to cross some slippery rocks. To the west + can be seen a wrecked galleon, and in all directions are more rocks. +srock3 light hideaway dmove inlet nolook + %srock1 + You are delicately attempting to cross some slippery rocks. To the + west can be seen a galleon wrecked on some vicious rocks out at sea, + but all around you are slippery rocks. +inlet light + Concealed inlet. + This is a small inlet from the sea, concealed from view by some + slippery rocks to the northwest. Out at sea to the west can be seen + the wreckage of a galleon, and above you towers a mighty cliff. There + is a bird's nest above, the route to which looks climbable. +nest light + Eagle's nest. + This is the nest of an eagle, stuck firmly to the cliff overlooking the + sea. Out at sea can be seen a ship on some vicious rocks, and there + is a strong current whirling around except to the north from west of + the inlet. The cliff above here is unclimbable. +sea1 light sanctuary nolook dmove beach + Sea. + You are out at sea. To the east is a beach, further out to the west + a galleon wrecked on some vicious rocks. +sea2 light sanctuary nolook dmove beach2 + %sea1 + You are out at sea, midway between a beach to the east, some slippery + rocks to the southeast, and a wrecked galleon to the west. +sea3 light sanctuary nolook dmove beach + %sea1 + You are out at sea. To the east and west are rough waters, but northern + and southern directions look safe enough to take. +sea4 light sanctuary nolook dmove beach2 + %sea1 + You are out at sea, midway between a beach to the east, some slippery + rocks to the southeast, and a wrecked galleon to the west. +sea5 light sanctuary nolook dmove inlet + %sea1 + You are out at sea, to the west of an inlet and to the southwest of + some slippery rocks. The waters all around you are rough, but northwards + and westwards is calm enough to sail. +sea6 light sanctuary nolook dmove vrocks + %sea1 + You are out at sea near some vicious rocks to the west, upon which is + wrecked a galleon. In the distance to the east can be seen a mighty + cliff and a waterfall, and to the south of that some slippery rocks. +sea7 light sanctuary nolook dmove vrocks + %sea1 + You are out to sea, to the southwest of some vicious rocks upon which + is wrecked a galleon. +sea8 light sanctuary nolook dmove vrocks + %sea1 + You are out on the high seas. Far to the north can be seen an island, + and far to the east a wrecked ship. +sea9 light sanctuary nolook dmove vrocks + %sea1 + You are on the high seas, far to the south of an island. the mast of a + wrecked ship can be seen on the south-eastern horizon. +sea10 light sanctuary nolook dmove slope1 + Small bay. + You are in a small bay, skirted by strong currents. To the north is + a steep slope, which the swirling flows about you make the only safe + place to land. The island is a huge rock, topped by a flat plateau + upon which is a huge circle of weatherbeaten stones. +sea11 light sanctuary nolook dmove jetty + %sea1 + You are out at sea, next to the coastline. To the west, the sea looks + still sailable, but northwards it gets rough. Eastwards is a jetty, + which juts out into the waves from a beach beyond. To the south, the + relative tranquility of these coastal waters continues. +sea12 light sanctuary nolook dmove beach3 + %sea1 + You are at sea, close to the coastline to the east. Northwards and + northwestwards, the sea looks safe enough to navigate, and to the + southwest there is a channel around a headland protruding from the + coast. Elsewhere, however, it is rough and sailing there would probably + deposit you in Davy Jones's locker... +sea13 light sanctuary nolook dmove beach3 + %sea1 + You are out to sea, away from the coastline. All around, except in the + southerly and easterly directions, the water is very rough, and it would + take a much larger craft than yours to travel there safely. Far beyond a + headland to the south you can see a ship wrecked on some vicious rocks, + but there is nothing but tempestuous sea beyond the cliff to the north. +sea14 light sanctuary nolook dmove beach3 + %sea1 + You are in a narrow channel of calm water, sailing around a headland + with rough seas swirling about it, its granite rocks unfortunately + precluding any attempt at landing. Northwards is a small bay with + a jetty to its east; southwards is a larger expanse of navigable + water. +sea15 light sanctuary nolook dmove inlet + %sea1 + You are out at sea, to the south of some vicious rocks upon which lies + a wrecked galleon. Some way to the east can be seen an inlet at the foot + of a tall cliff, and south, through strong currents on either side, is + a small island upon which has been built a large archway. +sea16 light sanctuary nolook dmove inlet + %sea1 + You are sailing north of a small island in the middle of rough seas. + The only calm waters lie further north, where in the distance can be + seen a galleon, wrecked on some vicious rocks. +woe1 light + North part of Isle of Woe. + You are standing on a small island, way out to sea. The waters are + relatively calm, but too far in any direction save north and they + become dangerous. A large, ancient archway straddles the island, its + faces well eroded over many thousands of years. To reach the southern + part of the island you would have to pass through it. +woe2 light + South part of Isle of Woe. + You find youself stood in the southern half of a small, windswept + island, separated from the northern half by a large archway which + stands from shore to shore. The seas around here sweep swiftly + northwards, too, but are not dangerous close to the island. +fslop1 light + Forest on steep slope. + You are in dense forest, sloping from the south downwards to the north. +fslop2 light + %fslop1 + You are in dense forest, sloping from the south downwards to the north. + To the southeast are the foothills of an enormous mountain. +fslop3 light + %fslop2 + You are in dense forest, sloping from the south downwards to the north. + To the west can be heard the roar of the sea, as it crashes into the + cliffs beyond the trees. +sdale light + South dale. + This is a peaceful dale, nestled at the base of a huge afforested + escarpment which slopes steeply away to the south. Northwards is + another forest, and eastwards the overgrown grounds of a mausoleum, + dwarfed by an enormous mountain which stands high above. The dale + curves away to the northwest, and westwards is a dangerous cliff. +ogrnds light + Overgrown grounds of mausoleum. + This once well-tended garden has now, sadly, fallen into a state of + neglect. Stood within, its doorway to the southeast, is a cold, + bemossed mausoleum. The scene is dominated by a huge cliff to the + east, at the base of an awe-inspiring mountain which climbs away + into the clouds, its foothills sweeping down into a steep escarpment + covered in forest to the south. North is more forest, and west a dale. + To the northeast there looks to be a railway cutting. +mosolm + Mausoleum. + You are stood inside a piece of history, a mausoleum which is far more + ancient than its weatherbeaten exterior would indicate. Within the + circular walls are the tombs of many, their names and heraldic designs + carved into the stones in a language which was dead before Atlantis + sank. The easiest exit from this eerie window on the past is to the + northwest. On the floor, however, is carved an inscription in an + archaic predecessor of your own language, which is readable. The floor + and ceiling do not have entrances, but the tombs seem to. +ntomb + North tomb. + This is the north tomb of the mausoleum, but the bones of the dead + have long since been reduced to dust by Time. The walls are close + together, and there is no evidence of there having been a coffin + within. The exit is to the south. +wtomb + West tomb. + This side-room is the west tomb of the mausoleum. An enormous + sarcophagus is lain against the back wall, and the way out is to the + east, leading back into the mausoleum entrance hall. +stomb + South tomb. + This small chamber is the southern tomb of the mausoleum, which has + not been used for burial purposes. The exit is to the north, and the + walls are curiously uninteresting. +swtomb + Southwest tomb. + This tomb is to the southwest of the mausoleum, and is quite richly + decorated. The walls are stained a regal purple, and the floor is a + mosaic of intricate design. The whole room has an eastern aura, and + bears many gilt symbols in a language you cannot recognise inlaid + upon the door. +etomb + East tomb. + This room consists the eastern tomb of the mausoleum, and is the + oldest part of the structure. Strange cobwebs adorn the far wall, + and the light casts dancing shadows on the roof which seem to come to + life in this relic of prehistory. The only exit is to the west. +setomb + Southeast tomb. + This is the southeastern tomb of the mausoleum, and has not been used + for burial purposes. The unplastered walls and uneven floor give a + sense of starkness which makes the uneasy mind wary, lest some + uncanny spirit has made the deathly room its abode. +dcliff light + Dangerous cliff. + You are stood by the edge of a dangerous, partly-forested cliff, + which slopes downwards to the north. To the east and south, the forest + becomes thicker, and to the northeast the slope levels out onto a dale. + The crumbling eroded western edge of the cliff looks so liable to + collapse that no-one in their right mind would risk certain death by + leaping off. +scrubs light + Scrub slope. + This is a gentle slope down westwards to a beach, covered in scrubs + and small bushes. To the south, the slope becomes much steeper, and + rises into a huge escarpment high above. Eastwards is a dale, and + northwards runs an east-west section of railway line. +wdale light + West dale. + This is a pleasant dale, hugging the slopes of a huge forest-covered + escarpment which rises to the south. East is more forest, but the + dale curves southeastwards behind it. West is a slope of scrubland, + which rolls down to the sea beyond. North is a railway line, which + runs from east to west, standard gauge. +forist light + %nfrst1 + You are stood in a dense forest, with a railway line to the north + and a pleasant dale to the south and west. +cuttin light + Railway cutting. + You are stood on a shallow mound, which has been cut through by a + now rusting railway line, in an east-west direction to the north. To + the south is a mausoleum in overgrown grounds, the remnants of a + surrounding fence no longer preventing entry. East and west are forests, + and southwest is a dale at the bottom of a long, steep slope. +efrst1 light + Forest at base of cliff. + The forest in which you stand is nestled at the base of a frighteningly + tall mountain which rises off in an unclimbable cliff to the east. + From inside it, to the north, appears to run a railway line, which + cuts through a shallow mound to the west. South stands a cold, grey + mausoleum in overgrown grounds, protected ineffectually by the remains + of a fence which long since rotted away to virtually nothing. +emine light + Entrance to mine. + This is the entrance to an underground tin mine, beneath a huge + cliff. Outside is to the west, and down to the east runs a main + passage into the mine proper. Both directions is a railway track, + overgrown enough to show it hasn't been used for many a year. +main1 light + Main passage. + This is the main passage in the tin mine, running east-west. Light + comes from the west end, whereas the east delves deeper underground. + The length of the passage there runs a rusted railway track. +main2 light + %main1 + This is the junction on the main passage in the mine. To the west, + whence comes light, the passage rises. Also in this direction runs + a railway track, although it stops where you are now standing. To + the north is a major shaft, and upwards to the east are some roughly + hewn but well-worn steps. The passage continues to the southeast. The + floor of this room seems to be slightly wet. +platfm + Platform. + This is a sort of landing at the top of some steps which lead + down to the west. To the east is a major shaft, which runs upwards, + and to the north is a makeshift shed. The platform looks well used. +shed + Shed. + This is a decrepit but nevertheless rather sturdy shed, used by the + tin-miners in the old days to store their equipment. The way out is + to the south, onto a platform at the top of a staircase. +valvrm + Valve on staircase. + You are halfway up (or down!) a staircase carved into the rock, + although it is well used. Fixed solidly into the wall is a rusted + wheel valve-release, of the sort used in large plumbing work. In + contrast to the stairs, it looks hardly used at all... +shaft1 dmove minor1 + Vertical shaft. + This is a vertical shaft, quite long, but easy to traverse because + of the iron rungs hammered into its sides. Such shafts were used long + ago by the tin-miners to reach the faces. At the top end, to the + south, is a main passage. Similarily, there is a minor passage at the + bottom, to the east. +shaft2 dmove platfm + %shaft1 + This is a vertical shaft, which you find yourself able to climb + because of the heavy iron rungs forced deep into the rock. At the + bottom end, to the west, is a main passage; at the top, however, + there is only a minor passage, to the north. +main3 + %main1 + This is a three-way junction in the main passage. Exits are upwards + to the northwest, downwards to the southwest, or to the east. +main4 + %main1 + You are walking down a main passage in the tin mine. To the east is + a vertical shaft, whereas the passage turns downwards to the south + and upwards to the west. +shaft3 dmove minor7 + %shaft1 + This is a vertical shaft leading deep underground. At the top end, to + the west, is a main passageway; at the bottom end, to the south, + there is a minor one. The shaft is climbable because of heavy + iron rungs biting into the sides, although the walls are a bit damp. +main5 + %main1 + This is a main passage in the tin mine, running up to the northeast + and curving down to the south. There is a fair amount of rubble + around, as though there has been a cave-in nearby at some time in + the past. +main7 + %main1 + This is a north-south main passage, which although clear at the + north end, runs into a pile of rubble to the south. It is plain that + the pit-props have given way some time, and the way through is almost + impossible. You might be able to travel south, however, if you were + to drop everything you're carrying... +dpass1 + Dangerous passage. + This is a dangerous passage, the description of which mortals can't + normally read! Try n or ne. +dpass2 + %dpass1 + This is a dangerous passage, the description of which mortals can't + normally read! Try sw, s, se or ne. +dpass3 + %dpass1 + This is a dangerous passage, the description of which mortals can't + normally read! Try n, sw or se. +dpass4 + %dpass1 + This is a dangerous passage, the description of which mortals can't + normally read! Try nw, w or sw. +dpass5 + %dpass1 + This is a dangerous passage, the description of which mortals can't + normally read! Try n or se. +dpass6 + %dpass1 + This is a dangerous passage, the description of which mortals can't + normally read! Try nw or ne. +sectn + Section of main passage. + This is a remaining section of the main passage, but I couldn't + care less because mortals still can't read it! Try e or nw. +main6 + %main1 + You find yourself in a main tunnel, which although clear at the + north end, runs into a pile of rubble to the south. You could + probably negotiate the cave-in if you were to drop everthing, but + you won't be able to see if you do... +minor1 + Minor passage. + This is a minor passage, at the base of a shaft to the west. It + continues to the east, towards the tin face. There is a narrow + crack to the southwest, but you'd have to drop everything to be + able to pass through. +minor2 + %minor1 + You are walking along a narrow passage, which splits three ways. + To the west, it continues upwards; to the south, it bends away + downwards; to the east, it meets the face, from where tin used + to be mined using picks. +face1 + Face. + This is one of the faces upon which work was proceeding when the + mine closed down. The only way out is to the west, to the previous + face, now a minor passage. +minor3 + %minor1 + This minor passage runs upwards to the north, and downwards into a + shaft to the south. It doesn't look like is has been used very often. +shaft4 dmove tightp + %shaft1 + This vertical shaft is exceedingly long, but ascent and descent is + facilitated by heavy iron rungs set into the walls. At the top end, + to the north, is a minor passage. At the bottom, to the south, is + a tight passage, which looks hardly used. +tightp small + Tight passage. + This is a very small and tight passage, and it is something of an + effort to enter although no-one need drop anything to do so. To + the south is a hardly-worked tin face; indeed, it looks like work + was in progress to widen the tunnel when the mine closed. To the + east is a crack, leading into the rock. +face4 + %face1 + This is one of the tin faces, where in years gone by the tin miners + would cut away to reach the ore. The only way out is to the north + onto a tight passage. +doomrm light + Doom room. + As soon as you enter, a section of floor gives way and you find + yourself falling into a pit. The finely-balanced rock slides + back above your head, and you find yourself stuck. +crrm small + Crack room. + Hello wizard, guess what mortals can't see without help? Try ne or w. +edwrlm + Entrance to dwarf realm. + You find yourself crouched in a low passage, obviously the work of + dwarfs, with a crack in the rock to the west and an ornamented + archway to the southeast. You realise that this must be the entrance to + the fabulous dwarf realm, about which there are many terrible legends. +minor5 + %minor1 + Where you are now is a minor passage at the top of a vertical shaft to + the south. Eastwards, the passage continues, and to the north is a + side passage, which seems to have been started in error, and abandoned. +minor6 + %minor1 + This is a minor passage, leading from the west to a tin face to the + east. South, there is a smooth-walled, vertical ventilator duct, or so + it appears. It looks particularily dangerous, however, and smells of + charcoal. +face2 + %face1 + This is a tin face, moderately used. The exit is to the west into a + minor passage. +sidpsg + Side passage. + This is the beginnings of a minor passage, but upon which work ceased + early because of the hardness of the rock. The passage proper is to + the south. +minor7 + %minor1 + This is another minor passage in the tin mine. It starts at the base of + a shaft to the north, and continues to the south. +minor8 + %minor1 + This minor passage continues to the north, but bends onto a face to + the east. There is one of the common roof collapses to the south, + which you could probably traverse if you weren't carrying anything. +face3 + %face1 + This is a frequently-used tin face, by the look of things, since it + seems to have a high grade of tin, although most of it has now been + mined, of course... The way out is to the west, onto a minor passage. +peril1 + Perilous passage. + Hi wizards! Try n or sw. +peril2 + %peril1 + Hi wizards! Try e or ne. +peril3 + %peril1 + Hi wizards! Try nw or sw. +peril4 + %peril1 + Hi wizards! Try nw or s. +peril5 + %peril1 + Hi wizards! Try n or s. +ledge1 light + Ledge. + You are stood on a ledge overlooking a fantastic sight. By light + coming from what seems to be a hole high above you, you witness an + incredible view of the fabled dwarf realm of legend. There is no way + to get down from here, although far to the southwest there seems to be + such an entrance. The ledge continues to the east. +ledge2 light + %ledge1 + You are stood on the ledge, high above the dwarf realm. Although + the view is awe-inspiring, you are careful to keep your footing + lest you fall the many hundreds of feet and kill yourself below. The + ledge continues to the east and west. +boledg +ledge3 light + %ledge1 + This is the easternmost end of the ledge, which is a bit wider than + the rest of it. Below you you can see a pasture, and some forests, + but the scene is stolen by a dazzling dwarfen citadel in the centre + of the cave below, which catches the mysterious light from above and + spreads it out in a glorious cascade of sparkling colours. +bldg light nolook + Bottom of ledge. + You are stood at the bottom of the northern wall of this strange + subterrainean domain. High above you can be seen a narrow ledge, but + there are no means by which you can climb there from here. To the + south is a pasture, now lying fallow. +dwpst1 light + Dwarfen pasture. + You are strolling across a pasture, used by the dwarfs for their + crops, although now it is overgrown because it is the fallow year. + To the north is the bottom of the northern wall, high up which is a + ledge. East is a forest, and south the entrance to the dominating + citadel. +befcit light + Before citadel. + You are stood before a huge marble-covered citadel, the entrance + to which is to the east. It is inset with coloured stones and + catches the sun from high above to create a glorious rainbow effect. + North and south are pastures, and to the west are steps up to a + shelf in the rock, and an archway. +dwpst2 light + %dwpst1 + This is a pasture to the south of the entrance to the citadel, + the as yet unripe wheat swaying to and fro' to unseen winds. To the + south and east are forests of oak. +panora light + Panoramic view. + You are stood on a shelf in the rock, with a grand archway through + into a passage to the northwest. This, however, is nothing compared + to the spectacular sight to the east. You see that this is a cavern, + light coming in by what seems to be a hole in the roof high above. + Steps lead down to the base of a huge citadel, surrounded by a + wall with forests beyond. To the northeast and southeast are two + pastures, and from somewhere can be heard a running spring. The + light reflecting from the citadel's marbled walls is so breathtaking + you feel quite in awe. +ufrst1 light + Underground forest. + You are stood in a pleasant oak forest, with a pasture to the west. + The forest continues to the southeast, but to the north is the cavern + wall and to the south the wall of the citadel. +ufrst2 light + %ufrst1 + You are walking through an oak forest, with pasture to the west. + North is the wall of the citadel, and south is the edge of the + cave. +ufrst3 light + %ufrst1 + This is a very agreeable oak forest through which you find yourself + walking. To the north is a wheatfield, and to the southeast can be + heard a spring. +spring light + Spring. + You are stood in a leafy part of the forest. From the cave wall + comes forth a spring, which tumbles into a little pool and seeps away + again into the earth. All around is more wall, for this is a large + crack, save to the northwest where the forest continues. +topcit light + Top of citadel. + This is the top of the citadel, from where you can see all the + surrounding cave. Directly above you can be seen a hole, high up in + the mountain, and it occurs to you that this citadel was so placed + as to catch the light precisely and create the wondrous effects + visible elsewhere in the cavern. There is a gateway to the east. +ufrst5 light + %ufrst1 + This is the forest at the back of the citadel. There is the cave + wall to the east, but the forest continues northwest and southwest. +entrnc + Entrance to citadel. + You are stood at the entrance to the dwarfen citadel, at the top of + some steps which run downwards to the east. West, a gateway provides + the only other exit from the room. The walls are decorated in curious + stones and wierd etchings, but none are removable or readable. +dwstep + Dwarf steps. + You are using some narrow, closely-spaced stairs, which descend in a + straight line from a room to the west to a doorway to the east. At the + top of the steps are strange decorations, presumably put there to + ward off evil presences, such as yours... +dwhall + Dwarfen hall. + The room in which you stand is impressive in size, even by non-dwarf + standards. High above is a red brick ceiling, and the floor is + decorated by a colourful, if crudely-made, mosaic. There are low + passages leading off to the north and east, and a higher passage to + the south (probably so long weapons don't scratch the roof). West is + a doorway, which looks well-used. +lowps1 + Low passage. + You are walking down a low, well-trodden passage. To the north, the + passage continues, and to the south it opens out into a large hall. + East is what looks like a kitchen, and to the west is a doorway. +lowps2 + %lowps1 + You are stood in a low, dwarfen passage, which runs from the south, + turns to the east, and continues. There is an opening on the north + wall into a room, and to the west is a doorway. +lowps3 + %lowps1 + This is a low, east-west passage. At the west end, it continues on + into the dark, but at the east end it opens up onto a comparatively + large room. To the northeast is an opening, from which issues a + peculiar odour. +dwfood + Food store. + This is the room the dwarfs who live here use to store their food + supplies. It is packed full of assorted vittles and foodstuffs, most + of which are in too small quantities for you to bother with. The only + way out is through a doorway to the east. +dwstre + Dwarf store. + Herein, the dwarfs keep most of their equipment and tools. The walls + are hung with assorted spades, clothes, planks of wood and the like, + but most are too small for you to use. The only exit is a doorway to + the east. +dwroom + Dwarf room. + This is a room which seems to have been recently constructed by the + dwarfs who inhabit this realm, for at the moment it has no furnishings + or even a door. The only way out is via an opening to the south which + leads onto the bend of a low passage. +dwbog small + Dwarf lavatory. + This is the small room the dwarfs use to excrete their waste bodily + products. Although there is no door (the exit is an opening to the + southwest), privacy is maintained by the room being on a slight + upward slant, out of the line of sight from the passage outside. + Understandably, being such a small room, there is a pungent odour here. +dwcant + Canteen. + This is the room where the dwarfs partake of their meals. It is quite + large, and has a long table running down the middle, bolted to the + ground. There are two low passages leaving the room; one to the west, + and one to the south. To the southwest is a doorway, and there are no + other exits. The walls are painted in pictures of grassy pastures. +dwktch + Dwarf kitchen. + You are stood in the dwarf kitchen, quite large and full of kitchen- + like utensils which are regretably too small to be of use to you. There + is a doorway to the northeast, with food stains on the floor near it, + and an opening onto a low passage to the west. North is a pit in which + refuse is thrown to decompose away. +dwpit small + Refuse pit. + This evil-smelling room is where the dwarfs toss their rubbish, from + the kitchen. All around are masses of decomposing foodstuffs, in + various states of decay, and filty, broken articles not even the + previous owners would be able to recognise. The only way out is via + a short climb to the south. +lowps4 + %lowps1 + This is a low passage, leading from what appears to be a canteen to + the north, to a doorway at the southern end. +lowps5 + %lowps1 + You are striding down a low passage, which forms a sort of T-junction. + To the west, it leads into a large hall, and to the east it opens up + into a room, whereas south, it carries on into the dark. +dwrm1 + Dwarf room. + This is a general-purpose room, used by the dwarfs for some of their + normal everyday activities. Strewn about it in a seemingly random + fashion, yet firmly fixed to the floor, are various items of furniture + and the like. There is a doorway to the north, and a low passage leading + off to the west. +guard1 + Dwarf guard room. + You are stood in a guard room built specifically to prevent access, + presumably to the doorway which is to the south. There are crimson + stains on the floor which have been unsuccessfully attempted to be + removed. North is an opening onto a large hall, and southeast is + another room. +guard2 + %guard1 + This is the inner guard room. The wall is decorated in battle scenes, + all of which end in the dwarfs winning. North is a doorway, and south a + low passage. To the west is a weapon store, which it appears the room + is primarily designed to guard. +wpnstr + Weapon store. + All about you is the most horrifying assortment of weapons you care to + envisage. Although they are too small for you to use in the main, the + various iron maidens, thumbscrews and racks also present show that the + dwarfs also use the room for torturing prisoners and each other. The + only exit is to the east, into a guard room. +lowps7 + %lowps1 + You are stood in a low passage connecting two guard rooms, one to the + north and one to the south. There is a doorway to the west which is + of polished wood, and seems to be to somewhere very important. +guard3 + %guard1 + You are in a guard room, bedecked in fine war trophies, most of which + are out of reach on the surprisingly high walls. The room is normally + reached by a low passage to the north, but to the south is a doorway + of very old oak, shined and polished to perfection. Obviously, it hides + something regarded with importance. +minrm + Ministerial room. + This is the dwarfen parliament room, where the king's ministers debate + the issues of the dwarfen realm. It is richly fashioned with oak + fittings, designed to hold, say, ten or so dwarfs excluding the king + himself. There is a doorway to the east, and a guard room to the south. +guard4 + %guard1 + This is the home of the king's guard, special, hand-picked troops of + the highest order, pledged to lay their lives down in order to save that + of their regal master. To the north is a room which seems to indicate + use as a debating forum of some kind, and from it through this room runs + a red fitted carpet to a doorway in the south wall. The doorway itself + is of heavy oak, and although elegantly finished seems to be built more + with strength in mind than ornamentation. +kingrm + Throne room. + This is the throne room, the very seat of power in the dwarfen realm. + It is luxuriously carpeted, and the walls are painted gold. It is here + that the dwarfen king holds audiences and receives oaths of fealty. The + king's study is to the east, and southwest lies the royal bedroom. A + doorway in the north wall is the only other exit. +kqdorm + Royal bedroom. + It is here that the dwarfen king and queen sleep. The room is furnished + with the normal bedroom paraphenalia, all dwarf-sized however so not + much good for you. The walls are a regal purple, and the floor is of + a soft, mossy material. The only exit is to the throne room, northeast. +kingst + King's study. + You are stood in the room the dwarfen king uses for much of his work. + A hollow cut out into the wall is obviously used for a desk, and it + is built with comfort and practicality in mind. The throne room is + easily accessed to the west, and there is a low passage to the south. + North is a doorway, of exceptionally old oak, well-tended and polished. +lowps8 + %lowps1 + You are in a low passage, which curves from a study to the north to end + in a doorway to the east. +ktreas + King's treasure chamber. + This room is built to house the crown jewels and other assorted + treasures of the dwarfen realm. It is austere in itself, and the only + way out is through a doorway to the west. +lowps6 + %lowps1 + You are in a low passage, which heads north to become the central + leg of a T-junction, and runs south to end in a doorway. East, it + opens up into a room. +dwrm2 + %dwrm1 + This is a room used by the dwarfs for everyday living, mainly by the + females and children. There is a doorway to the north, and another + room to the south. Northwest, there is an opening onto a guard room. +dwrm3 + %dwrm2 + You are stood in a very large room which the dwarfs use to manufacture + most of their goods. Dotted about all over are dozens of machines of + varying degrees of complexity, some so strange and old it is doubtful + that any of the dwarfs even know what they do. There is a thick wooden + door to the south, apparently for sound-proofing, and a low passage + leads off to the west. +dwrm4 + %dwrm1 + You look about to find yourself in a room used mainly during the + evenings and for relaxation. The older dwarfs are the kind you'd expect + to find here, for it is surprisingly quiet and well furnished. There is + another room to the north, and a low passage to the east. South you + observe a doorway. +kdorm + Children's dormitory. + This is the room where the young dwarfs sleep. The walls are decorated + in pictures of bunnies and pussies, and give the room a soft, dreamy + effect. The parents' dormitory is to the east, and to the north is a + door. +pdorm + Married quarters. + You are stood in the room in which live the married dwarfs. The various + sub-rooms are discretely curtained off from each other, although the + curtains are of course firmly fixed down to prevent their being stolen. + The dormitory of their young is to the west, and northwards is a low + passage. +lowps9 + %lowps1 + You are standing in a low passage, with three exits. West, the passage + leads into a room; south it opens into a dormitory; north, it ends in + a doorway. +odorm + Officers' dormitory. + This rather smart room is used as living quarters for officers and other + high-ranking dwarfs. Its walls are painted mainly in portraits of dwarfs + which all seem to look the same, due to their large beards. To the south + is a doorway, and to the north the large dormitory of the lower dwarfs. +dorm + Dormitory. + This is a large room, wherein sleep most of the unmarried dwarfs. It is + full of little hammocks upon which the dwarfs rest, sturdily fixed to + the wall to prevent their theft. To the south is the more classy + Officers' dormitory, and to the north is a heavy doorway, built to be + sound-proof. +rail4 light + Railway track. + You are stood on a section of rusted railway line, which runs out + from a tin mine in the base of a huge cliff to the east. Northwards + is a paddock where the pit ponies used to be kept, and south east + forest. Southwest is a mound, which the track cuts through as it + continues to the west. +rail3 light + %rail4 + You are stood on a section of east-west railway line, which continues + in both directions. To the south is a mound through which the track + is cutting, and to the north are a dale, and a paddock of some kind. +rail2 light + %rail4 + This is an east-west railway track, running through some very pleasant + surroundings. To the north and southwest are peaceful dales, and to the + south lies a drowsy forest. A hillock to the southeast is cut through + by the track as it heads east towards the base of a mighty cliff. +rail1 light + %rail4 + This is the last section of a railway line. It continues to the east + where it cuts through some dales, but to the west it stops at the + beach. Northwards is a stony slope also leading to the beach, and to + the southwest is a like slope, covered in scrubs. +stslop light + Stony slope. + This is a slope running down from a dale in the east to a beach in the + west. North is forest, and to the south is a section of railway line + which runs east-west. +ndale light + North dale. + You are stood in a quiet dale, at the foot of some gentle hills which + rise drowsily to the north, their slopes drenched in the emerald colour + of the trees which grow upon them. To the west the dale tails off into + a stony slope reaching down to the shore, and east is a paddock of + some description. To the south, before another forest, runs an east- + west railway track. +paddck light + Paddock. + This is a paddock, where once were kept the ponies which used to haul + the heavy skips of tin from the mine down to the jetty on the beach. + They have long since gone, but the railway line along which they used + to toil is still intact, to the south. Westwards is a dale, and to + northeast a ruin of some stone building. Eastwards, travel is impossible + due to the enormous cliff which rises up into a mountain far into the + clouds. +ruin light + Ruin. + This conglomeration of stone which lies forlornly in the grass is all + that is left of the outer buildings belonging to the nearby tinmine, + before bad times fell upon it. Age and the weather have since reduced + the once proud structures to moss-covered misshapen arrangements of + rubble. To the north is a forest, and to the east an enormous cliff at + the base of a huge, snow-capped mountain. Elsewhere is a pony paddock. +nfrst5 light + %nfrst1 + You are stood in some dense forest, which slopes down to the south. +nfrst6 light + %nfrst1 + You are stood in some dense forest, which slopes down to the south. +nfrst7 light + %nfrst1 + You are stood in some dense forest, which slopes down to the south, + where stones and masonry indicate once stood buildings, over which the + forest has now extended. +beach3 light nolook + Stony beach. + The beach upon which you are stood is covered in stones, a legacy of + the days when mining material would fall from the skips of ore as they + were loaded aboard merchantmen. To the north, the beach continues, and + to the west is the sea. East is a slope covered in scrubs, which rises + up to a dale. On the northern part of the beach can be seen a jetty. + Southwards, however, a headland with high cliffs cuts off the way. +beach4 light nolook + %beach3 + This is a beach covered in stones of irregular size. To the north the + cliffs rise, forming a cove which cuts off the area, but southwards + the beach continues. A railway line runs from the east, and to the + west a jetty forces itself out into the waves. To the southeast and + northeast, slopes rise up into dales. +shrine light small + Shrine. + You are inside a small yet sacrosanct shrine. A sense of deep + respectfulness fills this modest room. The way out, into a pine forest, + is to the northwest. It is obvious that the shrine was meant to be used + for quiet meditation, like similar chambers. +osanct light small silent + Outer sanctum. + You find yourself in the outer sanctum of some strange, holy temple. + All about you, the walls seem to be a hazy, formless blackness, but + there is a visible opening to the north from whence comes an errie, + golden light. +isanct light small silent + Inner sanctum. + This is the inner sanctum of a most reverend shrine. Thousands of + years it has existed, with only the highest of high priests permitted to + enter this hallowed room. The walls are a strange, misty black, and + golden light comes from an indeterminate source high above. An opening + to the south leads to the outer sanctum, but the bizarre walls may lead + elsewhere, too... +jetty light + Jetty. + This is a wooden jetty, which forces itself out into the sea. To the + east is the beach, but otherwise all around is the sea. +hdland light + Headland. + This is a small headland, jutting out of the island in a southeasterly + direction. All around the peninsula is rough sea, except to the + northwest, where a thicket is situated, and northwards where is a + sandy cove. +cove light + Cove. + You are stood in a sandy, windswept cove to the east of the island. + South is a barren headland, and southwest a thicket. To the north is + forest, and to the northwest a clearing, near which the indigenous + birds of the island refuse to fly. Eastwards is the rough sea. +ifrst1 light + Arcane forest. + You are stood in the awful hideousness of an arcane forest, its trees + misshapen collections of charred and splintered branches. All around + to the west rages the savage sea, and to the north the forest + continues. Eastwards, it has been cleared where it becomes a steep + slope. +ifrst2 light + %ifrst1 + This ancient forest in which you are stood looks to have been laid + to waste millennia ago, by some immense fire-breathing creation of the + evil gods. To the west, the relentless bombardment of the sea + continues, and to the east is a steep slope. South, the forest + is the same, but northwards it becomes foliated again. +ifrst3 light + Oak forest. + This is a forest of oak trees, in the northwest corner of the island. + To the south the forest has been ravaged by some diabolic evil, and + to the east is normal forest sloping upwards. West and north, the + rough sea batters away at the rugged coastline. +ifrst4 light + Sloping forest. + This is a sparse forest, which slopes from the south upwards to the + north. At the south end is a cove, which meets the rough sea that + is to the east. Southwest is an evil place, where such wildlife as + inhabits the island does not dare travel. To the west the forest + clears, and to the north is a clearing, upon which you can see a + ring of huge stones. +ifrst6 light + %ifrst4 + This is a forest on a steep hill, leading from an oak forest to the + west upwards to a clearing containing a huge ring of stones to the + north. Southwards the trees also end, and to the north the rough + sea crashes against the island. +ifrst5 light + Thicket. + This is a thicket, straddling the island. To the southeast it isolates + a barren headland, and to the east is a windswept cove. West is + wilderness which slopes up northwards, and to the north is level + ground, but over which hangs an aura of intense danger. +slope1 light + Steep slope. + This is a steep slope, running upwards to the north. Beyond more + slopes, at the top of the rock, a huge ring of stones can be seen, + a scene which dominates the whole island. To the east is a thicket, and + to the west an arcane forest. Southwards, the slope meets the sea in + a bay which looks just about calm enough to sail a small craft. +fring light nolook + Fairy ring. + You are stood in a desolate spot. The only noise is the howling wind + as it comes off the sea beyond a cove to the southeast. In the + centre of this wilderness is a fairy ring, a circle etched out by + toadstools many centuries before. No animals or birds of the island + will go in the area, although it it large enough for a human to enter. + North and west are slopes leading upwards to a plateau at the top of the + rock of an island, and northeast is forest. +slope2 light + %slope1 + You are stood on a steep slope, leading upwards to the north. At the + top, there levels out a plateau on the top of the rock which is this + island. East is forest, south and west more wilderness. +slope3 light + %slope1 + This is a cleared piece of wilderness which slopes up northeastwards. + All around is more of the same, except to the west where is a strange + and arcane forest. +slope4 light + %slope1 + This is a stretch of wilderness sloping upwards to the east onto a + plateau surmounted by a druidic ring of stones. North is s forest, + and west the slope levels out into a forest of oak. +rost light + Ring of stones. + You find yourself overawed by the huge ring of stones which encircle + this, the highest part of the island rock. As the wind sweeps over from + the rugged cliffs to the east and north, the whistling is broken only + by the lonely cries of the ravens which hover above. To the south and + west are steep slopes downwards. Far, far away in the distance on the + southeast horizon can be glimpsed the sail of a wrecked ship. In the + centre of the ring of stones is a large, heavy, bloodstained, slate, + sacrificial slab. Many people have been killed here. +brost light + Beneath ring of stones. + You are underneath the ring of stones, in a druidic chamber not entered + these past two thousand years until today. Light comes from the way out, + which is above. The walls of the chamber are stained red with the blood + from the sacrifices above. Steps lead down to the southwest. +dtest1 light nolook + Steps down. + As you go down, an axe swings out from above, but with a swish of your + magic sword you deflect it to one side. The way from here is a + downward climb, which you won't be able to climb back up, or the way + you came from the steps to the northeast. The floor is carpeted in a + heavy mist, so you cannot see your feet. +dtest2 light nolook + Niche room. + You start your descent, and the rocky walls change into clayy earth. + Suddenly, a clod comes loose from a tricky section, and you fall back. + With amazing speed you hook out with your sickle and it digs into the + wall, saving you from falling. You get to the bottom safely. There is + no exit, only a niche in the wall, to put things into. The floor is + covered in mist. +dtest3 light nolook + Druid room. + This most ancient of rooms is the old temple of the druids who once + lived upon this island. It is bare, the druids having taken their + paraphenalia with them when they fled The Land. Written onto the + wall in blue daub reads, "With the fork of gold eat the sprig of + pearls." There is a doorway to the north, and no apparent light + source although the room is illuminated. +dtreas light nolook + Druidical treasure chamber. + The room in which you find yourself is the most wonderous you have + ever glimpsed, its walls impregnated with starstones and the air + thickly scented with the drowsy aromatic sweetness of mistletoe. + The way out is via a rectangular hole in the roof. +dead20 light death + An unseen strong current suddenly drags hold of your little craft and + sucks it underwater. You splash about, but eventually drown. Sigh. +vrocks light + Vicious rocks. + You are landed by some vicious rocks out at sea. A strong current + flows past at alarming speed round the tattered, half-submerged + wreckage of a galleon stuck forlornly on them. You can cross to the + deck of the ship by going northwards, but its front half is underwater. + To the east in the distance can be seen a beach and cliff. Quite a way + to the south there looks to be a small island, dominated by a huge + archway which stands astride it. +deck light + Deck. + You are stood on the deck of a wrecked galleon. To the south are some + vicious rocks. Upwards, the main mast, still unbroken, leads to the + crow's nest; to the east are steps to the poop deck, and to the + northeast is the Captain's cabin. Downwards is the hold. +crow light small + Crow's nest. + You are perched in the crow's nest, high above the sea where it juts + out from the deck below. Far, far to the northwest can be glimpsed a + mysterious island, and to the east over the sea are cliffs. +stpoop light small + Steps. + You are on some shakey steps leading from the deck upwards to the poop. +poop light + Poop deck. + You are on the poop deck of the wrecked galleon. Westwards, steps lead + down to the deck. The wheel of the ship is stiffened and will not move + an inch. A name carved into it reads, "H.M.S. Essex". +capt light + Captain's cabin. + This cabin was once occupied by the captain of the ship. Most of the + contents have been washed away, and all that remains is driftwood. To + the southwest is an opening leading to the deck, and a hole in the + floor leads downwards to the galley. +galley light nolook + Galley. + This used to be the kitchen of the galleon, but all the utensils have + been washed away. A hole in the floor leads to the powder room, and + one in the roof leads to the captain's cabin. +proom light + Powder room. + The smell of sulphur fills the air as you look around you in the + storage place for gunpowder. Most of the kegs have been broken by the + elements, and are now useless. There was a way down but it is flooded. + Upwards is an opening in the ceiling to the galley. +hold light + Hold. + This is what remains of the hold which is unflooded. The walls are + stained black with the pitch used for waterproofing. The only + exit is upwards to the deck. +dead23 light death + You enter the powder room, and smell sulphurous fumes just before + igniting the powder ingrained in the wooden walls, and blowing + yourself to kingdom come. At least you went with a bang! +bwfall small light nolook + Behind waterfall. + You are in a small room behind a thundering waterfall. Above and + around you is a mighty cliff, and the walls of the cave glitter as + they catch the fractured light from outside. A spiral staircase to + the east leads upwards into the rock. +spiral small + Spiral staircase. + This is a spiral staircase, carved into the rock. Above, the steps + stop and a vertical section of steps follows. Below can be heard a + thundering crescendo of noise, and the sea can be smelled. +vert small dmove spiral + Vertical staircase. + This is a tight vertical climb, the steps hewn into the rocks in a + ladder-like arrangement. Above is a small room whence a hum ensues, + and below is a spiral staircase leading downwards. +revrm small + Reverberating room. + The walls around you in this small, oval room are humming as the + crashing of the waterfall outside resonates through the cliff. The + way out is a vertical climb leading downwards to the west, and another + passage runs northwards on the same level. +revps small light + Reverberating passage. + This passage also reverberates with the crashing of the waterfall + outside, but not so much as the reverberating room to the south. + Light comes from an opening onto a room to the north. +grotto light + Grotto. + This is a grotto, high up in the cliffs, but concealed from the beach by + an overhang. Out to sea can be seen a wrecked ship, tossed by some + fearful storm onto a pincushion of vicious rocks. Above is the cliff. +fossrm small + Fossil room. + This ancient room has not been visited in centuries until this day. Its + walls are studded with ancient fossils of creatues belonging to a bygone + era. An eerie sense of awe and wonder permeates the timeless cave. +fortun light + Forbidding tunnel. + You are in a forbidding tunnel underneath a mighty cliff. Light comes + from the western end, from which can also be heard the sound of the + sea. At the eastern end the rock becomes harder and the sea has not + eroded it. However, there are support braces for a heavy iron grate + there, in the roof. +smuggl + Smugglers' cave. + The irregularily-shaped room in which you find yourself is an old + cave, initially opened up by the sea but since enlarged upon by man. + Years ago, it was used as a hiding place by smugglers. In the floor + is a heavy iron grate, and below is a forbidding tunnel. +oglair + Ogre's lair. + This is a large room used as a home by an ogre. The floor is littered + with the bones of the dead, licked clean by the monster. A dark passage + exits to the north, and there is a small opening to the south. The + smell in the room is reminiscent of animals, and of the grave... +ydead8 light death + The ogre picks up his club and pounds you into the ground. +leprm small + Leprechaun room. + This is a small but pretty room owned by a leprechaun. The furniture + and ornaments are much too small to be of use to a human, however. The + only way out is to the north, whence a rotting smell ensues. +befidl light +yrdead light death + You are splattered over a very large area, or at least most of you + is. The rest of your remains are, even now, being eaten by the + seagulls (especially your eyes). If you'd have looked properly before + you leaped you might have decided not to jump! +outhut light + In front of hut. + You are standing in front of a ramshackle hut. Behind you is a field + of gorse. Further on to the south you can see a fast flowing river. + To the east you can see a range of mountains wreathed in mist and + to the west is a small cottage. +root light + Root room. + You are in a room of tangled yew roots. There appears to be a passable + gap to the north from whence emanates a dim light; to the south has + been hewn a smooth tunnel. Light comes from a hollow tree stump above. +rtun1 light + Root tunnel. + You are in an underground tunnel, with dry roots hanging from the + walls, and littering the floor. As you walk, you feel the twigs + snapping under your feet. The tunnel runs north to south, with a + dim light coming from the northern end, and a room of roots to the + south. +rtun2 light + Northern part of root tunnel. + You are in the northern part of a subterranean tunnel, its walls and + ceiling a mass of dangling, dry root from the tree above. There is a + dim light to the north, where the tunnel opens up. To the south, the + tunnel continues. +ydead1 light death + As you push your way through the hanging roots, the tinder dry wood + catches fire from your burning torch. The flames leap rapidly from + root to root, and soon you are surrounded by a raging fire. You feel + your body charring as you fall to the ground in utter agony... +dead10 light death + When you drop your torch, the tinder dry wood ignites from the + flame and an instant later you are burned to a frazzle as the + sparks flash across the roots. Serves you right for playing with + fire... +altar light + Sacred room. + You are standing in a room faced with smooth marble. The central + feature is a large, immobile block, out of which springs a tall flame, + throwing the empty corners of the room into vague, flickering shadow. + To the east is a dark tunnel, and to the south the only other entrance. +antech small light + Ante chamber. + You are standing in a small chamber carved out of the earth. To the + west is a tunnel, out of which emanates a dim glow. A mysterious + doorway is to the east, painted in a deep crimson colour. +hchamb + Hallowed chamber. + This is a sanctified, hallowed chamber, set off from the main temple by + an opening to the south. A faint smell of bitter incense still hangs + silently in the cold air. Most of the treasures which were once to be + found here have been stolen. +temple + Temple. + You are in a silent, sinister temple, its walls and a doorway to the + west painted in a deep crimson colour. The scent of stale incense + still lingers on, although the temple has remained unused for some + time and most of its trappings have been removed. A sliding chute + leads down to here from the east, but it is impossible to ascend. + In the north wall is an opening to a small chamber. +tunnel + Earth tunnel. + Before you is a convoluted earth tunnel. It seems to have been made + by a gang of cheery dwarves. Then again it might not have been. The + only exits appear to be to the north and southeast. +lgrm + Large room. + This is a very large room, at least 60 feet in diameter and some 20 + feet high. There are no apparent doors, but the walls are so full of + nooks and crannies that you might be able to go in any direction if + you tried. The only obvious exit is to the northwest. +wolfrm + Wolf room. + The evil stench of death hangs heavy on the wind in this most noxious + of rooms. The walls and floor are coated with the crusted excrement of + some massive hound, including the bones of brave men, licked clean + in some ghastly display of macabre carnage. There is an exit to the + west, and a deathly passage leading down... +deathp + Deathly passage. + This passage carries the scent of death, as it slants down from the + west to deep underground at the east. A stream of dried blood meanders + from the room at the top, and at the bottom the passage levels off. +cinder nolook + Cindered room. + The floor on which you stand is deep in cinders, and its walls are + blackened with soot from some incredible fire which must have once + raged here in some lost time. The walls beneath the soot are + glass-like, fused together by the radiant energy of the inferno. + To the west is a passage leading upwards, and to the east a strange + portal... +diamnd nolook + Diamond room. + When you enter the room, you feel a sudden sense of change around + you, although you cannot pinpoint the exact reason behind the + instinct. You soon forget this, however, as your eyes catch sight + of the floor: it is studded with diamonds! You leap down to pick them + up, but most are solidly fused in place. Looking around you, you see + a deathly passage sloping upwards to the west, and a strange doorway + to the east... +firept light hideaway + Fiery pit. + A narrow ledge here is the only safe place to tread, as a bubbling + pit of fiery tar and sulphur is on either side. The only exit is to + the west, into a passage still heated by the flames from the pit. + Breathing is difficult, but you can still get enough oxygen, albeit + with discomfort. +estlpl + East side of still pool room. + You are in a vaguely circular room with a high ceiling. The + way west is interposed by a large pool, but east is a hole in the wall. +wstlpl + West side of still pool room. + You are on the west side of the still pool room. There appear to + be no exits. +tombrm + Tomb room. + Above you, a set of narrow stairs lead upwards out of the tomb. To the + south is a scraped-out passage, above which is scrawled in crimson, + "EMERALD AND RED HAVE VALUE". The rest of the walls appear devoid of any + markings and there appears to be no other exit apart from the passage to + the south. +rottrm + Rotting room. + You are in a room of badly hollowed-out earth. The floor is littered + with rotting debris as if some evil feast of saphrophitic carnage + had been interrupted by your arrival. The only ways out from this + foul-smelling hole seem to be to the west and north. +cavein + Caved-in grave. + You are underneath a caved-in grave, although there is no way up + to the surface from here. Most of the corpse from the grave appears + to have been devoured so perhaps the cave-in was no accident... + To the west is a small chute which leads downwards, but you won't + be able to come back if you take it, or carry anything with you. +befgte light + Before Gate. + You are standing in front of a huge oaken gate, rotted through over + the ages so passage is easy. To the north is a narrow ledge over a deep + pit, and to the south a dark passage whence drifts the scent of animals. + The scene is visible by light beyond a smallish hole in the west wall. + You can travel through the gate, to the east. +bef1 + Before idol. + You are stood in front of a huge idol of a cyclops, hewn into the + rock face and towering above you. To the west is a large doorway but + the door has long since rotted away. Stairs run up the side of the idol + to an opening at the mouth, and beyond. To the north is a small opening. +crypt + Ancient crypt. + As you crawl out through the room, a sense of reverence comes over you, + for you find you are in a crypt. It has obviously not been entered for + a long time, and is stark and sparse save for a marble block in the + centre of the room, which is immobile. +ydead5 light death + As you leap, you suddenly realise that you are about to be splattered + all over the floor. Sure enough, you are. +ydead4 light death + As you start to cross the narrow ledge, the ox, nervous because of the + tremendous drop, is reluctant to follow and gives you a nudge with + its nose. You are knocked off balance and plummet downwards, breaking + into little pieces when you finally hit the bottom. +saltar small + Small altar room. + You are in a small room with an altar in front of you. Apart from the + narrow ledge there is no way out. +mthidl + Outside mouth of idol. + You are stood by the mouth of a large and ancient idol of a cyclops. + To the west, lower down, can be seen a tall but rotted gate. Above + are the nose and eye of the colossus. +inmth + Inside mouth of idol. + You are stood in the opening at the mouth of the idol. The walls are + blacked with the incense of ages passed. An opening to the east leads + deeper into the rock, whereas the mouth of the idol is to the west. +hollow + Hollowed-out passage. + This is an east-west passage, carved through the granite of the + mountain. At the west end is an opening to a small room, and at + the east a junction with some roughly hewn steps going downwards, + and the rest of the passage. The steps downwards curve away to the left. +rsteps + Roughly hewn steps. + You are on a spiral staircase, curving downwards into the bowels + of the mountain. The walls are solid rock, and the staircase is + narrow. +Rockps + Rock passage. + This is a passage carved into the rock, running east-west. At the + west end the passage continues, and makes a junction with some + steps leading downwards. At the east end the passage opens into + a chamber of some description. +chambr + Ancient chamber. + This is a ghostly chamber, its aged walls decorated with strange + glyphs and ancient runes which you cannot understand. To the west + is an opening to a passage. The eerie shadows cast by your light + add to the feeling of time and wonder you sense around you. +uland1 + Staircase landing. + You are stood in a small open area, which makes a junction a spiral + staircase leading both up and down. The steps down are much more + worn than those up, and the landing shows signs of recent use. To + the north is a battle-scarred oaken doorway. +guadrm + Guard room. + You are in a plain room of sanded granite, with seats set into the + wall which are well worn. To the south is an oaken doorway. +wstep1 + Worn steps. + You are on a worn spiral staircase leading both up and down. +wstep2 + %wstep1 + You are on a worn spiral staircase leading both up and down. +wstep3 + %wstep1 + You are on a worn spiral staircase leading both up and down. +uland2 + Bottom of worn steps. + You have reached the bottom of some worn steps, and find yourself in + a roughly-made room. The steps lead upwards, and to the west is an + exit to a natural cavern. +natcav + Natural Cavern. + This is a large natural cavern, caused by fissures in the rocks eons + ago. There is a well-worn path leading east-west, although the + cavern is bedded with granite. At the east end are steps to a landing; + at the west the cavern joins a north-south passage. +passg1 + Passage. + You are in a narrow, north-south passage which continues in both + directions. To the west is a doorway, and to the east is an entrance + to a natural cavern. +passg2 + %passg1 + This is a narrow north-south passage. At the north end is a doorway, + and to the south the passage continues. +passg3 + %passg1 + This is a narrow north-south passage. At the south end is a doorway, + and to the north the passage continues. +passg4 + %passg1 + This is a narrow east-west passage. At the east end is a doorway, at + the west an opening to a room. +passg5 + %passg1 + This is a narrow east-west passage. At the east end is a doorway, at + the west an opening to a room. +passg6 + %passg1 + You are in a narrow north-south passage. At the south end is a doorway, + at the north an opening to a room. +passg7 + %passg1 + You are in a narrow north-south passage, opening to a room at either + end. +passg8 + %passg1 + This is a narrow east-west passage, with a doorway at the west and and + an opening to a room at the east. +passg9 + %passg1 + You are in a narrow east-west passage. To the east are steps leading + upwards, and to the west the passage curves away to the left as you + look at it. In the north wall is a doorway. +pass10 + %passg1 + This is a narrow stretch of passage running east-west. At the east end + it joins a crooked passage, and at the west it stops. There is an + opening in the north wall at the west end leading to a long passage, and + one in the south wall at the west end leading into a room. +gob1 + Goblin lair. + This is a filthy room, vaguely square, with a doorway in the south wall + and an opening to a passage in the west. +gob2 + %gob1 + This is a filthy room, roughly square-shaped, with a doorway on the + west wall and openings to passages in the north, east and south. +gob3 + %gob1 + This dirty room is roughly square-shaped, with a doorway on the north + wall and an opening to a passage on the east. +gob4 + %gob1 + This is an unclean room, rectangular in shape, with an opening to the + south and a doorway to the north. There doesn't appear to be any way + of opening or unlocking the door from this side. +gob5 + %gob1 + This disgusting room is square-shaped. In the east wall is a doorway, + and to the south is an opening to a passage. There is a steep chute + in the north wall, leading down, but if taken you won't be able to + get back up through it. +treasc + Treasure chamber. + You find yourself in a room decked out in all manner of fabulous + valuables hoarded by the goblins over the years. Most of them, + however, are fabulous only in the eyes of goblins and there mightn't + be any you'd consider as treasure yourself. To the south in this room + is a doorway, and there is also a chute leading upwards, but it's + impossible to ascend. +ewstep + East-west steps. + You are on a staircase running down to the west and up to the east. At + the top is a room, at the bottom a passage. +curve + Curved passage. + This is a semi-circular passage, which bends to the east onto a passage + at the north end, and to the northeast onto a diagonal passage at the + southernmost end. If looked at from above, with north at the top and + south at the bottom, it could be described as the left half of a circle. +diagps + Diagonal passage. + This is a narrow passage, running diagonally from the southwest to the + northeast. At the southwest end, it comes onto a passage which curves + away to the right, and at the northeast end is space for a vertically + sliding panel. +spanel + Sliding panel room. + In this room you find space for a vertically sliding panel in the east + wall, but apart from that there are no interesting features. The only + exit is to the west where steps lead downwards. The place where the + panel goes has solid rock behind it. +bluerm small + Blue room. + This is a smallish room, painted in a bright royal blue for some reason, + from the ceiling to the floor. The way out is to the southwest, behind + where a vertically sliding panel is obviously intended to go. +longps + Long passage. + You are in a long, narrow, north-south passage. At the north end it + goes into a room, at the south it joins a crooked passage running + east-west. +crookp + Crooked passage. + This is a crooked passage running essentially east-west. At the west + end it straightens out, and at the east are narrow steps leading down. + There is an opening in the north wall leading onto a long passage. +nstep1 small + Narrow steps. + You are on some narrow steps, running a long way downwards from west to + east. +nstep2 small + %nstep1 + You are on some narrow steps, running up from east to west. The steps + are old, and look rarely used. +nstep3 small + %nstep1 + You are on some narrow steps, running up from east to west. The steps + are old, and look rarely used. +uland3 + Bottom of stairs. + You are in a small landing, deep in the bowels of the earth. The only + way out looks to be by some steps at the west end which run upwards. In + the northwest corner of this oval-shaped room is a widish, polished + chute, but it runs upwards and is slippery, so you cannot take it. Don't + know why I bothered mentioning it, actually! +lsp1 + Long sloping passage. + This is a long, sloping passage, running from the south upwards to the + north, with openings at both ends. +lsp2 + %lsp1 + This is a long, sloping passage, running from the south upwards to the + north, with openings at both ends. +lsp3 + %lsp1 + This is a long, sloping passage, running from the south upwards to the + north, where can be seen a dim light. +river3 light + Underground river. + You are on the banks of a fast-flowing river. High above is an opening + in the mountain, whence comes daylight, but it is impossible to reach + it. The river flows east-west, but underground at either end so you + cannot follow it. There is a slight bank to the north of you, and a + passage sloping downwards to the south. +nbank small light + North bank of underground river. + This is the north bank of the river, and is slightly muddy but not bad + enough to make you slip. Light comes from the opening high above. +cannrm + Cannon room. + You are in a square-shaped room. To the north is an opening onto a + passage, and to the south is a doorway. In the room, facing the + doorway, is an old ship's cannon. +fowrm light small + Fountain room. + An unmistakable sense of magic pervades this small room. In one corner + is a marvellous fountain, sprinkling sparkling water 6 feet into the + air. To the north is an opening to a larger room, but there are no + other exits. +eyedol small + Nose and eye of idol. + You are at the top of the idol. The stairs go no further. +attic light + Attic. + This is attic, or the loft. Dust of ages past lies here, barely + disturbed for generations. The thatched roof of the cottage adds + to the generally musty smell, and sense of mystery and excitement. + You can see because a thinning section of thatch lets the light in. +cuptop nolook + Top of cupboard. + You are stood at the top of the ladder in the cupboard. The walls + are old and the plaster is cracking, especially at the join with + the cupboard's ceiling. The ladder is very firm and steady. +dead11 light death + The cupboard is very small, and as you ascend the ladder you suddenly + realise that you are running out of air! Try as you might, you cannot + break your way out of the place, although you bash at all the walls, + and the ceiling and floor. Eventually you suffocate. Now you know how + the scratch marks on the wall were made! +laddrm light small dmove uhut + Ladder Shaft. + You are on a ladder, halfway between a hut and an underground room + dug into the earth. The inside of the hut can be observed through + holes in the floorboard, and it appears to have walls decorated with + animal trophies and other assorted items. +uhut + Underground Room. + This is an underground room, once used as a den by some forester, + perhaps. Its floor is covered with a soft moss, and it is surprisingly + comfortable, with evidence of once having an easy chair, and a fire + underneath a shaft (for ventilation). The shaft leads upwards and + contains a ladder affixed to the walls. To the west is a very small + tunnel, which you can squeeze into but won't be able to turn in. +stun1 small + Small tunnel. + You are in a small, claustrophobic, earthen tunnel, curving from the + north to the east. +stun2 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + west to the south. +stun3 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + northwest to the east. +stun4 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + south to the southeast. +stun5 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + southwest to the north. +stun6 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + northwest to the northeast. +stun7 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + west to the southeast. +stun8 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + north to the east. +stun9 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + northwest to the south. +stun10 small + %stun1 + You are in a small, claustrophobic, earthen tunnel, curving from the + north to the southeast. +dsteps light + Steps to cellar. + You are on some granite steps leading downwards to the cellar. There + is a hallway above to the northeast, and below is a dank cellar. +cellar light + Cellar. + This is a dank, murky cellar, its granite-faced walls stained with + mould and dust. Upwards to the northeast are steps, whence comes + light enough to see by. To the south is a crack in the wall, leading + to a small, earthen tunnel, although it looks very cramped and you + might not be able to turn round and come back were you to enter it. + To the west is the doorway to the coal bunker. +dead15 light death + As you attempt to move in a direction other than along the passage, + the soft earthen wall starts to crumble. You try to pack it back, + but the effect increases until the whole tunnel is falling about + your ears. Desperately, you claw your way through the disintigrating + passage, but the roof caves down and you are trapped, buried alive + under the huge weight of soil. A terrible way to go... +dead16 light death + You smash yourself into the rocks below and are consequently killed. +sloptn small + Sloping tunnel. + This is a small tunnel sloping from the north down to the south. Its + walls are earthy but hardened, and only about two feet apart. +level + Level room. + The floor of this square-shaped room lies on bedrock, and has been + chiselled painstakingly so as to be perfectly level. To the north is + a narrow passage, sloping upwards, and to the south is a short flight + of steps leading down to a muddy room. +mudrm + Mud room. + In this room, a large amount of reddish mud lies on the floor. The + floor is otherwise of unchiselled bedrock. A short flight of steps + to the north leads upwards into a square room with a level floor. +schamb + Small chamber. + You are in a small chamber with dry, earthy walls. The only exit is + to the west where you can see a room, its floor is deep in reddish mud. +hotpas light + Hot passage. + You are in a hot passage running east-west. At the west end is a + strange doorway, and at the east is a fiery pit, which makes the + atmosphere clammy, and thick with sulphurous fumes. +dead19 light death + Kingdom come. + You find yourself blown to kingdom come. Not really the ideal place + to spend the rest of your life, especially when you're dead. Next + time you'll know to put a fuse in and blast with the keg instead of + trying to burn it... +dead27 light death + The ox, afraid of the thundering waterfall, nudges you with its snout + as you walk under. You trip, and are drowned by the waters, held + underneath the surface by the falling torrent. Glug glug. +dead28 light death + The die comes up one. For an instant, it seems to glow a hellish red, + then there is an ear-splitting crack, as if the very fabric of the + universe had been rent. The die explodes into uncountable shards, and + you are killed by the blast. The goddess of luck must really dislike + you... +dead29 light death + Mistletoe is poisonous, simpleton! Don't you know ANYTHING? +dead30 light death + You try to set sail, but the seas are much rougher than you had + anticipated. Desperately, you try to make your way back to the shore, + realising that death is inevitable. You are right, and inevitably die. +dead31 light death + Off you jump, safe in the knowledge that your pseudo-parachute will + save you from certain death. Unfortunately, the strong winds coming + off the sea blow it out of your hands! Guess what happens next..? +dead33 light death + You poison yourself, simpleton. +dead34 light death + You start to move, and suddenly the squirrels start acting very + viciously. They scamper about you scratching and clawing, then, as + one, they leap at you and start gnawing at your flesh with their + sharp incisors. You try to beat them off, but they are too many and + are incensed by something into a maddened rage. Eventually you are + torn to pieces. I wonder what it is you did? Or didn't do? +dead37 light death + >-KABOOM-< +dead39 light death + You walk out of the coal bunker, but the coal dust by the door ignites + from your brand, and an instant later you find you aren't. +dead40 light death + All of a sudden the lit torch you are carrying sets fire to your boat, + and within seconds the wood is in flames. You look about in horror as + your little craft burns to nothing before your very eyes. Glug glug () + glug (). +dead41 light death + All of a sudden, from out of nowhere, comes a wall of water, crashing + towards you with immense power! You are hopelessly trapped, and although + you try your best you've no time to react. To cut a long story short, + you get buffeted against the floor and pounded to death. And if you'd + have survived that you'd have drowned, too... +dead43 light death + You leap off, hoping that for some reason you won't kill yourself + when you land. Where you got that idea from I'll NEVER know... +@txtmap +START +/ + <> [Forest]<> [Foot] | + [Hills] | [wall] + | +- - - - ------------------------6 - - - - + Narrow Road [Way Out] +- - - - ------------------------5 - - - - + | + [Foot] | [wall] + <> [Forest]<> [Hills] | +/ +ROAD2 +/ + + <> [Forest]<> + +- - - - ------------------------- - - - - + Narrow Road +- - - - ------------------------- - - - - + +[Veg. +Garden Gorse] <> [Forest]<> +/ +OSTART +/ +<> [Forest]<> | | <> [Forest]<> + | [Cemetery] | + | | +- - - - -----6---- ----6----- - - - - +[Beaten Track] Narrow Road +- - - - ---------5 4--------- - - - - + | | +[Flower] | [Path]| [Veg. +Garden] | | [Garden] +/ +HOME +/ +[ROOT MAZE1 INMTH] Also [START] out + [STORE] in + 4------------------5 [SWAMP] swamp +[CAPT] | HOME | [NATCAV ROST] jump + 3------------------6 [BDRM] up + [CANNRM] down +[BEACH] <> [GLADE]<> [CAVE] +/ +STORE +/ + 4---------------5 + | | + | STORE 8 [your guess is as good as mine] + | | + 3---------------6 + +/ +LIMBO +/ + + + LIMBO + + +/ +NFRST1 +/ +<> [Forested Slope]<> <> [Forested Slope]<> + +<> [Forest]<> <> Forest<> <> [Forest]<> + +<> [Forest]<> <> [Forest]<> <> [Forest]<> +/ +NFRST4 +/ + | <> [Forested Slope]<> + | + [cliff]| <> Forest<> <> [Forest]<> + | + | <> [Forest]<> <> [Forest]<> +/ +@txtvoc + links + chip + oven + chair + triumph + burner + prod + rivet + onledge + greengem + herring + gateway + wvol + height + springh2o + mpoint + fitting + dwarfs + ore + duct + torrent + pickaxe + lantern + wheel + csselesu + sink + cord + arachnid + tooth + sandstone + coffin + corpse + carving + tombs + ratstop + spstop + cricket + anthracite + fish + commode + vermin + plaything + trumpet + nut + cup + scythe + signpost + clanger + fungus + sword + killer + ivory + sprig + pottery + time + tubes + creeper + paw + guardian + relic + fruit + pegasus + bird + onyx + pan + crystal + symbols + case + lookingglass + scarab + bunny + enemy + fissure + coat + warren + rings + ball + paper + cannon + spray + goblin + rodents + charm + enclave + utensil + sliding + cloth + fuse + curse + book + tome + adventurer + keg + boat + pen + marble + iron + infection + tub + earth + head + trapdoor + slidingwall + trpdoor + monster + fairy + crock + rock + necklace + knife + beast + view + eview + tview + wretch + stradivarius + pointer + violinbow + hound + wood + shell + bone + map + sheepskin + band + block + disk + animal + lake + ice + limb + idol + bedclothes + headstone + glove + birdofprey + any + lizard + switch + crucifix + oneway + slate + ram + ladder + secretdoor + drawbridge + rum + biscuit + magic + skeleton + toy + antidote + flower + trunk + parachute + haunt + rug + urn + veil + brass + man + woman + recorder + bangle + frog + nanny + china + platter + mace + metal + archway +@txtcsy + sheets bedclothes ;these and the rest here might as well be for objects + covers bedclothes + nuts nut + bough sprig + wedgewood pottery + trophy head + rodent rodents + undead enemy +;;vocabulary objects +@txtobj + chain links 4000 40 + mosaic chip 10 5 + stove oven 0 0 + trophy triumph 1000 35 + throne chair 60000 200 + forge flame 0 0 + poker prod 3000 20 + icicle ice 1000 0 + pot container 2000 0 + wandvolume wvol 0 0 + fur coat 15000 7 + potty container 1000 0 + baton pointer 60 0 + violin stradivarius 300 20 + bow violinbow 1000 0 + stethoscope tubes 750 12 + emerald greengem 30 60 + objonledge onledge 100000 0 + cliff height 100000 0 + bolt rivet 1000 15 + disc disk 30 22 + gate gateway 100000 0 + springwater springh2o 100000 0 + medpoint mpoint 100000 0 + dwarf dwarfs 70000 25 + tin ore 2000 15 + ventilator duct 100000 0 + uranium metal 1000 92 + arch archway 100000 0 + flood torrent 100000 0 + pick pickaxe 5000 0 + lamp lantern 1000 0 + osselesu csselesu 100000 0 + valve wheel 100000 0 + filling tooth 1 10 + sarcophagus coffin 0 0 + body corpse 75000 58 + inscription carving 0 0 + horn trumpet 400 46 + tomb1 tombs 0 0 + tomb2 tombs 0 0 + tomb3 tombs 0 0 + tomb4 tombs 0 0 + tomb5 tombs 0 0 + tomb6 tombs 0 0 + vase china 4000 49 + sceptre mace 200 48 + rstop ratstop 0 0 + sptrap spstop 0 0 + coal anthracite 1000 15 + squirrels rodents 0 117 + slab slate 100000 0 + locket charm 20 57 + niche enclave 0 0 + fork utensil 30 68 + fleece sheepskin 2000 50 + headband band 1000 175 + skull ram 100 175 + acorn nut 5 0 + chalice cup 1500 25 + sickle scythe 1250 25 + sign signpost 15000 19 + bell clanger 3000 25 + broadsword sword 2250 163 + longsword killer 2250 0 + sabre sword 2250 0 + rapier sword 2250 0 + epee sword 2250 0 + cutlass sword 2250 0 + foil sword 2250 0 + scimitar sword 2250 0 + flute recorder 750 20 + effigy sandstone 1550 41 + bat cricket 1250 15 + toadstool fungus 10 0 + die ivory 20 20 + mistletoe sprig 30 0 + lever switch 0 0 + chart map 300 0 + mirror lookingglass 1000 30 + amulet scarab 50 20 + oracle treasure 1200 10 + ornament pottery 10 71 + sundial time 0 16 + ivy creeper 0 0 + kipper herring 52 7 + foot paw 30 5 + apple fruit 150 17 + horse pegasus 40000 48 + gull bird 1500 69 + birdbath sink 0 0 + lion onyx 1800 17 + pancake pan 2000 7 + crystals crystal 100 0 + bottle rum 3000 49 + wafer biscuit 5 0 + runes symbols 100000 0 + bookcase case 0 0 + libram tome 3000 10 + magazine adventurer 300 31 + rabbit bunny 2000 7 + rat vermin 10000 8 + hole warren 0 0 + scroll paper 40 0 + sphere ball 20000 51 + gun cannon 0 0 + ballview view 0 0 + fountain spray 0 500 + goblins goblin 20000 17 + zombie enemy 30000 18 + skeleton enemy 40000 25 + magbar any 0 0 + panel sliding 0 0 + egg curse 100 102 + brick block 0 0 + naughty toggles 0 0 + wardrobe fitting 0 0 + earrings rings 20 15 + silk cloth 5000 28 + string fuse 10 0 + logbook book 0 0 + powder keg 10000 0 + coracle boat 10500 0 + raft boat 10500 0 + quill pen 5 6 + moose head 7500 40 + grate iron 0 0 + barrel tub 40000 0 + mud earth 0 0 + portcullis drawbridge 0 0 + icon relic 2000 300 + golem guardian 70000 60 + beggar wretch 45000 22 + wolf hound 140000 165 + dragon lizard 256000 1000 + shark fish 70000 120 + dryad wood 70000 50 + pillar marble 50000 30 + conch shell 300 23 + fossil bone 30 0 + bracelet bangle 100 70 + plate platter 500 85 + prince man 75000 50 + beauty woman 60000 50 + toad frog 1500 0 + goat nanny 20000 20 + web cord 0 32 + spider arachnid 20000 65 + crack fissure 0 0 + tdoor trapdoor 0 0 + trpdor trpdoor 0 0 + sliwal slidingwall 0 0 + doll plaything 2000 15 + chest infection 20000 15 + ogre monster 100000 35 + leprechaun fairy 10000 37 + gold crock 10000 50 + granite rock 0 0 + pendant necklace 700 75 + pool lake 0 0 + pendview view 0 0 + leg limb 5000 0 + ox beast 40000 75 + blade knife 0 0 + eyeview eview 0 0 + rootview tview 0 0 + tunview tview 0 0 + eye idol 100 39 + statue decoration 5000 19 + cupboard oneway 0 0 + stepladder ladder 100000 0 + sdoor secretdoor 0 0 + wand magic 500 0 + umbrella parachute 1200 0 + parasol parachute 700 14 + rattle toy 100 0 + bed bedclothes 0 11 + tree trunk 0 0 + grave headstone 0 0 + gauntlet glove 2600 22 + eagle birdofprey 50000 79 + tomb haunt 0 0 + potatoes victuals 2500 40 + wolfsbane antidote 100 -200 + hyacinth flower 50 15 + cross crucifix 100 60 + carpet rug 7000 35 + incense urn 1500 20 + curtain veil 1200 20 + ring brass 20 110 +@txtosy + guard dwarf + cookie wafer + ss stethoscope + coals fire + icicles icicle + post sign + lib libram + library libram + vent ventilator + ma magazine + mad magazine + hc hyacinth + hiacynth hyacinth + stump tree + stiff body + ming china + floor inscription + cadavre body + cadaver body ;be kind to yanks week + rats vermin + z zombie + crescent sickle + berries mistletoe + gnomon brand + grail chalice + seed acorn + bs broadsword + ls longsword + brolly umbrella + cocaine naughty + saphire sapphire + pond lake + mushroom toadstool + lid tomb + fiddle violin + dial sundial + stallion horse + seagull gull + projectile sphere + platinum sphere + gunpowder powder + rope string + wick string + strand string + feather quill + dog wolf + frankincense incense + drape curtain + amber pendant + finger fossil + taties potatoes + jade ox + ruby eye + rod wand + staff wand + yew tree + spuds potatoes + herb wolfsbane + wolvesbane wolfsbane + squirrel squirrels + begger beggar + skin fleece + sheep ram + pelt fleece + pc portcullis + bc bookcase + bk bookcase + lep leprechaun + butt barrel + club ogre + earring earrings +@txtmtn +fastatn get + drop + kill + wave + blast + fix + $alter + $arch1 + $arch2 + $arch3 + $arch4 + $blast + $blind + $brewing + $brewing1 + $bump + $burn + $change + $check + $clear + $cure + $cured + $dead + $deaf + $devour + $dprovoke + $dragon + $drunk + $drunk1 + $drunk2 + $emerge + $exp + $fall + $fdevour + $firework + $flood + $flush + $fprovoke + $land + $message + $move + $null + $dumb + $out + $out1 + $paralyse + $plonk + $poison + $poison1 + $poison2 + $pouring + $pouring1 + $provoke + $play + $ratty + $reseagle + $smash + $spider + $snake + $snow + $snow1 + $snow2 + $snow3 + $snow4 + $summer + $summer1 + $suspend + $trans + $uranium + $winter + $written + $zzz + +;;vocabulary actions +action fell none none ifin null ufrst1 722 + fell none none ifin null ufrst2 722 + fell none none ifin null ufrst5 722 + fell none none ifin null ufrst3 722 + drop none none holdfirst null 0 0 + drop none none flipat null 0 0 + drop bird container unlessprop null 1 768 + drop .provoke birdofprey container null null 1106 0 + drop fairy container null null 769 0 + drop pottery container null null 770 0 + drop china container null null 770 0 + drop boat container null null 772 0 + drop nut container null null 773 0 + drop sprig container null null 774 0 + drop killer container null null 1088 0 + drop parachute container ifprop null 0 815 + drop anthracite flame destroy null 584 0 + summon none none ifin null slidin 961 + summon none none ifin null fallin 961 + fix nanny none ifprop null 1 673 + fix nanny none unlessgot goat 674 0 + fix nanny none ifhave egg 675 0 + fix nanny none ifin null firept 677 + fix .drop nanny none unlessinc null swamp1 678 ;NB doesn't catch rest of swamps + fix .drop nanny none exp null 90 679 + get none none ifhave egg 255 0 + get anything person ifobjis coracle 593 0 + get anything person ifobjis raft 593 0 + get anything person ifobjis mirror 460 0 + get .get anything person ifobjis uranium 0 0 -51 + get .get anything person ifberserk null 0 0 + get anything person ifobjis longsword 1087 0 + get anything container ifprop null 1 816 + get .remove anything container ifobjis uranium 0 0 -51 + make bedclothes none ifprop null 1 1035 + make bedclothes none inc null 104 1036 +@txttop + toll clanger none ifprop null 1 986 987 + toll clanger none null null 926 0 927 + listen tubes none null null 1068 0 + plant flower none null null 897 0 + press flower book destroy null 898 0 + press flower tome destroy null 898 0 + hints none none null null 15 0 + wake herring none null null 1113 0 + wake woman none null null 4 0 + wake dwarfs none ifprop null 2 1022 + wake dwarfs none ifprop null 3 1022 + wake dwarfs none dec null 1023 1022 + fill cup none null null 529 0 + fill rum none ifprop null 1 859 + fill rum torrent unlessprop second 1 860 + fill rum torrent inc null 861 0 + fill rum stream inc null 861 0 + fill rum lavatory inc null 861 0 + fill rum spray inc null 861 0 + fill rum sink inc null 861 0 + fill rum tub null null 864 0 + fill rum weather unlessprop rain 1 867 + fill rum weather inc null 861 0 + fill rum none ifin null estlpl 864 0 + fill none h2o unlessobjis bottle 876 0 + fill none h2o inc bottle 861 0 + fill rum none null null 860 0 + pull limb none null null 1038 0 + pull switch none trans null slidin 464 -24 + pull cord none ifprop null 1 936 + pull cord none set null 1 935 -27 + examine switch none null null 465 0 + prise rivet none ifprop null 0 720 + prise rivet pickaxe dec null 706 0 + prise rivet utensil destroy second 707 0 + prise rivet sword dec null 706 0 + prise rivet killer dec null 706 0 + prise rivet prod dec null 706 0 + prise rivet scythe dec null 706 0 + prise rivet tool unlesslevel null 3 845 + prise rivet tool dec null 706 0 + prise rivet torch null null 708 0 + prise rivet magic null null 709 0 + prise rivet none null null 710 0 + prise ore none ifprop null 0 720 + prise ore pickaxe dec null 717 0 + prise ore sword dec null 718 0 + prise ore killer dec null 718 0 + prise ore prod dec null 718 0 + prise ore tool unlesslevel null 3 845 + prise ore tool dec null 718 0 + prise ore none null null 719 0 + sharpen torch sword destroy null 711 0 + sharpen torch killer destroy null 711 0 + sharpen torch knife destroy null 711 0 + sharpen torch tool destroy null 711 0 + sharpen magic none null null 712 0 + sharpen torch none null null 713 0 + untether nanny none dec null 689 690 + bath bird none unlessin null bbath 402 + bath bird none inc null 403 404 + bath birdofprey none unlessin null bbath 402 + bath .provoke birdofprey none null null 1106 0 + pluck bird none ifzero null 411 412 + pluck .provoke birdofprey none null null 1106 0 + toss pan none expdestroy null 376 0 + smell none crystal ifobjis naughty 371 0 + smell .sleep crystal none destroytogglesex null 367 368 + smell flower none null null 899 0 + smell antidote none null null 1081 0 + climb space none ifin null hut 330 + climb space none ifin null ufrst5 753 + climb space none ifin null ufrst1 753 + climb space none ifin null ufrst2 753 + climb space none dead null 1042 0 + climb archway none null null 1084 0 + kiss frog none ifsex null 0 336 + kiss frog none destroycreate prince 337 0 + kiss man none ifsex null 0 338 + kiss man none expdestroy null 339 0 + kiss woman none ifsex null 1 346 + kiss woman none expdestroy null 347 0 + kiss person sprig emotion null 100 788 + kiss dwarfs none ifprop null 0 1026 + kiss dwarfs none null null 1027 0 + kiss beast none toggle null 117 117 699 + kiss nanny none null null 671 0 + kiss wretch none null null 1067 0 + prime cannon keg ifprop powder 1 274 + prime cannon keg decdestroy powder 275 0 + load cannon ball ifprop null 2 280 + load cannon ball decdestroy sphere 276 0 ;snakes and ladders joke if using in laddrm and snakes's there? + roll .drop ball none inc null 281 282 + roll .drop ivory none ifrprop null 5 497 + roll .drop ivory none ifprop null 4 498 + roll .drop ivory none ifprop null 3 499 + roll .drop ivory none ifprop null 2 500 + roll .drop ivory none ifprop null 1 501 + roll ivory none destroytrans null dead28 0 + slide slate none null null 538 0 + enter spray none expinc null 285 286 + enter brass none unlessprop null 2 516 + enter brass none trans null garden 514 + enter fitting none trans null wrdbe 0 + enter lizard none null null 686 0 + enter none none null null 513 0 + leave spray none null null 302 0 + leave none none null null 565 0 + unfix .get head space swap tdoor 193 0 + unfix head none ifprop null 1 194 + swim none none ifin null pond1 341 + swim none lake ifzero null 160 159 + swim none none unlessin null main2 140 + swim none none ifprop flood 0 738 + swim none none null null 737 0 + draw veil none ifprop null 2 224 + draw veil none ifpropdec null 1 850 + draw veil none set null 1 851 -7 + att fuse keg destroydec powder 254 0 + lie none bedclothes null null 173 0 + ride beast none null null 176 0 + ride nanny none null null 668 0 + sit chair none null null 1001 0 + sit beast none null null 176 0 + sit nanny none null null 668 0 + sit none web ifprop null 1 941 + ride none web ifprop null 1 941 + beat none web ifprop null 1 941 + fly none web ifprop null 1 941 + ride beast none null null 176 0 + ride nanny none null null 668 0 + ride pegasus none unlessgot null 399 0 + ride pegasus none ifhave mistletoe 400 0 + ride pegasus none trans null 398 + ride none rug ifprop null 1 4 + ride none rug ifin null attic 12 + ride none rug ifhave mistletoe 4 0 + ride none rug trans null 211 + beat rug none ifprop null 1 4 + beat rug none ifin null attic 12 + beat rug none ifhave mistletoe 4 0 + beat rug none trans null 211 + sit none rug ifprop null 1 4 + sit none rug ifin null attic 12 + sit none rug ifhave mistletoe 4 0 + sit none rug trans null 211 + fly beast none null null 688 0 + fly nanny none null null 688 0 + fly rug none ifprop null 1 4 + fly rug none ifin null attic 12 + fly rug none ifhave mistletoe 4 0 + fly rug none trans null 211 + fly pegasus none unlessgot null 399 0 + fly pegasus none ifhave mistletoe 400 0 + fly pegasus none ifin null glade 379 + fly pegasus none trans null 398 + fly rug none ifprop null 1 4 + fly rug none ifin null attic 12 + fly rug none ifhave mistletoe 4 0 + fly rug none trans null 211 + fly none rug ifprop null 1 4 + fly none rug ifin null attic 12 + fly none rug ifhave mistletoe 4 0 + fly none rug trans null 211 + fly none none unlessgot horse 430 0 + fly none treasure null null 400 0 + fly none none ifhave mistletoe 4 0 + fly none none ifin null glade 379 + fly none none trans null 398 + gallop pegasus none null null 621 0 + canter pegasus none null null 622 0 + roll tombs none null null 623 0 + sit none pegasus unlessgot null 399 0 + sit none pegasus ifhave mistletoe 400 0 + sit none pegasus trans null 398 + freeze lake ice null null 222 4 + melt ice flame destroy null 178 0 + melt something lantern null null 740 0 + melt ice torch destroy null 178 0 + melt ice none unlessin null firept 310 + melt ice none destroy null 178 0 + melt none pool ifprop null 0 179 + worship none idol floatdestroy eyeview 124 125 + worship none eview null null 142 142 + worship none none null null 141 0 + piss rum none testsex null 875 872 + piss container none null null 879 0 + rape corpse none unlesslevel null 8 644 + rape corpse none iflevel null 9 644 + rape corpse none testsex null 647 648 + rape woman none ifsex null 1 475 + rape woman none expdestroy null 476 0 + rape beast none null null 473 0 + rape .provoke nanny none null null 670 0 + rape pegasus none null null 473 0 + rape bunny none testsex null 477 478 + rape .provoke enemy none null null 479 0 + rape .provoke goblin none null null 480 0 + rape wretch none null null 481 0 + rape hound none null null 473 0 + rape familiar none ifprop null 9 485 + rape vermin none null null 581 0 + rape man none testsex null 482 483 + rape frog none testsex null 334 478 + milk beast none null null 641 0 + milk .provoke nanny none null null 658 0 + conduct none none unlessgot baton 803 0 + conduct none none null null 804 0 + climb none ladder null null 164 4 + unlatch none oneway ifprop cupboard 0 165 + unlatch none ladder null null 162 0 + unlatch none oneway swap sdoor 161 4 + latch none oneway ifprop cupboard 1 166 + latch none oneway swap sdoor 163 4 + unlock access none ifin null cannrm 283 + unlock access none ifin null downps 349 + unlock access yale ifin null gob4 288 + unlock access none ifin null gob4 287 + unlock none goblin null null 292 0 + unlock none enemy null null 324 0 + unlock access bone null null 656 0 + lock access none ifin null cannrm 283 + lock access bone null null 656 0 + read none none ifblind null 1 1069 + read time none ifprop null 1 383 + read time none unlessprop rain 0 385 + read .time time none expinc null 384 0 + read tome none iflight null 462 305 + read adventurer none iflight null 1092 305 + read paper none iflight null 304 305 + read map none iflight null 484 305 + read book none iflight null 548 305 + read symbols none iflevel null 7 964 + read symbols none dead null 1043 0 + read carving none iflight null 610 305 + read veil none iflight null 857 305 + read signpost none iflight null 923 305 + read guardian none null null 1037 0 + read anything none ifobjis sundial 965 0 + tame hound none null null 234 0 + wave none cord ifprop null 1 942 + wave medication none null null 576 0 + wave clanger none ifprop null 1 986 987 + wave clanger none null null 926 0 927 + wave torch none ifprop null 1 4 + wave torch none inc null 174 4 + wave toy none iflevel null 2 261 + wave toy none toggle rstop 102 102 -17 + wave pointer none unlessgot null 798 0 + wave pointer none ifhave mistletoe 4 0 + wave pointer none ifhave ox 4 0 + wave pointer none ifhave pillar 4 0 + wave pointer none ifhave carpet 4 0 + wave pointer none ifhave goat 4 0 + wave pointer none ifhave horse 4 0 + wave pointer none ifhave barrel 4 0 + wave .drop pointer none transwhere bow 799 837 + wave violinbow none unlessgot null 798 0 + wave violinbow none ifhave mistletoe 4 0 + wave violinbow none ifhave ox 4 0 + wave violinbow none ifhave pillar 4 0 + wave violinbow none ifhave carpet 4 0 + wave violinbow none ifhave goat 4 0 + wave violinbow none ifhave horse 4 0 + wave violinbow none ifhave barrel 4 0 + wave .drop violinbow none transwhere baton 805 837 + wave .drop magic none ifheretrans osselesu sorcrm 728 + wave magic none unlessgot null 562 0 + wave none none unlessgot wand 236 0 + wave none none unlessobjis wand 561 0 + wave none marble dead null 1044 0 + wave none sprig null null 502 0 + wave none rug null null 235 0 + wave .drop magic none trans null sorcrm 128 + tidy bedclothes none ifprop null 1 1035 + tidy bedclothes none inc null 104 1036 + unmake bedclothes none unlessprop null 1 1034 + unmake bedclothes none expset null 2 126 + wear glove none unlessgot null 798 0 + wear glove none transhere eagle 1110 1111 + wear .sleep band none null null 571 0 + wear coat none null null 938 0 + wear necklace none null null 247 0 + light curse flame null null 259 0 + light anthracite flame destroy null 584 0 + light pointer flame null null 800 0 + light stradivarius flame destroy null 801 0 + light violinbow flame destroy null 802 0 + light keg flame destroytrans null dead19 0 + light torch lizard dec null 589 4 + light lantern none ifprop null 2 908 + light lantern flame dec null 741 4 -19 + light lantern lizard zonk null 742 0 743 + light paper flame destroy null 306 0 + light parachute flame destroy null 601 0 + light map flame destroy null 491 0 + light tome flame null null 494 0 + light adventurer flame destroy null 1093 0 + light urn flame destroy null 1083 0 + light something lantern unlessprop second 0 744 + light something lantern null null 745 0 + light something sword null null 963 0 + light something killer null null 963 0 + light something oven null null 1010 0 + light urn torch destroy null 1083 0 + light trunk torch ifzero null 181 182 + light signpost none null null 918 0 + light lantern torch dec null 741 4 -19 + light wood torch expdestroy null 72 0 + light parachute torch destroy null 601 0 + light cord torch ifpropdestroy null 0 962 + light cord torch expdestroy null 939 0 + light wood none null null 558 0 + light keg torch destroytrans null dead19 0 + light torch none ifin null firept 241 + light creeper none null null 437 0 + light paper torch destroy null 306 0 + light map torch destroy null 491 0 + light tome torch destroy second 492 0 + light adventurer torch destroy null 1093 0 + light book torch destroy null 493 0 + light time torch inc null 390 389 + light anthracite torch destroy null 584 0 + light parachute torch destroy null 495 0 + light case torch null null 496 0 + light infection torch destroy null 506 0 + light sheepskin torch destroyinc skull 569 0 + light medication torch destroy null 572 0 + light corpse torch destroy null 1080 0 + light corpse flame destroy null 1080 0 + light pointer torch null null 800 0 + light stradivarius torch destroy null 801 0 + light violinbow torch destroy null 802 0 + bath money none dec null 372 373 + douse lantern none unlessprop null 0 4 + douse lantern none set null 1 746 -21 + fold adventurer none iflevel null 3 1095 + fold adventurer none exp null 3 1095 + tap none none ifin null grotto 466 + tap trunk none null null 106 0 + tap earth none ifzero null 70 69 + tap flame prod iflevel null 2 1000 + tap flame prod exp null 50 1000 + tap none none unlessin null downps 360 + tap none none trans null sorcrm 361 + cook bunny oven ifprop null 2 1011 + cook bunny oven destroy null 321 0 + cook bunny torch ifprop null 2 326 + cook bunny torch destroy null 321 0 + cook bunny flame ifprop null 2 326 + cook bunny flame destroy null 321 0 + cook bunny none null null 639 0 + kick .provoke wretch none iflevel null 2 118 + kick wretch none exp null 1 118 + fell wood tool expdestroy null 71 0 + fell .kill wood none null null 0 0 + fell cord tool null null 943 0 + fell cord sword ifpropdestroy null 0 982 + fell cord sword expdestroy null 978 0 + fell cord killer ifpropdestroy null 0 982 + fell cord killer expdestroy null 978 0 + fell something sword null null 564 0 + fell something killer null null 564 0 + fell something cricket null null 605 0 + fell something pickaxe null null 734 0 + fell block none null null 136 0 + fell signpost tool dec null 919 920 + fell trunk tool ifprop null 0 135 + fell trunk tool decifzero null 105 136 + fell trunk none ifhave axe 600 0 ;not the jewelled one + fell trunk none null null 190 0 + fell access tool ifin null cannrm 89 + fell access tool ifin null downps 89 + fell access tool ifin null gob4 89 + fell access tool ifin null treasc 89 + fell access tool ifin null fowrm 89 + fell access tool ifin null sorcrm 89 + fell access mace ifin null cannrm 89 + fell access mace ifin null downps 89 + fell access mace ifin null gob4 89 + fell access mace ifin null treasc 89 + fell access mace ifin null fowrm 89 + fell access mace ifin null sorcrm 89 + fell access mace destroy null 643 0 + fell access pickaxe null null 735 0 + fell case tool null null 489 0 + fell case mace null null 489 0 + fell oneway tool destroy null 783 0 + fell oneway mace destroy null 783 0 + fell none none unlessin null wfrst1 797 + fell none none ifzero tree 795 796 + feed something rum ifprop second 0 931 + feed nanny pan null null 681 0 + feed nanny victuals destroy second 682 0 + feed nanny antidote destroy second 682 0 + feed nanny flower destroy second 682 0 + feed nanny fungus destroydestroy toadstool 683 0 + feed nanny limb null null 684 0 + feed nanny corpse null null 684 0 + feed nanny sprig destroydestroy mistletoe 685 0 + feed nanny frog null null 684 0 + feed nanny bird null null 684 0 + feed nanny birdofprey null null 684 0 + feed nanny rodents null null 684 0 + feed nanny bunny null null 684 0 + feed nanny vermin null null 684 0 + feed nanny familiar null null 684 0 + feed nanny herring destroy second 682 0 + feed nanny serpent null null 684 0 + feed nanny nut destroy second 682 0 + feed nanny pen destroy second 682 0 + feed nanny parachute destroy second 682 0 + feed nanny money destroy second 682 0 + feed nanny gem destroy second 682 0 + feed nanny liquid destroy second 682 0 + feed nanny rum null null 930 0 + feed nanny medication destroy second 682 0 + feed nanny paper destroy second 682 0 + feed nanny map destroy second 682 0 + feed nanny tome destroy second 682 0 + feed nanny adventurer null null 1094 0 + feed nanny book destroy second 682 0 + feed nanny biscuit destroy second 682 0 + feed nanny none null null 687 0 + feed rodents none unlessin null sqroom 531 + feed rodents nut unlessgot acorn 532 0 + feed rodents nut expdestroy acorn 533 533 + feed rodents none ifhave acorn 557 0 + feed rodents none null null 534 0 + feed bird none unlessprop null 0 406 + feed bird nut destroy second 530 0 + feed bird rum null null 931 0 + feed .provoke birdofprey bunny ifprop second 1 0 + feed birdofprey bunny set second 1 1108 + feed birdofprey vermin destroy second 1104 0 + feed birdofprey bird destroy second 1105 0 + feed .provoke birdofprey none null null 1106 0 + feed enemy limb expdestroy null 343 0 + feed enemy rum null null 932 0 + feed enemy corpse ifprop null 0 634 + feed enemy corpse expdestroy null 633 0 + feed lizard anthracite destroy second 895 0 -15 + feed lizard rum destroy second 933 0 + feed monster none unlessprop null 0 148 + feed monster limb incdestroy leg 146 0 + feed fairy fungus null null 518 0 + feed beast none unlessprop null 0 134 + feed beast pan ifzero null 122 134 + feed beast rum ifzero null 930 134 + feed hound flower null null 885 0 + feed hound antidote unlessgot second 525 0 + feed hound rum null null 930 0 + feed .provoke hound antidote ifprop second 1 453 + feed hound antidote expdestroy null 231 0 703 + feed bunny flower null null 885 0 + feed bunny antidote destroy second 313 0 + feed bunny rum null null 930 0 + feed bunny victuals null null 314 0 + feed bunny biscuit destroy second 1064 0 + feed wretch biscuit null null 1063 0 + feed biscuit wretch null null 1063 0 + feed wretch victuals inc potatoes 167 747 + feed victuals wretch inc potatoes 167 747 + feed .provoke wretch rum null null 934 0 + feed wretch none null null 319 0 + feed frog fungus null null 520 0 + feed something nut null null 528 0 + feed something fungus null null 517 0 + feed something sprig null null 521 0 + feed monster none null null 147 0 + feed beast victuals null null 122 0 + feed beast biscuit null null 122 0 + feed beast pan null null 122 0 + feed beast flower null null 885 0 + feed beast antidote null null 123 0 + feed bird none null null 405 0 + feed fairy none null null 150 0 + feed hound none null null 233 0 + feed familiar bird destroy second 777 0 + feed bunny none null null 320 0 + dig none tview ifprop null 0 599 + dig none tview set null 0 597 + stroke money none dec null 372 373 + stroke bunny none ifprop null 2 1040 + stroke bunny none iflevel null 2 1040 + stroke bunny none exp null 1 1041 + stroke beast none ifprop null 2 763 + stroke beast none toggle null 117 117 699 + stroke nanny none null null 671 0 + stroke pegasus none unlessgot null 401 0 + stroke pegasus none ifhave mistletoe 401 0 + stroke pegasus none trans null jetty 1079 + unfurl parachute none dec null 107 107 + furl parachute none inc null 108 108 + prise tombs none null null 612 0 + prise haunt none ifin null mosolm 612 + prise haunt none dec null 111 112 + prize none haunt null null 113 0 + play stradivarius none unlessgot null 819 0 + play stradivarius none unlessgot bow 820 0 + play stradivarius none ifhere baton 821 0 + play .freeze stradivarius none ifpropinc null 0 821 825 -2 + play .unfreeze stradivarius none dec null 821 0 825 + play none vermin ifgot flute 1074 0 + play recorder none ifin null bstand 1070 + play recorder none transhere rat 1071 1072 1073 + diagnose familiar none ifprop null 0 1099 + diagnose familiar none ifprop null 9 1100 + diagnose familiar none null null 1101 0 + diagnose bunny none ifprop null 1 1102 + diagnose bunny none null null 1103 0 + diagnose .diagnose none tubes null null 0 0 + climb trunk none ifzero null 137 116 + drink rum none ifprop null 0 866 + drink rum none set null 0 868 -8 + drink .sleep none springh2o iflevel null 5 1114 + drink .sleep none springh2o exp null 5 721 + drink none tub ifprop null 0 301 + drink none none ifin null bbath 429 + drink none none ifhere pool 863 0 -1 + eat nut none null null 527 0 + eat chip none null null 1019 0 + eat fungus none destroytrans null dead33 0 + eat sprig utensil destroytrans null dtreas 0 + eat sprig none destroytrans null dead33 0 + eat rodents none ifin null sqroom 536 + eat .provoke birdofprey none null null 1106 0 + eat bird none ifprop null 1 409 + eat bird none destroy null 410 0 + eat pan none null null 377 0 + eat crystal none destroy null 369 0 + eat sprig none destroytrans null dead29 0 + eat limb none destroy null 86 0 + eat corpse none ifprop null 0 634 + eat corpse none destroy null 632 0 + eat beast none null null 180 0 + eat nanny none null null 669 0 + eat bunny none ifprop null 2 326 + eat bunny none ifprop null 0 317 + eat bunny none destroy null 318 0 + eat flower none destroy null 886 0 + eat antidote none destroy null 818 0 + eat cord none ifprop null 1 944 + eat cord none set null 1 945 -27 + eat herring none expdestroy null 1112 0 + eat biscuit none staminadestroy null 40 1065 + smoke links none null null 1086 0 + smoke container none ifobjis pot 761 0 + smoke flower none destroy null 887 0 + smoke antidote none expset null 0 209 + ding clanger none null null 986 0 987 + dong clanger none null null 926 0 927 + kill lantern none unlessprop null 0 4 + kill lantern none set null 1 746 -21 + kill headstone none null null 824 0 + kill clanger none ifprop null 1 988 987 + kill clanger none null null 928 0 927 + kill curse none null null 258 0 + kill access tool ifin null cannrm 89 + kill access tool ifin null downps 89 + kill access tool ifin null gob4 89 + kill access tool ifin null treasc 89 + kill access tool ifin null fowrm 89 + kill access tool ifin null sorcrm 89 + kill access mace ifin null cannrm 89 + kill access mace ifin null downps 89 + kill access mace ifin null gob4 89 + kill access mace ifin null treasc 89 + kill access mace ifin null fowrm 89 + kill access mace ifin null sorcrm 89 + kill access mace destroy null 643 0 + kill access pickaxe null null 735 0 + kill case tool null null 489 0 + kill case mace null null 489 0 + kill oneway tool destroy null 783 0 + kill oneway mace destroy null 783 0 + kill drawbridge none null null 785 0 + kill earth none null null 66 0 + kill .drop tub none ifprop null 1 64 + kill .drop tub none ifinc null level 62 + kill .drop tub none unlessinc null mudrm 61 + kill .drop tub none swap mud 63 64 + kill lookingglass none unlesssnooping null 448 0 + kill .unsnoop lookingglass none set null 1 447 + kill ball cricket null null 642 0 + kill rum none destroy null 865 0 + kill slate none null null 847 0 + kill .kill wood torch ifprop second 1 0 + kill wood torch expdestroy null 72 0 + kill cord tool null null 943 0 + kill cord sword ifpropdestroy null 0 982 + kill cord sword expdestroy null 978 0 + kill cord killer ifpropdestroy null 0 982 + kill cord killer expdestroy null 978 0 + kill person pickaxe hurt null 10 0 -4 + kill person sword hurt null 30 0 -4 + kill person links hurt null 20 0 -4 + kill person killer hurt null 25 0 -4 + kill person prod hurt null 15 0 -4 + kill person cricket hurt null 16 606 -4 + kill person rum hurt null 5 0 -4 + kill person scythe hurt null 5 0 -4 + kill person utensil hurt null 3 0 -4 + kill person mace hurt null 15 0 -4 + kill person magic hurt null 20 0 -4 + kill dwarfs none ifpropdestroy null 1 1025 + kill dwarfs pickaxe hurt null 32 0 + kill enemy limb expdestroy null 343 0 -4 + kill enemy corpse ifprop body 0 634 + kill enemy corpse expdestroy null 633 0 -4 + kill vermin familiar ifprop second 9 583 + kill vermin familiar expdestroy null 582 0 -4 + kill rodents none ifin null sqrm 531 + kill rodents none trans null dead34 0 + kill pegasus none null null 395 0 + kill bird none ifprop null 1 407 + kill bird familiar destroy null 779 0 -4 + kill bird none destroy null 408 0 -4 + get .provoke birdofprey none unlessgot gauntlet 0 0 + kill man none destroy null 340 0 + kill frog none null null 334 0 + kill wretch sword hurt null 60 0 + kill wretch links hurt null 60 0 + kill wretch cricket hurt null 60 607 + kill woman tool hurt null 15 348 + kill woman pickaxe hurt null 10 348 + kill woman sickle hurt null 5 348 + kill woman sword hurt null 30 348 + kill woman links hurt null 20 348 + kill woman killer hurt null 45 348 + kill woman prod hurt null 15 348 + kill woman cricket null null 608 0 + kill woman rum hurt null 10 348 + kill .kill woman none null null 348 0 + kill monster none ifprop null 2 263 + kill monster sword set null 2 526 + kill monster killer set null 2 526 + kill monster tool set null 2 145 + kill monster pickaxe set null 2 736 + kill monster magic set null 2 149 + kill monster none trans null ydead8 0 + kill fairy none null null 151 0 + kill signpost tool dec null 919 920 + kill signpost none null null 921 0 + kill trunk tool ifprop null 0 135 + kill trunk tool decifzero null 105 136 + kill trunk none null null 190 0 + kill beast none ifprop null 2 133 + kill beast none ifprop null 3 133 + kill beast knife set null 3 121 + kill bunny none ifprop null 2 326 + kill bunny none ifprop null 1 316 + kill bunny none inc null 312 0 -4 + kill wood tool expdestroy null 71 0 + kill beast none set null 2 130 + kill corpse none null null 645 0 + kill .reset knob none ifobjcount null uswamp 50 0 + kill guardian sword hurt null 8 990 + kill guardian links hurt null 30 1090 + kill guardian killer hurt null 12 990 + kill hound killer hurt null 45 0 -4 + kill .provoke guardian cricket destroy second 991 0 + kill .provoke guardian rum destroy second 991 0 + kill .provoke guardian pickaxe destroy second 991 0 + kill .provoke guardian scythe destroy second 991 0 + kill .provoke guardian utensil destroy second 991 0 + kill .provoke guardian mace destroy second 991 0 + kill .provoke guardian torch destroy second 991 0 + kill .provoke guardian prod destroy second 991 0 + kill guardian magic transwhere dwarf 992 4 + kill something sword hurt null 40 0 -4 + kill something links hurt null 30 0 -4 + kill something killer hurt null 60 0 -4 + kill something prod hurt null 20 0 -4 + kill something cricket hurt null 22 609 -4 + kill something rum hurt null 10 0 -4 + kill something pickaxe hurt null 15 0 -4 + kill something scythe hurt null 10 0 -4 + kill something utensil hurt null 5 0 -4 + kill something mace hurt null 20 0 -4 + kill something torch hurt null 15 0 -4 + kill something magic hurt null 30 0 -4 + disect corpse none null null 646 0 + flee none lizard zonk null 592 0 + flee none enemy null null 704 0 + flee none dwarfs ifprop null 3 1014 + flee none dwarfs ifprop null 2 1091 + flee none none ifin null sea1 585 + flee none none ifin null sea2 585 + flee none none ifin null sea3 585 + flee none none ifin null sea4 585 + flee none none ifin null sea5 585 + flee none none ifin null sea6 585 + flee none none ifin null sea7 585 + flee none none ifin null sea8 585 + flee none none ifin null sea9 585 + flee none none ifin null sea10 585 + flee none none ifin null sea11 585 + flee none none ifin null sea12 585 + flee none none ifin null sea13 585 + flee none none ifin null sea14 585 + flee none none ifhave egg 587 0 + flee none none ifberserk null 814 0 + flee .flee none none ifhave ornament 662 0 + flee .flee none none unlesshave vase 0 0 + flee .flee none none destroy vase 661 0 + retaliate pickaxe none retal null 5 0 + retaliate sword none retal null 15 0 + retaliate links none retal null 10 0 + retaliate killer none retal null 12 0 + retaliate prod none retal null 8 0 + retaliate cricket none retal null 8 0 + retaliate rum none retal null 3 0 + retaliate scythe none retal null 3 0 + retaliate utensil none retal null 1 0 + retaliate mace none retal null 8 0 + retaliate magic none retal null 10 0 + sail none boat unlessgot null 789 0 + sail .go none none null null 0 0 + launch none boat null null 790 0 + unbeach none boat null null 790 0 + move sliding none unlessin null spanel 294 + move sliding none swap magbar 295 0 + move slate none null null 538 0 + move iron none toggle null 358 357 + move case none ifin null ssteps 838 + move case none toggle null 356 355 + tell time none ifprop null 1 383 + tell time none unlessprop rain 0 385 + tell .time time none expinc null 384 0 + tell anything none ifobjis sundial 965 0 + get .remove anything dwarfs ifobjis uranium 0 0 -51 + get .remove anything oven ifobjis uranium 0 0 -51 + get .remove anything dwarfs null null 0 0 + get .remove anything oven null null 0 0 + get anything lantern ifprop second 2 913 + get anything lantern ifzero second 910 912 + get block none null null 563 0 + get knife none null null 1075 0 + get cord none ifprop null 1 936 + get cord none set null 1 935 -27 + get signpost none ifprop null 1 924 + get nanny none ifprop null 1 657 + get monster none ifprop null 2 680 + get monster none null null 567 0 + get .provoke vermin none null null 580 0 + get rodents none ifin null sqroom 537 + get rodents none null null 531 0 + get nut none ifin null sqroom 535 + get .get metal none null null 0 0 -51 + get .get ram none unlesshere fleece 0 0 + get ram none dead null 1045 0 + get cannon none null null 848 0 + get none vermin null null 579 0 + get antidote none ifhere wolf 522 0 + get .get sword none set null 0 0 + get .get killer none ifprop null 0 0 + get killer none unlesslevel null 5 1049 + get .get killer none set null 0 1021 + get creeper none null null 437 0 + get .get rivet none ifprop null 0 0 + get .get rivet pickaxe dec null 706 0 + get rivet utensil destroy second 707 0 + get .get rivet sword dec null 706 0 + get .get rivet killer dec null 706 0 + get .get rivet prod dec null 706 0 + get .get rivet scythe dec null 706 0 + get rivet tool unlesslevel null 3 845 + get .get rivet tool dec null 706 0 + get rivet torch null null 708 0 + get rivet magic null null 709 0 + get rivet none null null 710 0 + get .get ore none ifprop null 0 0 + get .get ore pickaxe dec null 717 0 + get .get ore sword dec null 718 0 + get .get ore killer dec null 718 0 + get .get ore prod dec null 718 0 + get ore tool unlesslevel null 3 845 + get .get ore tool dec null 718 0 + get ore none null null 719 0 + get none none ifin null doomrm 727 + get .get fruit none inc null 0 0 + get .get tome none inc null 0 0 + get beast none ifgot horse 401 0 + get pegasus none ifgot ox 394 0 + get beast none ifgot goat 664 0 + get nanny none ifgot ox 665 0 + get pegasus none ifgot goat 666 0 + get nanny none ifgot horse 667 0 + get .get familiar none unlesshave gull 0 0 + get .get familiar none ifprop gull 1 0 + get familiar none null null 434 0 + get .get bird none ifprop null 1 0 + get bird none ifhave cat 435 0 + get .get stradivarius none ifhave cat 984 0 + get .get pegasus none null null 397 0 705 + get liquid none null null 366 0 + get pan none null null 374 0 + get book none null null 322 0 + get man none null null 333 0 + get frog none null null 334 0 + get .get ball none unlessprop sphere 0 0 + get .get ball none incdestroy ballview 0 0 + get goblin none null null 289 0 + get enemy none unlesswiz null 327 0 + get none enemy unlesswiz null 586 0 + get .get head space swap tdoor 193 0 + get head none ifprop null 1 194 + get .get necklace none incdestroy pendview 0 0 + get .get beast none ifzero null 144 0 + get .get veil none set null 2 0 + get treasure none ifin null leprm 225 + get treasure none ifin null gob1 438 + get treasure none ifin null gob2 438 + get treasure none ifin null gob3 438 + get treasure none ifin null gob4 438 + get treasure none ifin null gob5 438 + get treasure none ifhere pancake 594 0 + get brass none ifprop null 2 515 + get brass none ifprop null 0 226 + get bedclothes none null null 170 0 + get crock none ifprop leprechaun 0 152 + get .get fairy none set null 1 153 + get idol none ifprop null 0 197 + get rug none ifprop null 0 210 + get earth none null null 69 0 + get .get bangle none togglesex null 331 332 + get .get greengem none inc null 0 0 + get treasure none ifin null treasc 507 + get none none ifin null swamp2 1039 -49 + get none none ifin null swamp3 1039 -49 + get none none ifin null swamp4 1039 -49 + get none none ifin null swamp5 1039 -49 + get none none ifin null swamp6 1039 -49 + get none none ifin null swamp8 1039 -49 + get none none ifin null swamp9 1039 -49 + get none none ifin null swampa 1039 -49 + get none none ifin null swampb 1039 -49 + get none none ifin null swampc 1039 -49 + get none none ifin null swampd 1039 -49 + drop .insert curse dwarfs null null 0 0 + drop .drop curse person null null 0 0 + drop curse lizard null null 649 0 + drop none none ifin null fallin 893 + drop none none ifin null slidin 893 + drop .drop curse none ifwiz null 0 0 + drop curse none unlessin null firept 256 + drop .drop curse none expdestroy null 257 0 + drop none none ifhave egg 262 0 + drop .insert something dwarfs null null 0 0 + drop .drop cup enclave trans null dtest3 551 + drop treasure enclave null null 555 0 + drop sprig enclave null null 4 0 + drop enclave enclave null null 651 0 + drop something enclave destroy null 547 0 + drop anything container ifprop null 1 816 + drop sheepskin container null null 766 0 + drop lookingglass container ifsnooping null 767 0 + drop treasure none ifin null firept 487 ;this and things like it don't cover the oracle + drop corpse coffin ifprop null 0 634 + drop corpse coffin null null 631 0 + drop something coffin null null 630 0 + drop anthracite flame destroy null 584 0 + drop .drop veil none unlessin null temple 0 + drop .drop veil none set null 2 856 + drop something oven ifprop second 1 1004 + drop .insert keg oven null null 1012 0 -46 + drop .insert chip oven null null 1019 0 + drop .insert something oven null null 1005 0 + drop boat none ifin null sea1 248 + drop boat none ifin null sea2 248 + drop boat none ifin null sea3 248 + drop boat none ifin null sea4 248 + drop boat none ifin null sea5 248 + drop boat none ifin null sea6 248 + drop boat none ifin null sea7 248 + drop boat none ifin null sea8 248 + drop boat none ifin null sea9 248 + drop boat none ifin null sea10 248 + drop boat none ifin null sea11 248 + drop boat none ifin null sea12 248 + drop boat none ifin null sea13 248 + drop boat none ifin null sea14 248 + drop something person ifobjis longsword 1089 0 + drop .drop something person sendemon second 51 0 + drop .drop something person null null 0 0 + drop .drop sword none destroy null 524 0 + drop .drop pegasus none ifin null whroom 0 + drop .drop pegasus none ifin null swamp1 953 + drop pegasus none move null whroom 396 + drop .drop pottery none ifin null swamp1 0 + drop .drop pottery none ifin null swamp2 0 + drop .drop pottery none ifin null swamp3 0 + drop .drop pottery none ifin null swamp4 0 + drop .drop pottery none ifin null swamp5 0 + drop .drop pottery none ifin null swamp6 0 + drop .drop pottery none ifin null swamp8 0 + drop .drop pottery none ifin null swamp9 0 + drop .drop pottery none ifin null swampa 0 + drop .drop pottery none ifin null swampb 0 + drop .drop pottery none ifin null swampc 0 + drop .drop pottery none ifin null swampd 0 + drop pottery none destroy null 442 0 + drop .drop china none ifin null swamp1 0 + drop .drop china none ifin null swamp2 0 + drop .drop china none ifin null swamp3 0 + drop .drop china none ifin null swamp4 0 + drop .drop china none ifin null swamp5 0 + drop .drop china none ifin null swamp6 0 + drop .drop china none ifin null swamp8 0 + drop .drop china none ifin null swamp9 0 + drop .drop china none ifin null swampa 0 + drop .drop china none ifin null swampb 0 + drop .drop china none ifin null swampc 0 + drop .drop china none ifin null swampd 0 + drop china none destroy null 655 0 + drop .drop flower headstone ifprop second 7 1076 + drop .drop flower headstone null null 902 0 + drop .drop flower h2o null null 903 0 + drop .drop flower torrent null null 903 0 + drop flower rum destroy null 904 0 + drop flower liquid destroy null 904 0 + drop flower medication destroy null 904 0 + drop flower lake destroy null 904 0 + drop flower man null null 900 0 + drop flower woman null null 901 0 + drop wretch victuals inc potatoes 167 747 + drop victuals wretch inc potatoes 167 747 + drop wretch something null null 119 0 + drop something wretch null null 119 0 + drop .drop flower china destroy second 905 0 + drop .drop bird none ifprop null 1 0 + drop bird none ifin null nest 413 + drop bird none ifin null firept 414 + drop bird none ifin null swamp1 415 + drop bird none ifin null swamp2 415 + drop bird none ifin null swamp3 415 + drop bird none ifin null swamp4 415 + drop bird none ifin null swamp5 415 + drop bird none ifin null swamp6 415 + drop bird none ifin null swamp8 415 + drop bird none ifin null swamp9 415 + drop bird none ifin null swampa 415 + drop bird none ifin null swampb 415 + drop bird none ifin null swampc 415 + drop bird none ifin null swampd 415 + drop .drop birdofprey none ifin null nest 1107 -71 + drop .provoke birdofprey none ifin null firept 0 + drop .drop onyx none ifin null maze1 417 + drop .drop onyx none ifin null maze2 418 + drop .drop onyx none ifin null maze3 419 + drop .drop onyx none ifin null maze4 420 + drop .drop onyx none ifin null maze5 421 + drop .drop onyx none ifin null maze6 422 + drop .drop onyx none ifin null maze7 423 + drop .drop onyx none ifin null maze8 424 + drop .drop onyx none ifin null maze9 425 + drop .drop onyx none ifin null maze10 426 + drop .drop onyx none ifin null swamp1 807 ;other swamps too if you like + drop .drop onyx none null null 416 0 + drop .drop bangle none togglesex null 331 332 + drop .drop ball none inc null 281 282 + drop .drop money spray null null 1097 0 + drop .drop something spray null null 1098 0 + drop torch lavatory incmove null bwfall 827 + drop something lavatory move null bwfall 827 + drop torch stream incmove null bwfall 835 + drop something stream move null bwfall 835 + drop something height delaymove null beach 12 -10 + drop .drop pickaxe gateway dec second 715 0 716 + drop bird sink null null 427 0 + drop bird none ifin null bbath 427 + drop .drop ice none ifin null pond1 1078 + drop .drop ice lake destroydec pool 138 4 + drop .drop ice h2o null null 1078 0 + drop keg flame destroytrans null dead19 0 + drop .drop bunny warren ifprop null 1 315 + drop .drop bunny warren ifprop null 2 568 + drop bunny warren expmove null lgrm 311 + drop .drop bunny none unlessin null swamp1 0 + drop bunny none destroy null 345 0 + drop .drop tub none ifprop null 1 64 + drop .drop tub none ifinc null level 62 + drop .drop tub none unlessinc null mudrm 61 + drop .drop tub none swap mud 63 64 + drop lookingglass none ifsnooping null 449 0 + drop none none ifin null vert 73 + drop .drop none none ifin null firept 240 + drop .drop nut none unlessin null sqroom 0 + drop .drop nut none exp null 350 533 + drop treasure none ifgot horse 954 0 + drop .drop none onledge unlessgot emerald 0 0 + drop something duct destroy null 726 0 + drop .drop clanger none null null 929 0 + drop none onledge move emerald bldg 723 ;NB move expects an objct, ie it ignores the fn. parameter + drop .drop none none unlessin null laddrm 0 + drop none none move null uhut 207 + turn wheel none ifpropdec flood 1 731 + turn wheel none ifdisenable null 5 731 + turn wheel none null null 729 0 730 -5 + re none none unlessin null mosolm 4 + re none none ifprop tomb1 0 625 + re none none set tomb1 0 617 + dundee none none unlessin null mosolm 4 + dundee none none ifprop tomb2 0 626 + dundee none none set tomb2 0 618 + 432 none none unlessin null mosolm 4 + 432 none none ifprop tomb3 0 627 + 432 none none set tomb3 0 619 + cqywri none none unlessin null mosolm 4 + cqywri none none ifprop tomb4 0 628 + cqywri none none set tomb4 0 620 + eb none none unlessin null mosolm 4 + eb none none ifprop tomb5 0 635 + eb none none set tomb5 0 636 + 1152921504606846976 none none unlessin null mosolm 4 + 1152921504606846976 none none ifprop tomb6 0 652 + 1152921504606846976 none none set tomb6 0 653 + curses none none null null 776 0 + summon .flush none none unlessgot horn 691 0 -50 + summon none none unlesslevel null 4 692 + summon none none ifprop horn 1 694 + summon .summon none none inc horn 693 0 698 + blow trumpet none ifin null bstand 794 ;could combine BLOW and PLAY? + blow trumpet none unlessin null revrm 695 + blow trumpet none dec crack 757 758 759 + blow shell none ifin null bstand 794 + blow shell none unlessin null revrm 74 + blow shell none dec crack 75 76 697 + blow none vermin ifgot flute 1074 0 + blow recorder none ifin null bstand 1070 + blow recorder none transhere rat 1071 1072 1073 + snoop none none unlessgot mirror 445 0 + snoop none none ifprop mirror 1 4 + snoop none none unlesslevel null 8 452 + snoop .snoop none none null null 446 0 + l lookingglass none ifinvis null 1 1085 + l lookingglass none null null 450 0 + l bedclothes none create potty 878 663 + l none none ifenabled null 8 1077 + l none none ifin null dtest1 549 + l none none ifin null dtest2 550 + l none none ifin null doomrm 732 + l .look none parachute ifprop null 0 0 + l .look none height null null 378 0 + make .flush none none unlessgot amulet 454 0 + make .flush none none unlesslevel null 7 455 + make .make none none destroy amulet 456 0 + where none none unlessgot oracle 457 0 + where none none ifprop oracle 0 458 + where none none unlesslevel null 6 459 + where .where none none dec oracle 0 0 + blast access cannon ifprop gun 2 277 + blast access cannon ifprop gun 1 278 + blast access cannon destroyset gun 2 279 700 + blast cannon none ifprop null 2 277 + blast cannon none ifprop null 1 278 + blast cannon access setdestroy second 2 279 700 + blast cannon none set null 2 303 700 + blast access keg ifprop powder 1 250 + blast access keg destroydestroy powder 251 0 701 + blast something keg ifzero powder 252 253 + blast none none unlessgot wand 229 0 + blast none none unlesslevel null 6 243 + blast none none ifgot longsword 1032 0 + blast none stone destroy wand 228 0 + blast person none hurt null 20 0 + blast monster none ifprop null 2 263 + blast monster none set null 2 149 -61 + blast wall none null null 439 0 + blast guardian none transwhere dwarf 992 4 + blast .sleep haunt none destroy wand 624 0 + blast .sleep tombs none destroy wand 624 0 + blast marble none dead null 1046 0 + blast fairy none incdestroy null 154 4 -61 + blast hound none destroy wand 232 0 + blast wood none expdestroy null 77 0 -61 + blast arachnid none expdestroy null 946 0 -61 + blast cord none destroy null 947 0 -61 + blast wretch none expdestroy null 78 0 -61 + blast dwarfs none unlessprop null 0 1015 + blast dwarfs none expdestroy null 786 0 -61 + blast trunk none ifprop null 0 1082 + blast trunk none set null 0 87 -61 + blast signpost none expdestroy null 922 0 -61 + blast beast none destroy null 237 0 -61 + blast nanny none destroy null 672 0 -61 + blast goblin none expdestroy null 293 0 -61 + blast enemy none expdestroy null 323 0 -61 + blast fish none expdestroy null 817 0 -61 + blast birdofprey none expdestroy null 1109 0 -61 + blast lizard none zonk null 787 0 + blast familiar none expdestroy null 966 0 -61 + blast serpent none expdestroy null 972 0 -61 + blast sliding none destroydestroy magbar 300 0 -61 + blast access none ifin null sorcrm 967 + blast access none ifin null downps 967 + blast access none ifin null cannrm 4 + blast access none destroy null 127 0 -61 + blast oneway none destroy null 784 0 + blast drawbridge none destroytrans null 238 -61 + blast iron none destroytrans null 239 -61 + blast none none unlessin null cannrm 4 + blast none none trans null 284 + roll rug none inc null 216 217 + unroll rug none dec null 218 219 + open oven none dec null 1006 1007 + open trapdoor none null null 1033 0 + open access none ifin null cannrm 283 + open access none ifin null downps 349 + open access none ifin null gob4 287 + open case none null null 350 0 + open parachute none dec null 107 107 + open container none ifobjis pot 808 0 + open charm none unlesshave broadsword 541 0 + open charm none unlesshave sickle 542 0 + open charm none unlesshave chalice 543 0 + open charm none unlesshave mistletoe 544 0 + open charm none null null 545 0 + open haunt none ifin null mosolm 611 + open haunt triumph null null 1002 0 + open haunt none null null 79 0 + open infection none dead null 1047 0 + open none goblin null null 292 0 + open none enemy null null 324 0 + open veil none ifprop null 2 224 + open veil none dec null 850 852 + open sliding none ifprop null 0 296 + open sliding none unlessin null spanel 294 + open sliding none swap magbar 298 298 + open slate none ifzero null 553 538 + open iron 2 dec null 80 81 + open iron none null null 84 0 + open case 2 dec null 351 352 + open none oneway ifprop cupboard 0 165 + open none ladder null null 162 0 + open drawbridge 2 dec null 202 203 + open drawbridge none null null 204 0 + open none oneway swap sdoor 161 4 + open access bone ifprop null 2 656 + open tombs none null null 611 0 + open coffin none ifprop null 3 614 + open coffin none ifpropinc null 2 629 + open coffin none setfloat body 3 613 + open rug none dec null 218 219 + open wheel none ifprop flood 1 951 + open wheel none ifenabled null 5 951 + open wheel none null null 729 0 730 -5 + open gateway pickaxe dec null 1017 1018 + open gateway none ifzero null 1018 1024 + close oven none inc null 1008 1009 + close trapdoor none null null 1033 0 + close gateway none inc null 998 999 + close access none ifin null cannrm 283 + close container none ifobjis pot 808 0 + close veil none ifprop null 2 224 + close veil none ifprop null 1 853 + close veil none set null 1 851 -7 + close sliding none ifprop null 1 297 + close sliding none unlessin null spanel 294 + close sliding none swap magbar 299 299 + close slate none ifzero null 538 554 + close iron 2 inc null 82 83 + close iron none null null 84 0 + close case 2 inc null 353 354 + close case none null null 350 0 + close drawbridge none inc null 205 206 + close none oneway ifprop cupboard 1 166 + close none oneway swap sdoor 163 4 + close access none ifprop null 2 187 + close tombs none null null 611 0 + close coffin none ifprop null 0 616 + close coffin none ifprop null 2 616 + close coffin none set null 2 615 + close parachute none ifin null fallin 894 + close parachute none inc null 108 108 + close haunt none ifin null mosolm 611 + close haunt none inc null 598 4 + close wheel none ifpropdec flood 1 731 + close wheel none ifdisenable null 5 731 + close wheel none null null 952 0 + write none none unlessgot quill 244 0 + write none none ifgot scroll 309 0 + write none none ifgot libram 461 0 + write book none writein null 246 0 -48 + sick none none ifdisenable null 8 871 + fix none none ifhave egg 832 0 + fix signpost none null null 925 0 + fix torch lavatory incmove null bwfall 827 + fix something lavatory move null bwfall 827 + fix torch stream incmove null bwfall 835 + fix something stream move null bwfall 835 + fix .drop cup enclave trans null dtest3 551 + fix treasure enclave null null 555 0 + fix sprig enclave null null 4 0 + fix enclave enclave null null 651 0 + fix something enclave destroy null 547 0 + fix torch time ifprop sundial 0 386 + fix torch time ifprop null 0 387 + fix torch time destroydec sundial 388 0 + fix magic time null null 380 0 + fix pointer time null null 806 0 + fix flower time null null 906 0 + fix treasure time null null 440 0 + fix bird sink null null 427 0 + fix keg cannon ifprop null 1 274 + fix keg cannon destroydec gun 275 0 + fix ball cannon ifprop gun 2 280 + fix ball cannon destroydec gun 276 0 + fix head space unlessin null hut 329 + fix head space ifprop null 1 192 + fix ram space ifin null hut 570 + fix triumph space null null 1003 0 + fix .drop head space swap tdoor 191 0 + fix .insert veil container null null 0 0 + fix veil none unlessin null temple 854 + fix veil none unlessprop null 2 855 + fix .drop veil none set null 0 856 + fix something oven ifprop second 1 1004 + fix .insert keg oven null null 1012 0 -46 + fix .insert chip oven null null 1019 0 + fix .insert something oven null null 1005 0 + fix fuse keg destroydec powder 254 0 + fix fuse lantern ifprop second 0 910 + fix fuse lantern destroyset lamp 1 911 -22 + fix brass bone ifprop null 2 516 + fix bone brass ifprop second 2 516 + fix brass bone incdestroy fossil 227 0 + fix bone brass destroyinc ring 227 0 + fix .drop bunny warren ifprop null 1 315 + fix bunny warren expmove null lgrm 311 + fix anything container ifprop null 1 816 + fix sheepskin container null null 766 0 + fix lookingglass container ifsnooping null 767 0 + fix .drop flower headstone ifprop second 7 1076 + fix .drop flower headstone null null 902 0 + fix .drop flower h2o null null 903 0 + fix .drop flower torrent null null 903 0 + fix flower lake destroy null 904 0 + fix flower liquid destroy null 904 0 + fix flower rum destroy null 904 0 + fix flower medication destroy null 904 0 + fix flower china destroy second 905 0 + fix .drop money spray null null 1097 0 + fix .drop something spray null null 1098 0 + fix killer rock ifprop null 1 1029 + fix .drop killer rock set null 1 1030 + fix .provoke birdofprey container null null 1106 0 + fix bird container unlessprop null 1 768 + fix fairy container null null 769 0 + fix pottery container null null 770 0 + fix china container null null 770 0 + fix boat container null null 772 0 + fix nut container null null 773 0 + fix sprig container null null 774 0 + fix parachute container ifprop null 0 815 + fix container bedclothes unlessobjis potty 948 0 + fix container bedclothes destroy null 950 0 + meditate .sleep none none ifin null chambr 993 -44 + meditate .sleep none none ifin null hchamb 993 -45 + meditate none mpoint trans null 997 + meditate none none unlessin null shrine 994 + meditate none none unlessdisenable null 44 995 + meditate none none unlessdisenable null 45 995 + meditate none none trans null osanct 996 + go .go none none iflevel null 10 0 ;let berserk wizards, too + go none dwarfs ifprop null 3 1014 + go none dwarfs ifprop null 2 1091 + go none enemy null null 676 0 + back .back none none iflevel null 10 0 ;let berserk wizards, too + back none dwarfs ifprop null 3 1014 + back none dwarfs ifprop null 2 1091 + back none enemy null null 676 0 + move .go none none iflevel null 10 0 + move none dwarfs ifprop null 3 1014 + move none enemy null null 676 0 + sleep none none ifin null slidin 1096 + sleep none none ifin null fallin 1096 + value antidote none null null 1051 1051 + value ivory none null null 1051 1051 +@txtbtm + shake wave + rap tap + knock tap + poke tap + witches wizards + zap blast + shoot blast + tie tether + untie untether + free untether + loose untether + sound toll + yank pull + tug pull + sniff smell + snort smell + hone sharpen + whittle sharpen + pray worship + mount ride + sound blow + hoot blow + fart blow + honk blow + clean bath + wash bath + hint hints +;;vocabulary demon actions +action $play .unfreeze none none destroy violin 839 0 + $smash .vis none none unlessin null rost 0 + $smash .vis none none dec slab 539 0 + $flood none none incsend flood dead41 0 + $trans none none ifin null cavein 0 + $trans none none trans null cavein 858 + $drunk none none ifasleep null 1 0 -8 + $drunk .sleep none none ifr null 40 870 -8 + $drunk none none ifr null 66 877 -9 + $drunk .sleep none none ifr null 50 870 + $drunk none none sendmess null 883 884 -11 + $drunk1 .back none none null null 0 0 -8 + $drunk2 none none ifr null 10 0 -8 + $drunk2 none none sendmess null 883 884 -11 + $message none none null null 880 0 + $plonk none none null null 881 0 881 + $fall none none trans null fallin 890 -14 + $land none none unlessin null fallin 0 + $land none none trans null beach 891 + $dragon none none ifdead dragon 0 0 + $dragon none none expdestroy dragon 896 896 896 + $exp none none exp null 1 0 + $check none none enable null 18 0 + $out none none ifgot lamp 909 0 -20 + $out none none set lamp 2 0 + $out1 none none set lamp 2 0 + $suspend none none suspend null 18 0 + $clear none none ifdisenable null 18 0 + $bump none none ifin null slidin 916 -25 + $emerge none none unlessin null slidin 0 + $emerge none none trans null uland3 915 + $move none none set sptrap 0 0 + $spider .provoke something none ifdestroyed web 0 0 + $spider none none dead null 1048 0 + $devour none vermin destroy null 977 0 + $fdevour none vermin destroy null 1104 0 + $fdevour none bird unlessprop null 0 0 + $fdevour none bird destroy null 1105 0 + $fdevour none bunny ifprop null 1 0 + $fdevour none bunny set null 1 1108 + $burn none none ifprop stove 0 0 + $burn none none destroy stove 1013 0 1013 + $zzz none none ifin null slidin 1031 + $zzz none none ifin null fallin 1031 + $zzz .sleep none none null null 171 0 + $written none none expdestroy quill 0 0 + $uranium none none unlessgot uranium 0 0 + $uranium none none ifasleep null 1 0 -51 + $uranium none none losestamina null 2 1066 -51 + $ratty none none ifasleep null 1 0 + $ratty none none ifwiz null 0 0 + $ratty none none ifgot cat 0 0 + $ratty none none ifgot flute 0 0 + $ratty .provoke something none ifrstas null 0 0 -4 + $blast none none ifprop wandvolume 1 0 702 + $arch1 none none ifinvis null 1 0 + $arch1 none none ifenabled null 63 0 + $arch1 .invis none none null null 0 0 -63 + $arch2 none none ifinvis null 0 0 + $arch2 .vis none none null null 0 0 + $arch3 none none trans null woe2 0 -62 + $arch4 none none trans null woe1 0 -62 + $dprovoke .vis none none ifinvis null 1 0 + $dprovoke none none ifasleep null 1 0 + $dprovoke .provoke something none null null 0 0 -4 + $fprovoke none none ifinvis null 1 0 + $fprovoke none none ifwiz null 0 0 + $fprovoke none none ifgot gauntlet 0 0 + $fprovoke .provoke something none null null 0 0 -4 + $reseagle none none resetdest eagle 200 0 +@txtdac +*demons 71 +@txtdmn +2 $play stradivarius none 60 always +5 $flood none none 15 global +7 $trans none none 15 +8 $drunk none none 30-60 +9 $drunk1 none none -1 +10 $message none none -1 +11 $drunk2 none none 2 +12 $plonk none none 8 +13 $fall none none -1 +14 $land none none 8 +;don't make $dragon either global or always - i want a full 20 minutes, and +;points to be accredited. +15 $dragon none none 1200-1800 +17 $exp none none -1 +18 $out none none 1800 global +19 $check none none -1 +20 $out1 none none -1 +21 $suspend none none -1 +22 $clear none none -1 +24 $bump none none 10 +25 $emerge none none 10-20 +26 $spider whichever none -1 +27 $move none none 10 global +43 $devour none none -1 global +;so just about possible to meditate in 2 places at once +44 $null none none 15 global +45 $null none none 15 global +46 $burn none none 900 global +47 $zzz none none -1 +48 $written none none -1 +51 $uranium none none 10-20 +60 $ratty whichever none -1 +61 $blast none none -1 +62 $arch1 none none -1 +63 $arch2 none none 30-450 +64 $arch3 none none -1 +65 $arch4 none none -1 +66 $dprovoke whichever none -1 +67 $fdevour none none -1 global +;no. 68 is spare +69 $fprovoke whichever none -1 +;no. 70 is spare +71 $reseagle none none -1 global +*objects +chain hotpas 0 0 0 +0 The links of a valuable gold chain glister in front of you. +pin store 0 0 0 +0 A shiny new pin lies at your feet! +almanac store 0 0 1 +0 ? +bouquet store 0 0 0 +0 A beautiful bouquet of fragrant flowers has been placed at your feet. +sphere nbank 0 2 1 +0 A platinum-plated sphere rests on the bank. +1 A platinum-plated sphere is here. +2 An iron ball is here. +web ruin ruin 0 1 1 +0 There is a thick, silver-looking cord here, coated in a strange, + clear substance. +1 You are trapped in an enormous spider's web! +spider 20 0 26 splair 0 0 0 110 noget +0 An enormous spider stands before you! +baton bstand 0 0 1 +0 A conductor's baton lies on the floor. +bow 0 0 1 +0 A violin bow has been put here. +violin attic 0 1 0 +0 A priceless violin is at your feet. +bolt rail2 1 1 0 +0 There is a golden bolt here. +1 A golden bolt has been hammered into one of the railway sleepers. +disc cavein 0 0 0 +0 A golden disc is here, bearing the design of a red eye. +coal bunker 0 0 0 +0 A polished piece of carved anthracite has been left here. +wandvolume store 0 1 2 noget noit +0 The wand is on low volume. +1 The wand is on high volume. +toilet bathrm 0 0 1 noget noit +toilet dwbog 0 0 1 noget noit +river river1 0 0 1 noget noit +river river2 0 0 1 noget noit +river river3 0 0 1 noget noit +river rapids 0 0 1 noget noit +river nbank 0 0 1 noget noit +cliff wfall 0 0 1 noget noit +cliff clifff 0 0 1 noget noit +cliff track1 0 0 1 noget noit +cliff clffst 0 0 1 noget noit +cliff nfrst4 0 0 1 noget noit +cliff sfrst1 0 0 1 noget noit +basin bathrm 0 0 1 noit noget +;what follows means that there's fresh water there... +water river1 0 0 1 noget noit +water river2 0 0 1 noget noit +water river3 0 0 1 noget noit +water rapids 0 0 1 noget noit +water nbank 0 0 1 noget noit +water bbath 0 0 1 noget noit +water bathrm galley bwfall fowrm 0 0 1 noget noit +water wfall 0 0 1 noget noit +water beach2 0 0 1 noget noit +water pond1 0 0 1 noget noit +water spring 0 0 1 noget noit +water main2 0 0 1 noget noit +water kitche 0 0 1 noget noit +water jetty 0 0 1 noget noit +trees forist 0 0 1 noget noit +trees ifrst5 0 0 1 noget noit +trees clffst nfrst4 sfrst1 0 0 1 noget noit +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 +trees sqrm 0 0 1 noget noit +trees sqroom 0 0 1 noget noit +trees ufrst1 0 0 1 noget noit +trees ufrst2 0 0 1 noget noit +trees ufrst3 0 0 1 noget noit +trees ufrst5 0 0 1 noget noit +arch woe1 0 0 1 noget noit +arch woe2 0 0 1 noget noit +medpoint isanct osanct 0 0 1 noget noit +squirrels sqrm sqroom 0 0 0 noit +slab rost 1 1 2 noget +0 The slate slab has been swung open, revealing a chamber below. +1 The slate slab obviously conceals something below, but is too heavy + for you to slide over. It is obviously meant to be used for sacrificing + human beings... +filling 0 0 0 +0 A golden filling from some unfortunate glints here. +sarcophagus wtomb wtomb 0 3 4 +0 The sarcophagus is closed. +1 The sarcophagus is open. +2 The sarcophagus is closed. +3 The sarcophagus is open. +body wtomb wtomb 0 1 1 +1 There is a severely dead body slumped here. +vase 0 0 0 +0 A delicate china vase, with fine jade detail, rests here. +jewels 0 0 0 +0 Some fabulous jewels here make you catch your breath in awe! +sceptre 0 0 0 +0 A magnificent sceptre lies resplendent here! +horn 0 1 0 +0 A mighty hunting horn lies here! +1 A hunting horn lies here. +inscription mosolm mosolm 0 0 1 noit +tomb1 mosolm mosolm 1 1 2 noit +0 The north tomb is open. +1 Written on the north tomb is "lundio edra el ?". +tomb2 mosolm mosolm 1 1 2 noit +0 The west tomb is open. +1 Written on the west tomb is "315121859=sutton, 33183150=blackpool, + 3361795=leeds, 357383407=?". +tomb3 mosolm mosolm 1 1 2 noit +0 The south tomb is open. +1 Written on the south tomb is "18 108 945 162 243 405 513 972 135 351 ?". +tomb4 mosolm mosolm 1 1 2 noit +0 The east tomb is open. +1 On the east tomb is written "tqxxmkhac qi zlnio vtut ny zom sqkbldl wo + jxnqfhdhj vzonhtt (one word is repeated)". +tomb5 mosolm mosolm 1 1 2 noit +0 The southeast tomb is open. +1 On the southeast tomb is "ls b sp cl h tcr oc bs ma lg q nhg hp sb wc + ea na wa ?". +tomb6 mosolm mosolm 1 1 2 noit +0 The southwest tomb is open. +1 On the southwest tomb is "2 to the power of 60". +locket brost 0 0 0 +0 A charming locket catches the light, near your boots. +niche dtest2 dtest2 0 0 1 noget +fork dtest3 0 0 0 +0 Placed here is a golden fork of very early design. +starstone dtreas 0 0 0 +0 A loose starstone has fallen here. +topaz dtreas 0 0 0 +0 At your feet is a large topaz. +bloodstone dtreas 0 0 0 +0 To one side, a deep-red bloodstone catches your eye. +amethyst dtreas 0 0 0 +0 Glinting in the light, nearby, is a polished amethyst. +fleece dtreas 0 0 0 +0 Left in a corner is a scented fleece. +clasp dtreas 0 0 0 +0 A silver clasp has been dropped on the ground nearby you. +headband dtreas 0 0 0 +0 A fabulous druidic headband, an inch across and solid gold, makes you + gasp when you espy it! +skull dtreas 0 1 1 +0 The skull of a ram is on the floor. +1 A valuable ram's skull is on the floor here. +acorn ifrst3 0 0 1 +0 On the ground here lies an acorn. +sickle 0 0 0 +0 A golden sickle lies untarnished at your feet. +chalice ifrst6 0 0 0 +0 A chalice of extraordinary beauty has been dropped here. +bell slope3 0 0 0 +0 A magnificent bell lies by your feet. +broadsword 1 -1 0 bright nosummon +0 A marvellous broadsword lies shining in front of you! +1 A fearsome broadsword lies in front of you, a marvel to behold! +longsword sea14 1 1 2 bright nosummon +0 A murderous, blood-stained longsword lies here. +1 Thrust deep into a rock is a murderous longsword! +granite sea14 0 0 1 noit noget +sabre store 0 0 1 +0 A bloodstained, menacing sabre lies at your feet! +rapier store 0 0 1 +0 A lengthy, vicious rapier has been dropped here! +epee store 0 0 1 +0 A dangerous, mean-looking epee has been placed on the ground here! +cutlass store 0 0 1 +0 Lying to one side is a mighty cutlass! +foil store 0 0 1 +0 You espy a springy, well-balanced, yet sturdy foil nearby! +scimitar store 0 0 1 +0 A deadly-sharp scimitar catches the light at your feet! +bat attic 0 0 0 +0 A fine willow cricket bat is propped up here. +toadstool fring 0 0 1 +0 A lone red and white toadstool grows here. +die guadrm 0 -5 6 +0 A die, made of solid ivory, has been rolled here. +1 A die, made of solid ivory, has been rolled here. +2 A die, made of solid ivory, has been rolled here. +3 A die, made of solid ivory, has been rolled here. +4 A die, made of solid ivory, has been rolled here. +5 A die, made of solid ivory, has been rolled here. +mistletoe lsp1 0 0 1 +0 A sprig of mistletoe lies here. +stethoscope sorcrm 0 0 0 +0 On the ground lies a stethoscope. +mirror sorcrm 0 1 1 +0 There is a lookingglass here. On the back is written the following: + "If you have sufficient magical power, you may WATCH people. Break the + mirror to stop." +1 There is a solid silver lookingglass here. +amulet sorcrm 0 0 0 +0 An ancient amulet is here. Upon its reverse is inscribed: "with me, + strong warlocks may FORCE people to do things." +oracle sorcrm 7 7 0 +7 An oracle here speaks: "You may ask me WHERE things are, seven times". +6 An oracle here speaks: "You may ask me WHERE things are, six times". +5 An oracle here speaks: "You may ask me WHERE things are, five times". +4 An oracle here speaks: "You may ask me WHERE things are, four times". +3 An oracle here speaks: "You may ask me WHERE things are, thrice". +2 An oracle here speaks: "You may ask me WHERE things are, twice." +1 An oracle here speaks: "You may ask me WHERE things are, once." +0 An oracle here speaks: "I shall answer no more." +banger xmasbx 0 0 0 +0 A firework marked "banger" lies at your feet. +banger xmasbx 0 0 0 +0 %banger +banger xmasbx 0 0 0 +0 %banger +banger xmasbx 0 0 0 +0 %banger +rocket xmasbx 0 0 0 +0 A rocket (firework variety) has been discarded here. +rocket xmasbx 0 0 0 +0 %rocket +rocket xmasbx 0 0 0 +0 %rocket +rocket xmasbx 0 0 0 +0 %rocket +sparkler xmasbx 1 1 1 bright +0 There is a sparkling sparkler here, its pretty, glittering flecks of + light cascading around it! +1 There is an unlit sparkler here. +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +sparkler xmasbx 1 1 1 bright +0 %sparkler +1 %sparkler +holly xmasbx 0 0 0 +0 A branch of festive holly is not decking the hall here. +xmastree xmasbx 0 0 0 bright +0 A beautiful Christmas tree is here, decorated in pretty lights and + baubles. +bell xmasbx 1 1 1 +1 A Christmas bell plays its old familiar carols here. +mousse xmasbx 0 0 0 +0 The heady aroma of a shocking-pink mousse here tempts your palate! +mouse xmasbx 0 0 0 +0 A not-quite-enchanted sugar mouse is here. +candle xmasbx 0 0 0 bright +0 A candle shines here. +snowman xmasbx 0 0 0 +0 A jolly snowman tries very hard not to melt nearby. +cracker xmasbx 0 0 0 +0 A Christmas cracker lies here, minding its own business. +carolbook xmasbx 0 0 0 +0 There is a Christmas Carol book here, full of Christmas carols (not the + story). You know the sort of thing I mean, "Once in Royal boughs of + holly", "I saw three french hens come sailing by", "oh silent night of + first noel", things like that. +reindeer 20 0 6 xmasbx 0 0 0 bright noget +0 A sturdy reindeer lumbers past you nearby. +santaclaus 0 0 6 xmasbx 0 0 0 noget +0 Ho ho ho, Father Christmas here again, with your Christmas gifts! +mincepies xmasbx 0 0 0 +0 Some delicious mince pies sit sumptiously on the floor, if you like + mince pies which it happens I don't but never mind, who am I to spoil + the Season of Goodwill and all that? +plumpudding xmasbx 0 0 0 +0 There is some plum pudding here, with a thumb-hole in it. +turkey 5 0 6 xmasbx 0 0 0 50 noget +0 A turkey in a mad panic flees for its very life here. +sleigh xmasbx 0 0 0 +0 A sleigh without a rosebud on it rests here. +ivy bbath 0 0 1 noget +snake 25 0 40 rail2 0 0 0 90 +0 A viper slithers by your feet... +cat 1 43 0 sorcrm 0 9 9 +9 A dead cat has been left here. +8 A mound of sliced and beaten matted fluff before you appears to be a + still-living cat. +7 Before you you recognise that a pile of red fur is in fact a cat, still + breathing... +6 A nearly-dead cat bleeds before you. It thinks it's purring but it + sounds more like a whistle with no pea in it. +5 A bloodied cat lies here, its once black fur matted with red gore. +4 A heavily bloodstained cat is here, coughing up innards as it purrs. +3 A severely cut up cat is here, purring with great difficulty. +2 A decidedly ill cat is here, purring sort of groggily. +1 A rather ruffled black cat is here which doesn't look at all well. +0 A sleek, black cat sits here, purring happily to itself. +cat store 10 10 0 200 +10 A sleek, black cat sits here, purring happily to itself. +rstop rattun 1 1 2 noit noget +sptrap splair 1 1 2 noit noget +sundial wabe 1 1 0 noget +0 In the sundial has been fixed a brand as a gnomon. +1 The sundial has no gnomon, so cannot tell the time. +garnet grotto 0 0 0 +0 You notice a curiously-carven piece of garnet by your feet. +lever grotto 0 0 1 noget +0 Embedded in the east wall is a lever. +chart capt 0 0 1 +0 An ancient chart lies in its frame here. +foot sett 0 0 0 +0 A lucky rabbit's foot is here! +buckle insett 0 0 0 +0 A shiny buckle has somehow found its way here. +apple gaptrm 0 1 1 +0 Growing on the tree is a golden apple! +1 A golden apple lies here, lustrously. +horse whroom 0 0 0 +0 A white, winged stallion stands majestically before you. +gull 0 0 6 beach 0 1 1 +0 A seagull flutters about you, aimlessly. +1 A lifelike golden seagull is here! +birdbath bbath 0 0 1 noget +lion lionrm 0 0 0 +0 An onyx lion has been placed here. Upon its base is the legend: "Drop + me in the garden of death to learn the path." +pancake pantry 0 0 0 +0 A pancake in a pan lies on the shelf. +runes downps 0 0 1 noget +runes sorcrm 0 0 1 noget +crystals sorcrm 0 0 1 +0 Some coloured crystals give off a heavy vapour here. +uranium face3 0 0 0 bright +0 A strange metal glows uncannily over to one side. +naughty store 0 0 1 noit +wardrobe hall 0 0 1 noit noget +potion sorcrm 0 1 1 +0 A vial of clear green potion has been left here. +1 A vial of cloudy green potion has been left here. +scroll wrdbe 0 0 1 +0 An aged scroll has been placed here. +fur wrdbe 0 0 0 +0 A moth-eaten fur coat lies strewn at your feet. +goat 3 0 6 wdale 1 1 2 110 +0 There is a nanny goat here. +1 A nanny goat is tethered here. +rabbit 10 0 6 nhill1 0 1 0 +0 A playful rabbit snuffles round your feet. +1 A savagely slaughtered rabbit lies pitifully at your feet. +rabbit store 2 2 0 +2 A playful rabbit snuffles round your feet. +flute treasc 0 0 0 +0 There lies a silver flute by your feet. +gate entrnc topcit 1 1 2 noget +0 The gateway is open. +1 The gateway is closed. Upon it is written, "Drop the key on me and I + shall open". +springwater spring 0 0 1 noget noit +dwarf 3 0 6 dwpst1 0 1 0 15 noget contains 15000 transparent opened disguised +0 A stocky dwarf eyes you up and down with suspicion. +1 A dwarf sleeps here. +tin face1 1 1 0 +0 Some useful tin ore lies here. +1 In the face there looks to be some tin ore. +tin face4 1 1 0 +0 %tin +1 %tin +tin face2 1 1 0 +0 %tin +1 %tin +tin face3 1 1 0 +0 %tin +1 %tin +tin dwarf 0 0 0 +0 %tin +tin sectn 0 0 0 +0 %tin +tin dwstre 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +tin ktreas 0 0 0 +0 %tin +dwarf dorm 1 1 0 40 noget contains 25000 transparent opened disguised +0 %dwarf +1 %dwarf +dwarf dorm 1 1 0 30 noget contains 25000 transparent opened disguised +0 %dwarf +1 %dwarf +dwarf dorm 1 1 0 50 noget contains 25000 transparent opened disguised +0 %dwarf +1 %dwarf +dwarf odorm 1 1 0 40 noget contains 25000 transparent opened disguised +0 %dwarf +1 %dwarf +dwarf odorm 1 1 0 35 noget contains 25000 transparent opened disguised +0 %dwarf +1 %dwarf +dwarf pdorm 1 1 0 45 noget contains 25000 transparent opened disguised +0 %dwarf +1 %dwarf +dwarf 19 0 6 dwpst2 0 0 0 95 noget contains 95000 transparent opened disguised +0 %dwarf +dwarf 17 0 6 dwpst2 0 0 0 85 noget contains 85000 transparent opened disguised +0 %dwarf +dwarf 13 0 6 dwpst2 0 0 0 65 noget contains 65000 transparent opened disguised +0 %dwarf +dwarf 11 0 6 dwpst2 0 0 0 55 noget contains 55000 transparent opened disguised +0 %dwarf +dwarf 7 0 6 dwpst2 0 0 0 35 noget contains 35000 transparent opened disguised +0 %dwarf +dwarf 5 0 6 dwpst2 0 0 0 25 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 20 0 6 dwrm3 0 0 0 45 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 21 0 6 dwrm3 0 0 0 35 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 22 0 6 dwbog 0 0 0 55 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 10 0 6 kdorm 0 0 0 10 noget contains 25000 transparent opened disguised +0 A young dwarf is here, smiling happily. +dwarf 11 0 6 kdorm 0 0 0 10 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 12 0 6 dwrm2 0 0 0 10 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 13 0 6 dwrm2 0 0 0 11 noget contains 25000 transparent opened disguised +0 A cherry dwarf is here, smiling happily. +dwarf 20 0 6 dwrm2 0 0 0 25 noget contains 25000 transparent opened disguised +0 There is a female dwarf here. +dwarf 21 0 6 dwrm2 0 0 0 25 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 22 0 6 dwrm2 0 0 0 25 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 23 0 6 dwrm3 0 0 0 35 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 24 0 6 pdorm 0 0 0 35 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 25 0 6 dwcant 0 0 0 35 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 26 0 6 dwcant 0 0 0 45 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 27 0 6 dwktch 0 0 0 45 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 23 0 6 dwrm4 0 0 0 25 noget contains 25000 transparent opened disguised +0 There is an old dwarf here. +dwarf 40 0 6 dwrm4 0 0 0 25 noget contains 25000 transparent opened disguised +0 %dwarf +dwarf 45 0 6 dwrm4 0 0 0 25 noget contains 25000 transparent opened disguised +0 There is an old female dwarf here. +dwarf 50 0 6 dwrm4 0 0 0 20 noget contains 25000 transparent opened disguised +0 There is an old female dwarf here. +dwarf 7 0 6 dwrm4 0 0 0 20 noget contains 25000 transparent opened disguised +0 There is a sprightly old female dwarf here. +dwarf guard1 3 3 3 50 noget contains 25000 transparent opened disguised +3 A stocky dwarf guard blocks your way. +dwarf guard1 3 3 3 50 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard1 3 3 3 50 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard2 3 3 3 60 noget contains 25000 transparent opened disguised +3 A hefty dwarf guard blocks your way. +dwarf guard2 3 3 3 60 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard2 3 3 3 60 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard3 3 3 3 90 noget contains 25000 transparent opened disguised +3 A burly dwarf guard blocks your way. +dwarf guard3 3 3 3 85 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard3 3 3 3 95 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard4 3 3 3 90 noget contains 25000 transparent opened disguised +3 A surly dwarf guard blocks your way. +dwarf guard4 3 3 3 90 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf guard4 3 3 3 90 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf ktreas 3 3 3 65 noget contains 25000 transparent opened disguised +3 A thickset dwarf guard blocks your way. +dwarf ktreas 3 3 3 70 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf ktreas 3 3 3 75 noget contains 25000 transparent opened disguised +3 %dwarf +dwarf pdorm 1 1 0 30 noget contains 25000 transparent opened disguised +0 There is a female dwarf here. +1 A female dwarf sleeps here. +dwarf kdorm 1 1 0 10 noget contains 25000 transparent opened disguised +0 A mewling baby dwarf bawls here incessantly. +1 A baby dwarf sleeps here. +dwarf kingst 2 2 2 110 noget contains 25000 transparent opened disguised +2 The dwarfen king is here! +dwarf kqdorm 0 0 0 40 noget contains 25000 transparent opened disguised +0 The dwarfen queen is here! +coin sidpsg 0 0 0 +0 A gold coin lies here, bearing on one side the image of a dwarf, on + the reverse a picture of a body of water. +ventilator minor6 0 0 1 noget +;let 'em off from flood in topcit - adds air of mystery... +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 +1 The area is flooded with water. +pick shed 0 0 1 +0 A smallish, woodworm-riddled pickaxe has been dropped here. +pick entrnc 0 0 1 +0 %pick +mosaic dwhall 0 0 0 +0 A loose chip of mosaic lies by your feet. +stove dwktch 1 1 2 bright noget contains 11000 disguised +0 A hot stove stands here with its door open. +1 A hot stove stands here with its door closed. +trophy guard3 0 0 0 +0 A war trophy depicting a dwarfen battle scene lies at your feet. +throne kingrm 0 0 0 +0 A gloriously bejewelled throne stands here, majestically. +forge dwrm3 0 0 1 bright noget contains 256000 disguised +0 A mighty forge of glowing coals dominates the centre of the room. +poker dwrm3 0 0 0 +0 There is a finely-worked poker here. +lamp shed 1 2 3 bright +0 There is a shining safety lamp here. +1 There is an unlit safety lamp here. +2 There is a safety lamp here without a wick. +valve valvrm 0 0 1 noget +osselesu sectn 0 0 1 noget noit +pot jetty 0 0 1 contains 2000 transparent opened +0 There is a lobster pot here. +sack smuggl 0 0 1 contains 5000 +0 There is a sack here. +bag attic 0 1 2 contains 7000 opened +0 A musty old carpet bag is here, open. +1 A musty old carpet bag is here, closed. +potty bdrm01 0 0 1 -1 contains 1000 transparent opened +0 There is a potty here. +jet potty 0 0 0 +0 A piece of jet has been secreted here. +coinval store 0 -1 2 noget +0 Someone tossed a heads. +1 Someone tossed a tails. +off store 0 0 1 noget +curiosity store 0 0 1 noget +sesame store 0 0 1 noget +starstone ktreas 0 0 0 +0 By your feet is a gorgeous starstone. +topaz ktreas 0 0 0 +0 A large topaz lies on the ground nearby. +garnet ktreas 0 0 0 +0 A garnet of unusual beauty lies here. +beads stun6 0 0 0 +0 Some smoked-glass beads are strewn by your feet. +hole shill1 0 0 1 noget +0 There is a small hole in the ground, about 5 inches across. It bends too + sharply for you to see anything down it. +gun cannrm 2 2 3 noget +0 The cannon is primed and loaded. +1 The cannon is primed. +2 The cannon is unloaded and unprimed. +ballview river3 0 0 0 noit noget +0 On the opposite bank of the river rests a fabulous platinum-plated + sphere. +door cannrm 1 1 2 noget +1 The doorway to the south is shut off by a robust door. +door kitche hall 2 2 3 +0 The kitchen door is open. +1 The kitchen door is closed. +2 The kitchen door is locked shut. +door hotpas cinder diamnd 2 2 3 +0 The strange door is open. +1 The strange door is closed. +2 The strange door is locked shut. +door temple antech 1 2 3 +0 The crimson door is open. +1 The crimson door is closed. +2 The crimson door is locked shut. +door guadrm uland1 2 2 3 +0 The oaken door is open. +1 The oaken door is closed. +2 The oaken door is locked shut. +door guard4 kingrm 2 2 3 +0 The oak door is open +1 The oak door is closed. +2 The oak door is locked shut. +door dwrm3 dorm 2 2 3 +0 The heavy door is open. +1 The heavy door is closed. +2 The heavy door is locked shut. +door shed platfm 2 2 3 +0 The shed door is open. +1 The shed door is closed. +2 The shed door is locked shut. +door passg1 passg4 2 2 3 +0 The door is open. +1 The door is closed. +2 The door is locked shut. +door sorcrm downps store 2 2 3 +0 %door +1 %door +2 %door +door gob1 passg2 2 2 3 +0 %door +1 %door +2 %door +door passg3 passg9 1 2 3 +0 %door +1 %door +2 %door +door gob2 passg5 2 2 3 +0 %door +1 %door +2 %door +door gob3 passg6 2 2 3 +0 %door +1 %door +2 %door +door treasc gob4 dtest3 2 2 3 +0 %door +1 %door +2 %door +door cellar bunker 2 2 3 +0 %door +1 %door +2 %door +door gob5 passg8 1 2 3 +0 %door +1 %door +2 %door +door dwstep dwhall 2 2 3 +0 %door +1 %door +2 %door +door dwfood lowps1 2 2 3 +0 %door +1 %door +2 %door +door dwstre lowps2 2 2 3 +0 %door +1 %door +2 %door +door dwktch dwcant 0 2 3 +0 %door +1 %door +2 %door +door lowps4 dwrm1 1 2 3 +0 %door +1 %door +2 %door +door lowps6 dwrm2 0 2 3 +0 %door +1 %door +2 %door +door odorm lowps9 2 2 3 +0 %door +1 %door +2 %door +door dwrm4 kdorm 0 2 3 +0 %door +1 %door +2 %door +door guard1 guard2 2 2 3 +0 %door +1 %door +2 %door +door minrm lowps7 2 2 3 +0 %door +1 %door +2 %door +door guard3 kingst 2 2 3 +0 %door +1 %door +2 %door +door lowps8 ktreas 2 2 3 +0 %door +1 %door +2 %door +fountain fowrm 0 1 0 noget +0 The fountain glows blue with its magical power. Below it, transcribed + in fiery runes, is the legend "Enter me and know" . +1 The fountain glows yellow. +zombie 20 0 6 store 0 0 0 15 +0 A horrifying zombie blocks your way! +zombie etomb 0 0 0 30 +0 %zombie +zombie 20 0 6 store 0 0 0 15 +0 %zombie +zombie 40 0 6 store 0 0 0 20 +0 %zombie +zombie 40 0 6 store 0 0 0 20 +0 %zombie +zombie 60 0 6 store 0 0 0 40 +0 %zombie +zombie zroom 0 0 0 25 +0 %zombie +skeleton 20 0 6 fossrm 0 0 0 80 +0 An animated skeleton bars your way. +skeleton 500 0 6 store 0 0 0 100 +0 %skeleton +rat 0 0 60 bunker 0 0 0 10 +0 An evil black rat bares its razor-sharp incisors at you. +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 bunker 0 0 0 10 +0 %rat +rat 0 0 60 cellar 0 0 0 10 +0 %rat +rat 0 0 60 cellar 0 0 0 10 +0 %rat +rat 0 0 60 cellar 0 0 0 20 +0 %rat +rat 0 0 60 bunker 0 0 0 20 +0 %rat +rat 0 0 60 bunker 0 0 0 50 +0 %rat +rat 0 0 60 bunker 0 0 0 50 +0 %rat +rat 1 0 60 cellar 0 0 0 200 +0 An enormous, evil black rat bares its razor-sharp incisors at you. +goblins gob1 1 1 1 20 +1 Several evil-looking goblins glare at you madly as you look around. +goblins gob2 1 1 1 80 +1 %goblins +goblins gob3 1 1 1 20 +1 %goblins +goblins gob4 1 1 1 20 +1 %goblins +goblins gob5 1 1 1 20 +1 %goblins +gauntlet uland3 0 0 0 +0 By your feet lies a studded leather gauntlet. +eagle 0 67 69 spring 0 0 0 200 +0 Above, watching you, hovers a large, golden eagle. +magbar ewstep 0 1 2 noit noget +brick altar 0 1 2 noit noget +brick crypt 0 1 2 noit noget +plate treasc 0 0 0 +0 A solid gold plate lies untarnished here. +bracelet treasc 0 0 0 +0 A bejewelled bracelet sparkles at your feet. +toad pond1 0 0 1 +0 A bloated toad croaks incessantly by the side of the water. +prince pond1 0 0 0 -1 noget +0 A handsome prince is here, smiling charmingly. +beauty crypt 0 0 0 100 noget +0 A sleeping beauty is lying entrancingly on the marble slab. +panel spanel diagps bluerm 1 1 2 +0 The sliding panel is raised. +1 The sliding panel is lowered. +kipper pantry 0 0 0 +0 An aging kipper lies to one side. +sapphire bluerm 0 0 0 +0 A deep blue sapphire attracts your gaze nearby. +ornament bluerm 0 0 0 +0 An ornament of Wedgewood pottery lies here. +ogre oglair 0 2 3 noget +0 The ogre is here, with a large club beside him! +1 The ogre is here, chewing happily at a rotting leg. +2 A dead ogre lies mangled up nearby. +earrings crow 0 0 0 +0 The golden earrings of some forgotten pirate lie here. +egg nest 0 0 0 +0 A golden egg is here, hallmarked with the sign of a flame. +effigy woe2 0 0 0 +0 There lies a fine, sandstone effigy here. +silk hold 0 0 0 +0 Lying on the floor is some fine silk. +string poop 0 0 1 +0 A strand of worn rope has been dropped here. +logbook capt 0 0 1 noget +0 ? +libram study 0 1 1 +0 On the bookcase lies a single tome: "Articles of magic". +1 There is a heavy libram here, entitled "Articles of magic". +magazine attic 0 0 0 +0 You find yourself almost standing on an ancient, faded copy of the + magazine "Micro Adventurer". +powder proom 1 1 2 +0 A keg of dry gunpowder is here with a fuse fixed firmly to it. +1 A keg of dry gunpowder is dangerously nearby. +raft hold 0 0 1 +0 A raft, large enough to carry one person, has been left here. +coracle inlet 0 0 1 +0 A sailable coracle large enough for one has been beached (?) here. +quill capt 0 0 0 +0 An inky quill-pen has been left here. +diamond diamnd 0 0 0 +0 A diamond weighing about an ounce is glinting here! +leprechaun leprm 0 1 1 +0 An impudent leprechaun is sitting here. +1 A sulking leprechaun is complaining here. +gold leprm 0 0 0 +0 A crock of gold has been put here! +grate smuggl fortun 1 1 2 +0 The iron grate is slid open. +1 The iron grate is slid closed. +doubloons sack 0 0 0 +0 A pile of doubloons glitters here! +pieces smuggl 0 0 0 +0 Some pieces of eight lie scattered around you. +bottle smuggl 1 1 0 +0 There is an empty bottle here. +1 There is a bottle of rum here. +wafer galley 0 0 1 +0 A wafer biscuit lies here. +wafer store 0 0 1 +0 %wafer +wafer store 0 0 1 +0 %wafer +wafer dwktch 0 0 1 +0 A wafer biscuit of dwarfen make has been dropped on the floor. +wafer guard4 0 0 1 +0 %wafer +wafer dwcant 0 0 1 +0 By your feet lies an aged, yet edible, wafer biscuit. +wafer dwfood 0 0 1 +0 %wafer +button ledge3 0 0 1 noget +0 A reset button is embedded in the wall. +groats kitche 1 1 0 +0 Some golden coins lie here! +1 Some worthless, dirtied groats have been dropped here. +crown swamp7 0 0 0 +0 Gleaming in front of you is a magnificent crown! +crown store 0 0 1 +0 Gleaming in front of you is a magnificent crown! +statue tombrm 0 -4 4 +0 There is a golden statue here with red eyes! +1 There is a golden statue here with blue eyes! +2 There is a golden statue here with green eyes! +3 There is a golden statue here with yellow eyes! +4 There is a golden statue here with emerald eyes! +medicine bathrm 0 1 0 +0 There is some medicine here. +1 There is some partially-drunk medicine here. +moose uhut 0 1 0 +0 A highly valuable stuffed moose's head grins lopsidedly at you nearby. +pillar uhut 0 0 0 +0 A magnificent, ancient, marble pillar has been stolen and dropped here! +portcullis inmth mthidl 1 1 2 +0 A raised portcullis is above an east-west link into the mouth of the + idol. +1 A portcullis prevents passage east-west between the mouth of the + idol and the opening to the outside. +wall hut 0 0 1 noget noit +wall nhill1 0 0 1 noget noit +wall nhill2 0 0 1 noget noit +wall shill1 0 0 1 noget noit +wall shill2 0 0 1 noget noit +wall ufrst1 0 0 1 noget noit +wall ufrst5 0 0 1 noget noit +wall ufrst2 0 0 1 noget noit +objonledge ledge1 0 0 1 noget noit +objonledge ledge2 0 0 1 noget noit +objonledge ledge3 0 0 1 noget noit +emerald ledge3 0 1 1 +0 A fabulous emerald lies loosely among the rock. +1 A fabulous emerald has been dropped here! +tdoor hut laddrm 1 1 2 noit +0 Fixed on the wall less firmly than the rest is a valuable moose's head. + A trapdoor is open in the floor connecting the hut and a steep shaft + containing a ladder. +1 An empty space on the wall is marked, in an unsteady but loving hand, + by the word "MOOSE". +painting attic 0 0 0 +0 Catching your attention is a beautiful painting of a crown in a swamp. +doll attic 0 0 0 +0 A child's antique doll is here, cast carelessly to the floor. +candlestick attic 0 0 0 +0 A richly ornamented brass candlestick lies on the ground. +chest attic 0 0 0 +0 A heavy chest is here, its padlock long since rusted away. Burned onto + the lid is a mark, shaped like a black rose. +pendant wstlpl 0 1 1 +0 A beautiful amber pendant catches your eye glistening by the iced pool. +1 A beautiful amber pendant catches your eye nearby. +pendview estlpl 0 0 1 noit noget +0 On the opposite bank of the pool you can see a beautiful pendant! +rootview root altar ydead1 rtun1 rtun2 0 1 2 noit +1 The way through the tunnel is blocked after a fire caused a cave-in. +tunview stun1 stun2 stun3 stun4 stun5 stun6 stun7 stun8 stun9 stun10 cellar uhut dead15 0 1 2 noit +1 The tunnel has collapsed and cannot be entered. +pool wstlpl estlpl 1 1 2 +0 The still pool has been frozen and the way across is easy. +1 The still pool looks very deep and has a mysteriousness about it. A + shallow mist hangs over it, and the room is stuffy and warm. +leg cavein 0 0 1 +0 There lies nearby the rotting leg of a recently-dead corpse. +icicle altar 0 0 1 +0 Some icicles cool the air around you. +cross 0 0 0 +0 You have found a small silver cross, battered and misshapen from some + enormous heat. On it is inscribed, "Carry me with you." +wand 0 0 1 +0 There is an ebony staff here without a rusty star on the end. +wand store 0 0 1 +0 There is an ebony staff here with a shiny star on the end. +wand sectn 0 0 0 +0 Hey, how'd you get to read this description? +ox 50 0 6 epstre 0 4 1 +0 A sturdy ox lumbers past you nearby. +1 There is a highly valuable jade statue of an ox here! +2 There lies the carcass of a murdered ox nearby. +3 There lies a dead ox off to one side. +4 There is a worthless jade statue of an ox here. +brand nfrst1 1 1 2 bright +0 There is a burning fire brand here. +1 There is a large stick on the ground. +brand ifrst3 1 1 2 bright +0 %brand +1 %brand +brand nfrst5 1 1 2 bright +0 %brand +1 %brand +brand nfrst7 1 1 2 bright +0 %brand +1 %brand +brand fslop1 1 1 2 bright +0 %brand +1 %brand +brand forist 1 1 2 bright +0 %brand +1 %brand +brand store 0 1 2 bright +0 %brand +1 %brand +brand store 0 1 2 bright +0 %brand +1 %brand +brand ufrst5 1 1 2 bright +0 %brand +1 %brand +brand nfrst3 1 1 2 bright +0 %brand +1 %brand +brand nfrst4 1 1 2 bright +0 %brand +1 %brand +brand cellar 1 1 2 bright +0 %brand +1 %brand +brand temple 0 1 2 bright +0 %brand +1 %brand +brand capt 1 1 2 bright +0 %brand +1 %brand +umbrella wrdbe 1 1 2 +0 There is an unfurled umbrella here. +1 There is a furled umbrella here. +parasol 1 1 0 +0 A pretty, oriental parasol lies unfurled here. +1 A neatly furled parasol is propped up close by. +potatoes patch 0 1 1 +0 There are some potatoes here. +1 There are some golden potatoes here! +rattle bdrm03 0 1 2 +0 Nearby lies a toy rattle. +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 +1 It is raining. +2 It is snowing. +conch bwfall 0 0 0 +0 A beautiful conch glistens pearl-like in the light. +fossil fossrm 0 0 1 +0 The fossilised remains of a small finger bone lie here. +crack revrm fossrm 1 1 2 noit noget +0 A crack in the wall permits east-west passage with another room. +curtain temple 0 2 2 +0 A curtain patterned with writing hangs loosely by the opening to the + north. +1 A curtain patterned with writing has been drawn closed covering the + opening to the north. +2 A curtain patterned with writing lies strewn at your feet. +incense hchamb 0 0 0 +0 An urn of rare frankincense stands majestically nearby. +ring chambr 0 1 1 +0 A brass finger-ring lies in one corner. +1 An astonishingly beautiful ring nearby makes you gasp in amazement! +ring fring 2 2 3 noget +wolfsbane garden 0 -1 2 +0 A curious herb gives off a sweet odour nearby. +1 A curious herb gives off a sweet odour nearby. +wolfsbane slope2 0 0 1 +0 A curious herb gives off a sweet odour nearby. +hyacinth garden 0 0 0 +0 A gorgeous hyacinth has been picked and left here. +key 0 0 1 +0 A set of rusty keys can be seen here. +key 0 0 1 +0 %keys +key 0 0 1 +0 %keys +key zroom 0 0 1 +0 %keys +key store 0 0 0 +0 A set of shiny keys can be seen here. +key store 0 0 0 +0 %keys +axe 0 -1 2 +0 A mighty woodsman's axe lies on the ground here. +1 A mighty woodsman's axe shines on the ground here. +axe guadrm 0 0 0 +0 A stout axe nearby gleams in the light. +axe store 0 0 1 +0 The axe of a mighty woodsman lies on the ground here. +tree wfrst1 3 3 4 noget +0 There is a felled yew tree here. You can see that the hollow stump + leads down to the depths. +1 There is a mighty yew tree here, with large chunks chopped off. +2 There is a mighty yew tree here, with axe-marks on the trunk. +3 There is a mighty yew tree here. +sign slope1 1 1 0 +0 There is a chopped down signpost here. +1 Fixed into the ground is a signpost. +bed bdrm01 0 2 1 noget +0 A bed with the bedclothes in disarray stands solidly in the centre + of the room. +1 There is a neatly made bed here. +2 A bed with the bedclothes unmade stands solidly in the centre + of the room +fire lounge 1 -1 2 contains 256000 noget disguised +0 A fire is burning merrily in its grate. The flickering flames are a + joy to behold as you warm your hands from the glowing coals. +1 There is a fire burning merrily in the grate, its cheerful glare + spreads a delightful air of homeliness. +fire altar 1 1 2 bright contains 256000 noget disguised +fire store 0 0 1 bright contains 256000 noget disguised +0 A roaring fire is burning in the grate, spreading a cosy feeling + around the room. +fire kingst 1 -1 2 contains 256000 noget disguised +0 A merry fire here casts a cheery glow around the room. +1 A cheerful fire here casts a merry glow around the room. +tomb maze25 tombrm 1 1 2 +1 A voice, speaking inside your head, seems to say, "A prize will open + the tomb." +0 The tomb is open. +tomb mosolm 0 0 1 noget +bookcase ssteps study 1 1 2 +0 The bookcase has been shifted aside to allow passage behind it. +1 The bookcase stands flush against the wall. +stepladder cupd2 0 0 1 noget +0 A heavy stepladder leads upwards to the ceiling. +sdoor cuptop attic 0 1 2 noit +0 There is a secret door open between the cupboard and the attic. +cupboard bdrm03 cupd2 1 1 2 +0 The cupboard is unlatched. +1 The cupboard is latched shut. +grave maze1 maze2 maze3 maze4 maze5 maze6 maze7 0 -41 100 +0 There is a grave here. The name on the headstone reads, "Roy Trubshaw". +1 There is a long forgotten gravestone here inscribed, "Nigel Roberts". +2 There is a tomb here; the name inscribed reads, "Polly the Witch". +3 On a huge grave is the name, "Evil the Wizard". +4 Graffiti on a nearby grave reads, "Visit Murrell's balloon emporium". +5 Inscribed on a nearby grave is the name of some body. +6 A headstone lies on its side nearby; the name on it is unreadable. +7 Inscribed on a modestly austere tombstone here is the name, "Richard + the Wizard". +8 On a nearby tomb is the name of someone dead. +9 You can just make out the name on this tombstone. +10 Over to your right is an unmarked grave belonging to Brian Mallett. +11 On a grave close by reads, "Gwyn the Wizard lies only a few feet from + here". +12 Before you looms an obsidian vault, insculpt "Shadow the Wizard". +13 Before you stands a granite tomb, topped with a garden Gnome. +14 A tombstone here reads, "Here rest the immortal remains of 'Merrick', + R.I.M. - he came to study Computing, but got waylaid in the MUD". +15 Two tombstones to your left read, "Helmut the Wizard". +16 A tombstone here bears the epitaph, "Fenwyn (Wizard". +17 The tomb of Jock the Wizard rises before you, inscribed, "But for a + devaluation of the point, he would have been here three weeks earlier". +18 A small rock to one side marks the grave of Foxy the Wizard. +19 The grave of Denise the Witch lies to one side, covered in footprints + where Egor the Wizard has danced. +20 The headstone of Gorpli the Wizard stands here, with nothing significant + on it. +21 Hacked into a tombstone before you is the epitaph, "Madmax the Wizard". +22 The tomb before you bears the name, "Roddy the Wizard", which has + obviously been painted on very quickly. +23 The romanesque tomb of Lacrima the Witch stands here, amid a small pool + of salt water. +24 Here stands the grave of Clive the Wizard, QED. +25 The tombstone of Paula the witch stands here, reading, "Kissing has lots + of good points". +26 Entombed here lies Innocence the Witch, her epitaph, reading, "The + mortals' favourite immortal", having been raised by public subscription. +27 Alan the wizard is virtually buried here. +28 Christian the wizard is buried here, beneath a tombstone reading, "A + legend in his own lifetime" four times. +29 You see what looks like the tomb of Petal the witch before you, but + realise it's Gnot. +30 Inscribed on a headstone to your left are the words, "Saavik, a wizard + at kissing and making up". +31 Before you stands the grave of Balastor the wizard, made without any + help whatsoever from Egor the Wizard... +32 The mass grave of Bwian, Faratol, Frobozz, Paysul, Bytor, Snieker + and Dan the wiz's is here, until they can be exhumed to more suitable + private accommodation. +33 A Celtic cross here bears the inscription, "Here is the body of Planxty + the Wizard, in his favourite position (horizontal)". +34 Gripper the wizard's aerial-bearing tombstone nearby reads "heavy + drinking got me here". +35 The tomb of Mugsanon the wizard stands before you, inscribed + "IItt''ss eeaassyy wwhheenn yyoouu kknnooww hhooww..". +36 Here stands the gravestone of Crab the wiz, it doesn't say much, but + then, that's showbiz! +37 The carefully constructed tomb of Morgwyn the witch stands here, ringed + by a variety of footprints. +38 A Reliable tombstone stands before you. +39 Here stands the tomb of Maria the witch, vaguely resembling a large + button and bearing the inscription, "f1". +40 Scrawled over the top of a crossing out on a tombstone here are the + words, "Jon the wizard". +41 This is the tombstone of Achetus the wizard, but his bones are lost in + the swamp. +grave maze8 maze9 maze10 0 -41 100 +0 The grave to your left reads, "In memory of Ulin Smith, BSc, RIP". +1 A nearby epitaph reads, "I didn't know marsh-gas was explosive" +2 A broken headstone lies scattered about you. +3 An inscription nearby reads, "Coming here was a grave mistake". +4 On a headstone to your right reads the inscription, "Rather here than + carrying the egg". +5 A headstone to the east bears the inscription, "OK, so maybe the dragon + WAS a bit of a handful...". +6 A nearby headstone bears the legend, "I wonder what happens if I eat + the toadstool?". +7 A grave to your left bears the words, "One who forgot to unfurl the + umbrella lies here". +8 The grave of Nic the Wizard is eventually here. +9 The grave of Andy the Wizard is somehow here. +10 The grave of Eric the Wizard was here until you started playing. +11 The tomb of Ridicule the Wizard has been gradually built up here. +12 Here is the final resting place of Gizmo the Witch, who hasn't ordered + her tombstone yet... +13 The grave of Zardoz the Wizard is here - "Forgotten but not gone". +14 Felicity the witch is buried here: her tombstone bears the epitaph, + "A spectacular life led me here". +15 You smell the grave of Conn the Wizard some way to one side. +16 Siona the Witch rests uneasily here, in a morbid black shirt. +17 The tomb of Zaphod the Wizard is here, marked "Do not open until 2am". +18 By a highly baroque, gaudy and ostentatious tomb here is a single + Rosebud. +19 The grave of the unknown wizard stands before you, beneath which lies + entombed Egor the Wizard. +20 The hastily-erected grave of Endora the Witch is said to stand here... +21 To one side lies the securely water-proofed grave of Cesil the Wizard. +22 The grave of Tremble the Wizard is here, made almost entirely of old + logs. +23 Before you stands the grave of Thor the wizard, marked, "Stopped Press". +24 The open grave of a witch yawns before you. +25 The tombstone of Rudy the wizard stands here, marked, "Gone before his + time". +26 Nick the wizard is buried here. The tombstone has been removed for the + words on it to be cleaned. +27 Elric the wizard is buried here beneath a tomb reading, "See where + helping other people gets you". +28 A headstone before you reads, "Azax the wizard lies here". The word + "lies" has been underlined several times. +29 You are standing on the plot where Simone the Witch would be buried had + she been killed en route to witch. +30 A tombstone before you reads, "Here lies the body of Kronos, a witch + through no fault of her own". +31 Six feet below you lie the remains of Happy the Wizard, "deep in + meditation". +32 Far to the east is the grave of Limhongch the Wizard. +33 A black monolith before you encases the body of Vulnax the Wizard. +34 The grave of Jason the whinging Wizard stands here, insculpt "He + had his cake and ate it". +35 Before you stands the mighty statue of a centaur, guarding the grave of + Chester the Wizard. +36 Here stands the tomb of Shrayer the Witch, closely resembling a prince. +37 Etched onto the grave of Dan the Wizard here are the words, "I got + by with a litle help from my friends". +38 The double-size grave of Fazz the Wizard here bears the sentence, + "T for two". +39 The wind, whistling above this forsaken spot, seems to whisper the + words, "Well, Qbert, what do you want on your tombstone?". +40 Here stands the tomb of Vivian the Wizard, "A sufferer of swamp + fever". +41 The proud marble headstone of Tixy the Wizard stands before you, + manufactured in Essex by Vivian's Patent Philanthropic Enterprises. +blade saltar 0 0 1 noget +0 A bloodstained sacrificial blade is chained to the altar. +eyeview bef1 0 0 1 noit noget +0 High up the idol, embedded in its forhead, is a dazzling ruby for an + eye! It seems to have remained there fixed for several centuries. +eye eyedol eyedol 0 1 1 +0 The idol's eye is a dazzling ruby! +1 There is a dazzling ruby here! +carpet guadrm 1 1 1 +0 There is an unrolled carpet here. +1 There is a rolled-up carpet here. +beggar 100 0 6 sfrst1 0 0 0 50 noget +0 A deaf, dumb, blind, lame beggar sits despondently nearby. +wolf wolfrm 1 1 1 150 noget +1 A ravenous, terrifying wolf dribbles and licks its lips as it watches + you intently. +dragon 20 0 66 ifrst1 0 0 0 800 noget +0 Beating its enormous wings above you is an immense, fire-breathing + dragon! +shark 0 0 6 sea1 0 0 0 125 noget +0 A shark fin can be seen cutting through the water around you. +dryad 20 0 6 clffst 0 0 0 80 noget +0 In amongst the trees is an evil-looking dryad, scowling menacingly. +icon isanct 0 0 0 +0 A beautiful icon depicting a hallowed chamber lies here. +icon isanct 0 0 0 +0 A valuable icon depicting a shrine lies here. +icon isanct 0 0 0 +0 A glorious icon depicting an ancient chamber lies here. +icon isanct 0 0 0 +0 A marvellous icon depicting the inner sanctum lies here. +golem osanct 1 1 1 120 noget +1 A golem of solid iron stands here as guardian of the inner sanctum. +barrel level 0 1 2 +0 A large barrel containing putrid, reddish water stands here. +1 A broken, empty barrel lies here. +mud schamb mudrm 1 1 2 +0 The mud which prevented east-west passage between the mud room and + the small chamber has been removed. +1 The walls of the room are caked in a rock-hard covering of dry, + porous mud. +firestone schamb 0 0 0 bright nosummon +0 A beautiful, iridescent firestone glows nearby. +firestone 0 0 0 bright nosummon +0 An iridescent, beautiful firestone glows nearby. +firestone store 0 0 0 bright nosummon +0 A beautiful, glowing firestone iridesces nearby. +firestone store 0 0 0 bright nosummon +0 A glowing, beautiful firestone iridesces nearby. +*travel go +ostart n road2 e o + n maze1 n + n nfrst3 ne + n path s + beast garden sw + nanny garden sw + pegasus garden sw + rug garden sw + marble garden sw + tub garden sw + torch garden sw + fungus fring sw + n garden sw + n patch se swamp + n track2 w + n wfrst1 nw +home n start o + n rost jump + n maze1 n + n root nw + n swamp1 swamp + n glade s + n capt w + n bch1 sw + n cave se + n inmth ne + n store in + n natcav e + n bdrm03 u + n cannrm d +store door o in n ne e se s sw w nw u d swamp +limbo door limbo o +nfrst1 n nfrst4 w + n nfrst2 e se swamp o + n nfrst3 s + n wfrst1 sw + n fslop1 n d + n fslop2 ne + n fslop3 nw +nfrst4 n nfrst1 e o + n clffst swamp sw + n wfrst1 s + n nfrst3 se + beast 474 jump + wood 0 jump + ~parachute beach jump + -13 jump + n fslop1 ne + n fslop3 n + 51 nw + 52 w +nfrst2 n nfrst1 nw + n nfrst3 w + wood 0 sw s se swamp o e ne u + n road2 sw + n start s se swamp o + n nhill1 e + n nhill2 ne u + n fslop2 n d +nfrst3 wood 0 sw o s se w swamp + n ostart sw o swamp + n nfrst2 e ne + n nfrst1 n + n nfrst4 nw + n maze1 w + n road2 s se +clffst n wfrst1 e + n nfrst4 n nw ne + wood 0 s sw swamp se o jump + n track1 s sw + n track2 swamp se o + beast 474 jump + ~parachute beach jump + -13 jump + 52 w +wfrst1 n nfrst4 nw n + n nfrst1 ne + wood 0 sw s swamp se o d e + n track1 sw + n track2 s + n ostart swamp se o + tree root d + n clffst w + n maze1 e + 116 u jump +track1 n clifff s sw + n track2 e o + n clffst n + n wfrst1 ne + n wpstre swamp se + beast 474 jump + ~parachute beach jump + -13 jump + 52 w +track2 n track1 w + n wfrst1 n ne + n clffst nw + n clifff sw + n wpstre s swamp + beast garden se + nanny garden se + pegasus garden se + rug garden se + marble garden se + tub garden se + torch garden se + fungus fring se + n garden se + n ostart e o +road2 n ostart w + n nfrst2 ne + n nfrst3 n nw + n start e o + n gorse s swamp + n mfrst se + n patch sw +start n mfrst sw + n road2 w + n nfrst2 nw + n nhill1 n ne u + n shill1 s swamp se + e wayout e o + 591 e o +wayout e start w in +clifff n track1 nw n + n track2 ne o + n wpstre e + n wfall s sw + n river1 se swamp + beast 474 jump + ~parachute beach jump + -13 jump + 52 w +fallin e bch1 d + e bch2 jump + e fallin n e s w + 892 d jump +slidin 917 d jump +wpstre n clifff w + n track1 nw + n track2 n + beast garden ne + nanny garden ne + pegasus garden ne + rug garden ne + marble garden ne + tub garden ne + torch garden ne + fungus fring ne + n garden ne + n epstre e o + n river1 s sw + n river2 se swamp +garden n clifff w + n track2 nw + n ostart n ne o + n wpstre s swamp sw sw + n path e se +path n hall s in + n ostart n ne nw o + beast garden w sw + nanny garden w sw + pegasus garden w sw + rug garden w sw + marble garden w sw + tub garden w sw + torch garden w sw + fungus fring w sw + n garden w sw + n patch e se swamp +patch n path w + n ostart n nw o + n road2 ne + n epstre s sw + n gorse e se swamp +gorse n patch w nw + n epstre sw se swamp + n outhut s + n mfrst e + n road2 ne n o +mfrst n start n ne o + n road2 nw + n gorse w + n rapids s + n outhut sw + n cave se swamp + n shill1 e u +wfall n clifff nw n ne out + n river1 e swamp + beast 474 jump + ~parachute beach jump + -13 jump + 55 s sw se + 52 w +river1 n wfall w + n river2 e swamp + n clifff nw + n wpstre n ne out + parachute spstre s se sw + boat spstre s se sw + rain spstre s se sw + 120 s se sw +river2 n river1 w + n rapids e swamp + n wpstre n nw + n epstre ne out + parachute spstre s sw se + boat spstre s sw se + rain spstre s sw se + 120 s sw se +rapids n river2 w + n epstre nw n out + n cave ne u + torch ydead3 s se swamp + spark ydead3 s se swamp + n swamp1 s swamp + n pond1 se + n spstre sw + 196 e +cave n epstre w + n rapids sw s swamp + n mfrst n nw + n shill2 ne u out + n befgte e in +nhill2 n nfrst2 w swamp sw + n nhill1 s se d out + n fslop2 nw + 54 n ne e u +nhill1 n nhill2 n ne u + n fslop2 nw + n nfrst2 w + n start se s sw d out swamp + 54 e +shill1 n start n ne nw d out + n mfrst w + n shill2 se u + n cave sw swamp s + 54 e +shill2 n shill1 n ne nw d out + n cave w sw swamp + 54 e se s +hut n outhut n out swamp + beast 199 d in + nanny 659 d in + pegasus 441 d in + tdoor laddrm d in +laddrm bird 428 u out + tdoor hut u out + 195 u out + n uhut d in +uhut marble 200 w in + tub 60 w in u out + n laddrm u out + tunview stun1 w in + 208 w in +stun1 tunview 342 e n out + d uhut e out + d stun2 n + 198 e out n + n dead15 ne nw se sw s +stun2 tunview 342 s w + d stun1 s + d stun3 w + 198 s w + n dead15 n ne e se sw nw +stun3 tunview 342 e nw + d stun2 e + d stun4 nw + 198 e nw + n dead15 n ne se s sw w +stun4 tunview 342 s se + d stun3 se + d stun5 s + 198 s se + n dead15 n ne e sw w nw +stun5 tunview 342 n sw + d stun4 n + d stun6 sw + 198 n sw + n dead15 ne e se s w nw +stun6 tunview 342 nw ne + d stun5 ne + d stun7 nw + 198 ne nw + n dead15 n e w s se sw +stun7 tunview 342 se w + d stun6 se + d stun8 w + 198 se w + n dead15 n ne e s sw nw +stun8 tunview 342 e n + d stun7 e + d stun9 n + 198 e n + n dead15 ne se s sw w nw +stun9 tunview 342 s nw + d stun10 nw + d stun8 s + 198 nw s + n dead15 n ne e se sw w +stun10 tunview 342 n out se + d cellar n out + d stun9 se + 198 n se out + n dead15 ne e s sw w nw +dsteps vermin cellar u ne out swamp + n hall u ne out swamp + n cellar d sw in +xmasbx n xmasbx n +cellar n dsteps u ne out swamp + pegasus 441 s + beast 199 s + nanny 659 s + marble 201 s + tub 60 s + tunview stun10 s + 208 s + door bunker w in + 50 w in +bunker torch dead39 e out + vermin rattun s in + door cellar e out + 595 s in + 50 e out +rattun rstop hall out + n bunker in +outhut bird 428 s in + n hut in s + n gorse n nw out + n epstre sw w + n mfrst e ne + n cave se + n rapids s swamp +befgte n cave w out swamp + n befidl e in + beast ydead4 n + n saltar n + n oglair s +saltar beast ydead4 s + n befgte s out swamp +oglair n befgte n out swamp + ogre ydead8 s in + n leprm s in +leprm n oglair n out swamp +bef1 forced ydead5 + n mthidl e u + n befgte w out swamp + tub 60 n in + pegasus 441 n in + beast 199 n in + nanny 659 n in + marble 201 n in + n crypt n in +crypt n befidl s out swamp +befidl forced bef1 +mthidl n eyedol u + n befidl w d out swamp + beast 474 jump + parachute befidl jump + portcullis inmth e in + n bef1 jump +inmth portcullis mthidl w out + n hollow e in +hollow n inmth w out + n rockps e in + n rsteps d +rockps n hollow w out + n chambr e in +chambr n rockps w out +rsteps n hollow u out + n uland1 d in +uland1 n rsteps u out + door guadrm n in + 220 n in + n wstep1 d +guadrm door uland1 s out + 220 s out +wstep1 n uland1 u out + n wstep2 d in +wstep2 n wstep1 u out + n wstep3 d in +wstep3 n wstep2 u out + n uland2 d in +uland2 n wstep3 u out + n natcav w in +natcav n uland2 e out + n passg1 w in +passg1 n passg2 n in + n natcav e out + n passg3 s + door passg4 w + 50 w +passg2 door gob1 n in + n passg1 s out + 50 n in +passg3 n passg1 n out + door passg9 s in + 50 s +passg4 n gob2 w in + door passg1 e out + 50 e +passg5 n gob3 w in + door gob2 e out + 50 e out +passg6 n gob4 n in + door gob3 s out + 50 s out +passg7 n gob5 n in + n gob2 s out +passg8 n gob1 e out + door gob5 w in + 50 w +passg9 door passg3 n out + n ewstep e u in + n curve w sw + 50 n out +pass10 n crookp e out + n lsp1 n nw u + n cannrm s sw in +gob1 goblins passg8 w in + door passg2 s out + 50 s out + 291 w in +gob2 goblins passg7 n + goblins passg4 e out + goblins longps s in + door passg5 w + 50 w + 291 n e s in +gob3 door passg6 n in + goblins passg5 e out + 50 n in + 291 e out +gob4 door treasc n in ne + goblins passg6 s out + 50 n in ne + 291 s out +gob5 door passg8 e out + goblins passg7 s + goblins treasc n d in nw + 50 e out + 291 n s d in +treasc door gob4 s sw out + 213 u + 50 s sw out +ewstep magbar passg9 d w out + n spanel u e in + 271 d w out +curve n passg9 e n out + n diagps ne s in +diagps n curve sw out w + panel bluerm ne in e n + 270 ne in e n +spanel n ewstep w d out +bluerm panel diagps sw out w s + 270 sw out w s +longps n gob2 n out + n crookp s in +crookp sprig 503 n out + n longps n out + n pass10 w in + n nstep1 e d +lsp1 n pass10 s out d + n lsp2 n in u +lsp2 n lsp1 s out d + n lsp3 n in u +lsp3 n lsp2 s out d + n river3 n in u +river3 n lsp3 s out d + rain nbank n ne nw in jump + 120 n ne nw in + 272 w e +nbank rain river3 s sw se out jump + 120 s sw se out + 272 w e +cannrm n pass10 n ne out + door fowrm s sw in + 273 s sw in +fowrm n cannrm n ne out +eyedol n mthidl d out swamp + 143 u + beast 474 jump + parachute befidl jump + n bef1 jump +nstep1 n crookp w u out + n nstep2 e d in +nstep2 n nstep1 u w out + n nstep3 e d in +nstep3 n nstep2 u w out + n uland3 e d in +uland3 n nstep3 u w out + 463 nw +epstre n wpstre w + n dining nw in + n outhut n + n mfrst ne out + n rapids s se swamp + n river2 sw + n cave e u +sfrst1 55 nw n + n spstre ne out + n sfrst2 e swamp + 51 s + ~parachute beach2 jump + -13 jump + 52 w sw + n glade se +sfrst2 n spstre nw n + n sfrst1 w + n rapids ne out + torch ydead3 e swamp + spark ydead3 e swamp + n swamp1 e swamp + 51 se + n glade sw s +glade n sfrst2 n ne out swamp + n sfrst1 nw + n wabe sw + n pines1 s + n sett se + 51 e w +wabe n glade ne out swamp + n pines1 e se + n pines7 sw s + n bbath w + 51 n nw +sett n glade nw out swamp + n pines1 w sw + nut sqroom e + n sqrm e + n pines6 se s + 51 n ne + paw insett d in + stone insett d in + 392 d in +pines1 n glade n out swamp + n sett ne + n pines6 e + n pines3 se s + n pines2 sw + n pines7 w + n wabe nw +bbath n wabe e out swamp + n pines7 s se + n lionrm nw + 51 n ne sw w +lionrm n bbath se out swamp + 51 n ne e s sw w nw +sqrm n sett nw w out swamp + n pines6 sw s + 51 n ne e se in +sqroom nut dead34 n ne e se s sw w nw out in swamp + n sett nw w out swamp + n pines6 sw s + 51 n ne e se in +pines7 n bbath n out swamp + n wabe ne + n pines1 e + n pines2 se + n pines5 s + 51 sw w nw +pines6 nut sqroom n + n sqrm n + n sett nw out swamp + n pines1 w + n pines3 sw + n pines4 s + n bstand se in + 51 e ne +pines2 n pines1 ne n out swamp + n pines3 e + n whroom se + n pines5 s sw + n pines7 w nw +pines3 n pines1 n nw out swamp + n pines6 ne + n pines4 se + n whroom s sw + n pines2 w + n bstand e in +pines5 n pines7 n out swamp + n pines2 ne + n whroom e + n gaptrm sw + 51 se s w nw +pines4 n pines6 n out swamp + n pines3 nw + n whroom w + n bstand ne in + n shrine se + 51 e s sw +shrine n pines4 nw o swamp +osanct golem isanct n in + 989 n in + n vrocks ne e se s sw w nw o swamp jump +isanct n osanct s in o + n vrocks n ne e se sw w nw swamp jump +gaptrm n pines5 ne out swamp + 51 n nw w sw s se e +insett n sett u out swamp +whroom n pines3 n ne out swamp + n pines4 e + n pines2 nw + n pines5 w + 51 sw s se +bstand n pines6 nw o swamp + n pines3 w + n pines4 sw + 51 n ne e se s +spstre n sfrst1 sw + n sfrst2 s e + 55 w + parachute river2 n out + parachute river1 nw + boat river2 n out + boat river1 nw + rain river2 n out + rain river1 nw + n rapids ne + torch ydead3 se swamp + spark ydead3 se swamp + n swamp1 se swamp + 120 n out nw +hall n path n out swamp + n lounge e + door kitche s in + 50 s in + n stairs se u + n dsteps sw d + n wrdbe w +wrdbe n hall e out swamp +lounge n hall out w + n dining s swamp + n study e in +study n lounge w out swamp + bookcase ssteps s in d +ssteps bookcase study n out swamp u + n zroom in d s +zroom n ssteps u n out swamp + n downps d s in +downps n zroom u out swamp n + door sorcrm s in d + 50 s in d +sorcrm door downps n u out swamp + 50 n u out swamp +dining n lounge n ne nw in + n epstre s se sw out swamp + 53 w +kitche door hall n out swamp + 50 n out swamp + 53 e + n pantry nw d in +pantry n kitche u s se out swamp +stairs n hall d n nw out swamp + n landin u s se in +landin n stairs d nw out swamp + n bathrm sw w + n cupd1 e ne + n bdrm03 se + n bdrm01 s + n bdrm02 n +bathrm n landin out swamp ne e +cupd1 n landin w sw out swamp +bdrm01 n landin n out swamp + beast 474 jump + parachute epstre s jump d + 129 s jump down +bdrm02 n landin s out swamp + 155 n d jump +bdrm03 n landin nw out swamp + cupboard cupd2 sw in +cupd2 cupboard bdrm03 n out swamp ne + torch dead11 up in + n cuptop up in +attic rug 791 d out swamp + sdoor cuptop d out swamp +cuptop n cupd2 d out swamp + sdoor attic u in +maze1 n maze2 se + n ostart out s + n maze1 n ne e w sw nw +maze2 n maze3 nw + grave ostart out + n maze2 n ne e s w sw se +maze3 n maze4 s + grave ostart out + n maze3 n ne e se w sw nw +maze4 n maze5 n + grave ostart out + n maze4 se ne e s w sw nw +maze5 n maze6 ne + grave ostart out + n maze5 n se e s w sw nw +maze6 n maze7 sw + grave ostart out + n maze6 n ne e s w se nw +maze7 n maze8 w + grave ostart out + n maze7 n ne e s se sw nw +maze8 n maze9 e + grave ostart out + n maze8 n ne se s w sw nw +maze9 n maze10 n + grave ostart out + n maze9 se ne e s w sw nw +maze10 n maze25 s + grave ostart out swamp + n maze10 n ne e w sw nw se +maze25 n ostart n ne e s w sw nw se swamp out + tomb tombrm d in +uswamp n swamp1 o u swamp +swamp1 n swamp2 [se sw s ne] + n swamp1 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp2 n swamp3 [se sw s ne] + n swamp1 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp3 n swamp4 [se sw s ne] + n swamp1 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp4 n swamp5 [se sw s ne] + n swamp2 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp5 n swamp6 [se sw s ne] + n swampa [se sw s ne] + n swamp2 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp6 n swamp8 [se sw s ne] + n swamp1 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp8 n swamp9 [se sw s ne] + n swampa [se sw s ne] + n swamp3 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp9 n swampb [se sw s ne] + n swampa [se sw s ne] + n swamp4 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swampa n swamp4 [se sw s ne] + n swamp2 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swampb n swampc [se sw s ne] + n swamp4 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swampc n swampd [se sw s ne] + n swamp5 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swampd n swamp7 [se sw s ne] + n swamp3 se sw s ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + dd 1050 d jump + 490 swamp +swamp7 n swamp1 se s sw ne + n spstre nw + n pond1 e out + n rapids n + n sfrst2 w + 114 d jump + 490 swamp +pond1 n rapids nw out + torch ydead3 n ne e se s sw w in swamp + n swamp1 n ne e se s sw w in swamp +beach forced yrdead + n fortun in e + n bch2 s + 214 n + pegasus 467 w sw nw + tub 468 w sw nw + marble 469 w sw nw + rug 470 w sw nw + beast 471 w sw nw + nanny 660 w sw nw + boat sea1 nw w sw + 215 nw w sw +fortun n bch1 out w + grate smuggl u e in + 85 u e in +smuggl grate fortun d w out + 85 d w out +bch1 forced beach +bch2 forced beach2 +beach2 forced dead16 + n bch1 n + pegasus 467 w sw nw + tub 468 w sw nw + marble 469 w sw nw + rug 470 w sw nw + beast 471 w sw nw + nanny 660 w sw nw + boat sea1 w sw nw + n srock1 s + 215 nw w sw + pegasus 472 e in + beast dead27 e in + parachute bwfall e in + dd 1052 e in +sea1 rain sea2 n nw w sw s + fish sea2 e se ne sw s + rain bch2 e + rain srock1 se + rain bch1 ne + dd 1053 n ne e se s sw w nw +sea2 rain sea1 ne e + rain sea3 n nw + rain sea4 w sw s + fish sea4 se + rain srock2 se + dd 1053 n ne e se s sw w nw +sea3 rain sea2 e se + rain sea4 s + rain sea6 sw + fish sea2 e se s sw n + rain sea14 n + n dead20 nw w ne + dd 1053 e se s sw n +sea4 rain sea6 w + rain sea3 n + fish sea2 se + rain srock3 se + rain sea5 s + rain sea2 e ne + n dead20 nw sw + dd 1053 n ne e se s sw w nw +sea5 fish sea4 e ne + rain inlet e + rain srock3 ne + rain sea4 n + rain sea6 nw + rain sea15 w + n dead20 sw s se + dd 1053 n ne e nw w +sea6 rain sea4 e + rain sea3 ne + rain sea5 se + rain sea15 sw + fish sea4 w + rain vrocks w + n dead20 n s nw + dd 1053 e w ne se sw +sea7 rain vrocks ne + rain sea8 nw + rain sea15 se + n dead20 n e s sw w + dd 1053 ne nw se +sea8 torch dead40 n ne e se s sw w nw + rain sea7 se + rain sea9 ne + n dead20 n nw e s sw w + dd 1053 se ne +sea9 rain sea8 sw + rain sea10 n + n dead20 ne e se s w nw + dd 1053 sw n +sea10 rain sea9 s + rain slope1 n + n dead20 ne e se sw w nw + dd 1053 s n +sea11 rain beach4 ne out + rain beach3 se + rain jetty e + rain sea12 s sw + rain sea13 w nw + rain dead20 n + dd 1053 n ne e se s sw w nw out +sea12 rain beach3 e se ne out + rain sea11 n + rain sea13 nw w + rain sea14 sw + rain dead20 s + dd 1053 n ne e se s sw w nw out +sea13 rain sea11 e ne out + rain sea12 se + rain sea14 s sw + rain dead20 n w nw + dd 1053 n ne e se s sw w nw out +sea14 rain sea13 n + rain sea12 ne out + rain sea3 s + rain dead20 e se sw w nw + dd 1053 n ne s out +sea15 fish sea5 n nw + rain vrocks n + rain sea7 nw + rain sea6 ne + rain sea5 e + rain sea16 s + n dead20 se sw w + dd 1053 n nw ne e s +sea16 fish sea15 s + rain sea15 n + rain woe1 s + dd 1053 n s + n dead20 ne e se sw w nw +woe1 -64 s + pegasus 467 n ne e se sw w nw + tub 468 n ne e se sw w nw + marble 469 n ne e se sw w nw + rug 470 n ne e se sw w nw + beast 471 n ne e se sw w nw + nanny 660 n ne e se sw w nw + boat sea16 n ne e se sw w nw + 511 n ne e se sw w nw +woe2 -65 n + pegasus 467 ne e se s sw w nw + tub 468 ne e se s sw w nw + marble 469 ne e se s sw w nw + rug 470 ne e se s sw w nw + beast 471 ne e se s sw w nw + nanny 660 ne e se s sw w nw + boat sea16 ne e se s sw w nw + 511 ne e se s sw w nw +beach3 n scrubs e u out swamp ne + n beach4 n + 214 s se + pegasus 467 nw w sw + tub 468 nw w sw + marble 469 nw w sw + rug 470 nw w sw + beast 471 nw w sw + nanny 660 nw w sw + boat sea11 nw + boat sea12 w sw + 604 nw w sw +beach4 n beach3 s + n scrubs se out swamp + n rail1 e + n stslop ne u + 214 n + n jetty w + pegasus 467 nw sw + tub 468 nw sw + marble 469 nw sw + rug 470 nw sw + beast 471 nw sw + nanny 660 nw sw + boat sea11 nw sw + 604 nw sw +jetty n beach4 e ne se out swamp + pegasus 467 nw w sw n s + tub 468 nw w sw n s + marble 469 nw w sw n s + rug 470 nw w sw n s + beast 471 nw w sw n s + nanny 660 nw w sw n s + boat sea11 nw w sw n s + 604 nw sw w s n +fslop1 n nfrst1 s u out swamp + n nfrst2 se + n fslop2 e + n fslop3 w + n nfrst4 sw + wood 0 n ne nw d + n sdale n ne nw d +fslop2 n nfrst2 s u out swamp + n fslop1 w + n nfrst1 sw + wood 0 n ne nw d se + n ogrnds ne n d + n sdale nw + n nhill2 se + 51 e +fslop3 n nfrst4 sw s u swamp + n nfrst1 se out + n fslop1 e + wood 0 ne + n sdale ne + n dcliff n nw d + 51 w +sdale n fslop1 u s out swamp + n fslop2 se + n ogrnds e + n cuttin ne + n forist n + n wdale nw + n dcliff w + n fslop3 sw +ogrnds n fslop2 sw s u out swamp + n mosolm se in + 602 e + n efrst1 ne n + n cutting nw d + n sdale w +mosolm n ogrnds nw out swamp u + tomb1 ntomb n + tomb2 wtomb w + tomb3 stomb s + tomb4 etomb e + tomb5 setomb se + tomb6 swtomb sw +ntomb n mosolm s o swamp +wtomb n mosolm e o swamp +stomb n mosolm n o swamp +etomb n mosolm w o swamp +setomb n mosolm nw o swamp +swtomb n mosolm ne o swamp +dcliff 51 sw + 52 w + wood 0 jump e ne n d nw + beast 474 jump + parachute beach3 jump + 603 jump + n fslop3 se s out swamp u + n sdale e + n wdale ne + n scrubs n d nw +scrubs n dcliff s se u out swamp + n wdale e ne + n rail1 n + n beach4 nw d + n beach3 w sw +wdale n sdale s se out up swamp + n forist e + n rail2 ne + n rail1 n nw + n scrubs w d + n dcliff sw +forist n sdale out up s swamp se sw + n cuttin e + n rail3 ne + n rail2 n + n rail1 nw + n wdale w d +cuttin n ogrnds s se u out swamp + n efrst1 e + n rail4 ne + n rail3 n d + n rail2 nw + n forist w + n sdale sw +efrst1 n ogrnds s sw u out swamp + n rail4 n + 602 se e ne + n rail3 nw + n cuttin w d +rail1 n wdale s out swamp u + n forist se + n rail2 e + n ndale ne + n stslop n + n beach4 nw w d + n scrubs sw +rail2 n forist s u out + n cuttin se + n rail3 e + n ndale n ne nw + n rail1 w + n wdale sw swamp +rail3 n cuttin u s out swamp + n efrst1 se + n rail4 e + n paddck ne n + n ndale nw + n rail2 w + n forist sw +rail4 n efrst1 s u out swamp + 602 se ne + n emine d e in + n paddck n nw + n rail3 w + n cuttin sw +emine n rail4 w u out swamp + n main1 d e in +main1 n emine w u out swamp + n main2 d e in +main2 n main1 w o swamp + flood shaft1 n + n valvrm u e + flood main3 se d in + 733 n se d in +platfm door shed n in + 50 n in + n shaft2 e u + n valvrm w d out +shed door platfm s o + 50 s o +valvrm n platfm u e in + n main2 d w o +shaft2 n platfm w o d + n minor5 u n in +shaft1 n main2 s o u + n minor1 e in d +main3 n main2 nw u o + n main4 e in + n main5 sw d +main4 n main3 w o u + n shaft3 e in + n main6 s d +shaft3 n main4 w u out + n minor7 d s in +main5 n main3 ne u o + n main7 s d in +main7 n main5 u o n + e dpass1 s d in + 750 s d in +dpass1 n main7 u o n + n dpass2 ne in d +dpass2 n dpass1 sw u + n dpass3 ne o + n dpass5 s d + n sectn se +dpass3 n main6 n o u + n dpass2 sw + n dpass4 se +sectn e dpass2 nw u in + e dpass4 e o d + 750 nw u in e o d +dpass5 n dpass2 n u o + n dpass6 se in d +dpass4 n dpass3 nw u o + n dpass6 sw in d + n sectn w +dpass6 n dpass5 nw u + n dpass4 ne o +main6 n main4 n u o + e dpass3 s d in + 750 s d in +minor1 n shaft1 w u o + n minor2 d e in + e crrm sw + 750 sw +minor2 n minor1 w u out + n face1 e + n minor3 d s in +face1 n minor2 w u out +minor3 n minor2 n u o + n shaft4 s d in +shaft4 n minor3 n u o + n tightp s d in +tightp n shaft4 n u o + n face4 s d in + n edwrlm e +face4 n tightp n u o +crrm n minor1 ne u o + n doomrm w in d +doomrm 751 u leap o +edwrlm n tightp w u out + n panora se in d +minor5 n shaft2 s o d + n sidpsg n + n minor6 e in +minor6 n minor5 w u out + n face2 e + dd 1054 s d in +face2 n minor6 w u out +sidpsg n minor5 s u o +minor7 n shaft3 n u o + n minor8 s d in +minor8 n face3 e + n minor7 n u o + e peril1 s d in + 750 s d in +face3 n minor8 w u out +peril1 n minor8 n u o + n peril2 sw w s +peril2 n peril1 n ne o + n peril3 e +peril3 n peril1 n nw o + n peril2 w + n peril4 sw +peril4 n peril2 nw + n peril1 n o + n peril3 ne + n peril5 s +peril5 n peril4 n o + n peril3 ne + n peril2 nw + n ledge1 s +ledge1 n ledge2 e in + n bldg leap + e peril5 n o + 752 u + 750 n u o +ledge2 n ledge1 w o + n ledge3 e in + 752 u + n bldg leap +ledge3 n ledge2 w o + 752 u + n bldg leap +bldg f dead43 + n dwpst1 s o + 752 u n ne e se sw w nw +boledg f bldg +ufrst1 n dwpst1 w sw o + n ufrst5 se e + 752 nw n ne + 753 s u +dwpst1 n boledg n + n panora sw u o + n befcit s + n ufrst1 se e + 752 nw ne +befcit flood dwpst1 n ne nw + n topcit e u + flood dwpst2 se s + flood panora sw w nw o + 949 n ne nw se s sw w nw o +dwpst2 n befcit n ne + n ufrst2 e + n ufrst3 se s + n panora nw u o + 752 sw w +panora dwarfs 0 nw u o + n edwrlm nw u o + n dwpst1 ne + n befcit e in + n dwpst2 se d +ufrst3 n dwpst2 n o + n ufrst2 ne + n spring se + 752 e s sw w nw +spring n ufrst3 nw o + 752 n ne e se s sw w +ufrst2 n dwpst2 w nw o + n ufrst3 sw + n ufrst5 e ne + 753 n u + 752 se s +topcit n befcit w d o leap + gate entrnc e in u + 754 e in u +entrnc n dwstep e d in leap + gate topcit w o + 754 w o +dwstep dwarfs dwhall e d in leap + door dwhall e d in leap + 50 e d in leap + n entrnc u w o +dwhall n lowps1 n + n lowps5 e + n guard1 s + dwarfs dwstep w o u + door dwstep w o u + 50 w o u +lowps1 n lowps2 n + n dwktch e + n dwhall s o + dwarfs dwfood w in + door dwfood w in + 50 w in +lowps2 n dwroom n + n lowps3 e + n lowps1 s o + dwarfs dwstre w in + door dwstre w in + 50 w in +lowps3 n dwbog ne u + n dwcant e in + n lowps2 w o +dwfood dwarfs lowps1 e o + door lowps1 e o + 50 e o +dwstre dwarfs lowps2 e o + door lowps2 e o + 50 e o +dwroom n lowps2 s o +dwbog n lowps3 sw o d +dwcant n lowps3 w + n lowps4 s + dwarfs dwktch sw o in + door dwktch sw o in + 50 sw o in +dwktch n dwpit n in d leap + n lowps1 w o + dwarfs dwcant ne in + door dwcant ne in + 50 ne in +dwpit n dwktch u o s leap +lowps4 n dwcant n + dwarfs dwrm1 s o in + door dwrm1 s o in + 50 s o in +dwrm1 n lowps5 w o + dwarfs lowps4 n in + door lowps4 n in + 50 n in +lowps5 n dwhall w o + n dwrm1 e in + n lowps6 s +guard1 n dwhall n o + n dwrm2 se + dwarfs dwrm2 s in + door guard2 s in + 50 s in +guard2 dwarfs guard1 n o + door guard1 n o + 50 n o + n lowps7 s + n wpnstr w in +wpnstr n guard2 e o +lowps7 n guard2 n o + n guard3 s + dwarfs guard2 w in + door minrm w in + 50 w in +minrm n guard4 s in + dwarfs lowps7 e o + door lowps7 e o + 50 e o +guard4 n minrm n o + dwarfs minrm s in + door kingrm s in + 50 s in +guard3 n lowps7 n o + dwarfs kingst s in + door kingst s in + 50 s in +kingrm n kingst e + dwarfs kingst n o + door guard4 n o + 50 n o + n kqdorm sw in +kqdorm n kingrm ne o in +kingst n kingrm w + dwarfs kingrm n o + door guard3 n o + 50 n o + n lowps8 s +lowps8 n kingst n o + dwarfs ktreas e in + door ktreas e in + 50 e in +ktreas dwarfs lowps8 w o in + door lowps8 w o in + 50 w o in +lowps6 n lowps5 n o + n dwrm3 e + dwarfs dwrm2 s in + door dwrm2 s in + 50 s in +dwrm2 n guard1 nw o + dwarfs lowps6 n in + door lowps6 n in + 50 n in + n dwrm4 s +dwrm3 n lowps6 w o + dwarfs dorm s in + door dorm s in + 50 s in +dorm n odorm s + dwarfs dwrm3 n o in + door dwrm3 n o in + 50 n o in +odorm n dorm n o + dwarfs lowps9 s in + door lowps9 s in + 50 s in +dwrm4 n dwrm2 n o + n lowps9 e + dwarfs kdorm s in + door kdorm s in + 50 s in +lowps9 n dwrm4 w o + n pdorm s + dwarfs odorm n in + door odorm n in + 50 n in +kdorm n pdorm e in + dwarfs dwrm4 n o + door dwrm4 n o + 50 n o +pdorm n lowps9 n o + n kdorm w +ufrst5 n ufrst1 nw o + n ufrst2 sw + 753 w u + 752 n ne e se s +stslop n rail1 s se out swamp + n ndale e + n nfrst5 ne n u + n beach4 nw w sw d +ndale n rail2 s swamp out d + n rail3 se + n paddck e + n nfrst7 ne + n nfrst6 n u + n nfrst5 nw + n stslop w + n rail1 sw +paddck n rail4 s se + 602 e + n ruin ne + n nfrst7 n u + n nfrst6 nw + n ndale w + n rail3 sw d swamp out +splair sptrap ruin o +ruin arachnid splair n ne e se s sw w nw u d in o swamp jump + web paddck s sw out swamp d + web nfrst7 nw u w n + 940 s sw o swamp d nw u w n + 602 se e ne +nfrst5 n stslop s out d swamp + n ndale se + n nfrst6 e + 51 ne n nw w u + n beach4 sw +nfrst6 n ndale s d out swamp sw + n paddck se + n nfrst7 e + 51 ne n nw u + n nfrst5 w +nfrst7 n paddck s out swamp d + n ruin se e + 602 e ne + 51 n nw + n nfrst6 w + n ndale sw +hdland n ifrst5 nw u + n cove n d + boat dead30 ne e se s sw w + 510 ne e se s sw w +cove n ifrst4 n u + n fring nw w + n ifrst5 sw + n hdland s + boat dead30 ne e se d + 510 ne e se d +ifrst1 n ifrst2 n + n slope1 e ne u + boat dead30 se s sw w nw d + 510 se s sw w nw d +ifrst2 n ifrst3 n + n slope4 u + n slope3 ne + n slope1 e + n ifrst1 s d se + boat dead30 sw w nw + 510 sw w nw +ifrst3 n ifrst6 e u + n slope4 se + n ifrst2 s d + boat dead30 sw w nw n ne + 510 sw w nw n ne +ifrst4 n rost n u nw + n cove s d + n fring sw + n slope2 w + boat dead30 ne e se + 510 ne e se +ifrst5 n fring n + n cove ne e + n hdland se + n slope1 w nw u + boat dead30 s sw d + 510 s sw d +slope1 n slope2 n u + n fring ne + n ifrst5 e se + n ifrst2 w + n slope3 nw + n ifrst1 sw + pegasus 467 s d + tub 468 s d + marble 469 s d + rug 470 s d + beast 471 s d + nanny 660 s d + boat sea10 s d + 511 s d +fring n ifrst4 ne + n cove e se d + n ifrst5 s + n slope1 sw w + n slope2 n u nw +rost n ifrst4 s + n slope2 sw + lizard slope4 d in + slab brost d in + n slope4 d + n ifrst6 w + 512 ne n nw e se + parachute dead31 jump + dd 1055 jump +brost n rost u out + container 983 d sw in + pointer 983 d sw in + violinbow 983 d sw in + sword dtest1 d sw in + dd 1056 d sw in +dtest1 scythe dtest2 d sw in + dd 1057 d sw in + n brost u out ne +dtest2 546 u out +dtest3 door treasc n out in swamp + 50 n out in swamp +dtreas n rost u out +slope2 n rost n ne u + n ifrst4 e + n fring se d + n slope1 s sw + n slope3 w + n slope4 nw +slope3 n slope4 nw n u + n slope2 e ne + n slope1 se s + n ifrst2 sw w d +slope4 n ifrst6 n ne + n rost u e + n slope2 se + n slope3 s + n ifrst2 sw + n ifrst3 w nw d +ifrst6 n rost e u se + n slope4 s sw + n ifrst3 w d + boat dead30 nw n ne + 510 nw n ne +srock1 n bch2 n + n srock2 s + pegasus 467 nw w + tub 468 nw w + marble 469 nw w + rug 470 nw w + beast 471 nw w + nanny 660 nw w + boat sea1 nw + boat sea2 w + dd 1058 ne e se sw w nw +srock2 n srock1 n + n srock3 s + pegasus 467 w sw nw + tub 468 w sw nw + marble 469 w sw nw + rug 470 w sw nw + beast 471 w sw nw + nanny 660 w sw nw + boat sea2 nw + boat sea4 w sw + dd 1058 ne e se sw w nw +srock3 n srock2 n + n inlet se + pegasus 467 w sw nw s + tub 468 w sw nw s + marble 469 w sw nw s + rug 470 w sw nw s + beast 471 w sw nw s + nanny 660 w sw nw s + boat sea4 nw + boat sea5 w sw s + dd 1058 ne e s sw w nw +inlet n srock3 nw out + pegasus 467 w sw + tub 468 w sw + marble 469 w sw + rug 470 w sw + beast 471 w sw + nanny 660 w sw + boat sea5 w sw + n nest u e + 214 n ne se s +nest n inlet d jump w out +vrocks pegasus 467 e se ne out sw s + tub 468 e se ne out sw s + marble 469 e se ne out sw s + rug 470 e se ne out sw s + beast 471 e se ne out sw s + nanny 660 e se ne out sw s + boat sea6 e se ne out + boat sea7 sw + boat sea15 s + boat dead20 w nw + 511 e se ne out w nw s + dd 1058 sw + n deck n u +crow n deck d e out + dd 1059 jump +deck n stpoop e + n hold d + n vrocks s out + n capt ne in + n crow u w +stpoop n deck d w out + n poop u e in +poop n stpoop d w out +capt n deck sw out + n galley d in +galley torch dead37 d in + n proom d in + n capt u out +proom n galley u out +hold n deck u out +bwfall parachute bch2 out w + dd 1052 out w + n spiral e u +spiral n bwfall d out w + n vert u in +vert n spiral d out + n revrm u in e +revrm n vert d out w + crack fossrm e in + n revps n in +revps n revrm s out + n grotto n in +grotto n revps s out + ~parachute beach jump + -13 jump + 52 w nw sw +fossrm crack revrm w out +root n wfrst1 u out + rootview rtun1 n + 157 n + n tunnel s +altar rootview rtun2 s out + 157 s out + n antech e in +rtun1 torch ydead1 n in out s + rootview rtun2 n in + rootview root s out + 156 s n in out +rtun2 torch ydead1 s n in out + rootview rtun1 s out + rootview altar n in + 156 s n in out +antech n altar w out + door temple e in + 221 e +temple door antech w out + n hchamb in n + 213 e u + 221 w out +hchamb n temple s out +tunnel n root n out + n lgrm se +lgrm n tunnel nw out + n estlpl w + n wolfrm e + tub 60 s d + n sloptn s d +wolfrm n lgrm w out + wolf deathp d in e + 230 d in e +deathp n wolfrm u out w + crucifix diamnd d e in + n cinder d e in +cinder n deathp u w out + door hotpas e in +diamnd n deathp u w out + door hotpas e in +hotpas door cinder w out + n firept in e +firept n hotpas w out + dd 1060 d jump +estlpl n lgrm e out + pool wstlpl w in + dd 1061 w in +wstlpl pool estlpl e out + dd 1061 e out +level tub 60 n u out + n sloptn n u out + n mudrm s d in +mudrm n level n u out + mud schamb e in +sloptn n level s d + n lgrm n u out +schamb mud mudrm w out +tombrm tomb maze25 u out + statue rottrm s in + dd 1062 s in +rottrm n tombrm n out + n cavein w in +cavein statue rottrm e out + dd 1062 e out + e temple d w + 212 d w +ydead1 n ydead3 n +dead10 n dead11 n +ydead3 n ydead4 n +yrdead n ydead1 n +dead16 n dead19 n +dead11 n dead15 n +dead15 n dead16 n +ydead4 n ydead5 n +ydead5 n ydead8 n +ydead8 n dead10 n +dead19 n dead20 n +dead20 n dead23 n +dead23 n dead27 n +dead27 n dead28 n +dead28 n dead29 n +dead29 n dead30 n +dead30 n dead31 n +dead31 n dead33 n +dead33 n dead34 n +dead34 n dead37 n +dead37 n dead39 n +dead39 n dead40 n +dead40 n dead41 n +dead41 n dead43 n +dead43 n yrdead n +*text 1600 +@txttxt +15 *HINTS: + If you want to see underground, light a stick from a fire. + If you want to score points for treasure, drop it in the swamp. + The swamp can be found by typing SWAMP outside until you reach it. + OUT normally moves you in the direction of the start. + If you're carrying a lit stick, look out for marsh gas. + Just type the answers to the mausoleum questions straight, eg 45. + Brollies make good parachutes. + Dryads are combustible. + The shrine, hallowed chamber and ancient chamber are good places in + which to meditate. + Beggars deserve to be kicked. + If you think these hints can be improved, type SUGGESTION and say + what you think's wrong. +50 The door's shut, can't you see you berk? +51 The forest becomes too dense to go any farther. You give up and turn + back. +52 As you approach the edge of the cliff the rock starts to crumble. + Hurriedly you retreat as you feel the ground begin to give way under + your feet! +53 You can't fit through that small serving hatch! +54 There's a whopping great big stone wall in the way! +55 The water here is flowing too fast for you to ford the river safely. +60 The barrel is too wide to fit through the opening. +61 The barrel upturns and smashes, but its contents have mysteriously + disappeared... +62 The reddish water splooshes out of the barrel as you drop the thing, + but seeps into the earthy walls at an alarming rate, and is soon gone. + Very little goes down the steps. +63 The water splooshes out of the barrel when you let it go, and laps up + against the porous walls. You suddenly become witness to an incredible + sight as the dry mud absorbs the water incredibly quickly, and falls + off to join the general mud on the floor. A short while later, a small + chamber to the east can be seen which was previously obscured by its + bizarre covering. +64 The barrel's smashed remains crash loudly to the floor. +65 The east wall sounds hollow. +66 The mud is incredibly hard, as if baked on, and will not yield to any + of your attempts at breaking it. +69 The mud is too gooey to carry around. It's useless even if you could! +70 The gooey mud makes a squelching sound... +71 The dryad wails in agony as your axe bites deep into its trunk, and + flails its branches around desperately trying to keep you off. Your + chop, however, was sufficient to finish it, and it crashes to the + ground and disappears whence it came. +72 The dryad instantly falls back, but too late and your torch takes + hold. A few seconds later, all that remains is the smouldering ash + that once was alive, then this, too, disappears whence it came. +73 The climb is too tight and precarious for you to be able to drop + anything here. +74 The conch emits a low reverberation, but it's not very loud. +75 The conch emits a low reverberation, which resonates with the + sound of the waterfall. As you blow harder, it gets louder until + it becomes almost deafening, then suddenly there is a tremendous + > CRACK < and the east wall of the room splits apart to reveal + a dark, eerie room. +76 The conch emits a low, but loud, reverberation. +77 From the end of your wand leaps a particularly vicious bolt of + vivid green lightning, which strikes the dryad with a hollow crack. + A trice later, and nothing remains of the unfortunate creature... +78 The beggar senses that you are about to zap him and leaps up to + defend himself. However, the electric glow which dances from the + end of your wand soon puts an end to his wretched life, and his + smouldering rags are the last evidence of his time in the Land... +79 The tomb is too stiff to open directly. +80 With your combined strength, the grate slides open. +81 The grate is already open, dunderhead! +82 Pushing and heaving together, you slide the grate shut. +83 It's already shut! Take a look if you don't believe me! +84 The grate is too difficult to open or close alone, get someone to help + you. +85 The grate is slid closed, try opening it... +86 Ughhh... +87 From the end of your rod flashes a scarlet ray of immense power. You + shield your eyes from the incredible intensity, and when you next + look, the tree has been felled. +89 The door is too strong to break, even when you use the weapon. +102 You wave the rattle to and fro and it makes a rattling noise! +104 With a great deal of effort you make the bed. +105 Chop, chop, chop . . . >creak< >groan< . . . >crack< + "TIMBERRRRRRRRRR" with a tremendous >CRASH< the aged tree falls + majestically to the ground. As the dust settles you notice that the + stump of the Yew is hollow, but the shadows are too deep for you to + see far down the hole. It looks descendable though... +106 A hollow sound reverberates from the trunk of the tree. +107 OK, it's unfurled. +108 OK, it's furled. +111 With the most earshattering squealling and groaning the top of the + tomb slides to one side. Revealing a staircase.. +112 The tomb is already open, stupid! +113 The tomb shows no signs of activity. +114 The ground is too hard for the swamp to swallow you up here. +120 The weather has swollen the river and you cannot cross! +116 You can't climb bushy trees like yews! Maybe you could from INSIDE... +117 The ox mechanistically lows a loud "MOO". +118 The beggar moans as your foot smashes into his face. +119 The beggar wants people to feed him with food, not make token gifts + of paltry goods the wretch finds useless. +167 The beggar eagerly accepts your food, then drops it in astonishment as + the individual potatoes turn to gold in his hands! "Praise the gods, a + miracle!" you think, hastily pushing the beggar out of the way and + collecting the treasure. "I preferred them before," thinks the beggar, + sorrowfully. +121 The ox is dead. +122 The ox isn't hungry, it just wants a bit of love. +123 Oxen are renowned for their dislike of suspicious herbs... +124 The eye loosens in its socket and tumbles out. +125 The gods don't appear to be listening. +126 With a great deal of fun you unmake the bed. +127 A dazzling ray sparks in a multitude of brilliant colours from the + end of your wand, and the door is blasted to oblivion. The doorway + itself is now passable. +128 Everything around you grows hazy, and merges into a swirling display + of magical colours and shapes, and you feel your wand slip from your + hand. Suddenly, the vivid chromatic opaqueness clears, and you + re-materialise... +129 Just because there's a window there, it doesn't mean you have to go + jump out of it, clod! +130 It was a very old ox and hadn't long to live anyway. +133 It's already dead you steaming great nit! +134 The ox isn't in a condition to eat at the moment... +135 The tree won't chop any further. Sorry if you were trying to make + brands out of it, but it wouldn't burn anyway (it may be hollow, but + it's still got lots of resin in it). +136 chop, chop, chop . . . >creak< >groan< . . . +137 The tree is felled so climbing it is rather pointless... +138 The pool starts freezing over the instant your icicles make contact. + As it hardens, it expands, but not enough to do any damage. The way + across is now safe. +140 In these parts, it is too dangerous to swim in flowing water. A more + likely place would be a pool, perhaps underground. +141 Worship in these parts is customarily conducted near idols, usually + their eyes if there are precious stones there. +142 This is a MASSIVE idol! Worshipping it from here isn't good enough! Go + up the steps you buffoon! +143 THE STAIRS GO NO FURTHER! Read the description, stupid! +144 The ox lows a loud "MOO" as you grab it by the horns and start + dragging it. +145 The ogre leaps up to pound you with his club, but doesn't understand + axes and you hack him to pieces. +146 The ogre grabs hold of the leg and starts gnawing at it ferociously. +147 The ogre glares at you and snarls. Ogres only eat dead flesh... +148 The ogre isn't in a mood to accept at present... +149 A brilliant flash of lightning erupts from the end of your wand and + strikes the ogre in its chest. The smell of burned ogre fills the room. +150 "To be sure, I'm not hungry!" quips the leprechaun. +151 As you attack the leprechaun your blow goes straight through him + without so much as harming his green tunic. "Bejabers, mortal weapons + can't hurt the loikes of me!" he exclaims. +152 "I hope you'll be keeping your eyes off my gold, beghorra!" says + the leprechaun, preventing your removal of his treasure. +153 Kicking and screaming wildly the leprechaun attempts vainly to + escape from your grasp. "'Tis not fair!" he wails as you tuck him + under your arm out of the way. +154 A dazzling red beam of light shoots from the end of your wand, and + when you look again the leprechaun has disintigrated quite noticibly! +155 The windows are to provide light for you, not a vehicle for suicide + attempts! The window is much too small in this room anyway... +156 You find your way blocked after a sudden fire and cave-in. +157 The way is blocked after a fire lead to a cave-in, twit... +159 You put your foot into the pool, but are suddenly stung with pain and + withdraw quickly. The water seems very hot, although not boiling. +160 How can you swim pools frozen over solid? You have some STRANGE ideas... +161 The cupboard opens off its latch. +162 There isn't a latch this side of the cupboard, and you find you can't + open it! Someone outside will have to do it. +163 The cupboard swings to, and latches itself shut. +164 To go up or down, say u or d. Do you think we put in commands like + this for nothing?! +166 The cupboard is latched already, it won't latch any more! +165 The cupboard is open already if you hadn't noticed... +190 You need an axe (or wand) to fell a tree. +170 Try as you might, some strange magical force appears to prevent your + removing either the bed or the bedclothes, although you could + probably re-arrange the sheets if you wished. +173 The mattress of the bed is very hard and uncomfortable, so you get + off it almost straight away. +174 Waving the brand causes it to go out. +175 Closer examination of an object does not reveal further information + about it. You'll have to use your wits! +176 Oxen are beasts of burden. They leave giving rides to animals like + horses and donkeys. +178 The icicle melts and soon evaporates. +179 The pool is too large to melt even partly. +180 The ox is very old, I'm afraid, and you soon realise that it would + be as tough as old boots were you to attempt to eat it. +181 The tree has only recently been felled, so unfortunately you can't + set it alight. +182 Living yew trees don't catch fire that easily above ground, I'm + afraid! +191 When you put the head in place, a trapdoor opens in the floor! +192 The head is already on the wall, fool. +193 As you take the head, the trapdoor in the floor closes. +194 The head is fixed to the wall, but you could take it off if you + said so... +195 The trapdoor leading up to the hut seems to be locked by some means. +196 The river flows from under the mountain here, so you can't follow it. +197 The eye appears to be fixed into its socket, and refuses to come + loose. +198 The tunnel is too small to turn round in, so you can only move forwards. +199 You can't go in there taking along an ox! +200 You can't get the pillar through there! You'll have to take the ladder. +201 The pillar is too big to take with you through the crack. +202 With your combined strength, the portcullis raises! +203 It's already up, you imbecile! +204 It's too difficult for one person to lift. You'll have to get someone to + help you, from the same side. +205 Silently, the portcullis glides shut. +206 It's already closed! Do you want to slam it through the floor or + something?! +207 The equipment falls into the room below, and lands almost immediately. +208 If the tunnel has collapsed it means you can't enter. I'm saying this + because it seems you haven't the mental capacity to understand the + description given when you LOOK. Idiot. +209 What kind of an idiot ARE you? We don't have that sort of thing + going on in THIS Land! Since wolfsbane isn't designed to be smoked + you come out of it feeling pretty ill, too. Fortunately, this is a magic + herb and regenerates itself. Now this time do something sensible with + it, you dope... +210 You can't pick up a carpet like that! You'll have to roll it up first. +211 The carpet slowly rises into the air, and the colours of your + surroundings blend together in a flood of bright ribbons and + streaks. A second later, and you materialise once more. +212 You'll have to drop everything you're holding before you can + get down that chute! +213 I do beg your pardon for not making the description clearer: THE + CHUTE IS IMPOSSIBLE TO ASCEND. Better? +214 The beach is cut off by the sea and cliff that way, forming a cove. +215 The sea is that way, and it's too far to the wreck to swim. Looks like + you'll have to find a boat... +216 Your carpet rolls up easily. +217 It's already rolled up! +218 Your carpet unrolls. It doesn't look as valuable in this state. +219 Take another look, pal, it's already unrolled... +220 The door isn't open, you blithering idiot. SOME people... +221 It's a CRIMSON door, not an OPEN one. +222 You can't make something freeze something else. Try dropping the + icicles into the pool instead... +224 You'll have to fix it onto the wall first. +225 For some strange reason you find yourself unable to get any treasure + here. There may be some confusion in this room as to whether certain + items are treasure or not (hint hint). Try getting stuff individually... +226 Some magical force drags the ring back to the floor irresistibly as + you try to take it. +227 The ancient fossil slides into the brass ring, and disappears as you + watch. The ring then transmutes to gold before your eyes, and becomes + incredibly beautiful. The magic holding it to the floor goes too! Looks + like you're in luck, chum! +228 The wand gives a perfunctory >PHUT< and disappears. To save you from + wondering, it was the firestone it didn't like... +229 You need a magic wand with which to zap things, and you've not got + one so nothing happens. +230 As you attempt to enter the passage, the wolf snarls, menacingly. + Hastily you retreat, as the straggled, grey hair of the mangy beast + rises up on its neck as a sign of anger. +231 The wolf shies away from you the instant you produce the herb. The + next moment, it bays a terrible "AAAOOOOOOHHHH" and disappears! +232 The wolf devours your wand... +233 The wolf is a carnivore, which means it's more interested in eating + YOU... +234 You don't honestly believe a beast as murderous as a wolf is going + to go for walkies do you? Sigh... +235 The wand waves, but nothing magical happens! Perhaps you have something + else magical which the wand dislikes? Or could it be somewhere nearby? + (I'd better not say any more or I'll be telling you what it is...). +236 You wave furiously but no-one waves back... +237 The ox mechanistically explodes a loud "BOOM". +238 An intense white glow sprays from the end of your wand, and when + it stops you discover that the portcullis has exceptionally vapourised. + The air around you, however, seems to grow thin, and the scene fades + away as some necromantic side-effect teleports you through space, and + you re-materialise...somewhere... +239 The grate glows white as an infra-red ray generated by your wand + causes it to heat immediately. A second later and it is gone - and + so are you (to the fitted cupboard). +240 () GLOOP (). The fiery pit consumes anything which is dropped in it. +241 The pit may be fiery, but you can't ignite anything from it because + the flames flash away too quickly. +243 You've got to be or have been an Enchanter to be able to use such + a powerful magical feature of the wand. Since you're not that + experienced yet, nothing happens. +244 You need a pen to be able to write. +246 Your message is written into the logbook, but the pen falls apart + afterwards. You feel proud to have left your mark on The Land. +247 Very pretty, I am sure... +248 Fortunately, a sudden attack of common sense prevents your drowning + yourself by getting rid of the boat whilst at sea... +250 How do you propose to blast something which hasn't got a fuse? Nothing + happens... +251 >< KAPOW >< + The door is no more! Neither is the powder for that matter... +252 The gunpowder gives a fizz but nothing else happens. +253 What?! Blasting things when there's gunpowder here with no fuse in it? + You're taking a risk! Fortunately, the gods inform you of the + suicidal outcome of your act and refrain you from doing it. Good of + them, isn't it? +254 The fuse fixes itself in so hard that it is impossible to remove it. It + seems to be stuck to some internal flint, so that you may be able to + blast things with the powder... +255 You reach out, but suddenly the golden egg you are carrying starts to + hum, and a powerful magical force interposes between your hands and + what you wish to get. After a few seconds trying, you have to give up. +256 When you attempt to drop the egg it starts to hum, and a powerful + magical force causes your fingers to grip it all the more tightly. You + find it is impossible to drop it. +257 The egg hums, and falls into the pit with a happy () GLOOP (). +258 This is a golden egg, not a hard-boiled one. Nothing happens. +259 Nice try, but it doesn't work! If the egg is magical, it will probably + need a much greater amount of heat before it'll allow you to drop it... +260 The egg starts to hum, but figures the fire isn't hot enough for its + tastes and won't let you drop it. You'll need something a little + hotter before it will let you get rid of it. Or, of course, you could + give it to someone... +261 Someone who is no longer a novice, such as yourself, should find it + beneath themself to play with TOYS... +262 As you attempt to let go of the object, you find to your horror that + it adheres to your fingers! Try as you might, you find you cannot drop + it or otherwise rid yourself of its presence. Maybe it's something else + you're holding which is magical? You might have to give it away... +263 The ogre is already dead. Killing it again won't make the least bit of + difference. +270 The way is blocked by the sliding panel. +271 Some strange, invisible, magical barrier blocks the way, and you can't + get past it. +272 The river goes underneath the mountains (it flows east to west) and + you cannot follow it. +273 The robust door in the way easily prevents your moving in that + direction. +274 The powder has to have a fuse in it before it's any use fixing it + to the cannon. +275 The cannon is now primed. +276 The cannon is now loaded and primed. +277 You need to put gunpowder into the cannon before you can shoot it. +278 Cannons require the insertion of some spherical projectile before + they'll shoot. +279 Out from the end of the cannon flies the sphere, and it smashes into + the robust door with an almighty >| CRASH |< . When the smoke clears, + both door and sphere are gone... +280 Don't you know ANYTHING? You have to put gunpowder in these things + first! Silly! +281 The balls starts to roll away, then the platinum scrapes off and it + stops. The platinum disappears, with more than a hint at the involvement + of some sort of magic... +282 the ball is magically prevented from rolling away. +283 The door remains locked shut. +284 A ray of intense yellow light streaks from the end of your wand. After + it stops, however, the door remains intact. You notice this as you + dematerialise... +285 The fountain changes colour to yellow, and you suddenly feel more + relaxed, confident and sure of yourself than when you did before you + entered... +286 You get wet. +287 You can't open the door from this side! Read the description! +288 There's no keyhole this side of the door... +289 You can't pick up goblins! +291 The goblins surround you so that you can't escape. +292 The goblins surround you, and poke their fingers into you so that you + can't open anything because of the distractions. +293 There are so many goblins here that it looks impossible to destroy + them. Your wand starts to throb, and to glow with a deep blue light + which turns into a flashing violet. Suddenly, a scything red ray + cuts from the end and slices through all the goblins as it bites through + the air. They fall to the ground, clawing at whatever they have left for + heads, and your wand glows black with their blood. +294 You can't get a proper grip on the panel to be able to move it. +295 The panel slides... +296 It's already been slid open, idiot! +297 I appreciate your closing doors behind you, but this one's shut already. +298 The panel slides open. +299 The panel slides shut. +300 \ KAZAM / - the panel disappears! +301 Drinking when there's a barrel of putrid water here is unwise, you + might catch something! +302 OK! +303 Out from the end of the cannon flies the ball, but it misses the door + and smashes into the wall. Unfortunately, the damage to the wall is + minimal, and when the smoke clears the ball has disappeared... Next + time you'll know to shoot the door with the cannon... +304 *The scroll reads as follows: + "From beneath the crystal curtain, + Salt to west and hard to cross, + Go south to the death so certain, + Though follow me and have no loss... + South again, the danger stronger, + Once more, or you feel the spray, + Travel on that way no longer, + Southeast, else you slip away." +305 You can't read in the dark, berk. +306 The scroll ignites, and a few seconds later its ashes scatter to the + winds. +309 The quill doesn't work for some reason. +310 It's a pretty robust icicle. You'll have to melt it with a torch or + something. +311 The bunny happily disappears into the warren, and you get a warm + feeling inside that you have done something really worthwhile. +312 The bunny kicks a little, but its resistance is futile as you + bash its brains in. +313 The bunny sniffs the herb, then eats it all up. +314 Rabbits don't eat potatoes (well this one doesn't anyway!). +315 The dead rabbit falls into the hole, but not out of reach. +316 It's already been murdered! +317 You can't eat LIVE animals! Ugh! +318 It was a bit stringy, but not bad. +319 The beggar wants to be fed with food. If you've got some, try + phrasing it differently. +320 The bunny isn't hungry. +321 The rabbit's fur catches fire with astonishing speed, and a second + or two later, all that is left are charred remains which you throw + away in disgust. +322 'Fraid it's too heavy, old bean. These mariner types don't mess + around with itsy-bitsy sized notebooks, you know! +323 Out from the end of your wand flashes a blinding scarlet bolt of + power, which atomises the fiend in no uncertain terms. +324 The undead interposes itself and prevents your action. +326 The bunny suddenly turns savage and you daren't. +327 Berk. +329 There's no place to hang it. Look for somewhere with other trophies + on the wall instead. +330 You climb as far as you can, and come down again when you hit your + head on the ceiling. +331 You suddenly feel all funny, there is a puff of smoke, and to your + dismay you find that you have become female. +332 You begin to feel weird, there is a sudden flash of light, and to + your surprise you find you have become male. +333 He doesn't want to be got. +334 It dives into the pond and hides under a rock when you try to get it + and only comes back to the surface after you stop. +336 It tastes of warts. +337 All of a sudden there is a flash of deep blue light, and the frog + transforms into a handsome prince! +338 He politely tells you to clear off before he bashes you in the face. +339 There is a sudden radiance about the man, and your heart cries out + for him when suddenly he becomes hazy and disappears before you can + suggest anything else. Sobbing because of your lost love, you + nevertheless grit your teeth, forget it, and soon feel better! +340 He suddenly glows, then becomes hazy and disappears before you can + clobber him one. Your swinging sword meets thin air (and doesn't kill + that, either). +341 It's too shallow. Can't you read, you short-sighted loon? +342 The tunnel has collapsed and you can't move. +343 The creature of the night mindlessly accepts the leg, gnaws at it, then + moans a long chilling scream and disappears in a puff of green fumes. + You find the teethmarks have gone from the leg when you examine it + afterwards... +345 rabbit dropped +346 The sleeping beauty remains asleep, her enchantment unaffected by a + kiss from a female due to the witch who cast the spell noting that she + had many sisters and no brothers... +347 The sleeping beauty's eyes start to open, she sits up, yawns, kisses + you again, then there is a flash of purple light and she disappears. You + are naturally upset by this, but the kiss was so good as for you to + feel much better as a result of the experience! +348 Her eyes open, and she starts to fight back! +349 The door won't open. +350 It's too difficult for one person to lift, you'll have to get someone to + help you. +351 With your combined strength, you slide the bookcase aside. +352 It's already been opened, why don't you LOOK? +353 With your combined strength, you slide the bookcase against the wall. +354 It's already against the wall, take a look stupid. +355 The bookcase slides aside easily revealing an opening. +356 The bookcase slides up against the wall. +357 The grate slides open. +358 The grate slides closed. +360 Tap...tap...tap... +361 All of a sudden there is a swirl of magical colours, and before you + can think, a flood a bright reds and greens whirl around, then part. + You find you have been teleported somehow... +366 You find that you cannot lift the vial more than a few inches. You could + just about drink some of it though... Not that I'm trying to give + you any hints. +367 You sniff the heavenly vapour, then everything swirls about you, the + crystals disappear, and you black out. You'll be able to wake up in + ten seconds time - meanwhile you have become female! +368 You take a whiff of the divine aroma, then the crystals vanish, + everything goes black, and you pass out. You'll be able to wake yourself + in about ten seconds, but in the meantime you have become male! +369 They tasted kinda salty. +371 They're COLOURED crystals, pill-head. We don't have that sort of + substance around in THIS land! +372 The dirt comes off easily, and you find that the groats are really + made of gold and are very valuable! +373 Rub...rub...rub... Nothing happens. +376 The pancake flies into the air, spins over, and lands perfectly in + the pan, which then crumbles to dust. You get a lot of fun out of + this obvious demonstration of mankind's superiority over pancakes. +374 You pick up the pan, but the further you move it, the harder it + becomes, until you have to put it down again. You can't even + get the pancake from the pan! There is something magical about + this... +377 You try to pick up the pancake to take a bite, but it grows + incredibly heavy and you have to drop it before being able to + take a mouthfull (and probably contracting botulism). +378 You think that were you to leap then perhaps you'd splat in the sands + below unless you had a parachute. +379 The horse decides not to bother flying, since when it flies it comes + here anyway. You might try riding it instead. +380 The wand doesn't fit. Perhaps something a little smaller, like a stick? +383 You obviously haven't read the description... +384 A curious radiance surrounds the sundial, then suddenly an amazing beam + of light scythes from it and hits you square in the chest. A feeling of + power floods through your body, and when you look again, the stick in + the dial has gone. +385 The skies are too overcast to enable the sundial to cast a strong + enough shadow by which you could tell the time. +386 It's already got a brand in it, birdbrain. +387 You can't put a lit brand in there or you'll burn your hand! +388 The brand fixes solidly into the sundial, in fact so solidly that you + won't be able to take it out. It looks like the sundial will work now. +389 You can't burn sundials, stupid; they're not made out of marshmallow + you know... +390 The sundial's pointer burns away with incredible speed, until there + is just the stone part of the object left. +392 As you try to crawl down, something inside the sett claws at your face + and you are forced to retreat hastily back to the surface. +393 As you enter the glade, your axe suddenly becomes unbearably hot, and + you stagger back out of the glade, where it magically cools within an + instant. +394 The horse refuses to acquaint itself with anyone dragging along an ox. +395 The stallion flies out of reach until you stop trying to kill it. +396 The stallion grows hazy and transparent, then with a loud "NEIGH" flies + off back whence it came. +397 The stallion neighs a loud "NEIGH" as you take it by the mane and start + dragging it. +398 You get onto the back of the winged stallion, and it rears up on its + hind legs, neighs a loud "NEIGH", and flies off, passing with ease + through all interposing solid bodies. A few seconds later it lands, and + you dismount... +399 You'll have to get the horse first. +400 The horse won't let you get on its back, probably because of something + you're holding or which is nearby. +401 The winged stallion will not let you, and rears up on its hind legs + dashing its hooves perilously close to your head until you stop. +402 This isn't the proper place to bath it. +403 The gull suddenly stops moving, becomes hard, and an instant later + has changed colour too and become solid gold. +404 Nothing happens, since gold birds don't get too dirty. +405 The bird is not hungry. Few creatures in The Land are... +406 You can't feed golden birds! +407 You can't kill a solid gold bird, berk! +408 It wasn't much fun, really, it didn't put up much of a fight. +409 Fool, you'll break your teeth if you bite gold! +410 The feathers and beak weren't too tasty, but the rest was passable. +411 The bird flutters out of reach every time you try to remove a feather. +412 You can't pluck birds made of gold, imbecile! +413 The bird refuses to be dropped in the nest of an eagle. If the owner + came back it would get ripped to bits! +414 The gull refuses to allow you to drop it in such a hot place. Do you + think it's stupid or something? +415 The bird doesn't fancy diving below freshwater, but it wouldn't mind + the sea if you REALLY want to get rid of it. +416 The lion lands on its side, and points nowhere. +417 The lion lands on its base and points southeast. +418 The lion lands on its base and points northwest. +419 The lion lands on its base and points south. +420 The lion lands on its base and points north. +421 The lion lands on its base and points northeast. +422 The lion lands on its base and points southwest. +423 The lion lands on its base and points west. +424 The lion lands on its base and points east. +425 The lion lands on its base and points north. +426 The lion lands on its base and points south. +427 Are you trying to kill the poor thing? It just needs bathing, not + drowning... +428 The gull you are holding flaps its wings and creates such a fuss that + you can't enter the hut. It doesn't like the stuffed animals in there. +429 The water isn't drinkable, loon. +430 You flap you arms a bit, but cannot fly. Most normal people wouldn't + be surprised by this... +434 You reach for the cat, but the bird you are holding squawks loudly + and flaps its wings about your head until you have to stop and leave + the cat where it is. +435 The bird flies out of reach, and lands again when you give up. It + doesn't like cats, dead or alive... +437 The ivy is stuck on tightly. You can't get it, burn it, or do anything + else to it. To be honest, it's only there to make the description + better. Concentrate on the sundial instead. +438 In goblin rooms, it's difficult to define things as treasure. Get + the objects individually... +439 Out from the end of your wand springs a dazzling green ray, and out + of the wall springs an equally dazzling red one. They meet in mid-air + and obliterate one another. The wall looks to be enchanted... +440 It's no use fixing that there, try something more regular in shape + and more like a pointer. +441 You can't go in there taking a horse with you! +442 The ornament smashes into tiny shards as it strikes the floor, and + is lost forever. And don't try to pick up the shards as they're so + small you can hardly see them... +445 You can't do that unless you have the magic mirror... +446 The mirror fogs over, then clears and you can see through it... +447 The mirror cracks, and the image fades. You look at the glass and it + clouds over, turning to solid silver! +448 The mirror doesn't break. Ah well that's 7 years bad luck you won't get. +449 You can't drop the mirror while using it. Break it first. +450 You see your reflection... +451 >>>>>SPARE<<<<< +452 You aren't powerful enough yet. You must be at least a necromancer or + necromancess. +453 The hound is incensed and attacks you! +454 Your spell didn't work; a magic amulet would have helped. +455 You need to be at least a sorcerer or sorceress to employ such a + powerful artifact. +456 As you speak the final word, a demonic vibration resonates through the + amulet, and it crumbles to dust. +457 Your spell didn't work; either try again, get more points, or use the + oracle... +458 The oracle answers no more... +459 The oracle's magic is too strong for you: only enchanters, + enchantresses and above can use the device. +460 The only mirror in The Land is a magic one, which you can't steal + because of its enchantment... +461 Some unseen, diabolic force prevents your hand from being able to + write. It seems to increase the nearer you are to the libram. +462 *The libram is old, musty, and has many pages missing, but you can + make out some illuminated letters: + "POTION: a draught mixed with medicine is something to be experienced. + CRYSTALS: take one sniff to be something you've always wanted. + RUNES: read them to be in many places at once. + DIE: the higher the roll, the more its value. + CAT: do as your curiosity directs. + DOOR: be polite when entering. + Operating instructions: + ORACLE: 'where object' eg 'where crown'. + AMULET: 'force someone: do something' eg 'force Polly: south'. + MIRROR: 'watch someone', eg 'watch Richard'. To stop, break it. + HORN: 'summon someone', eg 'summon Brian', unless they've a firestone." + Another page is about a magic wand, but it's unreadable. +463 Not surprisingly, you slip back. Don't you read descriptions or + something? +464 You tug at the lever, then suddenly the floor beneath you opens up, + and you fall down into a polished chute. The trap quickly resets, and + you find yourself hurtling downwards at a furious pace! +465 It's immobile, but the floor below you seems hollow. +466 There is a hollow echo from the floor beneath the lever. +467 The horse refuses to set to sea. +468 You can't carry that barrel with you, the sea currents would smash it. +469 You can't take that great big marble pillar with you! You'd sink! +470 The rug is too cumbersome to take, rolled or unrolled. +471 The ox is too heavy to take along. +472 The horse is frightened of being pounded to death by the waterfall. +474 The ox is too weighty, and would crush you if you jumped with it. +475 I don't mean to be a prude, but you're the wrong sex. +476 Well you were SUPPOSED to kiss her, but I expect she doesn't mind... Her + eyes open, she yawns, and before you can start the act there is a + sudden flash of purple light and she disappears. This is a bit + upsetting, but you still feel better on the whole for having known + her, and soon get over it. +477 This is a rather young bunny and it doesn't know what to do yet. +478 You'd burst it... +479 Urgh! Necrophilia! Naturally the creature attacks you... +480 You can't do them all at once, and the rest attack. +481 He doesn't notice... +482 He may be grateful, but not THAT grateful! +483 He informs you in the nicest possible way that he's a prince, not a + queen. +484 The chart tells of a legendary island, once inhabited by druids of + an unspeakable evil, who worshipped demonic gods far fouler than the + mere idols of the mainland. The ship was obviously sailing towards the + island when a storm tossed it onto the rocks. Part of the chart is + damaged, but to get from the rocks to the island you should sail + southwest, northwest, then some unclear direction, then north, then + north again. To get back to the mainland from the rocks, keep sailing + east. +485 Ugh! Necrophilia! Urr...I feel sick... +487 Drop the treasure individually, feeblebrain, otherwise the pit + will splash fire all over you when the stuff gloops into it. +489 It has been made of wood from an enchanted oak, and is + indestructible. Go vent your anger on some trees instead. +490 You're already in the swamp, take a look you myopic dumbo. +491 The chart goes up in flames, and soon nothing remains +492 This is a magical tome, and it sends the flames back at the brand. + You hurriedly drop the burning stick as it is engulfed in its own + flames, and shortly there is nothing left of it. +493 The log of Captain Oliver burns to a useless cinder. +494 It's fireproof. Magic books don't burn just like that, you know! +495 You burn it to nothingness. Well wasn't that just SO much fun? +496 The bookcase is made of enchanted oak; enchanted oak is fireproof; + ergo the bookcase is fireproof. Hmm, seems logical enough! +497 You rolled a 'six'. +498 You rolled a 'five'. +499 You rolled a 'four'. +500 You rolled a 'three'. +501 You rolled a 'two'. +502 The wand does nothing magical; it fears a great evil which it can + sense nearby. +503 The sprig of mistletoe you are carrying pulls back magically as you + try to leave, and with such power that it is plain you'll have to + leave it behind if you want to go that way. +506 The trunk burns an extraordinarily raging flame, its contents, whatever + they were, taking hold exceptionally quickly. Shortly afterwards, all + that remains is a worthless pile of ash which you might as well ignore + (I will!). +507 There could be something special about some treasure here you might not + like. Get it individually and you'll see. This has been a public + service announcement... +508 There's nothing here you could light anything from! +510 You haven't got a boat with you, and even if you had it would be + smashed to bits by the dangerously rough seas - and you with it. +511 You need a boat, it's too far to swim. +512 That way is a rugged cliff, with a sheer drop onto rocks below! You'd + kill yourself! +513 Use IN if you want to enter someplace, unless it is within the area + you're in at the moment, such as a fountain or fairy ring would be... + (me? hinting?) +514 There is a sudden SWOOSH of air, and you feel like your stomach has + been pumped out. When you regain your senses, you find yourself back + on the mainland... +515 You can't pick up a fairy ring! +516 It's not THAT sort of ring! +517 Nothing native to The Land eats poisonous toadstools, I'm afraid... +518 "To be sure, leprechauns don't eat fairy-ring toadstools", jests the + leprechaun, merrily. +520 Toads don't eat toadstools, they sit on them. Toad-stool, it's really + pretty easy to understand. This one doesn't want to sit on it, either. + Perhaps it isn't REALLY a toad..? +521 No denizens of The Land eat mistletoe, with its being poisonous and all + that... +522 The wolf snarls most ferociously and won't let you get anywhere near + the herb to pick it up. +523 I see no sword! +524 The sword disappears. +525 The wolf snarls menacingly, and you can't pick up the herb with which + to feed it! +526 The ogre leaps up to pound you with his club, but an omission in his + education means he's never heard of swords and you hack him to bits. +527 You put it in your mouth, but it tastes so ghastly that you have to + spit it out before you can swallow it. Maybe you should find some + creature which eats ALL sorts of nuts normally? +528 Why would anything want to eat an enchanted acorn? It could change + into an oak tree inside them or something! +529 The cup has some magical seal over the top which won't let any + liquid pass through it. You can easily put your hand in, though, + so it must just be the liquid it objects to... +530 The bird must be one of the few creatures in The Land which will both + eat nuts and not care if they're enchanted. It devours the magic acorn + and suffers no ill effects. +531 The squirrels have all scampered off, read the description. If you + don't know what scampered means, look it up in any child's + dictionary. +532 The squirrels won't let you pick up the nut to feed them with it, + baring their incisors menacingly and snapping at your fingers when + you try. +533 The squirrels become highly excited, and sit down pawing at the nut. They + are very affectionate towards you, and you get a lovely warm feeling + inside. +534 Squirrels eat nothing but nuts. +535 The squirrels won't let you touch their nut, and squeak loudly at you + when you try to take it. +536 You grab hold of the nearest one, but just as you are about to + take a mouthfull, the rest leap at you and bounce about all over you + until you desist. They're more dangerous than they look! +537 You pick up one of the rodents, but the little sod bites your hand + and you have to drop him. You realise it would be unwise to continue + this approach. +538 It weighs a ton! You couldn't move it if you had thrice the elephants + of Carthage to help you! +539 The bloodstained slab slides aside! +541 An inscription inside reads: "You have not the first of the four, the + reaper of souls." The locket springs shut when you've read it. +542 An inscription inside reads: "You have not the second of the four, the + crescent of the sun." The locket springs shut after you've read it. +543 An inscription inside reads: "You have not the third of the four, the + empty grail." The locket springs shut after you read it. +544 An inscription inside reads: "You have not the last of the four, the + holy plant of the sun." The locket springs itself shut when you've + read it. +545 An inscription inside reads: "You have the four. The way to the + treasure hall is safe." The locket springs shut again, as usual. +546 It's unclimbable, remember? +547 The object disappears! +549 To the northeast are steps up, downwards is a climb to a room below. + Light comes from the surface via the opening in the roof of the room + above. On the floor is mist, meaning you can't see any objects in the + room (although there was sufficient draught when you entered to be + able to glimpse them). +550 There's nothing here, really, just this niche. No ways out at all... + The floor is covered in mist, so you can't see any objects dropped on + it. Similarily, the inside of the niche is too obscured to see if + anything has been put in it. +551 There is a sudden pang of pain which shoots up your arm from the + chalice. It stops abruptly, and you see it was the effect of an + ancient teleportation spell... +553 It's already opened, take a look. +554 It's closed already, look at it moron! +555 Put in objects individually, there may be particular treasures which + have a startling effect if fixed there by themselves... +556 The squirrels eagerly take your nut and devour it amongst themselves. + You get a lovely warm feeling inside with the happiness of a deed well + done. (I don't know how I can write this stuff!). +557 If you want to feed the squirrels, say FEED SQUIRRELS WITH NUT, remember + the little perishers eat the things... This has been a hint. +561 Nothing happens. Watch what you're doing when you wave things, you + might wave the wand by accident... +562 Wave the wand? Pick it up, first, imbecile, do you expect me to do + EVERYTHING for you? +563 immobile [imObIl] adj not moving; that cannot be moved; fixed. + (Penguin English Dictionary, 3rd. edition). +564 Use an axe for chopping things, not a sword; swords are for KILLING + with... +565 If you want to leave a place, say OUT; LEAVE is to leave parts of + a room but not the rest, for example magic fountains... Enough + repetitions of OUT will normally lead you to the place where you + entered The Land. +567 The ogre swings his club and you dodge just in time to avoid his + caving your skull in... Perhaps he ought to be killed, you think... +568 The rabbit kicks and thumps with its feet, wildly. Obviously it doesn't + live here and dislikes the idea of being torn apart by something that + does! +569 The fleece goes up in flames VERY quickly, doubtless due to the scented + oils which had been soaked into it. Soon nothing remains but useless + ash which crumbles away. +570 The skull isn't a trophy, child, it's just treasure. +571 The band is enchanted, and when you put it on a sudden weariness drains + your senses, and a deep slumber befalls you. You remove the band, but + all too late and the somnolence overwhelms you. +572 The potion burns to nothingness. Fun, eh? +576 It makes little difference. This medicine is so old it's just as nasty + whether shaken or not. +579 The rat snarls, baring its yellowed teeth, and when you attempt to + pick up the object it intervenes so that you can't. You'll have to + wait until it leaves. +580 The rat objects to being picked up, and starts to fight! +581 Rats breed quicker than humans and are smaller too, so after a couple + of seconds it's all over... +582 The cat lashes out and kills the unfortunate rat with one raking + claw! It eats it, too, just to make sure. +583 The cat is dead, and doesn't seem to want to fight much... +584 The coal burns away to nothing. Well I hope you feel better after + that. +585 You can't flee at sea. How can you drop everything and move if + you're carrying a boat?! +586 The undead creature won't allow you to pick up anything while it's here! +587 You try to drop the egg to flee, but can't! You'll have to stay where + you are. +589 You're taking a bit of a chance, aren't you?! Your brand lights, + you impetuous fool... +591 The hole in the wall which leads out isn't large enough to let people + through if they're holding anything. Drop your equipment if you want + to go through. +592 HAWUMPH! The dragon incinerates you with its fiery breath. +593 Not a boat you don't, chummy: imagine the chaos if you do that sort + of thing at sea... +594 You can't get treasure in general here, because the pancake is treasure + yet you can't pick it up for long. Get things individually. +595 I told you you couldn't enter it. I wasn't lying. +597 You make a hole large enough through which for people to pass. +598 With a ghostly creak, the tomb slides shut. +599 You can't dig for fear of bringing the tunnel down on you... +600 Use the axe, that's what it's for... +601 The fabric burns away until there's nothing left. Well that was a + pretty stupid thing to do, now wasn't it? +602 The cliff is too steep and high to climb. +603 Did I understand you properly? You want to jump off without a + parachute? Ha! Well consider yourself lucky I'm stopping you, + otherwise it would have been "Splatsville". +604 You need a boat to sail to sea. EVERYONE knows that... +605 You have a good wallop with your bat, but conclude that it's best + to use an axe, otherwise the years of rubbing linseed oil into the + surface will have been in vain. +606 Have fun, hope you hit 'em for six. +607 The beggar stops. "Were I not deaf, I'm sure that would sound like the + swish of a cri... no, it can't be", he thinks. Moments later his head + isn't where he was expecting it to be... +608 Sorry old bean, some things just AREN'T cricket. +609 Well, that's what cricket bats are for, isn't it? +610 "Open not these tombs of yore, + They bear no common lock or door; + Upon each one is carved a guide + The wise may use to get inside + And reap the treasures that they hide." +611 The tombs won't budge. If you roped in half the armies in christendom + they'd still remain closed. The magic sealing them is of a kind so + timeless and powerful that no power on earth may break it, unless the + riddles of the ancients are solved. +612 Nice attempt, but you didn't honestly think it would work, now did you? +613 The coffin creaks open, to reveal a body... +614 It's already open. Why don't you take a look, you'd save me a lot of + work you know. +615 Slowly the sarcophagus creaks shut. +616 Yes, that's the idea, make sure it's well and truly stuck, even though + it was already... +617 With an ear-shattering /C/R/E/A/K/ the entrance to the north tomb opens. +618 With an earth-trembling \G\R\O\A\N\ the entrance to the west tomb + swings aside. +619 With a nerve-rending ^S^C^R^E^E^C^H^ the south tomb opens up. +620 With a mighty (B)(O)(O)(M) the east tomb's entrance rolls aside. +621 The horse doesn't like gallops when it can fly... +622 Why should the horse canter when it can fly? +623 You can't roll tombs, clod. My, but you're stupid. +624 There is a sudden awesome roll of thunder in your head, your wand + splits into innumerable splinters, and you collapse to the floor in + a dreamless slumber... +625 The north tomb is already open, nitwit. +626 The west tomb is already open, dummy. +627 The south tomb is already open, bumpkin. +628 The east tomb is already open, yokel. +629 The sarcophagus creaks open... +630 This sarcophagus is the resting place for the dead! It's not a box + to store your treasures in, you unfeeling individual. +631 Rigormortis has set in and the body won't fit back. +632 Cannibal. Still, it was fair enough - although perhaps a little more + seasoning would have made all the difference. +633 The creature from the grave mindlessly takes a bite from the body, then + suddenly its face contorts in a horrible agony, the air rushes through + its now voiceless throat as it tries to call in pain, and it + disintegrates. +634 I see no body, but that doesn't mean there isn't one nearby... +635 The southeast tomb is already open, fool. +636 With a grinding S>C>R>E>E>E>E the southeast tomb slides open. +639 What, just cook it? How about cooking it on some fire..? +641 It's a male ox. Fair enough? +642 The sphere's a little heavy for cricket, I'm afraid. Why not hit + people with the bat instead, that's what they're for... +643 You swing the sceptre, and an instant later the doorway is clear, the + shattered protal splintered around you. Vandal. +644 Well you can bugger that for a lark... +645 It's dead. If you think you can kill something dead, you are quite + welcome to try. I wouldn't waste your time trying here, though... +646 Disect away, you don't find a thing. +647 You're a necromancess, not a necrophiliac... +648 You're a necromancer, not a necrophiliac... +649 The dragon doesn't want the egg. It's not stupid, you know... Besides, + the dragon's fire is magical, and doesn't melt eggs. You'll need some + strong, non-magical heat source to get rid of it, I'm afraid! +651 Aha, I spotted that one! The niche won't fit inside itself, try + something else, mug. +652 The southwest tomb is already open, clot. +653 With a vibrant G}R}A}U}N}C}H the southwest tomb opens. +655 The vase breaks into little tiny pieces. Well, it was only 4000 years + old... +656 It's not a skeleton key... +657 It's tethered. +658 The goat doesn't want to be milked, and starts attacking you! +659 You can't take the goat with you in there! +660 The goat is too cumbersome to take along. +661 As you drop everything, the vase breaks! +662 As you drop everything, the ornament crashes to the ground, but + miraculously it doesn't break! +663 It's an ordinary bed, nothing unusual under it like reds or anything. +664 The ox doesn't like goats and refuses to come along. +665 The goat is afraid of the ox, and won't be taken. +666 The horse doesn't care to be seen with anyone dragging a goat... +667 The nanny goat isn't too keen on the horse, and won't come along. +668 You can't ride goats! +669 You don't eat goats, twit. Whenever did you hear of anyone eating a + goat? I don't know, some people are REALLY dumb... +670 The goat is outraged, and attacks you! Not that you can really blame + it... +671 The goat enjoyed it, but nothing special happens. Do you like bearded + females or something? +672 As you pick the remains of the now-fragmented goat from your tunic, + you remember with fondness the way it boiled when your trusty wand + pointed in its direction... +673 It's already tethered, empty-head. +674 You'll have to catch it first. +675 You can't let go of the goat when you've got the egg. +676 Your way is blocked by the Undead. +677 The goat isn't daft, and refuses point blank to be tethered in the + fiery pit! +678 The goat is tethered. +679 The goat is tethered, and sinks slowly into the swamp... +680 It weighs too much, which is just as well as it's a bit runny having + been hacked up... +681 The goat is currently abstaining from magic pancakes... +682 The goat eats it. +683 The goat swallows the toadstool whole, and promptly keels over dead as + a doornail. Ah well! +684 It's not a carnivore. +685 The goat devours the mistletoe, then seconds later falls quite dead. I + wonder if the sprig was poisonous? +686 Nice try, but Chinese Boxing is no good against REAL dragons! +687 The goat won't eat. +688 It can't fly, you barnpot! +689 The goat is now untethered. +690 It already IS untethered. What do you want, some award for being + excessively kind to animals? +691 Your spell doesn't work; either try again or use the hunting horn. Or + get to be a wizard or witch, of course! In the meantime, however, the + power of the magic has put you to sleep... +692 Only champions and above have the skill to summon with the horn. +693 A loud, clear note sounds from the horn... +694 Someone has been summoned by the horn already, and it only works the + once. +695 A feeble squeek croaks from the horn. You're supposed to summon people + with it, it's magic... +697 From somewhere in the distance comes a low reverberating sound. +698 The clear note of a horn sounds, somewhere in the distance. +699 You hear a loud "MOO" lowed somewhere. +700 You hear the >| CRASH |< of a cannon going off in the distance. +701 The loud >< KAPOW >< of a door being blown up assails your ears. +702 Your ears prick up at the sound of something being magically + destroyed quite noisily in the distance. +703 A loud "AAAOOOOOOHHH" reaches your ears from afar. +704 You can't flee from such fiends, they get in your way. You'll have to + wait until it goes, or kill it. +705 A distant neighing noise reaches your ears. +706 Using a lever, the bolt comes out easily. +707 The fork snaps in your hands and is destroyed. +708 The brand isn't strong enough. +709 The wand is too short to use as a lever. +710 The bolt is too deeply embedded to get it out, you'll need a strong + lever. +711 The brand falls to bits. Ah well! +712 The wand is indestructible, so you can't sharpen it. +713 Sharpen it with something like a knife if you REALLY want to... +715 There is a sudden crack of thunder and the gate opens! +716 In the distance you hear a crack of thunder. +717 The ore comes out quite easily when you use the pickaxe. +718 After a struggle, the ore comes out. +719 It's embedded in the face, you'll have to use some strong sort of + tool to get it out. +720 It's not stuck in anything! +721 The water flows smoothly through your body and fills you with a vibrant + energy. A second or so later, however, you feel dizzy and find yourself + collapsing into a deep sleep... +722 The dwarfs have treated their trees with a special hardener just to stop + louts like you from chopping them down... +723 The emerald plummets downwards, and lands somewhere in the cavern below. +726 It falls down the duct and you hear noises which seem to indicate that + the ventilator is perhaps some 40 feet down, vertically. Certainly + enough to kill any human venturing there. +727 The bones fall to dust when you try to pick them up. If you're + interested, most of them look like dwarf bones. +728 A bright flash sparks from the end of your wand, forcing you to drop it + with the electric shock. In that brief instant, you see that you are in + a section of main passage, which has been closed down because of the + rockfalls. Then, everything goes black, and suddenly you re-materialise + elsewhere... +729 There is a grinding sound, then you hear a deafening crash as of + millions of gallons of water suddenly released from somewhere very + close - about fifteen seconds away... +730 In the distance you hear a sudden rushing sound, as if a huge + torrent of water has just started to flood somewhere. +731 There is a grinding noise, and then a barely audible flushing noise, + as if a large body of water were seeping away. +732 There is nothing here, apart from a few bones. +733 The area is deep in flood water, you can't possibly hope to get past. +734 Pickaxes aren't any use at chopping down trees. Wouldn't it be really + useful if someone invented a sort of axe with which you could chop trees + down..? +735 You can't break down doors with pickaxes. Ordinary axes are OK, though. +736 The ogre doesn't understand pickaxes and you hack him to buggery. +737 You can't, its so deep you'd not be able to hold your breath for + long enough. +738 Eh? There isn't any water here. You simple or something? +740 It's a safety lantern, and never gets hot enough to melt anything. +741 Your lantern is now lit. +742 The dragon's breath melts the lantern, catches alight the oil and blows + you to pieces. +743 In the distance you hear someone being blown to pieces. +744 The lantern isn't lit! +745 This is a safety lantern, you can't use it to light anything. +746 Your lantern is now unlit. +747 He doesn't like eating golden potatoes, they have a nasty effect on + his teeth. +750 You can't go that way carrying anything, the gap is too narrow. +751 The walls are too slippery, steep and tall to get up. +752 It's too far to climb up the cavern wall. +753 The citadel wall has been especially built to stop people climbing + it from here... +754 The gate is closed and you cannot pass. +757 The trumpet emits a feeble squeak, which surprisingly rises sharply + in loudness, and builds up to a crecendo. There is a sudden tremendous + > CRACK < and the east side of the wall splits apart to reveal a dark, + eerie room. +758 The trumpet emits a feeble squeak, which rises suddenly in loudness, + but nothing else happens. +759 In the distance you hear a loud blow on a trumpet. +760 You can only cast sleep spells on people. If you want to go to sleep + yourself deliberately, say sleep. +761 It's not that kind of pot, you degenerate. +763 The ox is as dead as a doornail. Showing it affection has not the least + bit of effect, apart from making you look a right idiot. +766 The sheepskin is too bulky to fit into any container. +767 You start to insert the mirror, but as you try to insert it, a + magical force starts to push back. The harder you push, the more it + resists. You realise it is a futile task, and give up. I wonder why + that happened..? +768 The bird starts flapping about the instant it realises you're going + to put it in the container. It causes such a kefuffle you can't get it + in. +769 The leprechaun kicks wildly as you try to bung him in the container. + "'Tis a bully you are!" he expounds, as he successfully avoids your + suffocating him. +770 If you put that in the container it would break. +772 You can't put boats inside things! Imagine the problems if you + try that sort of thing at sea! +773 You insert the nut, and an instant later it pops out again. +774 No matter how hard you try, the mistletoe will not go in the container. +775 The brand falls into the container, and promptly sets it alight. You + realise what is happening and drop the container, and start stamping + out the flames, but too late. The fire quickly consumes the container + and everything inside it, so quickly that you get the impression it + was magical. Presently, nothing remains. +776 How about "a pox on thee, foul villain", or "oh wretched crone, may + thy visage be the abhoration of christendom", or "thou unspeakable + manifestation of hellish damnation, may thee spend thy days + languishing on the deepest plane of the Abyss", or "fuck off". +777 The cat swallows the bird whole, licks its lips, and gives a + satisfied purr... +779 The cat lashes out and kills the bird dead as you are ever likely to + find. +783 You take one almighty swing and the cupboard door flies off its + hinges, destroyed. What did it ever do to you, murderer? +784 From the end of your wand sparks a violent beam of intense light, + and an instant later the cupboard hasn't got a door any more... +785 You don't think they make portcullises so feeble as you'd be able + to break them down, do you? What a twit... +786 An amber cone glows from the end of your wand, and the dwarf melts. +787 Out from the end of your wand flies a spectacular green ray, which + scythes across the sky and slices into the dragon, to absolutely no + effect whatsoever. Out from the end of the dragon's mouth flies a + ball of fire... +788 Very festive... +789 You need to be carrying the boat to sail it. +790 If you want to sail the boat, just pick it up and move in the direction + in which you want to go. +791 Some magical power in the rug prevents your taking it with you. +794 Nice try, its clever of you to think of doing that here but nothing + special happens, I'm afraid. Well, not actually AFRAID afraid, well... +795 This is the only place you'll find a chop-downable tree. Why not chop it + down with the axe? It won't fall on you. +796 Someone's already felled the tree here. No point in trying to fell any + more if you want my opinion. +797 There's nothing fellable here! Try a forest. +798 Well pick it up then! +799 Suddenly you feel a stinging pain from your wand, and an electric + charge runs through your body. You are forced to drop the magic to + save your hand, then suddenly everything about you goes black, and + an instant later you rematerialise... +800 It won't burn. +801 The priceless violin burns to nothing. Philistine. +802 The violin bow is now burnt away. +803 There's no electricity here. +804 Well, you have a good conduct and nothing happens. Count yourself + fortunate I didn't hit you with a lightning bolt. +805 You feel a sudden, painful static electric shock from your bow, + which makes you drop it in surprise. Moments later, everything goes + black, and you feel like your stomach has just been sucked out. An + instant afterwards, your surroundings swirl about you and you + rematerialise... +806 It's not wide enough, try something thicker, such as a stick. +807 The lion lands with a splodge and sinks, pointing nowhere. +808 The pot is stuck closed, but you can put things in it through the + gaps in the wickerwork so it doesn't really matter. +809 It doesn't make much difference with the sack, opened or closed. + Nothing will fall out anyway, and it's airtight. +810 It's already open, why don't you read the description? +811 The bag creaks open slowly. +812 The bag is now closed. +813 It's already closed. +815 You'll have to furl it first. +817 After a modest explosion, the shark appears to have disappeared. +818 Well it tasted pretty bad, but you wolfed it down eventually. +819 Well pick it up then! There's a method to these things... +820 I don't suppose you'd care to use a bow, would you? Pizzicato ruins + your fingernails. +821 Out from the violin come a few bars of Paganini's Caprice no. 21. +822 Don't mention it... +824 They made headstones much stronger in the old days, so the likes of + you wouldn't go around vandalising cemetaries. +825 In the distance you hear the strains of a violin being played. +827 The toilet flushes automatically and when you look, it's empty! +832 When you try to manipulate the object, your egg starts to make a + humming noise, and you find some strange, powerful magic force prevents + your continuing... +835 It floats off down the river. +837 You feel a sudden sharp pain in your hand and drop what you were waving, + but nothing else special happens... +838 You can't get a grip on the bookcase from this side good enough to + enable you to slide it. +839 All of a sudden, to your shock and amazement, your violin cracks and + splinters to nothingness! +847 It's a thick slab of rock, you couldn't break it if you dropped a + rhinosceros on it from 2,000 feet. Isn't it obvious you're supposed to + sacrifice something there? +848 Have you ever thought how much cannons weigh, chump? +850 The patterned curtain is now drawn open. +851 The patterned curtain is now drawn closed. +852 The curtain's already open! Take a look, pachyderm! +853 The curtain's already closed! Why not take a look, donkey? +854 The curtain won't hang properly here. +855 It's already hanging up! +856 The curtain is now hanging loosely by the opening to the north. +857 The richly-woven pattern reads: + "When the eyes are red you may pass the ghouls, + But if treasure is wanted then emerald rules." + There are also some numbers written: "50" in red, "100" in blue, + "150" in green, "200" in yellow and "250" in emerald green. +858 You hear a voice, which seems to come from inside your head, calling + you from afar... +859 It's already full of rum. +860 There's no fresh water here. +861 The bottle fills, and its contents magically become rum! +863 It's highly acidic, and you swallow a mouthfull of the burning liquid + before spitting the rest out! I certainly wouldn't advise swimming in + the stuff... +864 The bottle won't fill. +865 The bottle shatters to uselessness. +866 The bottle's empty! You'll have to fill it. +867 It's not raining! +868 Yo-ho-ho! That was powerful stuff! Hic! +869 If you want to consume something, go ahead and do so. I'm not having + any of this wishy-washy tasting going on... +870 All of a sudden, you are feeling quite woozy, and fall asleep. +872 Very resourceful, but regretably the bottle doesn't fill. +875 How do you expect to do that? You haven't got a funnel, it'd go all + over! +876 If you want to fill anything, the most appropriate thing I can suggest + which you are liable to encounter is a bottle. +877 The room before you seems to swim around, and you stagger backwards... +878 You find a potty under the bed, containing some jet! +880 Over the cliff it goes! +881 In the distance you hear a loud PLONK. +883 HIC! +884 You've got the hiccoughs. HIC! +885 It won't eat it. +886 The hyacinth is a type of flower, not flour. Still, you managed to get + it all down without too much coming back up. +887 Mmm! Smoked hyacinth, it tastes delicious! +890 Over you go! For some reason, you don't plummet like a stone... +891 You land safely! +892 You're already heading that way. The total time taken for the jump + should be about 8 seconds, if you're worried about missing a 'bus or + something... +893 If you're falling, anything you let go of would fall the same speed as + you, wouldn't it? So you can't REALLY drop anything until you reach the + bottom... +894 I can't let people go around furling as they fall, they'd plummet + downwards and splash on the rocks. Keep your country tidy! +895 The dragon eats the coal. Seemed to enjoy it! +896 In the distance you hear the terrible RHOAAAUUUAURRRRGGGGGGHGHHHGHHHH of + a dragon dying... +897 It has no roots, so I'm afraid you can't plant it. +898 The flower falls to bits. Ah well! +899 It smells of hyacinth. +900 He's allergic to flowers, but thanks you all the same. +901 She's not in a position to accept at the moment... +902 I'm sure that whoever's buried there will be very grateful. +903 The flower doesn't perk up much, but then it didn't look like it was + going to die anyway. +904 The flower withers and dies. +905 The vase is so delicate that the weight of the flower breaks it! +906 No, that's not it. Resourceful of you though! +908 You find that the lantern won't light, the reason being that it's got no + wick. +909 Your lantern's wick has just burned out. +910 The lantern's lit, you'd burn your fingers. +911 You fix the new wick into the lantern. +912 It won't come out. +913 There isn't one in there. +915 You come out of the end of the chute and land with a thump on the floor. +916 All of a sudden you go over a bump in the slippery tunnel, and start to + decelerate. +917 Your're already going downwards, and since you have little say in the + matter I suggest you sit back and enjoy the ride... +918 It's fireproof, ask the dragon. +919 A single swing with the mighty axe fells the signpost. +920 The chop has no effect. +921 It resists your vandalism with commendable disdain. +922 From the end of your wand shoots a pencil-thin ray, which explodes the + signpost almost instantly. Ooh! +923 The signpost is a bit weatherbeaten, but you can make out: + "B WA E dr gon at a ge, e tr me y dan ero s, bu sh uld di if fe + c ." + Appended to the bottom, and more readable, is + "Drop boats here until you leave for the mainland - dangerous currents + will sink you if you move off the island from anywhere else". +924 It's fixed into the ground, you can't move it. Might be able to chop + it down if you tried, though. +925 The stem isn't long enough to fix it anywhere, I'm afraid. +926 ~D~O~N~G~ +927 Ringing through the air you hear a loud ~D~O~N~G~. +928 You hit the bell, and it rings a loud ~D~O~N~G~. +929 Now you've dropped a clanger! +930 It won't touch the demon drink... +931 The bottle's empty, a fat lot of use it is feeding something with it. +932 The creature of Satan swallows some of the rum, but is mindless anyway + so it has no effect. +933 The dragon's fiery breath ignites the bottle in your hands, and you + only just escape injury from the flying shards of glass! Talk about + fire water... +934 The beggar takes a gulp, passes back the bottle, then starts to sway + a bit. Unused to strong alcahol, in a sudden stupor he attacks you! +935 You take hold of the cord and find, to your horror that you stick to + it! Try as you might, it won't come off, and you find to your horror + that it is part of the immense web of some huge spider! Taking hold of + the cord is bound to have informed the creature of your presence, too! +936 You're stuck in the web, how could you pick it up? +937 The spider suddenly springs at you! +938 Well fair enough, worth a try I suppose. There's no special effects + as a result, though. +939 The web catches fire, and an instant later you are free! +940 You can't move that way, you're stuck in an enormous web! +941 You're stuck in the web and can't move enough to do that. +942 You haven't enough freedom of movement to wave anything. +943 You can't it sticks to the web. +944 It's far too sticky for that! What do you think it's made of, + marshmallow? +945 You sink your teeth into the cord, only to find that you stick! The + cord is part of an immense web, which you see as you attempt to + struggle free. I wonder whether the spider will be attracted? +946 From the end of your wand flies a blue bolt of highly-charged + electricity. PZINGGG no more spider... +947 The wand erupts forth a cone of fire which destroys the web no end. +948 Under the bed is not the sort of place to keep that sort of thing. Now + if you'd tried a potty on the other hand... +949 The flood water is too deep there, the only dry place around is the + top of the citadel. +950 The potty slides out of sight under the bed. +951 It's already open, if you want to toggle open/close just TURN VALVE. +952 It's already closed, if you want to toggle open/close just TURN VALVE. +953 The horse was expecting to land on solid ground, so when its feet are + sucked under it is surprised, and unable to take off. Happily, you + watch it sink to oblivion. Brutal so-and-so. +954 The stallion snorts forth ferocious billows of steam - it obviously + objects to what you're trying to do. Drop things some other way, it + MIGHT let you... +961 You can't summon people when you're falling! +962 OK, so you burn the cord. Wasn't that a whole heap of fun? +963 The sword isn't flaming, it just glows in the dark (and in the light, + too, come to that!). +964 The runes read, "If you were less experienced than enchanter, you'd be + blown up now!". +965 You haven't a watch. +966 Rarely have you witnessed a cat explode with such force. +967 The wand unleashes a screaming bolt of power, but the door withstands + it. It must be magical... +972 Your wand leaps from your hand, and beats the snake to death! It + then wipes itself on the ground and returns to your grasp. +977 The cat has eaten the rat! +978 The blade of the sword is so sharp as to be able to slice even through + the sticky, gooey web! An instant later, and you're free! +983 You try to move that direction, but your feet seem rooted to the spot. + A suitably mysterious, eerie sound whirls about you, warning that the + magic of the ancients objects to your taking something you're carrying + along with you... +984 Hey diddle diddle, the cat and the fiddle! +985 What, and break your teeth on them? They're golden! +986 ~D~I~N~G~ +987 Ringing through the air you hear a loud ~D~I~N~G~. +988 You hit the bell, and it rings a loud ~D~I~N~G~. +989 The golem interposes its iron frame, and blocks your way through the + opening. +990 The sword barely chips at the golem, but it's better than nothing. +991 It breaks on the golem's mighty iron torso! The guardian turns to you, + silently... +992 There is a flash of violet light from your wand, and you feel like you + are being pulled apart. Momentarily, everything goes black... +993 You fall asleep, deep in meditation. +994 This is no place to meditate, try a shrine or chamber of some kind. +995 There isn't sufficient meditation going on elsewhere to provide the + psychic energy to meditate in such a small shrine as this. +996 You feal a great tranquility filling your being, and when you cease + your meditation, you are in a strange place... +997 You start to meditate in this holy place, and the darkness around + you seems to close in. All of a sudden, it clears... +998 The gate closes. +999 It's already closed! I bet you're the sort of person who turns back to + their house after walking 20 yards "in case" they forgot to switch the + gas off... +1000 You make a good job of it, and feel quite proud of yourself. +1001 The throne is too small to sit in, but it looks to be worth a bob or + two. +1002 Not THAT sort of prize, idiot! +1003 It's not really supposed to go on a wall. Why not just drop it in the + swamp and forget about it, eh? +1004 The oven door isn't open. +1005 OK, but the oven isn't hot enough to do much damage. +1006 The oven is now open. +1007 The oven is already open, are you trying to get in or something? Perhaps + it would be best for all of us if I let you... +1008 The oven is now closed. +1009 It's already closed, twit. +1010 The oven's coals are out of reach, so you can't light anything from them + I'm afraid. +1011 The rabbit leaps suicidally into the recess where the hot coals are, and + that's the last you see of it! +1012 OK, but the oven's probably hot enough to ignite the gunpowder after a + while... +1013 You hear a loud explosion. +1014 The guard blocks your way. +1015 Your wand lets forth an amber cone of light, but it merely bounces off + the dwarf! +1016 The gateway needs a key to open it. Say "open gate with ", where + is what you think the necessary key is... +1017 The gateway swings silently open... +1018 It's already open. Making sure, were you? +1019 It's not THAT kind of chip! +1020 >>>>>SPARE<<<<< +1021 With a mighty heave, you withdraw the longsword from the rock! +1022 The dwarf is already awake, dope. +1023 The dwarf wakes up! +1024 The gateway won't open. +1025 You kill the sleeping dwarf with a single blow, but it wasn't much + fun. +1026 It continues to sleep. +1027 The dwarf is very surprised! +1029 It's already thrust into the rock, and won't go any further. +1030 The longsword slides into the rock, smoothly and silently. +1031 Not while you're falling! +1032 You can't use the wand if you have the longsword, and, unluckily for + you, you have both! +1033 The trapdoor won't budge. +1034 The bed is already unmade! +1035 It's tidy enough anyway, you're not one of those fastidious types + who dusts rooms 3 times "just to make sure", I hope... +1036 The bed has been unmade with such enthusiasm that you soon realise + you'll never be able to make it again (the bed I mean). +1037 Not THAT sort of Guardian! +1038 If you want your leg pulled, try playing under the name "Gail"... +1039 This part of the swamp is very treacherous, and as you move to get + the object, the shift in your centre of gravity is too much. A trice + later, and you're swallowed up into the mire... +1040 The bunny gives you a nasty nip with its sharp incisors. +1041 The bunny nuzzles up to you, oozing cuteness. +1042 That's a bit of a daft thing to do - if it was climbable it wouldn't + have been much use building it. You start clambering up with enthusiasm, + but all of a sudden slip on a loose stone and break your neck. Sigh! +1043 There is a sudden explosion, and you are blown to bits. A booby-trap, + in case you haven't guessed... +1044 When you start to wave, the pillar magically rises into the air, then + before you can do anything comes crashing down on you, pulping you + and grinding you into the floor. Since humans do not function too + well in this condition, you die. The pillar smiles to itself in + satisfaction... +1045 As you reach for the skull, a terrible transformation begins to take + place: skin starts to form on the ancient bones, and eyes well up in the + sockets. The leering grin of the ram becomes apparent, and it starts to + rise slowly into the air. Suddenly, it strikes! Its horns gouge deep + into your eyes. You fall back in agony as the manifestation of evil + gores you to death. Maybe that fleece nearby belonged to it once? +1046 A spectacular flash of glorious firework colour erupts from your + wand, accompanied by a tremendous clap of thunder, and a bit of a + scream as you find that the marble pillar is so strong that it + reflects the spell back at you and you go up in smoke! Trouble- + maker! +1047 When you open the chest, you discover that it contains clothing. + Unfortunately, said clothing came from a village whose entire + population was wiped out shortly afterwards by a particularly + virulent plague which kills instantly, as you suddenly discover + when you come out in rose-shaped blotches and drop dead. The lid + of the trunk conveniently slams shut afterwards, awaiting another + victim... Sorry about that! +1048 The spider scuttles over to where you lie helplessly trapped in her + web, and she sinks her fangs into your torso. You black out, and... +1049 You manage to budge the sword a little way, but you're not experienced + enough to dislodge it yet. Maybe if you made it to superhero or + superheroine you'd be able to? +1050 As you move, the swamp enfolds about your body. Kicking and screaming + as best you can, you can make but futile headway before the clammy + marsh becomes too heavy and you are sucked to a terrible death by + asphyxiation. +1051 I'm not telling you, so there! +1052 The thundering waterfall smashes you to pulp with its power. +1053 The sea suddenly becomes rough as a storm brews, and your little + boat is overturned. Needless to say, you drown... +1054 You slide down the chute, an air of excited expectancy about you. + This ends abruptly when you pile into an incinerator, which although + no longer alight is nevertheless 40 feet below where you come out. + You die, of a broken everything. +1055 You experience a relaxing, soothing sensation as you haplessly leap + to your doom, which only goes away when you break to pieces on the + rocks below. Do you think you're a lemming or something? +1056 You descend, when suddenly out from above swings a huge axe. You see + it coming and try to swipe it aside, but it is too strong and you are + cleft in two. +1057 You start your climb, and the rocky walls change to earth after a while. + All of a sudden, your foothold gives and you tumble back, the hunks of + earth you grab hold of coming away in your hands. You are knocked + unconcious on the wall behind you, and bounce off all the way down. You + are dead before you hit the bottom. +1058 You suddenly slip on a piece of wet seaweed and fall into the water. + Desperately you cling on, but the waves drag you under and you + finally drown. That's one way not to try again! +1059 You jump down, land on the rocks and are smashed to bits. Twit! +1060 () GLOOP (). What made you do that?! +1061 As you start crossing the pool, the waters enfold about you. You + realise that they are magical, and they seem very hot as you + splash about wildly, in a useless attempt to stop their dragging + you under. After you have drowned, the waters wash up your + possessions on the shore. +1062 As you start to enter the room, a horde of ghouls spring as if + from nowhere and tear you limb from limb. There are so many that + you are soon overpowered and consumed. The ghouls push your + belongings back into the room whence you came, lest they alert + future pickings... +1063 That's not enough, he wants something more substantial. +1064 The rabbit eats the wafer, and seemed to enjoy it. +1065 MMMmmm! Delicious! You feel better already! +1066 You feel rather tired. +1067 You pucker your lips to kiss the beggar, but as you close in on his + mouth he tries to bite off your nose, his sadly dim mind thinking + your head is food. Hastily you withdraw, since the beggar's teeth + are nothing to be sniffed at. +1068 You hear everything you could before, only louder. Why not try + diagnosing people with it? +1069 You can't read anything, you're blind! +1070 The flute doesn't seem to want to play. And after it was brought all + the way here, too! +1071 The clear notes of a tuneful melody ring through the air. +1072 The clear notes of a tuneless melody ring through the air. +1073 You hear the clear notes of a flute ringing through the air. +1074 It doesn't play a note. +1075 It's chained up, you can't get it. You aren't EVER going to be able to + get it, so don't bother trying! +1076 The words, "Aw, shucks, you shouldn't have..." flash across the + headstone, then are gone. +1077 You see large, pink and blue spots floating in front of you. +1078 Inventive, but the icicles just float. +1079 The stallion scoops you up onto its back and flies off before you can + stop it, passing through solid objects without let or hinder. Soon, it + circles, lands, and dumps you off... +1080 Cremation, eh? Well it burns away quite quickly. Ashes to ashes... +1081 It smells just like the sort of thing that if you were a wolf you + wouldn't like to be fed with it. +1082 Nothing happens. Well, the tree IS already felled! +1083 The incense quickly burns away, it exceeded its "best before" date + several centuries ago... +1084 You start to climb it, but soon realise that it's too windy out + here and were you proceed you'd be blown off. Reluctantly, you + scramble down to earth again. +1085 You don't see your reflection... +1086 What are you trying to do? Develop a hacking cough..? +1087 You can't steal the longsword, people guard it with too much + ferocity for the likes of you to take it! +1088 It doesn't seem to want to go in the container. +1089 Very generous of you, but the longsword has a mind of its own and + decides that you are quite good enough to wield it. +1090 The chain makes a large dent in the side of the golem! +1091 The king dwarf grabs hold of your leg and hangs on, preventing your + leaving. +1092 The words are too faded to read, but you can tell that, in its day, + it was rather good. +1093 At precisely 451 degrees farenheit, the magazine ignites and burns + away. +1094 The goat has too much respect for such an august publication to eat + it. +1095 As you fold the magazine, a fond reminiscence stirs you, of what once + was... +1096 At the speed you're going?! +1097 Ah, good idea, but nothing special happens. Only by entering the + fountain yourself may you gain any beneficial effects, and then only + if it glows blue. +1098 OK, so it gets a bit wet. What did you expect would happen? +1099 It looks perfectly OK to me. +1100 The cat seems reasonably dead. +1101 The cat isn't feeling very well. +1102 It's not going to get up and hop away anywhere, I'm afraid... +1103 The bunny is as fit as a fiddle. +1104 The eagle rips the rat apart with its talons! +1105 The eagle tears apart the gull with its talons! +1106 The eagle wrenches itself from your grasp! +1107 The eagle relaxes in its nest, and its wounds heal. +1108 The eagle kills the rabbit with a single blow of its mighty talons. +1109 The eagle bursts into flames as a cord of red fire rorars from the + end of your wand and engulfs it. An instant later, and the bird of + prey is no more. +1110 It fits like a glove. +1111 Well OK, but nothing special seems to happen. +1112 Mmm, scumptious! +1113 No, no, not THAT kind of a kipper! +1114 Your heightened senses react badly to the enchanted waters, and you + faint in a heap. diff --git a/MUD0.BCL b/MUD0.BCL new file mode 100644 index 0000000..571567a --- /dev/null +++ b/MUD0.BCL @@ -0,0 +1,157 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +$ldtext "/runame:mud" + +STATIC +$( //Various odds and sods. + cmndbuf = vec DRSIZE //Next command buffer + scanch = 0 //The last character read. + scan.info = 0 //The last word read. + name.string = vec 26 //A string. + fake.string = vec 26 //Space for another string. + mbuffer = vec 26 //Buffer for quote mode. + mainloop = 0 //Contains the mainloop. + prompted = false //Whether you've prompted. + firstsnoop = false //Set when first snooped on + somethingarrived = false //Whether some creature just arrived + lineflg = false //True if typed a line. + fake = vec 6 //Fake node. + bcplrm = vec 1 //bcpl version of a 6bit room + lastdr = 0 //The last door you locked. + lastdir = 1 //last direction you went in. + autowho = -1 //auto-who seconds count (spectacularing) + autoint = INTERVAL //how long to wait txixt autowho's + bstr = 0 //Stream for BUG command. + kept = 0 //kept object + events = 0 //events due to demons + who.copy = 0 //Who was last in a room. + pwcnt = 0 //how many times tried "password" command + fight = vec 35 //Who you are fighting. + laststream = -1 //Stream of item in buffer + lastblock = -1 //Block of item in buffer + cccnt = CCTRIP //number of ^C's before ejects you + savedp = 0 //number of times done a SAVE + pain = 0 //unnecessary ^C count + leading = true //true if not following + followers = 0 //People following + frontman = true //true if not assisted + joined = 0 //people joined to you + animal = 0 //animal you're following + snooping = true //True if you're not snooping... + snoopedon = false //players snooping on you + snobj = false //object you're snooping on + brief = false //whether in brief mode or not... + lastmoments = false //whether closing soon or not + verbname = "" //To make printing errors easier + objname = "" //ditto + insname = "" //ditto + fodsville = false //was I fodded just now? + osnop = 0 //old value of snoopedon + olog = 0 //old value of logstr + savescr = -1 //last score typed SAVE with + retaliated = 0 //wherther used a weapon this fight + pretend = false //Pretending not playing? + holdfirst = false //A hack into the actions... + me = 0 //My name + it = 0 //name of last thing mentioned + him = 0 //name of last male mentioned + her = 0 //name of last female mentioned + them = 0 //name of last player mentioned + there = 0 //name of last 6bit room mentioned + flipping = 0 //flipping between characters + fodded = false //Whether you've fodded anyone yet + lvmdoor = 0 //Address of message.door. + lvqdoor = 0 //Address of our queue door. + lvrdoor = 0 //Address of current rm. door + lvqueue = 0 //Address of queue entry. + lvcarry = 0 //Address of object list. + at = ? //whether reversed objct & instrmnt or not + ps.word = 0 //persona password + conversing = 0 //just there to talk? + deaf = 0 //am I deaf? + dumb = 0 //am I dumb? + blind = 0 //am I blind? + paralysed = 0 //am I paralysed? + justforced = ? //was I just forced? + strtab = (table //Strings for random output. + "I'm not sure I understand you fully.", + "What?", + "I don't understand that.", + "I don't see what you mean.", + "It's all double dutch to me mate!", + $az"Out from behind a pseudo-teletype leaps a grey-haired* + * old man.*C*L*"You shall not pass*", he says.", + $az"Don't run this program with a CCL entry!", + $az"You find yourself in a grey formless void, the universe* + * has not*C*Lyet been created. Try again later.", + $az"There is something magic happening! You feel yourself leaving the land..* + *.*C*LYou can restart in a minute or so.", + $az"Some powerful magic prevents your entering The Land. Try again*C*Llater, please." + ) + mins = (table + 0, + "Five past", + "Ten past", + "Quarter past", + "Twenty past", + "Twenty-five past", + "Half past", + "Twenty-five to", + "Twenty to", + "Quarter to", + "Ten to", + "Five to" + ) + hrs = (table + "twelve", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "ten", + "eleven" + ) + + days = (table + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ) + +//Player profile information. + profile = 0 //Points to hi-seg profile. + name = 0 //Points to hi-seg name. + player.no = 0 //Player number (convenience). + player.bit = 0 //Bit corresponding to us. + room = 0 //Current room. + oldroom = 0 //Last room we were alive in. + carry = 0 //What we are carrying. + verb = 0 //Last valid "verb". + objct = 0 //Last valid "object". + instrmnt = 0 //Last valid "instrument". + res6 = ? //for no.-to-6bit result +$) + diff --git a/MUD1.BCL b/MUD1.BCL new file mode 100644 index 0000000..5816eb3 --- /dev/null +++ b/MUD1.BCL @@ -0,0 +1,465 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and/or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let start() be +$( input,output_tty,tty //Initialise things. + mainloop_label(l1) //Ditto. + initialise() //More of above. + $( l1: at_false + justforced_false + check.stuff() //Game in full swing, check + parse.command() //various things and says + instate() + execute.command() //anything try and understand + $) repeat //it. Again and again. +$) +and check.stuff() be +$( let present,change,bit,nm=?,?,?,? + while magic + $( $[ $setzm JBINT $] + outz(strtab!8) + Outs("Everything in the game has been reset to its original starting state!*C*L") + stop.fighting() + $[ $clrbfi $] + quit() + $) + ran() //Bump random (ha!) number generator. + jar(@deldr) + check.gone() + active!player.no_valof + $[ $mstime 1, 0 $] + unjar(@deldr) + unless maint + test lastmoments then + $( lastmoments+_1 + if lastmoments ge TIMEOUT*60 test timeok(low2) then + $( out("*C*L:6 will not be closing after all - carry on playing...*C*L", MUD6) + lastmoments_0 + $) or + $( out("*C*L:6 is now closed!*C*L", MUD6) + stop.fighting() //ought to have a proc for these 2 - happen together often + quit() + $) + $) or unless timeok() + $( out("*C*L:6 will be closing shortly - you have about :N minutes left!*C*L", MUD6, TIMEOUT) + lastmoments_1 + $) + present_WHO!room //See who is in room. + unless who.copy=present then //If changed since last time report on it. + $( change_present neqv who.copy //Get changes. + unless ASLEEP of profile if visible() for i=0 to 35 do unless i=player.no then + $( bit_1<(bit bitand present -> "appeared with a crash of thunder", "disappeared in a puff of smoke"), + (bit bitand present -> "arrived", "left")) + $) + $) //If can't find name then someone "died". + who.copy_present //Keep copy up to date. + $) //Continue as nothing had happened + if queue!player.no interact() //If received message process it (them). + if pain STAMINA of profile-_pain<>pain_0 + if chcnt>0 test can.wake() then wake.up()<>return or error("You can't wake yourself up yet!") + if ASLEEP of profile /\ can.wake() /\ new.stamina() ge STAMINAMAX of profile + $( outs("You are too alert to sleep any more! ") + wake.up() + $) + test somethingarrived then somethingarrived_false or unless lineflg + unless random(player+1) if melted do + $( let tracer=movers + while tracer do + $( let obj, mobile = LH of tracer, MOTN of obj + if (CURROOM of mobile)/\(FIGHTS of mobile=0)/\(DESTROYED of obj ge 0)/\(P4 of obj=0) then + $( MOVECOUNT of mobile+_1 + if MOVECOUNT of mobile gr MOTION of mobile then moveobject(obj)<>MOVECOUNT of mobile_0 + $) + tracer of_RH + $) + $) + if ~autowho + $( autowho-_1 + unless autowho + $( autowho_autoint + unless ASLEEP of profile + $( Outz($az"*C*LAuto-who:*C*L") + Special(SF.WHO) + $) + $) + $) + if events handledemons(@events) + if gdemons/\random(player+1)=0 handledemons(@gdemons) + if player unless random(player+1) + $( jar(@deldr) + for i=0 to 35 unless i=player.no if player.names!i + $( let act=active!i + if act ls 0 loop + if (((valof + $[ $mstime 1, 0 $])-act+WHOLEDAY) rem WHOLEDAY gr DELAY)\/ + (valof + $( let jb=jobnos!i + $[ $setz 1, 0 + $move 2, jb + $trmno. 2, 0 + $seto 1, 0 + $] + $)) then exorcise(i) + $) + unjar(@deldr) + $) + unless prompted \/ pretend + $( unless snooping ge 0 \/ snobj + $( outz($az"*S*C*L") + ccnt_0 + if INVIS of profile writech(tty,'(') + if WIZARD of profile writes(tty,"----") + writech(tty,conversing->'"',(BZK/\BERSERK of profile) -> '>', '**') + if INVIS of profile writech(tty,')') + unless valof + $[ $setz 1, 0 + $skpinc + $seto 1, 0 + $] do + $[ $movei 1, 2 + $hrli 1, 2 + $movei 2, #2 + $move 3, ttyno +retry: $trmop. 1, 0 + $jrst okthen + $movei 4, 1 + $hiber 4, 0 + $trn + $jrst retry +okthen: + $] <> forcetty($az "*^R") + $) + prompted_true + $) + lineflg_hibernate() //Sleep for a sec. or until line ready. + if ctcflg quit() + if lineflg read.line() //Read the line if there. +$) repeat //Otherwise do it again. +and parse.command() be +$( let token=? + switchon scanner() into //See what was typed. + $( case S.MOTION ... S.LEVEL: + verb_scan.info //Remember verb. + token_nvscanner() //Next token. + if token=S.CONT return //Only said verb. + if token=S.WITH\/token=S.AT token_nvscanner() //ignore superfluous WITHs + if token=S.MOTION nvscanner() + //Frig participles to verbs! + try.it(@objct,token) //Remember object. + unless token=S.WITH\/token=S.AT token_nvscanner() //Anything more? + if token=S.AT at_true + unless token=S.WITH\/token=S.AT\/token=S.CONT + $( let what=scan.info + token_nvscanner() + test S.IT le token le S.THEM then try.it(@objct,token) or + test token=S.CONT\/token=S.WITH\/token=S.AT then scan.info_what<>try.it(@objct,S.OBJECT) + or try.it(@instrmnt,token)<>endcase + $) + if token=S.CONT instrmnt_0<>return //No. + if token=S.AT at_true + token_nvscanner() + try.it(@instrmnt,token) + endcase + CASE S.SPECIAL: + verb_scan.info + nvscanner() //take off the s.cont + return + case S.UNCONVERSE: + verb_0 + return + case S.AT: + at_true + case S.WITH: + token_nvscanner() + if token=S.CONT error("The first word I understood was a preposition, so it should be*C*L* + *followed by an object, but I don't recognise it.") //Must be followed by something. + try.it(@instrmnt,token) //Remember it. + if scanner()=S.CONT test verb then return or + error("I got the first word as WITH-like and I think I got an instrument, but*C*LI can't find an action.") + //May have specified a verb. + verb_scan.info //Store verb. + token_nvscanner() //Next token. + if token=S.CONT return //Finished so return. + if token=S.MOTION token_nvscanner() + //Frig participles. + try.it(@objct,token) //Store object. + endcase + case S.CONT: + if chcnt>0 endcase //Allow stuff like 'and then'. + return //Or return. + case S.PLAYER: + objct_scan.info //remember player number + while valof switchon scanch into + $( + case '*S': + case '*T': + case ',': + case '.': + case ':': + case '-': + resultis true + default '*0' ... '*D': + resultis false + $) scanch_getch() + if dumb error("You can't speak to :U, you're dumb.",player.names!(P1 of objct)) //can find out hidden people this way + interact(I.TELL) + jump(mainloop) + default: + objct_scan.info //Might be an 'object' + 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. + $) + 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. + if at swap(@objct, @instrmnt) + unless objct objct_fake.node("that") +$) +and execute.command() be if verb then switchon PTYPE of verb into +$( case S.SPECIAL: //A special verb. + special(P1 of verb) //quoted or shouted + endcase + case S.LEVEL: + special(SF.DBUG) + endcase + case S.MOTION: //Execute a direction. + objct_verb + objname_verbname + verb_tverb + verbname_PNAME of verb + case S.ACTION: case S.FASTATN: //An action verb. + action() +$) +and try.it(lvword,token) be switchon token into +$( case S.OBJECT: + setit(scan.info) //inefficient + default: + !lvword_scan.info + endcase + case S.PLAYER: + $( let nam,prof=player.names!(P1 of scan.info),LH from nam + unless hidden(P1 of scan.info) + $( ((SEX of prof)->her, him)_nam + them_nam + $) + !lvword_scan.info + endcase + $) + case S.HIM: + unless him error("I don't know to whom ':s' refers.",PNAME of scan.info) + pronoun(him,lvword) + endcase + case S.HER: + unless her error("I don't know to whom ':s' refers.",PNAME of scan.info) + pronoun(her,lvword) + endcase + case S.THEM: + unless them error("I don't know to whom ':s' refers.",PNAME of scan.info) + pronoun(them,lvword) + endcase + case S.ME: + pronoun(me, lvword) + endcase + case S.THERE: + unless WIZARD of profile error() + unless there error("I don't know where you mean by 'there'.") + $( let s=selector 7:29:bcplrm + and b=selector 6:30:1 + and c=0 + $[ $move 1, there +come: $ldb 2, b + $jumpe 2, gone + $aos c + $addi 2, '*S' + $idpb 2, s + $lsh 1, 6 + $jrst come +gone: + $] + LENGTH of bcplrm_c + $) + !lvword_fake.node(bcplrm) //hope only have 1 room per sentence! + endcase + case S.IT: + unless it error("I don't know what you mean by 'it'.") + case S.WITH: + !lvword_find.word(it) + endcase +$) +and setit(nd) be unless NOIT of nd it_PNAME of nd +and pronoun(pn,lvword) be +$( let word=find.player(pn) + !lvword_fake.node(pn) + if \word unless hidden(word) + $( PTYPE of fake_S.PLAYER + P1 of fake_word + them_PNAME of LH from player.names!word + $) +$) +and nvscanner()=valof +$( let token=scanner() + while token=S.ACTION \/ token=S.FASTATN do token_scanner() + resultis token +$) +and scanner()=valof +$( let word=? + switchon scanch into + $( case 'A' ... 'Z': + case 'a' ... 'z': + case '0' ... '9': + if conversing + $( get.text() + resultis S.SPECIAL + $) + word_read.name() + scan.info_find.word(word) + if scan.info then + $( if PTYPE of scan.info=S.NOISE then loop + if PTYPE of scan.info=S.SPECIAL + $( get.text() + switchon FIRSTCH of mbuffer into + $( + case ',': + case '.': + case ':': + case '-': + FIRSTCH of mbuffer_'*0' + default '*0' ... '*D': + $) + P1 of scan.info_SF.SHOUT + $) + resultis PTYPE of scan.info + $) + scan.info_fake.node(word) + word_find.player(word) + if word\=-1 then + $( if hidden(word) resultis false + PTYPE of scan.info_S.PLAYER + P1 of scan.info_word + resultis S.PLAYER + $) + resultis false + case ',': + case '.': + case ':': + case '-': + if conversing + $( get.text() + resultis S.SPECIAL + $) + scanch_getch() + resultis S.CONT + case '*"': + scanch_getch() + get.text() + resultis S.SPECIAL + case ';': + chcnt_0 + verb_0 + case '*L' ... '*P': + case '*$': + case '*^G': + case '*E': + scanch_-1 + resultis S.CONT + case ')': + conversing_true + endcase + case '(': + conversing_false + endcase + case '**': + case '>': + if conversing + $( conversing_false + out("*C*LLeaving converse mode.*C*L") + resultis S.UNCONVERSE + $) + default '*0' ... '*D': + $) + scanch_getch() +$) repeat +and read.name()=valof +$( let linev,n=vec 127,0 + while 'a'<=scanch<='z'\/'0'<=scanch<='9'\/'A'<=scanch<='Z' do //use a case? + $( n+:1 + unless n>127 n!linev_'A'<=scanch<='Z'->scanch+#40,scanch + scanch_getch() + $) + !linev_n>127->127,n + resultis packstring(linev,name.string) +$) +and find.word(word,type,cont)=valof +$( let node=dictionary!((!word>>1) rem HASHSIZE) + switchon numbargs() into + $( case 1: + type_0 + case 2: + cont_0 + $) + if cont then node_LINK of cont + while node do test seq(word,PNAME of node)/\(type=0\/PTYPE of node=type)/\ + (PTYPE of node ne S.OBJECT \/ DREC of node ge #400000) then resultis node + or node of_LINK + resultis false +$) +and find.room(name)=valof +$( let node=? + name_sixbit(name) + node_index!((name>>1) rem HASHSIZE) + while node do test name=RNAME of node then resultis node + or node of_LINK + resultis false +$) +and fake.node(wd)=valof +$( let t=fake.string + fake.string_name.string + name.string_t + PNAME of fake_wd + P1 of fake_0 + PTYPE of fake_0 + resultis fake +$) +and find.player(name)=valof +$( /* + This procedure searches down the list of player names, and returns the player + number if found, otherwise -1. + */ + for i=0 to 35 do if player.names!i if seq(name,player.names!i) resultis i + resultis -1 //otherwise +$) +and get.text() be +$( read.message(mbuffer) + scan.info_fake.node(mbuffer) + PTYPE of scan.info_S.SPECIAL + P1 of scan.info_SF.QOTE + unless deaf\/us(PNAME of profile) if censor("richard") \/ censor(" roy") + out("*C*LIn the distance you hear a deep rumble of thunder.*C*L") +$) +and censor(password)=valof +$( let pw, txt=vec 127, vec 127 + unpackstring(password, pw) + unpackstring(mbuffer,txt) + for i=1 to !pw pw!i bitor_#40 + for i=1 to !txt txt!i bitor_#40 + for i=1 to !txt-!pw+1 do if valof + $( for j=1 to !pw + unless pw!j=txt!(i+j-1) resultis false + resultis true + $) resultis true + resultis false +$) diff --git a/MUD2.BCL b/MUD2.BCL new file mode 100644 index 0000000..8170446 --- /dev/null +++ b/MUD2.BCL @@ -0,0 +1,463 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let handledemons(oldptr) be test bstr then return or +jar(@delock)<> //Locking not needed for locals, but cheaper not to check +$( let ptr=!oldptr + while ptr + $( unless E.SUSPENDED of ptr E.TIME of ptr -_1 + test E.TIME of ptr ge #777770 then //give 'em up to -8 in the database + $( let oldvb,oldobj,oldins=verb,objct,instrmnt + and demon=ptr+DOF + verb, objct, instrmnt_D.VERB of demon, D.OBJECT of demon, D.INSTRUMENT of demon + instate() + LINK of oldptr_LINK of ptr + if D.PLONK of demon plonk(demon) + (ptr ge #400000->freemblock,free)(ptr) //Hack! But isn't it all? + ptr_LINK of oldptr + unjar(@delock) + action(true) + jar(@delock) + reinstate(oldvb, oldobj, oldins) + $) or + $( oldptr_ptr + ptr of_LINK + $) + $) + unjar(@delock) +$) +and move(mnum) be +$( let trvtab,t,looking=TRAVEL of room,?,numbargs() + unless looking mnum_DREC of verb + start.leading() + until LH of trvtab=RHMASK do test LH of trvtab bitand 1<LINK of s,ROBJT of room) + o_t bitor s + $) + unjar(lvrdoor) + endcase + $) + case 3: looksee(looking) //straight text message + longdescribe(v) + return + case 4: if RH of trvtab ne oldroom then //can't go way you came + $( unless looking lastdir_mnum + move.sub(RH of trvtab,looking) + return + $) + endcase + case 5: //text message if carrying some v + if carrying.class(v,false,carry) do + $( if looksee(looking) + longdescribe(RH of trvtab) + return + $) + endcase + case 6: //text message if carrying some v or some here in prop 0 + $( let s,o=false,? + t_carrying(v,false,carry) + jar(lvrdoor) + unless t s_is.or.was.here(v,ROBJT of room) + o_t bitor s + while o + $( if (P4 of o\=0\/ DESTROYED of o ls 0) then //ne 0? Wonder why?! + $( unjar(lvrdoor) + looksee(looking) + longdescribe(RH of trvtab) + return + $) + if t t_carrying(v,false,LINK of t) + unless t s_is.or.was.here(v,s->LINK of s,ROBJT of room) + o_t bitor s + $) + unjar(lvrdoor) + endcase + $) + case 7: //mustn't be carrying any v in prop 0 + t_carrying.class(v,false,carry) + while t + $( unless P4 of t endcase + t_carrying.class(v,false,LINK of t) + $) + lose.followers() + unless looking lastdir_mnum + move.sub(RH of trvtab,looking) + return + case 8: //mustn't be carrying any v or there be some in prop 0 + $( let s,o=false,? + t_carrying(v,false,carry) + jar(lvrdoor) + unless t s_is.or.was.here(v,ROBJT of room) + o_t bitor s + while o + $( if (P4 of o = 0) /\ (DESTROYED of o ge 0) + $( unjar(lvrdoor) + endcase + $) + if t t_carrying(v,false,LINK of t) + unless t s_is.or.was.here(v,s->LINK of s,ROBJT of room) + o_t bitor s + $) + unjar(lvrdoor) + unless looking lastdir_mnum + move.sub(RH of trvtab,looking) + return + $) + case 9: //set off demon + if looking error("You can't tell.") + enable(v) + return + case 10: + if looking error("You can't tell.") + oktogo() + longdescribe(v) + if WIZARD of profile ne 0 return + test spectacular then //should be a procedure... + $( drop.everything() + STAMINA of profile_STAMINA of profile<20 -> 10, (STAMINA of profile)-10 + special(SF.SLEEP) + $) or + $( oldroom_room + quit() + $) + endcase + $) + trvtab+:2 + $) + or + $( unless looking lastdir_mnum + move.sub(RH of trvtab, looking) + return + $) or trvtab+:2 + if looking error("You can't tell.") + Error("You cannot go that way!") +$) +and move.sub(newrm, justlooking) be test numbargs()=2/\justlooking then +$( if FORCED of newrm newrm of_FORCED + test WIZARD of profile Describe(newrm,true) or + $( if \(visible(newrm))\/ + ((A.DEATH bitor A.NOLOOK) bitand ATTRIB of newrm) error("You can't tell.") + desc.short(newrm) + if A.HIDE bitand ATTRIB of newrm return + unless A.HIDEAWAY bitand ATTRIB of newrm + $( let nd,nm,l,something=?,?,?,false + Outz($az"Therein can be seen") + lock(newrm+door) + nd_ROBJT of newrm + while nd do test DESTROYED of nd ls 0\/valof + $( let cprop=P4 of nd //use WHERE instead? + resultis (selector 18:18*(cprop rem 2):cprop/2+OBJECTSIZE+1) of nd=0 + $) then nd of_LINK or + $( nm_PNAME of nd + l_LENGTH of nm + test ccnt+l+1>72 then out("*C*L:S",nm) or out("*S:S",nm) + something_true + nd of_LINK + $) + unlock() + unless something outz($az" nothing") + outz($az".*C*L") + $) + for i=0 to 35 do if 1<" asleep","",ROBJT of tz) + $) + $) +$) or move.ser(newrm) +and move.ser(newrm, no.option) be +$( oktogo() + unless (RELAXED\/us(me)) if A.CHAIN bitand ATTRIB of newrm + error("You can't leave that way, for magical reasons...sorry!") + if numbargs()\=2/\((max.obj()room of_FORCED + if followers test A.DEATH bitand ATTRIB of room then lose.followers() + or broadcast(K.YFIM,followers,newrm) + CROOM of profile_room + lvrdoor_DOOR+room + setbit() + describe(room) + if (A.CHAIN bitand ATTRIB of room) then quit(INVADE of LEAVE of room,BCHEAD of LEAVE of room) + been.in(RNUMB of room)_true +$) +and oktogo() be +for i=0 to 35 do if fight!i then +test start.leading() then error("You are too involved in combat to follow anyone further") or + error("You can't leave in the middle of a fight unless you flee in some direction!") +and moveobject(obj) be +$( let rm,trvtab,tracer,newrm,mnum,insides,ins,t,v,it.moves= + ?,?,?,?,?,CONTENTS of obj,insides->CONTS of insides,0,?,?,MOTN of obj + jar(@mvlock) + rm,trvtab,tracer_CURROOM of it.moves, TRAVEL of rm, trvtab + if LH of tracer=RHMASK unjar(@mvlock)<>return + until LH of tracer=RHMASK do tracer+_2 + trvtab+_random((tracer-trvtab)/2)*2 + mnum_LH of trvtab + for i=TRAVEL of rm to tracer-2 by 2 do if mnum bitand LH of i then + $( v_CONDVAL of i + switchon CONDTYPE of i into + $( + case 0: if ins + $( unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) + case 10: + endcase + case 1: + if classmatch(v,obj)/\P4 of obj=0 endcase + t_carrying.class(v,false,ins) + while t + $( unless P4 of t endcase + t_carrying.class(v,false,LINK of t) + $) + unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + case 2: + if LH of obj=v/\P4 of obj=0 endcase + $( let nd=ROBJT of rm + while nd do + $( let t=LH of nd + if ((A.HIDEAWAY bitand attrib of rm) ne 0)/\(FIXED of nd=0) nd_LINK of nd<>loop + test v=t/\((P4 of nd=0)\/(DESTROYED of nd ls 0)) then endcase + or nd of_LINK + $) + $) + t_carrying(v,false,ins) + while t + $( unless P4 of t endcase + t_carrying(v,false,LINK of t) + $) + case 3: case 9: + unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + case 4: if RH of i ne PREVROOM of it.moves endcase + case 5: case 6: //isn't this a bit unfair to the mobiles? + unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + case 8: if LH of obj=v/\P4 of obj=0 endcase //monsters can't block themselves... + $( let nd=ROBJT of rm + while nd do + $( let t=LH of nd + if ((A.HIDEAWAY bitand attrib of rm) ne 0)/\(FIXED of nd=0) endcase + test v=t /\(P4 of nd=0)/\(DESTROYED of nd ge 0) then + $( unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) or nd of_LINK + $) + $) + t_carrying(v,false,ins) + while t + $( unless P4 of t + $( unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) + t_carrying(v,false,LINK of t) + $) + endcase + case 7: + t_carrying.class(v,false,ins) + while t + $( unless P4 of t + $( unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) + t_carrying.class(v,false,LINK of t) + $) + endcase + $) + newrm_RH of i + if (A.HIDEAWAY bitand ATTRIB of newrm) + $( unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) + if FORCED of newrm newrm of_FORCED + if (A.DEATH bitand ATTRIB of newrm) \/ newrm=rm \/ + (A.CHAIN bitand ATTRIB of newrm) \/ ((A.SMALL bitand ATTRIB of newrm)/\occupied(newrm,obj)) + $( unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) + lock(door+rm) + $( let nd, oldnd=ROBJT of rm,rm+4 + until nd=obj do + $( oldnd_nd + nd of_LINK + unless nd + $( unlock() + unjar(@mvlock) + instinctify(it.moves,rm,obj,ins) + return + $) + $) + LINK of oldnd_LINK of nd + $) + unlock() + lock(door+newrm) + pushlist(newrm+4,obj) + unlock() + CURROOM of it.moves_newrm + PREVROOM of it.moves_rm + unjar(@mvlock) + instinctify(it.moves,newrm, obj, ins) + $( let who.from, who.to, snprs, chsrs = who!rm, who!newrm, SNOOPERS of MOTN of obj,CHASERS of MOTN of obj + for j=0 to 35 do + $( let bit=1<find.word(PNAME of obj), D.OBJECT of demon, + D.INSTRUMENT of demon=#777777->find.word(PNAME of obj), D.INSTRUMENT of demon, + newrm + instate() + action(false) + reinstate(oldvb, oldobj, oldins) + room_oldrm +$) +and enabled(demonum) = valof +$( let ptr=events + while ptr test E.DEMONUM of ptr=demonum/\E.SUSPENDED of ptr=false then resultis true or ptr of_LINK + jar(@delock) + ptr_gdemons + while ptr test E.DEMONUM of ptr=demonum/\E.SUSPENDED of ptr=false then unjar(@delock)<>resultis true or ptr of_LINK + unjar(@delock) + resultis false +$) +and enable(demonum, old) be +$( let indx,demon,globald=demons+(DEMONSIZE+DOF)*demonum,?,D.GLOBAL of indx + unless 0 le demonum le max.demon.no return + if numbargs()=2 + $( let ptr,gotone=globald->gdemons, events,false + while ptr + $( if E.DEMONUM of ptr=demonum/\E.SUSPENDED of ptr + $( E.SUSPENDED of ptr_false + gotone_true + $) + ptr of_LINK + $) + if gotone return + $) + demon_globald->getmblock(),newvec(DEMONSIZE+DOF) + copy(indx, demon+DOF, DEMONSIZE) + E.TIME of demon+_random(D.OFFSET of indx) + jar(@delock) + !demon_(demonum<<18) bitor (globald->gdemons, events) + (globald->gdemons,events)_demon + unjar(@delock) +$) +and suspend(ptr, demonum) be while ptr +$( if E.DEMONUM of ptr=demonum E.SUSPENDED of ptr_true + ptr of_LINK +$) +and disenable(demonum) =valof +$( let ptr, oldptr=events,@events + while ptr + $( if E.DEMONUM of ptr=demonum + $( LINK of oldptr_LINK of ptr + free(ptr) + resultis true + $) + oldptr_ptr + ptr of_LINK + $) + jar(@delock) + ptr, oldptr_gdemons, @gdemons + while ptr + $( if E.DEMONUM of ptr=demonum + $( LINK of oldptr_LINK of ptr + freemblock(ptr) + unjar(@delock) + resultis true + $) + oldptr_ptr + ptr of_LINK + $) + unjar(@delock) + resultis false +$) diff --git a/MUD3.BCL b/MUD3.BCL new file mode 100644 index 0000000..c3a6934 --- /dev/null +++ b/MUD3.BCL @@ -0,0 +1,344 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let error(message,f1,f2,f3) be +$( outs("*C*L") + checksnoop(SNOOPROMPT) + test numbargs() then echo()<>out(message,f1,f2,f3)<>outs("*C*L") or + outstr(strtab,5) + flush() + jump(mainloop) +$) +and private() be +$( olog, osnop_logstr, snoopedon + logstr, snoopedon_0,false +$) +and public() be +$( logstr, snoopedon_olog, osnop +$) +and reinstate(ov, oo, oi) be +$( verb, objct, instrmnt_ov, oo, oi + instate() +$) +and instate() be verbname,objname,insname_ + verb->PNAME of verb, "", PNAME of objct, instrmnt->PNAME of instrmnt, "" +and playing(sm) = valof +$( sm_(1<<(sm-2))*EXP.STEP + for i=0 to 35 if player.names!i + $( let prof=LH from player.names!i + if SCORE of prof ge sm\/WIZARD of prof=1 resultis true + $) + resultis false +$) +and normalise(attrib, max) be +$( if attrib of profile > max attrib of profile_max + unless attrib=STAMINA if attrib of profile <10 attrib of profile_10 +$) +and setexp(o1,nolose,asking) =valof +$( let ans=? + unless numbargs()=3 asking_false + unless asking if (WIZARD of profile)=1 return + ans_(P4 of o1=SCOREPROP of o1 \/P1 of o1=1 \/ RANDM of o1 ne 0)-> valof + $( let res=VALUE of o1 + $[ $hrre 1, res + $movem 1, res + $] + if res le 0 /\ numbargs()=2 resultis 0 + if P1 of o1=1 \/ RANDM of o1 then res*_(P4 of o1)+1 + resultis extra(res) + $),0 + if asking resultis ans + setscore(ans) +$) +and setscore(pts, okberserk) be if pts +$( let oldlev,newlev=player.level(),? + unless numbargs()=2 okberserk_1 + test BZK/\BERSERK of profile then unless numbargs()=2 return + or okberserk_1 + unless pts ls 0 if INVIS of profile return + SCORE of profile+_pts*okberserk + if SCORE of profile ls 0 SCORE of profile_0 + newlev_player.level() + if newlev ne oldlev + $( let alter=newlev gr oldlev->boost, unboost + Out("Your level of experience is now :P.*C*L",(SEX of profile->female,male)!newlev) + unless us(me) sendall(true,K.IHCL,false,true,(newlev<<18)+oldlev) + alter(STRENGTH) + alter(DEXTERITY) + alter(STAMINA) + alter(STAMINAMAX) + if newlev=MAX.LEVEL unless BZK/\BERSERK of profile + out("You can now enter :s mode, but I suggest you save your persona first...*C*L", + (SEX of profile->female, male)!MAX.LEVEL) + $) +$) +and read.message(addr) be +$( if chcnt>0 while scanch='*S'\/scanch='*T' do scanch_getch() + unless chcnt>0/\scanch ne '*C' then + $( outz($az"OK, tell me the message:*C*L") + if scanch='*C' scanch_getch() + check.stuff() + scanch_getch() + $) + nextch,chcnt-:1,-1 + chcnt_chcnt-(linebuffer!(!linebuffer-1)='*C'->2,1) + !nextch_chcnt>69->69,chcnt + while !nextch /\ nextch!!nextch ls ' ' then !nextch-_1 + packstring(nextch,addr) + reset() +$) +and check.gone() be +$( unless active!player.no=-1 return + unjar(@deldr) + out("*C*LTime out! :6 has lost contact with you!*C*L", mud6) + out("You have been exorcised from the game.*C*L") + if detch() run($6"sys", $6"logout", $6"exe", 0) + finish +$) +and dormant() be +$( jar(@deldr) + check.gone() + active!player.no_-2 + unjar(@deldr) +$) +and alive() be +$( jar(@deldr) + active!player.no_valof + $[ $mstime 1, 0 $] + unjar(@deldr) +$) +and flush() be +$( objct_fake.node("that") + him_0 + her_0 + them_0 + it_0 + there_0 + instrmnt_0 + verb_0 + chcnt_0 + scanch_-1 +$) +and nextnum(def)=valof +$( let ans=? + check.stuff() + scanch_getch() + ans_getnum() + resultis ans->ans,def +$) +and swap(lvone,lvtwo) be +$( let three=!lvone + !lvone_!lvtwo + !lvtwo_three +$) +and swapobjins() be +$( swap(@objct, @instrmnt) + swap(@objname, @insname) + if objct=0 objct_fake.node("that")<>objname_"that" +$) +and gettrue()=valof +$( swap(@getnum, @gettrue) + resultis true +$) +and getnum()=valof +$( let res=0 + if chcnt>0 then + $( while scanch='*S' \/ scanch='*T' do scanch_getch() + while '0' le scanch le '9' do res_res*10+scanch-'0'<>scanch_getch() + $) + reset() + resultis res +$) +and place(room) = valof +$( let rm=0 + if WIZARD of profile=1/\instrmnt + $( rm_find.room(insname) + if rm rm_LH of rm + $) + resultis rm->rm,room +$) +and killmonster(it) be if MOTN of it +$( let moit,watchers,chsrs,insides,ins,rm= + MOTN of it,SNOOPERS of moit,CHASERS of moit,CONTENTS of it,insides->CONTS of insides,0,CURROOM of moit + for i=0 to 35 do + $( let bit=1<resultis true + nd of_LINK + $) + unlock() + for i=0 to 35 do if (1<0/\holding(obj) + test val then unless oldprop + $( OBJ.EXTRA of profile-_(v/WTHRESHOLD)+1 + WT.EXTRA of profile-_v + $) or + $( OBJ.EXTRA of profile+_(v/WTHRESHOLD)+1 + WT.EXTRA of profile+_v + $) + $) + unless numbargs()=3 return + longdescribe(sm) +$) +and hidden(pnum) = valof +$( let prf=LH from player.names!pnum + if invisible(prf) resultis true + pnum_CROOM of prf + resultis pnum=0\/ + (WIZARD of profile=1\/flipping -> false, A.HIDE bitand (ATTRIB of pnum)) +$) +and dud(one,two) be return +and person(objct) be +$( if PTYPE of objct = S.PLAYER /\ hidden(P1 of objct)=0 return + error(":U is not a player.",objname) +$) +and reset() be +$[ $setom scanch + $setzm chcnt + $move 1, objname + $move 1, 0(ac) + $came 1, bufull + $( return $) + $move 1, rep1 + $add 1, rep2 + $hlrz 1, 0(ac) + $movem 13, 3(ac) +$] + +and sb(num) = valof +$( res6_0 + until num=0 do + $( res6_(res6>>6) bitor ((num rem 10 +#20)<<30) + num /_10 + $) + resultis @res6 +$) +and player.level(prof)=valof +$( let scr=SCORE of (numbargs()->prof, profile) + for i=0 to MAX.LEVEL do if (1<(BERSERK of profile), 1))*12) + if numbargs() + $( fightmess(B.IMDEAD,0) //player 0 will do some extra work... + freemblock(block) + $) + for i=0 to 35 do if fight!i + $( test i=player.no then if MOTN of fight!i FIGHTS of MOTN of fight!i bitand_\player.bit or + $( block_getmblock() + if block + $( block!3_!nam + block!4_1!nam + send(i, block, K.IMDD,pts) + them_i + $) + $) + fight!i_0 + $) + if them ne player.no + $( let tmp=? + private() + tmp_Createtmp($6"where", Label(tish)) + Writeno(tmp,valof + $[ $move ac, them + $add ac, jobnos + $move ac, 0(ac) + $trmno. ac, 0 + $seto ac, 0 + $gtntn. ac, 0 + $seto ac, 0 + $]) + Close(tmp) + if false +tish: Writes(tty, "*C*LCan't create the .TMP file for WHERE.*C*L") + public() + $) + quit() +$) +and extra(pts)=3*pts-((4*pts)/(player+2)) diff --git a/MUD4.BCL b/MUD4.BCL new file mode 100644 index 0000000..02ab58d --- /dev/null +++ b/MUD4.BCL @@ -0,0 +1,245 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let occupied(room,obj)=valof +$( let who.copy=who!room + unless who.copy resultis false + broadcast(K.STTE,who.copy,PNAME of obj) + resultis true +$) +and start.leading() = valof test not leading then +$( transmit(leading,0,K.ISFY) + leading_true + resultis true +$) or test animal then +$( CHASERS of MOTN of animal bitand_\player.bit + animal_false + resultis true +$) or resultis false +and lose.followers() be if followers then +$( broadcast(K.SFM,followers) + followers_0 +$) +and doownthing() = valof test not frontman +$( transmit(frontman, 0, K.ISJY) + frontman_true + resultis true +$) or resultis false +and lose.joiners() be if joined then +$( broadcast(K.SJM,joined) + joined_0 +$) +and break.off() be +$( lose.followers() + start.leading() + lose.joiners() + doownthing() +$) +and new.stamina(pno) =valof +$( let prof, val, smax=?, ?, ? + unless numbargs() pno_player.no + prof_LH from player.names!pno + unless ASLEEP of prof resultis STAMINA of prof + val_can.wake(pno) + val+_STAMINA of prof + smax_STAMINAMAX of prof + if val gr smax val_smax + resultis val +$) +and can.wake(pno)=(ud.time()-kips!(numbargs()->pno,player.no))/SDIV +and wake.up() be +$( unless ASLEEP of profile return + out("You wake up.*C*L") + broadcast(K.IHWU, who.copy) + STAMINA of profile_new.stamina() + kips!player.no_false + ASLEEP of profile_false + out("Your stamina is now :N.*C*L", STAMINA of profile) +$) +and fightmess(what, snd, deadname) be +$( let str, who=vec 26, valof + test snd=player.no then + $( let name=numbargs()=3->deadname,PNAME of fight!player.no + !str_!"*0the" + 1!str_!name + 2!str_1!name + LENGTH of str+_((LENGTH bitor 1) of str)+1 + (LENGTH bitor 1) of str_'*S' + resultis str + $) or resultis numbargs()=3->deadname, player.names!snd + switchon what into + $( + case B.START: + out("You :r that :p is :r at you :r...*C*L", 16, who, 1, 2) + endcase + case B.IHIT: + out("You :r :p with a :r :r!*C*L", 3, who, 4, 5) + endcase + case B.THEYMISS: + out("You :r :r a :r :r :r :p.*C*L", 22, 6, 7, 5, 9, who) + endcase + case B.IMISS: + out("Your :r :r is :r :p.*C*L", 7, 5, 10, who) + endcase + case B.THEYHIT: + test random(3) then out("The :r of a :r :r :p sends you :r.*C*L", 12, 5, 9, who, 21) + or out("You are :r by the :r of a :r :r :p!*C*L", 11, 12, 5, 9, who) + endcase + case B.IMDEAD: + out("You can :r your :r :r...*C*L", 13, 14, 15) + endcase + case B.IMOK: + out(":r you :r, and :r into the :r.*C*L", 17, 18, 19, 8) + endcase + case B.IHITBACK: + out("Your :r :r sends :p :r!*C*L", 20, 5, who, 21) + endcase + case B.IMISSAGAIN: + out("Your :r :r :r at :p is :r :r.*C*L", 7, 20, 5, who, 22, 23) + endcase + case B.VICTORY: + out("Your last :r :r :U!*C*L", 5, 24, who) + endcase + $) + unless snd=player.no hibernate() +$) +and ch.sendlevel(hmm) be +$( let l=(DREC of hmm) + if l=max.level unless WIZARD of profile + error("Only immortals may speak to immortals in this way.") + sendlevel(l-1) +$) +and sendlevel(l) be +$( let cn,sc1,sc2=?,(1<0 then + $( read.message(mbuffer) + cn_(LENGTH of mbuffer)/5 + cn_cn>13->13,cn + $) or return + for i=0 to 35 if i ne player.no /\ player.names!i + $( let pr=LH from player.names!i + if (l=max.level-1/\(WIZARD of pr ne 0\/SCORE of pr ge sc1))\/(sc1 le SCORE of pr ls sc2) + $( let mb=getmblock() + unless mb return + transmit(i, 0, K.ISCY, verbname) + copy(mbuffer, mb+2, cn) + send(i, mb, K.TEXT, mb!2) + $) + $) +$) +and sendall(bits,fn,always,wizonly,val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14) be +if bits for i=0 to 35 if player.no \= i if bits bitand (1<her,him)_0 + transmit(snooping, 0, K.IWSS) + snooping_true //that is to say, false... + SNOOPBIT of profile_false + $) +$) +and announcechange() be sendall(true,K.WM,true,false) +and stop.fighting(fleeing) be +$( let fighting=false + for i=0 to 35 do if fight!i + $( fighting_true + test i=player.no then if MOTN of fight!i FIGHTS of MOTN of fight!i bitand_\player.bit + or transmit(i,0,K.IFFY, verb\/((SCORE of profile gr FLEELOSS->((player.level()+1)*FLEELOSS*numbargs()),SCORE of profile)<<18)) + fight!i_false + $) + if fighting/\numbargs() + $( out("You drop everything as you make your tactical withdrawal...*C*L") + drop.everything() + setscore((player.level()+1)*2*-FLEELOSS) + $) + quitflg_true +$) +and unfollow() be //the same as unsnoop... +$( if animal + $( CHASERS of MOTN of animal bitand_\player.bit + out("You have stopped following the :P.*C*L", PNAME of animal) + animal_false + $) + if \leading + $( transmit(leading,0,K.ISFY) + out("You have stopped following :P.*C*L", player.names!leading) + leading_true + $) +$) +and inform(nd,token) be if MOTN of nd broadcast(token, SNOOPERS of MOTN of nd, nd,true) +and stopmoving(nd) be +$( let mobile=MOTN of nd + unless mobile return + !mobile_0 + broadcast(K.SFM,CHASERS of mobile, nd,true) + CHASERS of mobile_false +$) +and broadcast(token,bits,info,to.me) be +$( unless numbargs()=4 bits bitand_\player.bit + unless bits return + for i=0 to 35 if (1<nd of_LINK + LINK of oldnd_blk + unjar(queue.doors+dst) + unless dst=player.no + $[ $move ac, dst + $add ac, jobnos + $move ac, 0(ac) //I should've used block instead of vec + $wake ac, 0 + $trn + $] +$) +and transmit(dst,blk,fn,val) be + send(dst,blk->blk,getmblock(true),fn,numbargs()<4->0,val) diff --git a/MUD5.BCL b/MUD5.BCL new file mode 100644 index 0000000..f46b4ec --- /dev/null +++ b/MUD5.BCL @@ -0,0 +1,2068 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let special(sftype) be +$( let cn,nd,nm,l=0,?,?,? + switchon sftype into + $( case SF.TELL: //Tell + if dumb error("You can't tell anyone anything, you're dumb.") + if PTYPE of objct=S.LEVEL + $( ch.sendlevel(objct) + endcase + $) + interact(I.TELL) + endcase + case SF.SAY: //Say + if dumb error("You can't say anything, you're dumb.") + out("*':s*'*C*L",objname) + endcase + case SF.FLUSH: + flush() + endcase + case SF.GET: //Get + test PTYPE of instrmnt=S.PLAYER then + $( swapobjins() + interact(I.STEAL) + swapobjins() + $) or switchon PTYPE of objct into + $( case S.OBJECT: + gett() + endcase + case S.ALL: + test RELAXED/\WIZARD of profile=1/\(spectacular=0\/(spectacular ne 0/\maint)) then get.all() or + test spectacular/\(WIZARD of profile=0) then Error("Not during a spectacular!") or + $( let newnd,nd,portal,gotone,all=?,?,DOOR+place(room),false,objct + unless A.HIDEAWAY bitand ATTRIB of room + $( lockup(@nd,@newnd) + while nd do + $( newnd_LINK of nd + unless FIXED of nd ne 0\/NOGET of nd ne 0\/(DESTROYED of nd ls 0) //the ne 0's are needed + $( objct_find.word(PNAME of nd) + objname_PNAME of objct + unlock() + action() + gotone_true + lock(portal) + $) + nd_newnd //2 simultaneous get alls will cause trouble... + $) + unlock() + $) + unless gotone error("Nothing taken.") + objct_all + objname_PNAME of objct //needed? + $) + endcase + case S.CLASS: + get.class() + endcase + case S.PLAYER: + interact(I.STEAL) + default: + error("I don't know what :s means.",objname) + $) + endcase + case SF.KEEP: + $( let val=? + test PTYPE of objct=S.OBJECT then + val_(D1 of DREC of objct)<<18\/objname or + test PTYPE of objct=S.CLASS /\ valof + $( val_toting.class(P1 of objct) + resultis val + $) then val_(PTYPE of val)<<18\/(PNAME of val) + or error("You can only keep hold of objects.") + if val=kept out("You're already keeping :s.*C*L",objname)<>endcase + if kept /\ toting(LH from kept) out("Stopped keeping :s. ", kept) + out("Keeping :s.*C*L", objname) + kept_val + endcase + $) + case SF.UNKEEP: + test kept then + $( out(":U unkept.*C*L", kept) + kept_0 + $) or outs("You aren't keeping anything anyway!*C*L") + endcase + case SF.DROP: //Drop + test PTYPE of instrmnt=S.PLAYER then + $( swapobjins() + interact(I.GIVE) + swapobjins() + $) or + switchon PTYPE of objct into + $( case S.OBJECT: + drop() + endcase + case S.ALL: + test RELAXED/\WIZARD of profile=1/\(spectacular=0\/(spectacular ne 0/\maint)) then drop.everything(true) or + $( let all=objct + and ptr=carry + objname_PNAME of objct + unless carry error("You aren't carrying anything!") + while ptr test PTYPE of ptr=LH from kept then + $( out(":U kept.*C*L", PNAME of ptr) + ptr of_LINK + $) or + $( let nd=LINK of ptr + objct_find.word(PNAME of ptr) + action() + ptr_nd + $) + objct_all + objname_PNAME of objct //needed? + $) + endcase + case S.CLASS: + drop.class() + endcase + case S.PLAYER: + interact(I.GIVE) + endcase + default: + error("I don't know what :s means.",objname) + $) + endcase + case SF.BYE: + checkforced() + test RELAXED then Quit(true) or quit() + endcase + case SF.SGO: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( unless us(me) then error() + unless WIZARD of profile Error() + $( let game=Sixbit(objname) + scanner() + quit(PNAME of scan.info,game) + $) + endcase + $) + CASE SF.KILL: case SF.PROVOKE: + if peace test sftype=SF.PROVOKE then Jump(mainloop) or Error("Fighting is currently forbidden.") + test PTYPE of objct = S.PLAYER then interact(I.KILL) or + $( let obj, tipe, watchers,wiz=?, PTYPE of objct, 0,who.copy + unless tipe=S.OBJECT\/tipe=S.CLASS error(":U is not a player.", objname) + obj_tipe=S.CLASS-> PTYPE of valof + $( let v=here.or.toting.class(P1 of objct) + unless v error("You can't :s that!", verbname) + resultis v + $), D1 of DREC of objct + obj_here.or.toting(obj) + test sftype=SF.KILL then + $( unless objct ne fake error("To use the verb :p you have to give someone's name!", verbname) + unless DESTROYED of obj gr 0 error("You can't :s that!", verbname) + if fight!player.no=obj error("You're already fighting the :s!", objname) + if fight!player.no error("You can't fight more than one non-player at once!") + $) or + $( if fight!player.no ne 0\/obj=0 jump(mainloop) + out("You are attacked by the :p!*C*L",objname) + $) + quitflg_false + if MOTN of obj + $( FIGHTS of MOTN of obj bitor_player.bit + watchers_SNOOPERS of MOTN of obj + $) + fight!player.no_obj + for i=0 to 35 if player.names!i/\WIZARD of LH from player.names!i ne 0 wiz bitor_1<K.MFM,K.IFM,false,false,objname) + test sftype=SF.KILL then + send(player.no, 0, WIZARD of profile->K.ISAHM, + DEXTERITY of profile gr 60->K.ISAHM, K.ISAMM, WIZARD of profile->10000, random((STRENGTH of profile)/F.DMGE1)+1) + or send(player.no, 0,WIZARD of profile\/random(100) le 40 -> K.ISAM, + K.ISAH,random((WEIGHT of obj)/1000/F.DMGE2)+1) + if watchers broadcast(K.SFO,watchers,obj) + $) + endcase + case SF.EXORCISE: + spcheck() + if us(objname) unless maint error("You haven't a ghost of a chance.") + exorcise() + endcase + case SF.QUIT: //Quit + checkforced() + quit() + endcase + case SF.EXITS: + $( let cnt, beendir, rm1, rm, trvtab + =0, 0, WIZARD of profile=1/\find.room(objname), (rm1->LH of rm1, room), TRAVEL of rm + if visible() until LH of trvtab=RHMASK do + $( switchon 1!trvtab->CONDTYPE of trvtab, 0 into + $( + case 2: + unless valof + $( let s,o,v,t=false,?,CONDVAL of trvtab,carrying(v,false,carry) + jar(rm+DOOR) + unless t s_is.or.was.here(v,ROBJT of rm) + o_t bitor s + while o + $( if P4 of o=0\/DESTROYED of o ls 0 unjar(rm+DOOR)<>resultis true + if t t_carrying(v,false,LINK of t) + unless t s_is.or.was.here(v,s->LINK of s,ROBJT of rm) + o_t bitor s + $) + unjar(rm+DOOR) + endcase + $) endcase + case 0 ... 1: + case 4: + case 7 ... 8: + $( let d, dir, rm=LH of trvtab, ?, RH of trvtab + if FORCED of rm rm of_FORCED + for i=1 to 18 + if d bitand 1<'*0','*T') + if WIZARD of profile out(":6*T", !rm) + desc.short(rm) + cnt+_1 + $) + beendir bitor_ d + $) + default 0 ... 10: + endcase + $) + trvtab+_2 + $) + unless cnt Error("You don't see any exits.") + endcase + $) + case SF.ATTACH: + spcheck() + attach() + case SF.DETACH: + spcheck() + detach() //I hate these once-only-called procedures + case SF.PURGE: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( checkforced() + spcheck() + purge() + $) + endcase + case SF.SAVE: + checkforced() + spcheck() + if ATTED of profile Error("Not to an attached persona!") + unless WIZARD of profile if savescr=SCORE of profile + error("You haven't changed score since your last :s.",verbname) + save() + savescr_SCORE of profile + endcase + case SF.SCRE: //Score + $( let oldprof,pno=profile,player.no + if WIZARD of profile=1/\PTYPE of objct=S.PLAYER + $( person(objct) + pno_P1 of objct + profile_LH from player.names!(pno) + $) + out("Score to date: :n*C*L",SCORE of profile) + out("Level of experience: :p:s*C*L", (SEX of profile->female,male)!(player.level()), BZK/\BERSERK of profile->" & berserk", "") + out("Strength: :n*TStamina: :n*TDexterity: :n*TSex: :s*C*L", + STRENGTH of profile,new.stamina(pno),DEXTERITY of profile,SEX of profile->"female", "male") + out("Maximum stamina: :n*C*L",STAMINAMAX of profile) + out("Weight carried: :ng (max. weight: :ng)*C*L",CARRY.COUNT of profile, max.wt()) + out("Objects carried: :n (max. number: :n)*C*L", OBJ.CARRIED of profile, max.obj()) + out("Games played to date: :n*C*L",GAMES.PLAYED of profile) + profile_oldprof + endcase + $) + case SF.LOOK: //Look + test PTYPE of objct=S.MOTION then + test (WIZARD of profile=1)\/random(player.level()+2) then move(DREC of objct) or + error("You can't tell.") or + $( if PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS + $( let bag=object() + if bag/\CONTENTS of bag Sayinsides(bag,0,objname, true)<>endcase + $) + if WIZARD of profile + $( let l=find.room(objname) + if l describe(LH of l,true)<>endcase + $) + describe(room,true) + $) + endcase + case SF.MAP: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( unless essex error() + $( let rm,old=WIZARD of profile=1/\find.room(objname),logstr + rm_rm->LH of rm,room + unless visible() error(blind->"You can't see, you're blind.","The room is too dark to see anything.") + rm of_MAPWD + unless rm Error("The room is too difficult to map.") + logstr_0 + dscribe(rm, mapput) + unless old endcase + logstr_old + old_snoopedon + snoopedon_0 + writes(logstr,"*C*L(Maps are not printable).*C*L") + snoopedon_old + endcase + $) + $) + case SF.P: //Pretend to be doing something else + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( checkforced() + unless WIZARD of profile error() + for i=0 to 30 $[ $outstr $az " *C*L" $] + pretend_not pretend + if \snooping transmit(snooping,0,K.IWSS)<>snooping_true + if snobj SNOOPERS of MOTN of snobj bitand_\player.bit<>snobj_false + verb_0 + endcase + $) + case SF.PRONOUNS: + outz($az "Pronouns are as follows:*C*L") + out("it*T:s*C*Lhim*T:u*C*Lher*T:u*C*Lthem*T:u*C*Lme*T:u*C*L", + it->it, "(not known)", him->him,"(not known)", + her->her, "(not known)", them->them, "(not known)", me) + if PTYPE of objct then unless objct=fake/\hidden(P1 of objct) out("Default object is :s*C*L", objname) + if instrmnt out("Default instrument is :s*C*L", insname) + if WIZARD of profile=1/\there out("there*T:F*C*L",there) + out("Last direction (for going back)*T:U*C*L", motvec!lastdir) + endcase + case SF.QOTE: //Quoted mode. + if dumb error("You can't do that, you're dumb.") + sendall(who.copy,K.TEXT,true,false,!verbname,verbname!1, + verbname!2,verbname!3,verbname!4,verbname!5,verbname!6,verbname!7,verbname!8, + verbname!9,verbname!10,verbname!11,verbname!12,verbname!13) + verb_0 + objct_fake.node("that") + endcase + case SF.LAUGH: + if dumb error("You can't do that, you're dumb.") + test WIZARD of profile then + $( read.message(mbuffer) + sendall(who.copy,K.LAUGH,true,false,!mbuffer,mbuffer!1, + mbuffer!2,mbuffer!3,mbuffer!4,mbuffer!5,mbuffer!6,mbuffer!7,mbuffer!8,mbuffer!9, + mbuffer!10,mbuffer!11,mbuffer!12,mbuffer!13) + $) + or sendall(who.copy, K.LAUGH, true, false, 0) + reset() + endcase + case SF.BERSERK: + test BZK then + $( checkforced() + if demo error("Not during a demo - sorry!*C*L") + $( let pl=? + if BERSERK of profile error("You're already :s!", verbname) + pl_player.level() + if WIZARD of profile pl_max.level + if pl error("No :s can go :s!", (SEX of profile-> female, male)!pl, verbname) + $) + for i=0 to 35 if fight!i error("Not in the middle of a fight, chum!") + BERSERK of profile_true + out("*C*LWARNING: this will be permanent! You can't enter :s mode if*C*L", (SEX of profile-> female, male)!max.level) + outs("you go ahead. Still want to? ") + dormant() + unless valof + $[ $clrbfi +again: $inchrw ac + $clrbfi + $tro ac, #40 + $cain ac, 'y' + $jrst does + $caie ac, 'n' + $jrst eh + $( unless ESSEX + $[ $outstr $az"*C*LN" + $] + $) + $outstr $az"o*C*L" + $( resultis false $) +does: $( unless ESSEX + $[ $outstr $az"*C*LY" + $] + $) + $outstr $az"es*C*L" + $( resultis true $) +eh: $outstr $az"*C*LEh? Yes or no? " + $jrst again + $] + $( alive() + BERSERK of profile_false + jump(mainloop) + $) + out("You are now :s!*C*L", verbname) + STRENGTH of profile+_10 + DEXTERITY of profile-_10 + normalise(STAMINAMAX, 100) + normalise(STAMINA, STAMINAMAX of profile) + normalise(STRENGTH, 100) + normalise(DEXTERITY, 90) + alive() + endcase + $) or error() + case SF.SHELVE: + case SF.UNSHELVE: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( unless us(PNAME of profile) error() + sftype_sftype=SF.SHELVE + unless PTYPE of objct=S.OBJECT Error("Only objects, please!") + $( let obj, nd, oldnd= + D1 of DREC of objct,sftype->carry,shelf,sftype->lvcarry,@shelf + until nd=0 \/LH of nd=obj + $( oldnd_nd + nd_LINK of nd + $) + unless nd error("Can't find it!") + LINK of oldnd_LINK of nd + test sftype then + $( ROBJT of profile_carry + CARRY.COUNT of profile-_WEIGHT of nd + OBJ.CARRIED of profile-_1 + adjustdown(nd) + LINK of nd_shelf + shelf_nd + $) or + $( LINK of oldnd_LINK of nd + pushlist(lvcarry,nd) + ROBJT of profile_carry + CARRY.COUNT of profile+_WEIGHT of nd + OBJ.CARRIED of profile+_1 + adjustup(nd) + $) + setit(nd) + Outs("The shelf contains ") + inventory(shelf, 0, true) + outz($az"*C*L") + $) + endcase + $) + case SF.BEGONE: case SF.PROOF: + $( let bits=true + unless us(PNAME of profile) error() + sftype_sftype=SF.BEGONE + read.message(mbuffer) + if PTYPE of objct=S.PLAYER + $( person(objct) + bits_1<<(P1 of objct) + $) + if sftype locked_true + sendall(bits,sftype->K.BGON,K.PIM,true,false,!mbuffer,mbuffer!1, + mbuffer!2,mbuffer!3,mbuffer!4,mbuffer!5,mbuffer!6,mbuffer!7,mbuffer!8,mbuffer!9, + mbuffer!10,mbuffer!11,mbuffer!12,mbuffer!13) + endcase + $) + case SF.NEWHOURS: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( unless WIZARD of profile=1/\maint error() + $( let day=(LH from ud.time()) rem 7 + Out("*C*LNew hours (for today only)*C*L") + day_times!day + while day + $( let st, ft=STIME of day, FTIME of day + out(":N*T:N*C*L", st, ft) + out(":N -> ", st) + STIME of day_nextnum(st) + out(":N -> ", ft) + FTIME of day_nextnum(ft) + day of_LINK + $) + out("Min. no. of free jobs before allow play: :N -> ", low2) + low2_nextnum(low2) + out("Max. no. of free jobs before stop play: :N -> ",low1) + low1_nextnum(low1) + $) + endcase + $) + case SF.SPECTACULAR: +// test CORELOW then +// error("The :s command has been temporarily removed for space reasons - sorry!", verbname) +// or + $( unless maint error() + test spectacular then + $( spectacular_false + locked_false + autowho_-1 + if RELAXED special(SF.LOG) + Outz($az"*C*LSpectacular ended.*C*L") + $) or + $( let count, one=0, ? + spectacular_true + locked_true + if RELAXED special(SF.LOG) + autowho_autoint + peace_false + unless logstr special(SF.SPECLOG) + for i=0 to 35 if player.names!i unless WIZARD of LH from player.names!i count+_1 + one_count=1 + out("*C*LThere :S :N mortal:c playing.*C*L", one->"is","are",count,one->'*0','s') + $) + test chcnt>0 then + $( read.message(mbuffer) + cn_(LENGTH of mbuffer)/5 + cn_cn>13->13,cn + $) or + $( !mbuffer_0 + cn_0 + $) + for i=0 to 35 do if player.no\=i/\player.names!i then + $( nd_getmblock() + copy(mbuffer,nd+2,cn) + send(i,nd,sftype=K.SPEC,nd!2) + $) + verb_0 + endcase + $) + case SF.SHOUT: + if dumb error("You can't shout anything, you're dumb.") + cn_(LENGTH of verbname)/5 + cn_cn>13->13,cn + for i=0 to 35 unless i=player.no if player.names!i + $( nd_getmblock() + copy(verbname, nd+2, cn) + send(i,nd,((who.copy bitand (1<K.BELW,K.DIST,nd!2) + $) + verb_0 + objct_fake.node("that") + endcase + case SF.LOG: + unless RELAXED error() + if logstr then + $( close(logstr) + logstr_0 + writes(tty,"Logging terminated.*C*L") + return + $) + case SF.SPECLOG: + writes(tty,"Logging commenced.*C*L") + $( let old.snoop=snoopedon + logstr_appendfile("dsk",me,"log",ppn,label(problem)) + snoopedon_false + write(logstr,"*C*LLogging :s on :D at :T*C*L", @mudnam, + valof $[ $DATE AC, 0 $], + valof $[ $MSTIME AC, 0 $]) + verb_0 //In case people press it twice by mistake + snoopedon_old.snoop + endcase +problem: writes(tty,"Problem with log file*C*L") + snoopedon_old.snoop + logstr_0 + endcase + $) + case SF.INVN://Inven + test carry then + $( outz($az"You are currently holding the following:*C*L") + ccnt_0 + inventory(carry, 0, true) + $) or outz($az"You aren't carrying anything!") + outz($az"*C*L") + endcase + case SF.FLEE: + if paralysed error("You can't :s, you're crippled.", verbname) + unless PTYPE of objct=S.MOTION error("Direction expected after :P",verbname) + verb_objct + objct_fake.node("that") + stop.fighting(true) + lose.followers() + move() + endcase + case SF.DBUG: //Debug mode! + spcheck() + scanch_-1 + if seq(objname, "lock") test WIZARD of profile/\(RELAXED\/us(me)) then + $( locked_true + out("*C*LThe game is now locked.*C*L") + endcase + $) or error() + if seq(objname, "unlock") test WIZARD of profile/\(RELAXED\/us(me)) then + $( locked_false + out("*C*LThe game is now unlocked.*C*L") + endcase + $) or error() + unless seq(objname,"mode") + $( if dumb error("You can't use the :s command, you're dumb.",verbname) + ch.sendlevel(verb) + endcase + $) + if nowiz error("No.*C*L") + unless ISWIZ of profile ne 0 test realwiz(me) then ISWIZ of profile_true or + Error("This persona may not enter :s mode.",(SEX of profile->female,male)!max.level) + if BZK/\BERSERK of profile unless maint error("Not you, you're berserk!") + test WIZARD of profile then + $( WIZARD of profile_false + cccnt_CCTRIP*10 + $) or + $( WIZARD of profile_true + if snoopedon then for i=0 to 35 do if (1< "mistress", "master") + if BZK/\BERSERK of profile unless us(PNAME of profile) BERSERK of profile_false + $) + announcechange() + verb,objct_0,fake.node("that") + if chcnt>0 until scanner()=S.CONT do $(/*Nothing*/$) + endcase + case SF.PASSWORD: + checkforced() + $( let opret, one, two=pretend, ?, ? + if pwcnt error("You can only change passwords once per game - sorry!") + pwcnt+_1 + pretend_true + private() + outs("What is your present password?*C*L**") + noecho() + check.stuff() + scanner() + one_PNAME of scan.info + one_encrypt(one) + unless one=ps.word + $( echo() + pretend_opret + public() + error("Sorry, incorrect.") + $) + out("*C*LNew password for persona - up to :N letters please.*C*L**",NAMELENGTH) + reset() + check.stuff() + scanner() + one_PNAME of scan.info + one_encrypt(one) + Outs("*C*LEnter it again to make sure it's correct, please.*C*L") + reset() + check.stuff() + scanner() + echo() + pretend_opret + public() + two_PNAME of scan.info + two_encrypt(two) + unless one=two error("No, they're different - password remains unchanged.") + ps.word_two + out("*C*LYour password will be updated when you leave the game.*C*L") + flush() + $) + endcase + case SF.HOURS: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( outz($az"*C*LOpening hours as follows:*C*L") + for i=0 to 6 + $( let day=(i+4) rem 7 + and ptr=times!day + out(":s*C*L", days!i) + test ptr then + while ptr + $( let s, f=STIME of ptr, FTIME of ptr + out("*T:C:N00 to :C:N00*C*L", s<10->'0','*0',s,f<10->'0','*0',f) + ptr of_LINK + $) + or outz("*T No access*C*L") + $) + if demo outz($az"A demonstration is in progress at the moment.*C*L") + endcase + $) + case SF.DEMO: + unless maint error("You need to be a maintainer.*C*L") + demo_not demo + out("The demonstration is :s in progress.*C*L", demo->"now", "no longer") + endcase + case SF.FREEZE: + spcheck() + melted_false + endcase + case SF.UNFREEZE: + spcheck() + melted_true + endcase + case SF.INVIS: + spcheck() + INVIS of profile_true + endcase + case SF.VIS: + INVIS of profile_false + endcase + case SF.PEACE: + spcheck() + peace_true + endcase + case SF.WAR: + spcheck() + peace_false + endcase + case SF.HUMBLE: + unless us(PNAME of profile) error() + unless nowiz sendall(true, K.GOWM,true,true) + nowiz_~nowiz + endcase + case SF.RESET: + $( let ok=maint/\WIZARD of profile ne 0 + for i=0 to 35 if fight!i error("Not while you're fighting!") + unless ok + $( jar(@inidr) + if player + $( unjar(@inidr) + error("There is more than just you in this game so you can't reset it") + $) + $) + unless resetgame() + $( unless ok unjar(@inidr) + error("Sorry old bean, can't get at the .EXE file") + $) + if ok out("*C*LYou are now in a superseded game.*C*L")<>endcase + unjar(@inidr) + quit(mud6, !room) + $) + case SF.STAMINA: + unless WIZARD of profile Error() + $( let o1, mobile, container=object(),MOTN of o1, CONTENTS of o1 + out("*C*LName*T*T:U*C*L",PNAME of o1) + if mobile + $( outs("Room*T*T") + test CURROOM of mobile then write6(tty,!(CURROOM of mobile)) or outs("(immobile)") + out("*C*Lmove every*T:N*Tcount*T*T:N*C*L",MOTION of mobile, MOVECOUNT of mobile) + $) + if container + $( let ptr=CONTS of container + outs(mobile->"carrying*T","contains*T") + test ptr then + $( while LINK of ptr + $( out(":U, ",PNAME of ptr) + ptr_LINK of ptr + $) + out(":U*C*L", PNAME of ptr) + $) or out("nothing*C*L") + out("max. contents*T:Ng*Tcontents used*T:Ng*C*L", + MAXWT of container,WTUSED of container) + $) + 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", + valof $( let v=VALUE of o1 + $[ $hrre 1, v + $] + $), setexp(o1,true,true),WEIGHT of o1,P4 of o1,SCOREPROP of o1,DESTROYED of o1) + $) + endcase + case SF.DIAGNOSE: + $( let st, nam, ob=?, ?, false + test PTYPE of objct=S.PLAYER/\hidden(P1 of objct)=0 then + $( nam_player.names!(P1 of objct) + st_new.stamina(P1 of objct) + $) or + $( ob_object() + nam_PNAME of ob + st_DESTROYED of ob + $) + test st le 0/\ ob then // the /\ob needed? + out("*C*LThe :U isn't alive.*C*L", nam) + or + $( st_((st-1)/RNGE)*RNGE + out("*C*L:s:p has a stamina of between :n & :n.*C*L", ob->"The ","",nam,st+1,st+RNGE) + $) + endcase + $) + case SF.DEAFEN: + deaf_1 + endcase + case SF.BLIND: + blind_1 + endcase + case SF.DUMB: + dumb_1 + endcase + case SF.PARALYSE: + paralysed_1 + endcase + case SF.UNVEIL: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( let v, t=vec 16, !objname + unpackstring(objname, v) + for i=0 to !v t*_(i+v!i) + unless t*ps.word=5732491264 error() + profile!14_!objname + profile!15_1!objname + WIZARD of profile_true + bashfull() + Out("You are seen in your true form, :p!*C*L",objname) + $) + case SF.CURE: + deaf, blind, dumb, paralysed_false,false,false,false + endcase + case SF.HASTE: + unless WIZARD of profile reset()<>error() + spcheck() + $( let moved,match,o1,val,orm=false,?,?,getnum(),room + room_place(room) + o1_object() + match_LH of o1 + o1_here(match) + while o1 do + $( if MOTN of o1 moved_(MOTION of MOTN of o1)+1<>MOTION of MOTN of o1_val + o1_here(match, LINK of o1) + $) + o1_toting(match) + while o1 do + $( if MOTN of o1 moved_(MOTION of MOTN of o1)+1<>MOTION of MOTN of o1_val + o1_toting(match,LINK of o1) + $) + room_orm + test moved then out(":P now :s.*C*L", objname, + moved=val+1->"the same speed",moved<=val->"slower","faster") + or error("The :p can't move!", objname) + endcase + $) + case SF.FOD: + unless WIZARD of profile error() + checkforced() + spcheck() + if us(objname) + $( outz($az"*C*LBye-bye...*C*L") + STAMINA of profile_-1 + quit() + $) + if PTYPE of objct=S.PLAYER + $( unless ~WIZVWIZ\/us(PNAME of profile) + $( if fodded error("You've already fodded someone once and you can't fod again this game!") + fodded_true + $) + interact(I.FOD) + endcase + $) + swap(@getnum, @gettrue) + case SF.RESURRECT: + unless WIZARD of profile reset()<>error() + spcheck() + $( let match, o1, val,orm=?,?,getnum(),room + room_place(room) + o1_object() + match_LH of o1 + o1_here(match) + if MOTN of o1 unless val + $( outz($az "To what stamina, then?*C*L") + val_nextnum(VALUE of o1) + $) + unless RELAXED\/us(me) if val>100 val_100 + while o1 do + $( DESTROYED of o1_val + o1_here(match, LINK of o1) + $) + o1_toting(match) + while o1 do + $( DESTROYED of o1_val + o1_toting(match, LINK of o1) + $) + Out(":P now :s.*C*L", objname, \val->"resurrected","deceased") + room_orm + endcase + $) + case SF.MOBILE: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( unless WIZARD of profile error() + unless melted writes(tty,"Movement has been frozen.*C*L") + $( let tracer=movers + while tracer do + $( let obj, mobile=LH of tracer, MOTN of obj + unless A.HIDEAWAY bitand ATTRIB of CURROOM of mobile + $( write(tty,":p*T", PNAME of obj) + test CURROOM of mobile then write6(tty,!(CURROOM of mobile)) or writes(tty,"(immobile)") + 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) + $) + tracer_RH of tracer + $) + $) + endcase + $) + case SF.SLEEP: + test PTYPE of objct=S.PLAYER then + test spectacular/\WIZARD of profile=0 then Error("Not during a spectacular!") or + interact(I.SLEEP) or + $( if ASLEEP of profile error("You're already asleep!") + if (A.SMALL bitand ATTRIB of room) error("You can't get to sleep in this small place.") + kips!player.no_ud.time() + ASLEEP of profile_true + broadcast(K.IHFA,who.copy) + start.leading() + doownthing() + $) + endcase + case SF.WAKE: + if PTYPE of objct=S.PLAYER /\ hidden(P1 of objct)=0 interact(I.WAKE) + endcase + case SF.SUMMON: + unless WIZARD of profile if A.SMALL bitand ATTRIB of room + Error("The room is too small - no-one else can enter it.") + spcheck() + interact(I.SUMMON) + endcase + case SF.CHANGE: + interact(I.CHANGE) + endcase + case SF.FRCE://Make + checkforced() + spcheck() + if us(objname) error("You honestly thought I'd allow that?!") + interact(I.MAKE) + endcase + case SF.GO://Go (check if wizard otherwise ignore) + if WIZARD of profile then + $( l_find.room(objname) + start.leading() + if l then move.ser(LH of l,true)<>return + $) + if paralysed error("You're crippled, you can't :s anywhere.",verbname) + unless PTYPE of objct=S.MOTION error("Direction expected after :p.",verbname) + verb_objct + verbname_objname + objct_fake.node("that") + move() + endcase + case SF.BACK: + if paralysed error("You can't :s :s, you're crippled.",PNAME of tverb, verbname) + $( let ld = valof + $[ $move 1, lastdir + $subi 1, 1 + $trc 1, 1 + $addi 1, 1 + $] + unless (byte 1:ld) from backword + Error("There is no opposite direction to the one you last tried.") + verb_fake.node(verbname) + DREC of verb_ld + out("Going :U.*C*L", motvec!ld) + move() + endcase + $) + case SF.BUG://Bug (append stuff to a bug file). + bug() + endcase + case SF.WEIGH: + case SF.VALUE: + unless PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS error("You can only :s objects, not anything else.", verbname) + $( let nd=object() + unless WIZARD of profile + if FIXED of nd \/ NOGET of nd + Error("You can't :s that!", verbname) + test sftype=SF.VALUE then + out("*C*LThe base value of the :P is :N, and the current value is :N.*C*L", + objname, valof + $( let v=VALUE of nd + $[ $hrre 1, v $] + $), setexp(nd, true, true)) or + out("*C*LThe weight of the :P is :Ng.*C*L", objname, WEIGHT of nd) + endcase + $) + case SF.AUTOWHO: + checkforced() + $( let res=getnum() + unless res autowho_-1<>endcase + autowho+_res-autoint + autoint_res + if autowho le 0 + $( autowho_res + special(SF.WHO) + $) + $) + endcase + case SF.QUICKWHO: + for i=0 to 35 if player.names!i then unless hidden(i) + $( let ii=INVIS of LH from player.names!i + out(":c:p:c:s*C*L",ii->'(','*0',player.names!i,ii->')','*0',(i=player.no/\snoopedon)->" ","") + $) + endcase + case SF.WHO://Who (is playing?) + for i=0 to 35 do if player.names!i then unless hidden(i) + $( let ii=INVIS of LH from player.names!i + out(":c:p is playing:c",ii->'(','*0',player.names!i,ii->')','*0') + if WIZARD of profile then + $( nm_LH from (player.names!i) + out(" in room :6 carrying :i",!(CROOM of nm),ROBJT of nm) + $) + test spectacular then + $( let rm=CROOM of LH from player.names!i + outs(" in the room described as:*C*L") + test A.DEATH bitand ATTRIB of rm then out("Land of the Dead.*C*L") + or desc.short(rm) + $) or outz($az"*C*L") + $) + endcase + case SF.CTRAP: //Toggle for ^c trap. + unless RELAXED\/us(me) then error() + spcheck() + 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) + Out("*C*L^C trap now :S.*C*L", ctrap()->valof + $( if maint out("*C*LOn your own head be it...") + resultis "on" + $), "off") + case SF.ACTION: //Not really special... + endcase + case SF.FOLLOW: + test objct=fake then interact(I.FOLLOW) or + $( cn_object() + unless MOTN of cn error("The :P can't move!",objname) + if animal=cn error("You're already following the :P.", objname) + if toting(PTYPE of cn) Error("You can't :s objects you are holding.",verbname) + unfollow() + animal_cn + CHASERS of MOTN of animal bitor_player.bit + out("You have started to :s the :P.*C*L", verbname, objname) + $) + endcase + case SF.LOSE: + interact(I.LOSE) + endcase + case SF.JOIN: + interact(I.JOIN) + verb, objct_0, fake.node("that") + verbname, objname_"",PNAME of objct + endcase + case SF.REFUSE: + interact(I.REFUSE) + endcase + case SF.INSERT: //unsatisfactory - only does objects at present + unless PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS error("You can only insert items into objects, not anything else.") + unless instrmnt/\PTYPE of instrmnt=S.OBJECT error("You can only insert items into objects, not anything else.") + insert() + flush() + endcase + case SF.REMOVE: //unsatisfactory - only does objects at present + unless PTYPE of objct=S.OBJECT\/PTYPE of objct=S.CLASS error("You can only remove items from objects, not anything else.") + unless instrmnt/\PTYPE of instrmnt=S.OBJECT error("You can only remove items from objects, not anything else.") + remove() + endcase + case SF.EMPTY: + empty() + endcase + case SF.CONVERSE: + checkforced() + if dumb out("*C*LYou won't be able to say anything, you know, you're dumb.") + out("*C*LTo leave :s mode, type ':c'.*C*L", verbname,BZK/\BERSERK of profile->'>','**') + conversing_true + reset() + endcase + case SF.TIME: + $( let t, m, h=valof + $[ $mstime 1, 0 $], + ((t rem 3600000)+150000)/300000, + (t/3600000-(m>6)) rem 12 + test 0 ls m ls 12 then out(":s :s.*C*L", mins!m, hrs!h) or + out(":U o'clock.*C*L", hrs!h) + endcase + $) + case SF.WHERE: + if PTYPE of objct = S.PLAYER then unless hidden(P1 of objct) + $( let name, prof, rm=player.names!(P1 of objct),LH from name,CROOM of prof + if WIZARD of profile out(":6 - ", !rm) + test A.DEATH bitand ATTRIB of rm then out("Land of the Dead.*C*L") or desc.short(rm) + (SEX of prof->her,him)_name + them_name + endcase + $) + unless PTYPE of objct=S.OBJECT \/ PTYPE of objct=S.CLASS + error("You can only ask where an item or person is, not anything else.") + $( let found=false + cn_PTYPE of objct=S.CLASS -> classmatch, objmatch + l_PTYPE of objct=S.CLASS -> P1 of objct, D1 of (DREC of objct) + for i=0 to 35 do if player.names!i then unless hidden(i) + $( let nd=ROBJT of (LH from player.names!i) and fnd=false and num=0 + while nd do + $( if lookinside(nd,l,cn) then fnd_true<>setit(nd) + if cn(l,nd) num+_1<>setit(nd) + nd of_LINK + $) + if fnd saywhere(0,i)<>found_true + if num saywhere(num,i)<>found_true + $) + for i=0 to HASHSIZE + $( let nd=index!i + while nd do + $( let rm, ob=LH of nd, ROBJT of rm + and fnd, num, des=false, 0, 0 + unless (ATTRIB of rm bitand (A.DEATH bitor A.HIDEAWAY))/\(WIZARD of profile)=0 + $( while ob do + $( if lookinside(ob,l,cn) fnd_true<>setit(ob) + if cn(l,ob) test WIZARD of profile then + $( num+_1 + if DESTROYED of ob ls 0 des+_1 + setit(ob) + $) or if DESTROYED of ob ge 0 num+_1<>setit(ob) + ob of_LINK + $) + if fnd sayroom(0,rm,@found) + if des out(":N destroyed from the ",des) + if num sayroom(num,rm,@found) + $) + nd of_LINK + $) + $) + unless found outz($az"Wouldn't you like to know!*C*L") + $) + endcase + case SF.SGET: //this, WHERE, TRANSWHERE and TRANSHERE are virtually the same! + unless PTYPE of objct=S.CLASS\/PTYPE of objct=S.OBJECT outz($az"It's not gettable.*C*L")<>endcase + cn_PTYPE of objct=S.CLASS->classmatch,objmatch + l_PTYPE of objct=S.CLASS->P1 of objct, D1 of DREC of objct + for i=0 to HASHSIZE + $( let nd=index!i + while nd do + $( let rm, ob, oob=LH of nd, ?, ? + lockup(@ob,@oob,rm) + while ob do + $( if cn(l, ob)/\(RELAXED\/us(me)\/(FIXED of ob=0/\NOGET of ob=0)) + $( if FIXED of ob \/ NOGET of ob unless us(me) + outz($az"I hope you know what you're doing...*C*L") + out("from :6 - ", !rm) + tidy(oob,ob,@cn) + unlock() + ROBJT of profile_carry + endcase + $) + oob_ob + ob of_LINK + $) + unlock() + nd of_LINK + $) + $) + outz($az"It's not gettable.*C*L") + endcase + case SF.DIRECT: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( 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") + l_1 + for i=0 to HASHSIZE + $( let nd = index!i + while nd do + $( let rm, nm = LH of nd, RNAME of nd + if ROBJT of rm then + $( let ob=ROBJT of rm + while ob do + $( out(":6 :S:S",nm, PNAME of ob,l rem 4->"*T","*C*L") + ob of_LINK + l +_1 + $) + $) + nd of_LINK + $) + $) + endcase + $) + case SF.ROOMS: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( unless WIZARD of profile error("Wait until you're a :s...", (SEX of profile->female,male)!max.level) + l_1 + for i=0 to HASHSIZE + $( let nd=index!i + while nd do + $( out(":6:s", RNAME of nd, l rem 8 -> "*T", "*C*L") + l+_1 + nd of_LINK + $) + $) + out("*C*LTotal of :n rooms.*C*L", l-1) + endcase + $) + case SF.BRIEF: + brief_~brief->-1,0 + endcase + case SF.VERBOSE: + brief_brief=1->0,1 + endcase + case SF.IGNORE: + IGNORE of profile _~(IGNORE of profile) + out("Status messages will :sbe ignored.*C*L", (IGNORE of profile)->"", "not ") + endcase + case SF.SNOOP: + unsnoop() + test objct=fake then interact(I.SNOOP) or + $( cn_object() + unless P4 of cn=0/\MOTN of cn Error("The :P can't move!", objname) + snobj_cn + SNOOPERS of MOTN of snobj bitor_player.bit + out("You have started to :s on the :p.*C*L", verbname, objname) + $) + endcase + case SF.UNSNOOP: + unless snooping ge 0 \/ snobj error("You're not snooping on anyone!*C*L") + unsnoop() + endcase + case SF.CRASH: + test CORELOW then + error("The :s command has been temporarily removed for space reasons - sorry!", verbname) + or + $( checkforced() + 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") + unless RELAXED\/us(me) then error() + unless WIZARD of profile Error() + spcheck() + Clearvec(special,interact-special) + $[ $exit 1,0 $] + $) + case SF.POLICE: + test ESSEX then + $( let op, ostr=?, output + op_appendfile($6"dsk",$6"prolog", $6"prl", MPPN, Label(rotts)) + output_op + out("POLICE called to :s by :p!*C*L", @mudnam, me) + for i=0 to 35 do if player.names!i + $( let nm, ii=LH from player.names!i, INVIS of nm + out(":c:s is playing:c",ii->'(','*0',player.names!i,ii->')','*0') + if WIZARD of nm out(" in wiz mode") + out(" on :N points in room :6 carrying :i*C*L",SCORE of nm,!(CROOM of nm),ROBJT of nm) + $) + out("end of POLICE report.*C*L") + output_ostr + close(op) + out("Thankyou, :s, you've been of enormous help, I'll put someone on it as soon*C*Las I can.*L", + SEX of profile -> "ma'am", "sir") + endcase +rotts: error() + $) or error() + case SF.ENCHANT: + unless RELAXED\/us(me)\/seq(objname,me) then error() + unless WIZARD of profile error() + unless us(me) if us(objname) error("What a sweet sense of humour!") + spcheck() + unless objct=fake error(":p who?",verbname) + person(objct) + $( let prof=LH from player.names!(P1 of objct) + and str, dex, scr= + STRENGTH of prof, DEXTERITY of prof, SCORE of prof + and op=? + if BZK unless us(me) if BERSERK of prof error("Not a berserker, see an arch-wiz about it!") + if ESSEX + $( op_appendfile($6"dsk",$6"prolog", $6"prl", MPPN, Label(ratts)) + 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) + $) + out("*C*LStrength: :N -> ",str) + STRENGTH of prof_rationalise(nextnum(str)) + out("*C*LStamina: :N -> ",STAMINA of prof) + STAMINA of prof_rationalise(nextnum(STAMINAMAX of prof)) //default to max stamina, not current one + STAMINAMAX of prof_STAMINA of prof + out("*C*LDexterity: :N -> ",dex) + DEXTERITY of prof_rationalise(nextnum(dex)) + if Us(PNAME of profile) + $( let gam=GAMES.PLAYED of prof + out("*C*LGames: :N -> ", gam) + GAMES.PLAYED of prof_nextnum(gam) + if BZK + $( let ber=BERSERK of prof + out("*C*LBerserk: :N -> ", ber) + BERSERK of prof_nextnum(ber) + $) + $) + out("*C*LScore: :N -> ",scr) + SCORE of prof_nextnum(scr) + if ESSEX + $( write(op, ":N*T:N*T:N*T:N*C*L", STRENGTH of prof,DEXTERITY of prof,STAMINAMAX of prof,SCORE of prof) + close(op) + $) + endcase +ratts: error() + $) + case SF.SET: + 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 + spcheck() + $( let o1, p=object(), getnum() + unless p <= P5 of o1 + Error("Max. property for :S is :n.",objname, P5 of o1) + setprop(o1,p) + longdescribe(@mud6,(selector 18:18*((P4 of o1)rem 2):(P4 of o1)/2+OBJECTSIZE+1)of o1) + $) + $) +$) +and action(skiptonext) be +$( let fast.action,vb,nd,oldnd,ocl,o1,rcl,o2,sm,fm,function,obj,ifr,sms,fms,trylots,formobile= + PTYPE of verb=S.FASTATN,get.cmnd(DREC of verb,fast.action),?,?,?,?,?,?,?,?,?,?,false,?,?,Numbargs(),trylots ne 0 /\ skiptonext=0 + $( o1_false + ocl,rcl_D1 of vb,D2 of vb + if rcl=#400001 then if (PTYPE of objct)=S.PLAYER loop //Means can override eg ".assist" + if ocl o1_action.ser(objct,ocl,trylots,formobile)<>unless o1 loop + if rcl then test #400000 le rcl le #400077 then + $( let cnt=0 + for i=0 to 35 do if (1<here.class,here.or.toting.class)(rcl) + unless o1 loop + $) + obj_D6 of vb->((D6 of vb ne #777777/\D6 of vb ne #777775)->D6 of vb,o2),o1 + sm,function_D4 of vb,D3 of vb + switchon function into + $( + case F.HOLDFIRST: + holdfirst_true + loop + case F.HOLDLAST: + holdfirst_false + loop + case F.FLIPAT: + if at swapobjins() + loop + case F.NOIFR: + ifr_false + loop + case F.IFRPROP: + if RANDM of obj setprop(obj,random(1+(P5 of obj))) + case F.IFPROP: case F.IFPROPINC: case F.IFPROPDEC: case F.IFPROPDESTROY: + if(P4 of obj) ne sm loop + endcase + case F.IFOBJCOUNT: + $( let cnt=0 + sm_ROBJT of LH of sm + while sm + $( cnt+_1 + sm_LINK of sm + $) + test cnt ge D5 of vb then endcase or loop + $) + case F.UNLESSPROP: case F.UNLESSPROPDESTROY: + unless (P4 of obj) ne sm loop + endcase + case F.IFIN: case F.IFINC: if (LH of sm ne room) loop + endcase + case F.UNLESSIN: case F.UNLESSINC: if (LH of sm eq room) loop + endcase + case F.SENDEMON: case F.SSENDEMON: //sendemon or super-sendemon + obj_D6 of vb->((D6 of vb ne #777777/\D6 of vb ne #777775)->D6 of vb,instrmnt),objct + unless PTYPE of obj=S.PLAYER loop + $( let pnum=P1 of obj + if hidden(pnum) loop + unless function=F.SSENDEMON\/(WIZARD of profile=1)\/((1<=sm-1 \/(WIZARD of profile)=1 loop + default: endcase + $) + holdfirst_false + unless D7 of vb doownthing() //What? No mobile check?! + if D8 of vb sendall(true,K.LOUD,false,false,D8 of vb) + special(D7 of vb) + break + $) repeatwhile valof $( vb_get.cmnd(LINK of vb,fast.action); resultis vb $) + unless vb test trylots then return or error() + if ifr/\(WIZARD of profile)=0 verb_0<>objct_fake.node("that") + unless o1 o1_obj + fm_D5 of vb + enable(D9 of vb) + skiptonext_formobile->-1, 1 + sms_skiptonext*sm + fms_skiptonext*fm + if function ge F.INCDESTROY then switchon function into + $( case F.FLOATDESTROY: + FIXED of o1_false + case F.INCDESTROY: + if P4 of o1 < P5 of o1 then setprop(o1,(P4 of o1)+1) + function_F.DESTROY + endcase + case F.DESTROYINC: + destroy(o1,0) + function_F.INC + endcase + case F.DESTROYCREATE: + destroy(o1,0) + function_F.CREATE + endcase + case F.EXPDESTROY: + setexp(o1) + function_F.DESTROY + endcase + case F.EXPMOVE: + setexp(o1) + function_F.MOVE + endcase + case F.INCMOVE: + function_F.MOVE + case F.UNLESSINC: + case F.IFINC: + if P4 of o10 then setprop(o1,(P4 of o1)-1) + function_F.DESTROY + endcase + case F.DECIFZERO: + if P4 of o1>0 then setprop(o1,(P4 of o1)-1) + function_F.IFZERO + endcase + case F.DECINC: + if P4 of o1 > 0 then setprop(o1,(P4 of o1)-1) + function_F.INC + endcase + case F.INCDEC: + if P4 of o1 < P5 of o1 then setprop(o1,(P4 of o1)+1) + function_F.DEC + endcase + case F.DESTROYDEC: + destroy(o1,0) + function_F.DEC + endcase + case F.DESTROYDESTROY: + destroy(o1,0) + function_F.DESTROY + endcase + case F.DESTROYSET: + destroy(o1,0) + function_F.SET + endcase + case F.SETDESTROY: + case F.SETFLOAT: + setprop(o1, sm) + endcase + case F.SWAP: + If D6 of vb /\ D6 of vb ne #777777/\D6 of vb ne #777775 then + $( let temp=P4 of (D6 of vb) + setprop((D6 of vb),P4 of o1) + setprop(o1,temp) + $) + longdescribe(sms) + return + $) + if D6 of vb then o1_D6 of vb ne #777777/\D6 of vb ne #777775->D6 of vb, o2 + switchon function into + $( case F.FLOAT: + unless FIXED of o1 endcase + FIXED of o1_false + longdescribe(sms) + return + case F.IFLIGHT: + longdescribe(visible()->sms,fms) + return + case F.INC: //Inc + if P4 of o1>=P5 of o1 then endcase + setprop(o1,(P4 of o1)+1,sms) + return + case F.FIX: + if fixed of o1 endcase + fixed of o1_true + case F.DEC: //Dec + if P4 of o1>0 then + $( setprop(o1,(P4 of o1)-1,sms) + return + $) + endcase + case F.IFPROPDEC: + if P4 of o1>0 then + $( setprop(o1,(P4 of o1)-1,fms) + return + $) + endcase + case F.TESTSMALL: + longdescribe(A.SMALL bitand ATTRIB of room->sms, fms) + return + case F.FLUSH: + flush() + case F.UNLESSGOT: + case F.IFGOT: + case F.IFRSTAS: + case F.UNLESSRSTAS: + case F.IFHAVE: + case F.UNLESSHAVE: + case F.IFHERE: + case F.UNLESSHERE: + case F.IFOBJIS: + case F.UNLESSOBJIS: + case F.IFOBJPLAYER: + case F.UNLESSOBJPLAYER: + case F.IFSNOOPING: + case F.UNLESSSNOOPING: + case F.IFOBJCONTAINS: + case F.UNLESSOBJCONTAINS: + case F.IFINSIS: + case F.UNLESSINSIS: + case F.IFDEAD: + case F.UNLESSDEAD: + case F.IFBERSERK: + case F.UNLESSBERSERK: + case F.IFFIGHTING: + case F.UNLESSFIGHTING: + case F.IFWIZ: + case F.UNLESSWIZ: + case F.IFILL: + case F.UNLESSILL: + case F.IFSMALL: + case F.UNLESSSMALL: + case F.IFSELF: + case F.NULL: //Null + longdescribe(sms) + return + case F.IFDISENABLE: + case F.IFWEIGHS: + case F.UNLESSWEIGHS: + endcase + case F.MOVE: //Move + if skiptonext ls 0 endcase + switchon PTYPE of objct into + $( CASE S.OBJECT: drop(LH of sm); endcase + CASE S.CLASS: drop.class(LH of sm); endcase + DEFAULT: error("I don't know what :s means.", objname) + $) + endcase + case F.DELAYMOVE: + $( let obj,nd,oldnd,indx=?,carry,lvcarry,demons+(DEMONSIZE+DOF)*fm + if skiptonext ls 0 endcase + switchon PTYPE of objct into + $( + case S.OBJECT: + obj_D1 of DREC of objct + unless toting(obj) error("You aren't carrying it!") + until LH of nd=obj oldnd_nd<>nd of_LINK + drop.delay(nd,oldnd,LH of sm,indx,fm) + return + case S.CLASS: + obj_P1 of objct + unless toting.class(obj) error("You aren't carrying any :s", objname) + while nd do + $( unless PTYPE of nd=LH from kept if P1 of nd=obj\/(obj=1/\P4 of nd=SCOREPROP of nd /\ valof + $( let res=VALUE of nd + $[ $hrre 1, res $] + $) ge 0) then drop.delay(nd,oldnd,LH of sm,indx,fm)<>nd_oldnd + oldnd_nd + nd of_LINK + $) + return + default: error("I don't know what :s means.", objname) + $) + $) + case F.IFHERETRANS: + case F.TRANS: //Trans + longdescribe(fms) + lose.followers() + start.leading() + move.ser(LH of sm->LH of sm,room, true) + return + case F.TRANSWHERE: + $( let obno=PTYPE of o1 + let place=valof + $( for i=0 to HASHSIZE + $( let nd=index!i + while nd do + $( let rm,ob=LH of nd,ROBJT of rm + unless (ATTRIB of rm bitand (A.DEATH bitor A.HIDEAWAY))/\(WIZARD of profile)=0 + while ob do + $( if PTYPE of ob=obno resultis rm + ob of_LINK + $) + nd of_LINK + $) + $) + resultis false + $) + unless place endcase + longdescribe(sms) + lose.followers() + start.leading() + move.ser(place,true) + return + $) + case F.WRITEIN: + $( let mudstream, buffer, snoopy=?, vec 26, snoopedon + read.message(buffer) + snoopedon_false +rats: mudstream_appendfile(DISC, PNAME of o1, "dba", MAINTA, label(rats)) + write(mudstream, "*":s*"*C*L", buffer) + close(mudstream) + snoopedon_snoopy + out("*C*L") + longdescribe(sms) + return + $) + case F.RETALIATE: + if skiptonext ls 0 endcase + if retaliated error("You can't :s further this melee",verbname) + $( let wpn=(sm<<18) bitor ((0 le ocl ls #400000)/\(object ne fake) -> objct, 0) + for i=0 to 35 if fight!i transmit(i, 0, K.IHR, wpn) + out("You :s with your :s!*C*L", verbname, objname) + retaliated_true + endcase + $) + case F.ENABLE: + enable(sm,true) + endcase + case F.DISENABLE: + disenable(sm) + endcase + case F.SUSPEND: + suspend(events,sm) + suspend(gdemons,sm) + endcase + case F.SENDLEVEL: + if dumb error("You can't do that, you're dumb") + sendlevel(sm-2) + endcase + case F.SENDMESS: + if skiptonext ls 0 endcase + sendall(true,K.MESS,false,false,sm) + endcase + case F.TESTSEX: + longdescribe(SEX of profile->sms,fms) + return + case F.SETSEX: + $( let beforeoperation=SEX of profile + SEX of profile_sm ge 1 -> 1, 0 + unless SEX of profile=beforeoperation sexify(SEX of profile) + $) + endcase + case F.DESTROYTOGGLESEX: + SEX of profile_not (SEX of profile) + sexify(SEX of profile) + destroy(o1,SEX of profile -> sms, fms,numbargs()) //not too useful for demons... + return + case F.TOGGLESEX: + SEX of profile_NOT (SEX of profile) + sexify(SEX of profile) + longdescribe(SEX of profile->sms,fms) + return + case F.SENDEMON: + case F.SSENDEMON: + transmit(P1 of obj,0,K.DTD,sm) + endcase + case F.HURT: + if skiptonext ls 0 endcase + if peace error("Fighting is currently forbidden.") + unless RELAXED\/us(me) if WIZARD of profile error("I'm sure you don't mean it...") + test PTYPE of objct=S.PLAYER then + $( let pnum=P1 of objct and weapon=0 ls rcl ls #400000->instrmnt, 0 + if pnum=player.no error("Don't do it, kid! Things will look better in the morning, honest!") + if fight!pnum error("You're not allowed to do that to :p while fighting :s", + objname, SEX of LH from player.names!pnum ->"her", "him") + send(pnum, 0, K.IHHU, (sm<<18)bitor weapon) + out("You start to :s :P with :s :r", verbname,player.names!pnum, + sm<10->"extra",sm<30->"real","tremendous", 12) + test weapon then Out(" using your :s.*C*L",insname) + or outs(".*C*L") + $) or + $( if fight!player.no error("You're not allowed to do that to the :s in the middle*C*L of a fight", objname) + unless DESTROYED of o1 gr 0 error("You can't :S that!", verbname) + quitflg_false + if MOTN of obj FIGHTS of MOTN of obj bitor_player.bit + fight!player.no_o1 + broadcast(K.IFM,who.copy, objname) + send(player.no, 0, K.ISAHM, sm) + out("You start to :s the :s with :s power", verbname, objname, sm<10->"little extra",sm<30->"real","tremendous") + if instrmnt out(" using your :s", insname) + outs("!*C*L") + $) + retaliated_true + endcase + case F.EMOTION: + if skiptonext ls 0 endcase + test PTYPE of objct=S.PLAYER then + $( let pnum, blk, sc, scr,pr,prf,nam,pnam= + P1 of objct, ?, sm, SCORE of profile,player.names!pnum,LH from pr,PNAME of prf, PNAME of profile + if pnum=player.no error("Narcissism gets you nowhere these days, flower.") + 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) + if BZK/\BERSERK of profile error("Berserkers, such as yourself, are unable to perform such an act!*C*L") + if BZK/\BERSERK of prf error("You can't :s a berserker!", verbname) + if scr ls SCORE of prf sc_0 + if scr ls sc sc_scr + setscore(-sc) + blk_getmblock() + blk!3, blk!4_!verbname, 1!verbname + send(pnum, blk, K.IHSE, (E.MULT*sc)/E.DIV) + sendall(who.copy bitand ~(1< sm, LH of sm + for i=0 to HASHSIZE + $( let nd=index!i + while nd do + $( let rm, ob = LH of nd, ROBJT of rm + while ob do + $( if ptoob=PTYPE of ob + $( test function then whoto bitor_WHO!rm or + $( broadcast(K.TTH,WHO!rm,thisrm,true) + if (ATTRIB of thisrm) bitand A.DEATH + $( let o1=ROBJT of rm + while o1 do //walk list already walking via ob... + $( if DESTROYED of o1 gr 0 + destroy(o1,0) + o1 of_LINK + $) + $) + $) + break + $) + ob of_LINK + $) + nd of_LINK + $) + $) + if whoto sendall(whoto,K.LOUD,false,false,thisrm) + endcase + $) + case F.ZONK: + unless WIZARD of profile stamina of profile_-1 + longdescribe(sms) + checkout() + endcase + case F.DEAD: + $( let nam=PNAME of profile + for i=0 to 35 if fight!i /\ i ne player.no + $( let block=getmblock() + block!3_!nam + block!4_1!nam + send(i,block,K.IHD,(player.level()+1)*DEADPTS/2) + fight!i_false + $) + $) + stop.fighting() + longdescribe(sms) + unless WIZARD of profile ne 0 test spectacular then + $( drop.everything() + STAMINA of profile_STAMINA of profile<20 -> 10, (STAMINA of profile)-10 + $) or + $( if sms<0 longdescribe(-sms) + quit() + $) + endcase + case F.EXPSET: + setexp(o1) + case F.SET: //Set + setprop(o1,sm) + endcase + case F.RESETDEST: + DESTROYED of o1_sm + endcase + case F.IFPROPINC: + if P4 of o1 < P5 of o1 setprop(o1,(P4 of o1)+1) + endcase + case F.EXP: + setscore(extra(sm)) + flush() + endcase + case F.LOSEEXP: + setscore(-sm) + endcase + case F.LOSESTAMINA: + unless WIZARD of profile STAMINA of profile-_sm + longdescribe(fms) + checkout() + case F.IFOBJCOUNT: + return + case F.TOGGLE: //Toggle + setprop(o1,(p5 of o1)-(p4 of o1)) + longdescribe(P4 of o1->sms, fms) + return + case F.SETFLOAT: + FIXED of o1_false + if P4 of o1 smax s_smax + STAMINA of profile_s + $) + if function=F.STAMINA endcase + case F.SETDESTROY: + case F.IFPROPDESTROY: + case F.UNLESSPROPDESTROY: + case F.DESTROY: + if DESTROYED of o1 ls 0 endcase + destroy(o1,function = F.DESTROY->sms,fms,D8 of vb->false,Numbargs()=skiptonext) + return + case F.INJURE: + if DESTROYED of o1 le 0 endcase + DESTROYED of o1-_sm + if DESTROYED of o1 le 0 destroy(o1,0) + endcase + case F.CREATE: + unless DESTROYED of o1 ls 0 endcase + DESTROYED of o1_false + longdescribe(sms) + return + case F.FORROT: + setprop(o1,((P4 of o1)+1) rem ((P5 of o1)+1)) + longdescribe(P4 of o1->sms,fms) + return + case F.BACKROT: + setprop(o1,((P4 of o1)-1) rem ((P5 of o1)+1)) + longdescribe(P4 of o1->sms, fms) + return + case F.TRANSHERE: + $( let obno, nd=PTYPE of o1, ? + longdescribe((valof + $( for i=0 to HASHSIZE + $( nd_index!i + while nd + $( let rm, ob, oob=LH of nd,?,? + lockup(@ob,@oob,rm) + unless rm=room\/((ATTRIB of rm bitand (A.DEATH bitor A.HIDEAWAY))/\(WIZARD of profile=0)) + while ob do + $( if PTYPE of ob=obno/\DESTROYED of ob ge 0 + $( LINK of oob_LINK of ob + unlock() + lockdown(room,ob) + broadcast(K.SHBD,who!room,ob,true) + resultis true + $) + oob_ob + ob of_LINK + $) + unlock() + nd of_LINK + $) + $) + resultis false + $)) -> sms, fms) + return + $) + case F.EXPINC: + setexp(o1) + unless P4 of o1fms,sms) + return + default: endcase //hope this catches the rest... + $) + longdescribe(fms) +$) +and action.ser(obj,ocl,skipnext,formobile)=valof +$( let class,res,type=?,?,? + unless obj resultis false + type_PTYPE of obj + if ocl=#777777 resultis type=S.PLAYER->obj, 0 + unless type=S.CLASS\/type=S.OBJECT resultis false + if ocl=#777775 resultis obj=fake->false, true + test type=S.CLASS then class_DREC of obj or class_D2 of (DREC of obj) + unless ocl=#777776 \/ ocl=class resultis false + test type=S.CLASS then res_(formobile->here.class,here.or.toting.class)(class) + or res_(formobile->here, here.or.toting)(D1 of (DREC of obj)) + unless res\/skipnext out("I see no :s!*C*L",PNAME of obj)<>jump(mainloop) + resultis res +$) +and spcheck() be if spectacular unless maint Error("Not during a spectacular!") +and checkforced() be if justforced Error("You can't be forced to do that!") diff --git a/MUD6.BCL b/MUD6.BCL new file mode 100644 index 0000000..6f27dee --- /dev/null +++ b/MUD6.BCL @@ -0,0 +1,674 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let saywhere(num,i) be +$( let rm=CROOM of LH from player.names!i + if num out(":n ",num) + out("carried by :p in the room described as ",player.names!i) + if WIZARD of profile out("(:6) ",!rm) + test (A.DEATH bitand ATTRIB of rm)/\(WIZARD of profile)=0 then outs("Land of the Dead.*C*L") or desc.short(rm) +$) +and sayroom(num,rm,lvfound) be //get nm from obj sometime? +$( if num out(":n ",num) + out("in the room described as ") + if WIZARD of profile out("(:6) ",!rm)<>!lvfound_true + desc.short(rm) + unless LENGTH of (dmpbuf+((TITLE of rm) rem WDSPERBUF+1)) outz($az"Land of the Dead") + !lvfound_true +$) + +and lookinside(nd,l,cn)=valof +test CONTENTS of nd ne 0 /\ (WIZARD of profile ne 0 \/ DESTROYED of nd ge 0) then +$( let n=CONTS of CONTENTS of nd and found=false and num=0 + while n do + $( if lookinside(n, l, cn) found_true + if cn(l,n)/\(WIZARD of profile=1\/DESTROYED of n ge 0) num+_1 + n of_LINK + $) + if found out(":s the :s ",MOTN of nd->"carried by","inside",PNAME of nd) + if num + $( if found outz($az"and ") + out(":n :s the :s ",num,MOTN of nd->"carried by","inside",PNAME of nd) + found_true + $) + resultis found +$) or resultis false +and inventory(list,level,looking) be test list then //don't use outz in here or sayinsides +$( let nd,nm,l=list,?,0 + while nd do + $( nm_PNAME of nd + l_LENGTH of nm + test ccnt+l+1>72 then + $( outs("*C*L") + for i=1 to level outs(" ") + out(":s*S", nm) + $) or out(":s*S",nm) + nd of_LINK + $) + nd_list //could just use list + while nd do + $( if holds(nd) outz($az"*C*L")<>sayinsides(nd, level+1, PNAME of nd, numbargs()=3) + setit(nd) + nd of_LINK + $) +$) or outs("nothing") +and holds(obj)=valof +$( let insides=CONTENTS of obj + unless insides /\ (DISGUISED of insides=0 \/ WIZARD of profile=1) resultis false + resultis insides +$) +and sayinsides(obj,level, nm, looking) be +$( let insides=holds(obj) + unless insides return + ccnt_0 + for i=1 to level outs(" ") + out("The :s :s ", nm,MOTN of obj->"is carrying","contains") + test ((TRANSPARENT of insides ne 0 \/ looking)/\P4 of obj=0) \/ WIZARD of profile=1 then inventory(CONTS of insides, level) + or out(CONTS of insides ->"something", "nothing") +$) +and holding(obj)=valof +$( let nd=carry + while nd do test obj=nd then resultis true or nd of_LINK + resultis false +$) +and gett() be +$( let obj,nd,oldnd=D1 of (DREC of objct),?,? + unless WIZARD of profile=1 \/ here(obj) then + error("I see no :s", objname) + lockup(@nd,@oldnd) + until LH of nd=obj /\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0)) do + $( oldnd_nd + nd of_LINK + unless nd unlock()<>Error("It's not :chere.",place(room)=room->'*0','t') + $) + if FIXED of nd\/NOGET of nd test WIZARD of profile=1/\(RELAXED\/us(me))/\(spectacular=0\/maint) then //should combine fixed & noget selectors + unless us(me) outz($az"I hope you know what you're doing...*C*L") or + $( unlock() + error("Don't be ridiculous!") + $) + if full.up() + $( unlock() + error("You can't carry more than :n objects.", max.obj()) + $) + if WEIGHT of nd+CARRY.COUNT of profile>max.wt()/\(WIZARD of profile)=0 then + $( unlock() + error(CARRY.COUNT of profile ->"It is too much extra weight","It is too heavy for you to carry alone") + $) + LINK of oldnd_LINK of nd + stopmoving(nd) + unlock() + CARRY.COUNT of profile+:WEIGHT of nd + OBJ.CARRIED of profile+:1 + if DESTROYED of nd ls 0 DESTROYED of nd_false + pushlist(lvcarry,nd) + ROBJT of profile_carry + adjustup(nd) + inform(nd,K.IGOT) + out(":u taken.*C*L", objname) + setit(nd) +$) +and get.class() be +$( let cl,nd,oldnd,got.one,got.not=P1 of objct,?,?,false,false + unless WIZARD of profile=1\/here.class(cl) error("I don't see any :s", objname) + lockup(@nd,@oldnd) + while nd do + $( if classmatch(cl,nd)/\( + ((FIXED of nd=0)/\(NOGET of nd=0))\/ + (WIZARD of profile=1/\(RELAXED\/us(me))/\(spectacular=0\/maint))\/valof + $( got.not_true + resultis false + $)) then + $( got.one_1 + if WEIGHT of nd+carry.count of profile>max.wt()/\(WIZARD of profile)=0 then + $( 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) + break + $) + if full.up() + $( out("Too many objects carried to take :s*C*L",PNAME of nd) + break + $) + tidy(oldnd,nd,@got.one) + nd_oldnd + $) + oldnd_nd + nd of_LINK + $) + unlock() + if not got.one + $( unless got.one out(got.not->"Don't be ridiculous!*C*L","I don't see any :s*C*L", objname) + jump(mainloop) + $) + ROBJT of profile_carry +$) +and tidy(oldnd,nd,got.one) be +$( out(":u taken.*C*L",PNAME of nd) + setit(nd) + !got.one_true + if DESTROYED of nd ls 0 DESTROYED of nd_false + LINK of oldnd_LINK of nd + CARRY.COUNT of profile+:WEIGHT of nd + OBJ.CARRIED of profile+:1 + stopmoving(nd) + pushlist(lvcarry,nd) + adjustup(nd) + inform(nd,K.IGOT) +$) +and full.up()=(max.obj()<=OBJ.CARRIED of profile)/\(WIZARD of profile)=0 +and max.wt()=MAXWEIGHT*(STRENGTH of profile)+(WT.EXTRA of profile) +and max.obj()=(DEXTERITY of profile)/10+2+(OBJ.EXTRA of profile) +and get.rid.of(o1,mess) be +$( let nd,oldnd=carry,lvcarry + while nd do + $( let t=therein(nd, o1, true) + if t + $( if t=1 + $( let.go.of(nd) //nasty if got by 2 demons at once... + longdescribe(mess) + $) + break + $) + oldnd_nd + nd of_LINK + $) + killmonster(o1) +$) +and let.go.of(obj) be +$( let nd, oldnd, secnd=carry, lvcarry, ? + while nd do test obj=nd then break or oldnd_nd<>nd of_LINK + unless nd return + drop.ser.ser(nd,oldnd) + pushlist(room+4,nd) + ROBJT of profile_carry +$) +and drop.ser(nd,oldnd,rm) be +$( out(":u dropped.*C*L",PNAME of nd) + setit(nd) + if A.SANCTUARY bitand ATTRIB of rm setexp(nd,true) + drop.ser.ser(nd,oldnd) + if (A.HIDEAWAY bitand ATTRIB of rm)/\(MOTN of nd) destroy(nd,0) +$) +and drop.ser.ser(nd,oldnd) be +$( LINK of oldnd_LINK of nd + CARRY.COUNT of profile-:WEIGHT of nd + OBJ.CARRIED of profile-:1 + adjustdown(nd) + inform(nd,K.IDROPT) +$) +and drop(rm) be +$( let obj,nd,oldnd=D1 of (DREC of objct),carry,lvcarry + unless numbargs() rm_place(room) + unless toting(obj) then error("You aren't carrying it!") + until LH of nd=obj do + $( oldnd_nd + nd of_LINK + $) + drop.move(@rm) + drop.ser(nd,oldnd,rm) + lockdown(rm,nd) + broadcast(K.SHBD,who!rm,nd) + ROBJT of profile_carry +$) +and drop.delay(nd,oldnd,rm,indx,demonum) be //what,where,with +$( let block=getmblock() + drop.move(@rm) + drop.ser(nd,oldnd,rm) + copy(indx,block+DOF,DEMONSIZE) + E.TIME of block+_Random(D.OFFSET of indx) + E.PLONK of block_true + block!(DEMONSIZE+DOF+1)_nd<<18 bitor rm + jar(@delock) + !block_(demons+(DEMONSIZE+DOF)*demonum)<<18 bitor gdemons + gdemons_block + unjar(@delock) + ROBJT of profile_carry +$) +and plonk(demon) be +$( let wd,nd,rm=demon!(DEMONSIZE+1),LH from wd, RH from wd + lockdown(rm,nd) + broadcast(K.SHBD,WHO!rm,nd,true) +$) +and get.all() be +$( let nd,oldnd,gotone=?,?, false + lockup(@nd,@oldnd) + while nd do + $( unless FIXED of nd \/ NOGET of nd tidy(oldnd,nd,@gotone)<>nd_oldnd + oldnd_nd + nd of_LINK + $) + unlock() + ROBJT of profile_carry + unless gotone error("Nothing taken.") +$) +//NB for next 2 procs: if the person who changes the object's property isn't +//carrying it, could end up with a different carrying allowance to what should. +and adjustup(nd) be if P4 of nd=0/\WEIGHT of nd>WTHRESHOLD/\MOTN of nd ne 0 +$( let VAL = WEIGHT of nd -WTHRESHOLD + OBJ.EXTRA of profile+_(val/WTHRESHOLD)+1 + WT.EXTRA of profile+_val +$) +and adjustdown(nd) be if P4 of nd=0/\WEIGHT of nd>WTHRESHOLD/\MOTN of nd ne 0 +$( let val=WEIGHT of nd-WTHRESHOLD + OBJ.EXTRA of profile-_(val/WTHRESHOLD)+1 + WT.EXTRA of profile-_val +$) +and drop.move(lvrm) be +$( let rm=!lvrm + if (A.SANCTUARY bitand ATTRIB of rm) /\ + (A.DMOVE bitand ATTRIB of rm) then !lvrm_DMOVE of rm +$) +and drop.everything(tell.them) be +$( let obj,rm=unlink(lvcarry),? + rm_WIZARD of profile=0/\(A.DEATH bitand ATTRIB of room)->oldroom,place(room) + rm_WIZARD of profile=0/\(A.DMOVE bitand ATTRIB of rm)-> DMOVE of rm, rm + drop.move(@rm) + unless obj return + $( if numbargs() Out(":u dropped.*C*L", PNAME of obj) + broadcast(K.SHBD,who!rm,obj) + inform(obj,K.IDROPT) + lockdown(rm,obj) + obj_unlink(lvcarry) + $) repeatwhile obj + ROBJT of profile_carry + CARRY.COUNT of profile_0 + OBJ.CARRIED of profile_0 + OBJ.EXTRA of profile_0 + WT.EXTRA of profile_0 +$) +and drop.class(rm) be +$( let cl,nd,oldnd,dropped.one=P1 of objct,carry,lvcarry,false + unless toting.class(cl) error("You aren't carrying any :s.", objname) + unless numbargs() rm_place(room) + drop.move(@rm) + while nd do + $( if P1 of nd=cl \/(cl=1 /\ P4 of nd=SCOREPROP of nd/\valof + $( let res=VALUE of nd + $[ $HRRE 1, res $] + $) ge 0 ) then + test PTYPE of nd=LH from kept + then Out(":U kept.*C*L", PNAME of nd) or + $( drop.ser(nd,oldnd,rm) + lockdown(rm,nd) + broadcast(K.SHBD,who!rm,nd) + nd_oldnd + dropped.one_true + $) + oldnd_nd + nd of_LINK + $) + ROBJT of profile_carry + unless dropped.one error("You're keeping all the :s you have.", objname) +$) +and insert(given) be +$( let class,obj, nd, oldnd, ins, bag, insides,sel,gotone= + 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 + bag_here.or.toting(ins) + unless bag error("I see no :s!", insname) + unless numbargs() given_MOTN of bag + unless (class->toting.class, toting)(obj) + error("You have to be carrying the :s to :s it :s anything.", objname, verbname,given->"to","in") + insides_CONTENTS of bag + unless insides error("You can't :s it :s!", verbname,given->"to that","in there") + $( until sel(obj,nd)\/nd=0 + $( oldnd_nd + nd of_LINK + $) + unless nd test gotone then return or error("You aren't carrying any :s.", objname) + if nd=bag error("You can't :s something :s itself!", verbname,given->"to","inside") + if (WTUSED of insides)+(WEIGHT of nd)>MAXWT of insides /\(WIZARD of profile)=0 + error(given->"The :s can't carry it.","There's not enough room!", insname) + LINK of oldnd_LINK of nd //possible deadlock here... + WTUSED of insides+_WEIGHT of nd + WEIGHT of bag+_WEIGHT of nd + unless toting(ins) CARRY.COUNT of profile-_WEIGHT of nd + OBJ.CARRIED of profile-_1 + ROBJT of profile_carry + pushlist(insides,nd) + inform(nd, given->K.IGIV,K.IINS) + if given infrm(nd,bag,K.MGOT) + adjustdown(nd) + out(":p now :s the :s.*C*L", PNAME of nd,given->"carried by","inside", insname) + unless class setit(bag)<>return + gotone_true + nd_LINK of oldnd + $) repeat +$) +and remove() be +$( let class,obj,nd,oldnd,ins,bag,insides,sel,gotone,mover= + PTYPE of objct=S.CLASS,class->P1 of objct,D1 of DREC of objct, + ?,?,D1 of DREC of instrmnt, here.or.toting(ins), CONTENTS of bag, + class->classmatch,objmatch,false,MOTN of bag + unless insides error("The :s :s anything!", insname,mover->"isn't carrying","doesn't contain") + nd_CONTS of insides + oldnd_insides + $( until sel(obj,nd)\/nd=0 + $( oldnd_nd + nd of_LINK + $) + unless nd test gotone then return or error("The :s :s any :s.", insname, mover->"isn't carrying","doesn't contain", objname) + if full.up() + $( out("You can't carry more than :n discrete objects.*C*L", max.obj()) + test gotone then return or jump(mainloop) + $) + unless toting(ins) + $( if (WEIGHT of nd)+(CARRY.COUNT of profile)>max.wt()/\(WIZARD of profile)=0 + $( out(CARRY.COUNT of profile->"it is too much extra weight*C*L", "it is too heavy for you to carry alone") + test gotone then return or jump(mainloop) + $) + CARRY.COUNT of profile+_WEIGHT of nd + $) + LINK of oldnd_LINK of nd + WTUSED of insides-_WEIGHT of nd + WEIGHT of bag-_WEIGHT of nd + OBJ.CARRIED of profile+_1 + pushlist(lvcarry, nd) + ROBJT of profile_carry + adjustup(nd) + if mover infrm(nd,bag,K.MDROPT) + inform(nd, mover->K.ITAK,K.IREM) + out(":p :s from :s.*C*L", PNAME of nd,mover->"stolen","removed",PNAME of bag) + setit(nd) + unless class return + gotone_true + nd_LINK of oldnd + $) repeat +$) +and empty() be +$( let obj, ins,bag,insides,holding,rm=?,D1 of DREC of objct,here.or.toting(ins),CONTENTS of bag,toting(ins),place(room) + unless insides error("The :s isn't a container.", objname) + obj_unlink(insides) + unless obj error("The :s is already empty!", objname) + while obj do + $( out(":u dropped.*C*L", PNAME of obj) + setit(obj) + if A.SANCTUARY bitand ATTRIB of rm setexp(obj,true) + WTUSED of insides-_WEIGHT of obj + WEIGHT of bag-_WEIGHT of obj + if holding CARRY.COUNT of profile-_WEIGHT of obj + lockdown(rm,obj) + inform(obj,K.IREM) + inform(obj,K.IDROPT) + obj_unlink(insides) + $) + adjustdown(bag) + out("The :s now :s nothing.*C*L", objname,MOTN of bag->"carries","contains") +$) +and lockup(lvnd,lvoldnd,rm) be +$( unless numbargs()=3 rm_place(room) + !lvoldnd_rm+4 + lock(door+rm) + !lvnd_ROBJT of rm +$) +and lockdown(rm, nd) be +$( lock(door+rm) + pushlist(rm+4,nd) + if MOTN of nd then + $( !(MOTN of nd)_rm + if A.HIDEAWAY bitand ATTRIB of rm unless WIZARD of profile=1/\numbargs() ne 3 + destroy(nd,0) + $) + unlock() +$) +and describe(room,long) be +$( let bit,ty, lvrdoor=?,brief, door+room + if numbargs()<2 long_false + unless long gr 0\/ visible() then + error(blind->"You can't see anything, you're blind.","The room is too dark to see anything.") + if WIZARD of profile=1/\(brief ne -1\/long) + $( out("Room :6*C*L",!room) + if(A.HIDEAWAY bitand ATTRIB of room) then out("(Hideaway)*C*L") + if(A.HIDE bitand ATTRIB of room) out("(Hide)*C*L") + if(A.DEATH bitand ATTRIB of room) out("(Death)*C*L") + if(A.SILENT bitand ATTRIB of room) out("(Silent)*C*L") + $) + desc.short(room) + if long=true \/ (A.DEATH bitand ATTRIB of room) dscribe(ROOMWD of room, roomput)<>ty_true //the =true is needed... + unless ty=-1\/(ty=0/\been.in(RNUMB of room)) dscribe(ROOMWD of room, roomput) + if (A.DEATH bitand ATTRIB of room)/\(WIZARD of profile)=0 then + $( let nd=? + lock(lvrdoor) + nd_ROBJT of room + while nd do + $( unless P4 of nd >= P5 of nd setprop(nd, P4 of nd+1) + nd of_LINK + $) + unlock() + test spectacular then + $( drop.everything() + STAMINA of profile_STAMINA of profile<20->10, (STAMINA of profile)-10 + special(SF.SLEEP) + $) or quit() + $) + if (A.HIDE bitand ATTRIB of room)/\(WIZARD of profile)=0 then return + unless (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then + $( lock(lvrdoor) + describe.obj(ROBJT of room, long) + unlock() + $) + for i=0 to 35 do unless invisible(i) + $( bit_1<" asleep,", "",ROBJT of (LH from tt)) + $) + $) +$) +and longdescribe(rm, dd, nocrlf) be +$( let input=? + if LH from rm=#777777 then + $( broadcast(K.OHDS, WHO!room, -rm, true) + return + $) + test numbargs() ne 2 then + test rm then + test (selector 1:rm rem 36:rm/36) of text then + rm_sb(rm) + or dscribe((rm rem 2->LH, RH) from txtvec!(rm/2),textput, numbargs()=3)<>return + or return + or if dd ne #777777 dscribe(dd,objput)<>return + input_dofile(DISC,!rm,"dba",MAINTA,label(ak),0,2,lookup,rda,sterr,closefile) + readch(input,@dd,true) + nocrlf_numbargs()=3->'*C',-1 + until dd='*E'\/dd=nocrlf do + $( outch(dd) + readch(input,@dd,true) + $) + close(input) +ak: outz($az"*C*L") +$) +and desc.short(rm) be dscribe(TITLE of rm, roomput) +and dscribe(num, stream, nocrlf) be +$( let block=num/WDSPERBUF+1 + unless stream=laststream /\ block=lastblock + $( useti(stream, block) + inuuo(stream, cbl) + laststream_stream + lastblock_block + $) + num_dmpbuf+(num rem WDSPERBUF) + if numbargs()=3/\nocrlf + $( let s=selector 7:36:num + $[ +neckst: $ildb ac, s + $jumpe ac, dun + $caie ac, '*C' + $jrst neckst + $setz ac, 0 + $dpb ac, s +dun: + $] + $) + outz(num,stream=comput) +$) +and describe.obj(obj, long) be +$( let rand,cprop,sprop=?,?,? + while obj do + $( if obj ne long + $( rand,cprop_RANDM of obj,P4 of obj + if rand cprop_random(1+(P5 of obj))<>setprop(obj,cprop) + sprop_selector 18:18*(cprop rem 2):cprop/2+OBJECTSIZE+1 + if WIZARD of profile=1/\(brief ne -1\/long) + $( out(":s - ", PNAME of obj) + unless sprop of obj outz($az"*C*L") + $) + if WIZARD of profile=1 + if DESTROYED of obj ls 0 outz($az"(Destroyed) - ") + unless (DESTROYED of obj ls 0 /\(WIZARD of profile)=0)\/sprop of obj=0 + $( let sp,sxb=SPROP of obj,? + if sp=#777777 sxb_sixbit(PNAME of obj) + setit(obj) + longdescribe(@sxb,sp) + sayinsides(obj, 1, PNAME of obj, false) + if holds(obj) outz($az"*C*L") + $) + $) + obj of_LINK + $) +$) +and destroy(o1,mess,noprint) be +$( let msg=Abs(mess) + DESTROYED of o1_true + for i=0 to 35 if player.names!i + $( let nd=ROBJT of (LH from player.names!i) + while nd do + $( if therein(nd, o1,false) + $( test i=player.no then get.rid.of(o1,msg) or + transmit(i,0,K.GRO,(msg<<18)\/o1) + return + $) + nd of_LINK + $) + $) + if numbargs()=3 unless noprint longdescribe(mess) + killmonster(o1) +$) +and therein(nd, o1,dropit) = valof +$( let insides,n,oldn=CONTENTS of nd,?,? + if nd=o1 resultis 1 + unless insides resultis false + n_CONTS of insides + oldn_insides //relies on CONTS=LINK + while n do + $( let there=therein(n, o1) + if there + $( if there=1/\dropit + $( LINK of oldn_LINK of n //could get away with oldn as insides + CARRY.COUNT of profile-_WEIGHT of n + WTUSED of insides-_WEIGHT of n + WEIGHT of nd-_WEIGHT of n + killmonster(n) + pushlist(room+4,n) + $) + resultis true + $) + oldn_n + n of_LINK + $) + resultis false +$) +and is.or.was.here(obj,nd)=valof +$( while nd do test obj=LH of nd then + $( test ((A.HIDEAWAY bitand ATTRIB of room) ne 0)/\(FIXED of nd=0) then resultis false + or resultis nd + $) or + $( let o=open(nd, obj, objmatch,false) + if o resultis o + nd of_LINK + $) + resultis false +$) +and open(nd, obj, match,oppen)=valof +$( let bag, insides=CONTENTS of nd, ? + unless bag ne 0/\(oppen\/(OPENED of bag ne 0 /\ P4 of nd=0)) resultis false + insides_CONTS of bag + while insides do + $( let o=? + if match(obj,insides) resultis insides + o_open(insides, obj, match,oppen) + if o resultis o + insides of_LINK + $) + resultis false +$) +and here(obj, nd)=valof +$( if (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then resultis false + lock(lvrdoor) + unless numbargs() = 2 nd_ROBJT of room + while nd do test obj=LH of nd /\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0)) then + $( unlock() + resultis nd + $) or nd of_LINK + unlock() + resultis false +$) +and toting(obj, nd)=have(obj, numbargs()=2->nd, carry, objmatch) +and toting.class(obj)=have(obj, carry, classmatch) +and have(obj, nd, match)=valof +$( while nd do test match(obj,nd) then resultis nd or nd of_LINK + resultis false +$) +and here.class(obj)=valof +$( let nd=? + if (A.HIDEAWAY bitand ATTRIB of room)/\(WIZARD of profile)=0 then resultis false + lock(lvrdoor) + nd_ROBJT of room + while nd test classmatch(obj,nd) then + $( unlock() + resultis nd + $) or nd of_LINK + unlock() + resultis false +$) +and carrying.class(obj,oppen,nd)=got(obj, classmatch,oppen,nd) +and carrying(obj,oppen,nd)=got(obj, objmatch,oppen,nd) +and got(obj, match,oppen,nd)=valof +$( while nd do test match(obj,nd) then resultis nd or + $( let o=open(nd, obj, match,oppen) + if o resultis o + nd of_LINK + $) + resultis false +$) +and object()=valof +$( let tipe,orm=PTYPE of objct,room + unless tipe=S.CLASS\/tipe=S.OBJECT Error("You can't :s that!", verbname) + room_place(room) + tipe_tipe=S.CLASS->valof + $( let v=here.or.toting.class(P1 of objct) + unless v resultis 0 + resultis PTYPE of v + $), (D1 of DREC of objct) + if tipe tipe_here.or.toting(tipe) + room_orm + unless tipe error("I see no :s!", objname) + resultis tipe +$) +and objmatch(obj, nd)=obj=PTYPE of nd +and classmatch(obj,nd)= +(obj=P1 of nd \/(obj=1 /\ P4 of nd=SCOREPROP of nd/\valof + $( let res=VALUE of nd + $[ $hrre 1, res $] + $) ge 0 ))/\(WIZARD of profile=1 \/ (DESTROYED of nd ge 0)) +and here.or.toting.class(obj)=around(obj, here.class, toting.class) +and here.or.toting(obj)=around(obj, here, toting) +and around(obj, heretest, totingtest)=valof test holdfirst then +$( let res=totingtest(obj) + unless res res_heretest(obj) + resultis res +$) or +$( let res=heretest(obj) + unless res res_totingtest(obj) + resultis res +$) diff --git a/MUD7.BCL b/MUD7.BCL new file mode 100644 index 0000000..019066e --- /dev/null +++ b/MUD7.BCL @@ -0,0 +1,413 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let save() be +$( let testsaved=? + perput_dofile(disc,ps6,$6".pm",mainta,label(eh),#17,1,lookup.enter,rdb,wrb,closefile) + assign() + testsaved_saverec(profile+14) + deassign() + close(perput) + if testsaved + $( out("*C*L:P saved.*C*L", me) + savedp+_1 + $) + return +eh: error("Someone accessing the profile file - :P not saved! Try again.", me) +$) +and purge() be +$( let psw,going,numrecs,bcnt=ps.word,true,?,3 + if fight!player.no error("You can't :s in the middle of a fight!",verbname) + unsetbit() + perput_dofile(disc,ps6,$6".pm",mainta,label(eh),#17,1,lookup.enter,rdb,wrb,closefile) + dormant() + assign() + test seq(objname,"that") then + $( load.block(perput,1) //Load in the first block for filelength + numrecs_(FLEN of dmpbuf-2*WDSPERBUF)/RECLENGTH + load.block(perput,bcnt) + rec_dmpbuf + $) or + $( searchrec(objname) + numrecs_rec -> 1, 0 + rec_rec rem 128+dmpbuf //Dmpbuf contains record after searchrec. + $) + deassign() + for i=1 to numrecs + $( if us(me) psw_PSWD of rec + if PSWD of rec=psw/\WRD1 of rec then //Deleted record if name zero + $( out("*L*S*C*LName: :U*T[**,:8]*C*LStrength: :N*TStamina (max): :N*TDexterity: :N*TSex: :s*C*L", + rec+2,PN of rec,STRN of rec,STMX of rec,DXTY of rec,rec!1 bitand 1 -> "female", "male") + out("Games: :N*TScore: :N.*C*L", GAMES of rec, SCRE of rec) + unless valof + $( unless WIZARD of profile resultis true + out("*L*S*C*LSave, delete or finish? ") + $[ $clrbfi + $inchrw ac + $clrbfi + $trz ac, '*S' + $cain ac, 'S' + $jrst save + $cain ac, 'D' + $jrst delete + $cain ac, 'F' + $jrst finsh + $clrbfi + $outstr $az"S" + $jrst saver +finsh: $setzm going + $( unless ESSEX + $[ $outstr $az"F" + $] + $) + $outstr $az"inish*C*L" + $jrst tr +save: $( unless ESSEX + $[ $outstr $az"S" + $] + $) +saver: $outstr $az"ave*C*L" +tr: $( resultis true $) +delete: $( unless ESSEX + $[ $outstr $az"D" + $] + $) + $outstr $az"elete*C*L" + $( resultis false $) + $] + $) then + $( let str,prevrec=vec 1,rec + !str_2!rec + 1!str_3!rec + assign() + deleterec(str) + deassign() + load.block(perput,bcnt) //Deleterec screws up dmpbuf + rec_prevrec //and rec + out("*C*L:u deleted.*C*L",str) + $) + $) + unless going break //Finished. + if (rec-dmpbuf)>128 + $( rec-_128 + assign() + bcnt+_1 + load.block(perput,bcnt) + deassign() + $) + rec +_ RECLENGTH + $) + close(perput) + laststream_-1 + setbit() + flush() + alive() + return +eh: Outs("*C*LSomeone is using the persona file, try again later, sorry.*C*L") + alive() + setbit() +$) +and bug() be +$( let day,tim,ch,wot=?,?,?,verbname + for i=0 to 35 do if fight!i error("You don't have time to :s during a fight!", wot) + private() + bstr_appendfile("all","letter","box",MAINTA,label(errlab)) + day_valof $[ $DATE AC, 0 $] + tim_valof $[ $MSTIME AC, 0 $] + 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) + unsetbit() + write(tty,"Please type in your :s. Finish it with an ESCape*C*L",wot) + reset() + verb_0 + $( check.stuff() + ch_getch() + until linebreak(ch) do + $( writech(bstr,ch) + ch_getch() + $) + unless ch='*L' writech(bstr,'*C') + writech(bstr,'*L') + if ch='*$' break + $) repeat + close(bstr) + bstr_0 + public() + out("*C*LYour :s has been recorded. Thankyou!*C*L", wot) + setbit() + return +errlab: writes(tty,"Problem with bug file ") + public() + iomessage() +$) +and attach() be +$( let oldname, real, oldp.no=player.names!player.no,false,player.no + unless (RELAXED\/us(me)\/us(objname))/\(flipping\/WIZARD of profile=1) error() + if !objname=!"gail" then !objname_!"glai" + if LENGTH of objname gr NAMELENGTH + error("Maximum length of name allowed is :N", NAMELENGTH) + if (find.word(objname) ne 0) \/ (objct ne fake) + error("I can't call you :s.",objname) + if player.no=P1 of objct error("There's no point in attaching to yourself...") + if us(objname) unless maint error("Not to :U you don't!", objname) + test PTYPE of objct=S.PLAYER then + $( unless JBNUM of LH from player.names!(P1 of objct)=jobno + if us(objname) \/ us(me)=0 + error("You can't attach to someone else's persona") + break.off() + bashfull() + dormant() + player.no_p1 of objct + player.bit_1<=35 unlock()<>quitflg_true<>Error("Too many players - try again later") + player+_1 + player.no_plynum!player + unlock() + player.bit_1< "girl", "son") + if player.no=pno error("*C*LYou can't exorcise yourself! You're not dead!") + $) + unless jalready jar(@deldr) + if active!pno=-1 + $( unless jalready unjar(@deldr) + return + $) + player.no_pno + active!player.no_-1 + unless jalready unjar(@deldr) + player.bit_1<>18, (SCORE of profile)-oldscore + if t le 0 t+_WHOLEDAY + t/_1000 + rhours+_t //don't really care too much if it's interrupted! + writez(tty,$az"*C*LDuration of game =") + if d write(tty," :N day:S",d, d=1->"","s") + writesecs(tty,t) + writes(tty,".*C*L") + if d writez(tty, "*C*LMy god! What dedication!") + if scr ge 1 write(tty,"You scored :N point:S this session:s.*C*L", + scr,scr=1->"","s", STAMINA of profile le 0->" before you died","") +if essex /\ scr ge 6888 +$( let op=? + op_appendfile($6"dsk",$6"prolog",$6"prl",MPPN,label(rattts)) + write(op,":P leaving :s gaining :N points from :N to :N*C*L", + me, @mudnam, scr, oldscore, SCORE of profile) + close(op) +rattts: +$) + $) + if logstr close(logstr) //If logging close log file. + logstr_0 //Stop dump mode I/O causing ill uuo. + if bstr close(bstr)<>bstr_0 + writeprofile(nextgame) + lock(@inidr) //Lock initialisation door + plynum!player_player.no //Re-cycle the player no. + player-:1 //Decrement player-stack pointer + unless \player locked_false //last one out unlocks game + unlock() //Now unlock the door + test numbargs() then test \nextgame then + $( output_createtmp(sixbit(nextgame),label(nochain)) +//dofile(disc,nextgame,"tmp",0,label(nochain),0,2,enter,rda,wrb,closefile) + outch('*^A') + out(PNAME of profile) + test logs then outch('*B') or outch('*^C') + out(":n*$:n*$:n*$:n*$:n",valof $[ $mstime 1, 0 $],daytime,sixbit(nextrm),ps.word,oldscore) + close(output) + $) or + $( freemblock(profile) + run($6"sys",$6"logout",$6"exe",0) + $) or + $( +nochain: freemblock(profile) + finish + $) + freemblock(profile) + run(disc,nextgame,$6"exe",mainta,0) +$) diff --git a/MUD8.BCL b/MUD8.BCL new file mode 100644 index 0000000..c9c896f --- /dev/null +++ b/MUD8.BCL @@ -0,0 +1,828 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +get "mudlib" +get "dungen" + +let interact(fn) be +$( let snd,bit,block,damage,pp,pn,inv,inf=?,?,?,?,?,?,?,? + if numbargs() then + $( unless objct=fake error("To use the verb :p you have to give someone's name!", verbname) + person(objct) + snd_P1 of objct + pn_player.names!snd + pp_LH from pn + switchon fn into + $( case I.KILL: + unless RELAXED\/us(me) + if WIZARD of profile + unless ~WIZVWIZ/\WIZARD of pp ne 0 + error("That's a bit un:s!", + SEX of profile->"ladylike", "gentlemanly") + if snd=player.no error("Committing suicide is too easy a way to get points!") + if fight!snd then error("You're already fighting :p",pn) + bit_1< getting U in a loop. + endcase + case I.SNOOP: + if snd=player.no error("You should already know what YOU'RE doing...") + if snd=snooping error("You're already snooping on :p!",pn) + transmit(snd, 0, K.SNOP) + out("You have started to :s on :p.*C*L", verbname, pn) + snooping_snd + SNOOPBIT of profile_true + endcase + case I.WAKE: + if snd=player.no return + unless WIZARD of profile unless (1<0 do + Error("Say it again, and this time mention what you want to :p :p do.",verbname,objname) + block_getmblock() + read.message(block+2) + unless us(me) for i=0 to 35 do + if player.no\= i /\ + snd \= i /\ + player.names!i /\ + WIZARD of LH from player.names!i then + $( let msg=getmblock() + copy(block+2, msg+2, 13) + send(i,msg,K.SHBF, 2!block) + $) + send(snd,block,K.MAKE,2!block) + verb_0 + endcase + case I.FOD: + unless RELAXED\/us(me)\/(WIZARD of pp ne 0) error("Not to mortals!") + transmit(snd,0,K.FOD) + endcase + case I.STEAL: + if snd=player.no then + error("Stealing from yourself is silly!") + bit_1<return + followers bitand:\(1<female,male)!MAX.LEVEL) + out(":p is now :smale.*C*L",objname,SEX of pp->"","fe") + transmit(snd,0,K.TSEX) + endcase + case I.SLEEP: + if snd=player.no + $( objct_fake.node("that") + special(SF.SLEEP) + return + $) + unless WIZARD of profile unless (1<female,male)!MAX.LEVEL) + endcase + $) + $) + $( lock(lvqdoor) + block_unlink(lvqueue) + unlock() + unless block return + snd_SENDER of block + pn_player.names!snd + inv_invisible(snd) + inf_INFO of block + pp_LH from pn + switchon FUNC of block into + $( case K.IHHU: + if fight!snd endcase + $( let ins, damge=RH from inf, + WIZVWIZ/\WIZARD of profile ne 0 -> 0, LH from inf + out("*C*L:p has suddenly attacked you", pn) + if ins Out(" with :s :s", SEX of pp->"her","his", PNAME of ins) + outs("!*C*L") + STAMINA of profile -_damge + if ASLEEP of profile STAMINA of profile-_damge + if STAMINA of profile le 0 STAMINA of profile_1 //no outright kills + $) + case K.IWKU: + if fight!snd endcase + quitflg_false + fight!snd_-1 + $( let kipped=kips!player.no + wake.up() + unless FUNC of block=K.IHHU fightmess(B.START, snd) + send(snd,block,K.IACPT,WIZVWIZ/\WIZARD of profile ne 0->10000000,kipped->-1,DEXTERITY of profile) + loop + $) + case K.IACPT: + quitflg_false + fight!snd_-1 + for i=0 to 35 do if player.no\=i/\i\=snd/\player.names!i then + $( let p=LH from player.names!i + if WIZARD of p ne 0\/(who.copy bitand (1<DEXTERITY of profile then + $( send(snd,block,K.ISAM) + loop + $) + case K.ISAM: + unless fight!snd endcase + if phased(snd,block)loop + fightmess(B.THEYMISS, snd) + damage_WIZVWIZ/\WIZARD of profile ne 0->0,random(100)+1+(CARRY.COUNT of profile)/F.ENCMB + test damage<=DEXTERITY of profile \/ INF=-1 then + $( damage_WIZVWIZ/\WIZARD of profile ne 0->1000000,random(STRENGTH of profile/F.DMGE1)+1 + send(snd,block,snd=player.no->K.ISAHM, K.ISAH,INF=-1 ->2*damage, damage) + fightmess(B.IHIT, snd) + $) or + $( send(snd,block,snd=player.no->K.ISAMM, K.ISAM) + fightmess(B.IMISS, snd) + $) + wake.up() + loop + case K.ISAH: + unless fight!snd endcase + if phased(snd,block)loop + fightmess(B.THEYHIT, snd) + STAMINA of profile-:INF + checkout(block) + fightmess(B.IMOK, snd) + damage_WIZVWIZ/\WIZARD of profile ne 0->0,random(100)+1+(CARRY.COUNT of profile)/F.ENCMB + test damage<=DEXTERITY of profile then + $( damage_WIZVWIZ/\WIZARD of profile ne 0->10000000,random(STRENGTH of profile/F.DMGE2)+1 + send(snd,block,snd=player.no->K.ISAHM, K.ISAH,damage) + fightmess(B.IHITBACK, snd) + $) or + $( send(snd,block,snd=player.no->K.ISAMM, K.ISAM) + fightmess(B.IMISSAGAIN, snd) + $) + wake.up() + loop + case K.IMDD: case K.IHD: + if snd=player.no /\ MOTN of fight!snd then + FIGHTS of MOTN of fight!snd bitand_\player.bit + fight!snd_0 + setscore(INF, 2) + test FUNC of block=K.IHD then + out(":U has died, but not because of the fight!*C*L", block+3) or + fightmess(B.VICTORY, snd, block+3) + freemblock(block) + for i=0 to 35 if fight!i snd_-1<>break + if snd=-1 loop + retaliated_0 + outz($az"You are victorious - this time...*C*L") + quitflg_true + return + case K.WAF: + unless ASLEEP of profile unless inv + unless IGNORE of profile + $( out("*C*L:p and :p have started to fight", pn, player.names!(INF)) + givewhere(snd,pp) + $) + endcase + case K.IFM: + unless ASLEEP of profile unless inv + unless IGNORE of profile + $( out("*C*L:p and the :p have started to fight", pn, INF) + givewhere(snd,pp) + $) + endcase + case K.MFM: + unless ASLEEP of profile unless inv + unless IGNORE of profile + $( out("*C*L:p has been attacked by the :p",pn,INF) + givewhere(snd,pp) + $) + endcase + case K.ISAHM: + $( let monster=fight!player.no + unless monster endcase + DESTROYED of monster -: INF + if DESTROYED of monster ls 0 then + $( let val, name=0, PNAME of monster + destroy(monster, 0) + if P4 of monster = SCOREPROP of monster val_VALUE of monster + block!3_!name + block!4_1!name + send(player.no, block, K.IMDD, val) + return + $) + unless DESTROYED of monster DESTROYED of monster+_1 + $) + case K.ISAMM: + $( let monster=fight!player.no + unless monster endcase + if DESTROYED of monster ls 0 + $( send(player.no,block,K.ISAHM,0) + loop + $) + damage_random(100) + test damage ls 60 then + $( damage_WIZARD of profile->0,random((WEIGHT of monster)/1000/F.DMGE2)+1 + send(player.no, block, K.ISAH, damage) + $) or send(player.no, block, K.ISAM) + return + $) + case K.IHR: + $( let obj,damge=RH from inf, LH from inf + if snd=player.no + $( send(player.no, block, K.ISAHM, damge) + loop + $) + if obj out(":P retaliates with :s :s.*C*L", + pn, SEX of pp->"her","his", PNAME of obj) + STAMINA of profile-_damge + if STAMINA of profile le 0 STAMINA of profile_1 + endcase + $) + case K.GRO: + get.rid.of(RH from inf,LH from inf) + endcase + case K.MESS: + if deaf endcase + out("*C*L:p says *"",pn) + longdescribe(INF,false,true) + outs("*"*C*L") + wake.up() + endcase + case K.ISCY: + out("*C*L:P is about to contact you with a *":s*" command...", pn, inf) + endcase + case K.TEXT: case K.TOLD: + if deaf endcase + bit_FUNC of block=K.TEXT + test conversing /\ bit then + $( if inv pn_"someone" + out("*C*L:U:: *":s*"*C*L",pn,block+2) + $) or + out("*C*L:p :s *":s*"*C*L",pn,bit->"says","tells you", block+2) + wake.up() + endcase + case K.LAUGH: + if deaf endcase + out("*C*L:p laughs", pn) + if inf out(", :s", block+2) + outs("*C*L") + wake.up() + endcase + case K.MAKE: + wake.up() + sendall(true, K.IHBF, true, true) + unless us(pn) + $( justforced_true + test WIZARD of profile then + out("*C*L:U has forced you to :s*C*L",pn,block+2) or + $( let osnp=snoopedon + snoopedon bitand_~(1<"*C*L:s*C*L", "*C*LYou are forced to :s*C*L",block+2) + $) + $) + unpackstring(block+2,linebuffer) + chcnt,nextch_!linebuffer+2,linebuffer + chcnt!linebuffer,(chcnt-1)!linebuffer_'*l','*C' + freemblock(block) + scanch_-1 + at_false + parse.command() + instate() + execute.command() + reset() + loop + case K.IHBF: + out(":p has been forced.*C*L", pn) + endcase + case K.SHBF: + out(":p has forced someone to :s*C*L", pn, block+2) + endcase + case K.IHA: + unless IGNORE of profile + out(":p has attached to :p.*C*L", player.names!inf, pn) + endcase + case K.WU: + unless ASLEEP of profile endcase + unless inv out("*C*L:p has started to wake you up.*C*L",pn) + wake.up() + endcase + case K.ITTE: + 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) + endcase + case K.SPEC: + unless logstr special(SF.SPECLOG) + case K.DIST: case K.BELW: + if deaf endcase + $( let osnp=snoopedon + snoopedon_false + test WIZARD of profile=1\/FUNC of block ne K.DIST then out("*C*L:p shouts",pn) + or out("*C*LA :Smale voice in the distance shouts",SEX of pp->"fe","") + test block!2 then out(" *":S*"*C*L",block+2)or outz($az" something*C*L") + wake.up() + snoopedon_osnp + $) + endcase + case K.LOUD: + if deaf endcase + outz($az"*C*L") + longdescribe(INF) + wake.up() + endcase + case K.IWSU: + bit_D1 of(DREC of(RH from (INF))) + unless toting(bit) then + $( send(snd,block,K.INCI,block!2) + loop + $) + damage_WIZARD of profile->102,ASLEEP of profile->-1,random(100)+1 + test us(me)\/(damage>(LH from(INF))/\us(pn)=0) then + $( out("*C*LYou catch :p trying to steal the :s from you!*C*L",pn, PNAME of (RH from block!2)) + send(snd,block,K.IFYO,block!2) + $) or + $( let nd, oldnd=carry, lvcarry + until LH of nd=bit do + $( oldnd_nd + nd of_LINK + $) + LINK of oldnd_LINK of nd + CARRY.COUNT of profile-:WEIGHT of nd + OBJ.CARRIED of profile-:1 + ROBJT of profile_carry + adjustdown(nd) + inform(nd,K.IDROPT) + if random(100-(WEIGHT of nd)/100)+1 le DEXTERITY of profile then + $( setit(RH from block!2) + unless ASLEEP of profile out("*C*L:p has stolen the :s from you!*C*L",pn,PNAME of RH from block!2) + $) + LH from block!2_nd + send(snd,block,K.YSFM,block!2) + $) + loop + case K.INCI: case K.IFYO: + 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", + pn,PNAME of (RH from block!2)) + endcase + case K.IWGU: + bit_LH from block!2 + if (((WEIGHT of bit)+CARRY.COUNT of profile>max.wt())\/ + full.up())/\(WIZARD of profile)=0 then + $( send(snd, block,K.ITHM,block!2) + loop + $) + case K.ITHM: + test FUNC of block=K.ITHM then + $( out("*C*L:p can't take the object you try to give :s.*C*L", pn, SEX of pp->"her","him") + bit_LH from block!2 + $) or unless ASLEEP of profile + $( setit(RH from block!2) + out("*C*L:p has given you the :s.*C*L", pn, PNAME of RH from block!2) + $) + //Hope you've not picked up another in the meantime! + //Maybe sending the PNAME only would be better... + pushlist(lvcarry,bit) + CARRY.COUNT of profile+_WEIGHT of bit + OBJ.CARRIED of profile+:1 + ROBJT of profile_carry + adjustup(bit) + inform(bit,K.IGOT) + if FUNC of block=K.IWGU then + $( send(snd,block,K.TYVM,block!2) + loop + $) + endcase + case K.YSFM: + bit_LH from block!2 + test (((WEIGHT of bit)+(CARRY.COUNT of profile)>MAXWEIGHT*(STRENGTH of profile))\/ + full.up())/\(WIZARD of profile)=0 then + $( 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)) + unless here(bit) do + $( lock(lvrdoor) + pushlist(room+4,bit) + unlock() + $) + $) or + $( pushlist(lvcarry,bit) + CARRY.COUNT of profile+:WEIGHT of bit + OBJ.CARRIED of profile+:1 + ROBJT of profile_carry + adjustup(bit) + inform(bit,K.IGOT) + out("*C*L:U stolen from :p*C*L",PNAME of (RH from block!2),pn) + $) + endcase + case K.IWTF: + followers bitor:(1<her,him)_0 + objct_fake.node("that") + wake.up() + endcase + case K.SNOP: + unless us(pn) if (WIZARD of profile ne 0) \/snooping ne -1 then + $( send(snd,block,K.SSNO,SEX of profile) + unless inv out("*C*L:p has tried to snoop on you!*C*L",pn) + return + $) + unless snoopedon firstsnoop_true + snoopedon bitor_1<break + if snd=-1 loop + retaliated_0 + if bit outz($az"You have defeated the coward!*C*L") + quitflg_true + return + case K.TSEX: + SEX of profile_NOT (SEX of profile) + sexify(SEX of profile) + out("*C*LYour sex has been magically changed to :smale!*C*L",SEX of profile->"fe","") + endcase + case K.BGON: + stop.fighting() + outs(block+2) + freemblock(block) + quit() + case K.FOD: + STAMINA of profile_-1 + if us(pn)\/~WIZVWIZ + $( ISWIZ of profile_false + WIZARD of profile_false + $) + fodsville_true + out("*C*LA finger of death by :P has terminated you.*C*L",pn) + freemblock(block) + checkout() + return + case K.TYVM: + out("*C*L:U given to :p.*C*L",PNAME of RH from block!2, pn) + endcase + case K.STTE: + unless IGNORE of profile + unless ASLEEP of profile if visible() out("*C*LAn attempt to enter your room has failed, made by some :p.*C*L",INF) + endcase + case K.SJL: + unless ASLEEP of profile if visible() + unless ~snooping/\(((1<find.word(PNAME of INF), D.OBJECT of demon, + D.INSTRUMENT of demon=#777777->find.word(PNAME of inf), D.INSTRUMENT of demon + freemblock(block) + instate() + action(false) + reinstate(oldvb, oldobj, oldins) + return //or loop if you prefer + $) + $) + endcase + case K.OHM: + out("*C*L:C:C",SNOOPROMPT,SNOOPROMPT) + describe(CURROOM of MOTN of INF, INF) + out(":C:C*C*L",SNOOPROMPT,SNOOPROMPT) + endcase + case K.SFO: + out("*C*L(The :P is fighting :P).*C*L",PNAME of INF,pn) + endcase + case K.OHD: + if snobj + $( snobj_false + out("*C*LYou can snoop on the :p no longer.*C*L",PNAME of INF) + $) + endcase + case K.IGOT: case K.IDROPT: + unless inv out("*C*L(:P has :Sthe :P)*C*L",pn,FUNC of block=K.IGOT->"got ","dropped ",PNAME of INF) + endcase + case K.MGOT: case K.MDROPT: + out("*C*L(The :P has :Sthe :P)*C*L",block!3,FUNC of block=K.MGOT->"got ","dropped ",PNAME of INF) + endcase + case K.IINS: case K.IREM: + bit_FUNC of block + bit_bit=K.IINS->0,bit=K.IREM->1,bit=K.IGIV->2,3 + unless inv out("*C*L(:P has :sthe :p :s some:s)*C*L", + pn, + bit!(table "inserted ","removed ","given ","taken "), + PNAME of INF, + bit!(table "inside","from","to","from"), + bit ge 2->" creature","thing") + endcase + case K.TTH: + $( let dropsy, sumnd=WIZARD of pp, LH from INF + if sumnd if WIZARD of profile=1 \/ valof + $( let nd=lvcarry + if dropsy resultis false + while nd test luminous(nd, NOSUMMON) + then resultis true or nd_LINK of nd + resultis false + $) then unless us(pn) + $( out("*C*L:P has tried to :s you.*C*L", + pn, LH from INF) + send(snd, block, K.YCSM, INF) + loop + $) + bit_RH from INF + if bit=room endcase + wake.up() + lose.followers() + start.leading() + stop.fighting() + if sumnd + $( Out("*C*L:P has summoned you magically!*C*L", pn) + if carry/\dropsy=0 outz($az"You drop everything...*C*L") + $) + freemblock(block) + unless dropsy drop.everything() + move.ser(bit,true) + loop + $) + case K.IHWU: + unless inv out("*C*L:P has woken up.*C*L", pn) + endcase + case K.ZZZ: + if WIZARD of profile + $( unless inv out("*C*L:p has tried to put you to sleep!*C*L", pn) + endcase + $) + if ASLEEP of profile send(snd,block,K.IAA)<>loop + if valof + $( for i=0 to 35 if fight!i + send(snd,block,K.IMOF)<>resultis true + resultis false + $) loop + kips!player.no_ud.time() + start.leading() + doownthing() + ASLEEP of profile_true + out("*C*L:p has put you to sleep!*C*L", pn) + broadcast(K.IHFA,who.copy) + endcase + case K.IMOF: + out("*C*L:P is in the middle of a fight!*C*L", pn) + endcase + case K.IAA: + out("*C*L:p is already asleep!*C*L", pn) + endcase + case K.IHFA: + unless inv out("*C*L:P has fallen asleep.*C*L", pn) + endcase + case K.SHBE: + unless IGNORE of profile + out("*C*L:U has been exorcised.*C*L", block+3) + if snooping=INF + $( snooping_true + SNOOPBIT of profile_false + him, her, them_false, false, false + $) + if snoopedon bitor (1<break + unless snd=-1 + $( retaliated_0 + quitflg_true + $) + outz($az"Well you won that one anyway!*C*L") + $) + endcase + case K.INH: + unless IGNORE of profile + out("*C*L:P has entered :F having played :N time:c before.*C*L", + pn, mud6, block!2, block!2=1-> '*0', 's') + endcase + case K.IHCL: + unless IGNORE of profile + $( let sx=(SEX of pp->female,male) + out("*C*L:U has changed experience level from :S to :S.*C*L", + pn,sx!(RH from INF), sx!(LH from INF)) + $) + endcase + case K.YCSM: + out("*C*LYou cannot :s :p.*C*L", LH from INF, pn) + endcase + case K.WM: + unless IGNORE of profile + unless us(pn) unless inv + $( let theirp=pp + Out("*C*L:P is:s in :s mode:s*C*L", pn, + WIZARD of theirp->""," not",SEX of theirp->female!max.level,male!max.level, + WIZARD of theirp->"...",".") + $) + endcase + case K.OHDS: + unless ASLEEP of profile if visible() longdescribe(INF) + endcase + case K.IHPO: + unless IGNORE of profile + unless ASLEEP of profile out(":U has just passed on.*C*L",block+2) + endcase + case K.DTD: + enable(INF) + endcase + case K.IHSE: + wake.up() + out(":p has given you a nice :s!*C*L", pn, block+3) + setscore(INF) + endcase + case K.IHKS: + unless ASLEEP of profile unless inv out(":P has given :P a nice :s.*C*L",pn, INF, block+3) + endcase + case K.GOWM: + if WIZARD of profile + $( out("*C*LLeaving :s mode.*C*L",(SEX of profile->female,male)!max.level) + WIZARD of profile_false + $) + unsnoop(true) + endcase + $) + freemblock(block) + $) repeat +$) +and phased(snd,block)=valof +$( unless snd=player.no resultis false + snd_fight!player.no + if DESTROYED of snd ls 0 + $( send(player.no, block, K.ISAHM, 0) + resultis true + $) + resultis false +$) +and givewhere(snd,pp) be +$( if WIZARD of profile Out(" in :6",!(CROOM of pp)) + outs("!*C*L") +$) diff --git a/MUDLIB.BCL b/MUDLIB.BCL new file mode 100644 index 0000000..a640306 --- /dev/null +++ b/MUDLIB.BCL @@ -0,0 +1,2172 @@ +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +$nolist +get "mudlib" +get "dungen" +$list + +manifest +$( REGIONSIZE : 6 + INTEGRITY : #525252 + DEBUGGING : FALSE + SIZE : LH + ISTTY : B14 + BUFLENGTH : 150 + TMP.BLOCKSIZE : 128 + TTY6 : $6"tty" +$) + +static +$( region : VEC REGIONSIZE + // **** Order must be same as order of FREESPACE parameters **** + origin : #377 + extent : 0 + quantum : -2 + routine : NIL + nname : "the low-seg' freelist" + // **** **** + page : #377 + freelist : 0 + scbsize = SC.DEFAULT.SIZE + hibflg = (1<<22)\/1000 //Hibernate flags. + trmpar = (3<<18)\/1 //TRMOP. parameter flags + hwmain = #2776 + months = (table //Month names for writedate. + "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December") + snoopbuffer = vec 69 + +//Four word interrupt block + intblk = #4000000 //XWD 4,0 + inttyp = 2 //EXP ER.ICC + retadr = 0 //EXP 0 + ctcflg = 0 //EXP 0 + stack = vec 100 //100 words of PDL stack +//Statics for testing access to mud (leave as NIL!!). + ppn = ? //User's PPn. + peen = ? //User's Pn. + guest = ? //User is a guest (from outside) + ttyno = ? //TTY udx. + jobno = ? //Jobnumber. + ctlno = ? //Controlling job number. + micstatus = ? //MIC status bits. + hsattrib = ? //Hi-seg attributes. + hsname = ? //Name of hi-seg. + hsppn = ? //PPn of hi-seg. + privved = ? //True if privileged. + + logstr = false //Non zero means logging enabled. + linebuffer = vec BUFLENGTH //Line buffer. + chcnt = 0 //Character count. + nextch = 0 //next character + roomput = 0 //SCB for the .RM file + textput = 0 //ditto .TM file + objput = 0 //ditto .OM file + comput = 0 //ditto .CM file + perput = 0 //ditto .PM file + mapput = 0 //ditto .MM file + cmndput = 0 //ditto .GM file + oldscore = 0 + rec = ? //pointer to record in dmpbuf + bufull = 3690556618 //buffer full name.string termination flag + first = true //for opening .PM file automatically + quitflg = true //Set to true if ^C gets u out. + maint = false //true if maintainer + room.been = ? //whether been in this room or not + dmpbuf = vec BUFFERS //input buffer for textput/roomput/objput/comput/perput/mapput + cbl = vec 1 //argument block to read above in in dump mode + ccnt = 0 //character count on output +//STATICS for vestigal BCPL library (Leave as NIL!!!!). + batch = ? + ccl = ? + callnm = ? + input = ? + output = ? + daytime = ? + udaytime = ? + err = ? + fl = ? + scb = ? + sl = ? + stackbase = ? + savpdl = ? + savt = ? + mainta = ? + chain = ? + lockflg = 0 //lets you out on ^C if 0 +$) + +let appendfile(dev,file,ext,ppn,error) = VALOF +$( let r,w,last=?,?,? + r_dofile(DEV,FILE,EXT,PPN,LABEL(NX),0,1,lookup.enter,rda,wrb,closefile) + w_words(r); last_w/128+1 + useti(r,last) + SC.ERROR^r_LABEL(END.OF.FILE) + SC.READER^R_RDB // NON ASCII READ + SC.APPENDCL^R_SC.CLOSER^R + SC.CLOSER^R_CLOSEA + $( let ch=? + rdb(r,@ch) + wrb(r,ch) + $) repeat +end.of.file: + USETO(R,LAST) + SC.ERROR^R_ERROR + RESULTIS R +NX: resultis dofile(dev,file,ext,ppn,error,0,2,enter,sterr,wrb,closefile) +$) +and detch()=valof +$[ $pjob 2, 0 + $setz 1, 0 + $trmno. 2, 0 + $seto 1, 0 +$] +and Enq(chan) be +$( let addr=vec 4 + !addr_#1000005 + 1!addr_142857 + 2!addr_chan + 3!addr_$az"mud"+(-1<<18) + 4!addr_0 + $[ $move 1, addr + $enq. 1, 0 + $trn + $] +$) + +and Deq(chan) be +$( let addr=vec 1 + !addr_#1000005 + 1!addr_142857 + $[ $move 1, addr + $hrli 1, 1 + $deq. 1, 0 + $trn + $] +$) +and assign() be jar(@persona.door)<>enq(SC.CHANNEL^perput) +and deassign() be deq(SC.CHANNEL^perput)<>unjar(@persona.door) + +AND FINDTMP(F,ERR) = VALOF // FINDS TMP:XXX, DOES A READ-DELETE +$( LET S=NEWVEC(SC.TMPCOR.SIZE+TMP.BLOCKSIZE) + LET NAME,BLOCK=SIXBIT(F),(-TMP.BLOCKSIZE<<18)+(SC.TMPCOR.SIZE-1)+S + LET REPLY=VALOF + $[ $HRLI AC,#2 + $HRRI AC,NAME + $TMPCOR AC,0 // TMP: READ AND DELETE INTO S + $SETZM AC + $] + SC.TMPNAME^S_F>>18 + UNLESS REPLY IOERROR(S,ERR.FINDTMP,ERR) + SC.FLAGS^S_(SC.TMPCOR.SIZE<<12)+1 + SC.READER^S_READTMP + SC.WRITER^S_sterr + SC.CLOSER^S_FCLOSETMP + SC.ERROR^S_ERR + SC.TMPBYTEP^S_(SELECTOR 7:0:(SC.TMPCOR.SIZE-1))+S // JUST BEFORE BUFFER + SC.TMPLIMIT^S_SC.TMPCOR.SIZE+REPLY+S // LAST WORD READ + RESULTIS S +$) + +AND READTMP(S,LVCH) BE +$( + !LVCH_VALOF + $[ + $HRRZ SCBREG,S + $ILDB AC,SC.TMPBYTEP(SCBREG) + $] + IF (SC.TMPWORD^S)>SC.TMPLIMIT^S THEN !LVCH_'*E' + // WORD IS THE RH OF BYTEP +$) + +AND FCLOSETMP(S) BE FREEVEC(S) +and CREATETMP(F,ERR) = VALOF +$( LET S=NEWVEC(SC.TMPCOR.SIZE+TMP.BLOCKSIZE) + IF NUMBARGS<2 THEN ERR_0 + SC.FLAGS^S_(SC.TMPCOR.SIZE<<12)+1 + SC.WRITER^S_WRITETMP + SC.READER^S_STERR + SC.CLOSER^S_CLOSETMP + SC.ERROR^S_ERR + SC.TMPNAME^S_F>>18 + SC.TMPBYTEP^S_(SELECTOR 7:0:(SC.TMPCOR.SIZE-1))+S + RESULTIS S +$) + +AND WRITETMP(S,C) BE +$( +$[ $MOVE SCBREG,S + $MOVE AC,C + $IDPB AC,SC.TMPBYTEP(SCBREG) +$] +$) + +AND CLOSETMP(S) BE +$( LET NAME,BLOCK,Z=SC.TMPNAME^S<<18,((S+(SC.TMPCOR.SIZE-1)-SC.TMPWORD^S)<<18)\/(S+(SC.TMPCOR.SIZE-1)),0 + FOR I=0 TO 4 WRITETMP(S,0) // CLEAR REST OF LAST WORD + UNLESS VALOF + $[ + $SETOM AC + $HRLI B,#3 + $HRRI B,NAME + $TMPCOR B,0 // TMPCOR WRITE + $SETZM AC + $] sterr() + FREEVEC(S) +$) +AND CLOSEA(R) BE +$( LET WD=SC.OWD^R + LET BUF=SC.OBUF^R+2 + SETSTS(R,#17) + WRDMP(R,IOWD(WD-BUF+1,BUF),0) + (SC.APPENDCL^R)(R) +$) +AND LOOKUP.ENTER(CH,FILESPEC)=LOOKUP(CH,FILESPEC)&ENTER(CH,FILESPEC) +AND DOFILE(DEV,FILE,EXT,PPN,ERROR,MODE,BUFFS,SELECT,RD,WR,CL)=VALOF +$( LET SIXDEV, date=DEV=0\/LH&&dev\=0\/(LH&&DEV=0&!DEV=0)->$6 "DSK",SIXBIT(DEV), valof $[ $date 1, 0 $] + and DEVCHR=VALOF + $[ $MOVE AC, SIXDEV + $DEVCHR AC, 0 + $] + and DEVSIZ=VALOF + $[ $MOVEI AC, B + $MOVE B, MODE + $MOVE C, SIXDEV + $DEVSIZ AC, 0 + $SETZ AC, 0 + $] + and scb,ch=?,? + IF MODE = 0 & (DEVCHR&ISTTY)\=0 THEN // INCHWL STREAM + $( LET TTYNAME=VALOF $[ $GETLIN AC, 0 $] + LET PHYSDEV=VALOF $[ $MOVE AC, SIXDEV + $DEVNAM AC, 0 + $TRN + $] + IF PHYSDEV=TTYNAME THEN RESULTIS TTY + $) + CH_FINDCHANNEL() + IF CH<0 THEN DOFILE..ERROR(0,ERR.NOCHANNEL,ERROR) + SCB_NEWVEC(SCBSIZE) + clearvec(scb,scbsize) + SC.STATUS^SCB, SC.DEV^SCB, SC.OBUFHDR^SCB, SC.IBUFHDR^SCB_ + MODE, SIXDEV, WR=0\/WR=sterr->0, SC.OBUF+SCB, RD=0\/RD=STERR->0, SC.IBUF+SCB + SC.CHANNEL!SCB_CH<<23 // ! TO CLEAR REST OF WORD + SC.COUNT^SCB_6 + SC.FILENAME^SCB_SIXBIT(FILE) + SC.EXT^SCB_LH&&SIXBIT(EXT) + SC.PPN^SCB_PPN + SC.FLAGS^SCB_B0+B35 + SC.MODE of scb_mode + IF DEVCHR\=!#74 & (DEVCHR & (1 << (BYTE 4:0)&&MODE)) = 0 DOFILE..ERROR(SCB,ERR.BADMODE,ERROR) + SC.READER^SCB_RD + SC.WRITER^SCB_WR + SC.CLOSER^SCB_CL + SC.IN^SCB_$IN<<27\/(CH<<23) + SC.OUT^SCB_$OUT<<27\/(CH<<23) + SC.STATZ^SCB_$STATZ<<27\/(CH<<23)+#740000 + SC.PROTECTION^SCB_#477 + SC.USETI^SCB_$USETI<<27\/(#36000003)+(CH<<23) // USETI CHANNEL,@3(P) + SC.USETO^SCB_$USETO<<27\/(#36000003)+(CH<<23) + SC.SIZE^SCB_SCBSIZE + SC.TIME^scb_valof $[ $mstime 1, 0 $]/60000 + date_((date-61)/372)*372+61 + SC.CREATEDATE^SCB_date + SC.HIDATE^SCB_(BYTE 3:12)&&date + SC.ERROR^SCB_ERROR + SC.OBUF!SCB_B0 // VIRGIN OUTPUT BUFFER RING (! TO CLEAR REST OF WORD) + SC.IBUF!SCB_B0 // DITTO INPUT + UNLESS HOPEN(CH,SC.STATUS+SCB) DO DOFILE..ERROR(SCB,ERR.NODEV,ERROR) + UNLESS SELECT(CH,SC.COUNT+SCB) DO DOFILE..ERROR(SCB,ERR.NOFILE,ERROR) + IF BUFFS <= 0 THEN BUFFS_LH&&DEVSIZ + IF (MODE) LE #14 THEN // MAKE THE BUFFER RINGS + $( UNLESS WR=STERR \/ WR=!#74 DO SC.OBUF^SCB_GETRING(OUTBUF,CH,BUFFS,RH&&DEVSIZ) + UNLESS RD=STERR \/ RD=!#74 DO SC.IBUF^SCB_GETRING(INBUF,CH,BUFFS,RH&&DEVSIZ) + $) + RESULTIS SCB +$) +AND GETRING(GETBUF, CHANNEL, NO, SIZE) =VALOF +$( LET T=JBFF + LET BUF=NEWVEC(SIZE*NO-1) + JBFF_BUF + GETBUF(CHANNEL,NO) + JBFF_T + RESULTIS BUF+1 +$) +AND CLOSEFILE(SCB) BE +$( LET CH=SC.CHANNEL^SCB + RELEASE(CH,0) + FREEBUFRING( SC.IBUF^SCB ) + FREEBUFRING( SC.OBUF^SCB ) + FREE( SCB ) +$) +AND FREEBUFRING(R) BE UNLESS R=!#74 DO +$( LET P,Q=R,R + $( IF P=N THEN + $( LET K = S-N + TEST K<4 THEN + $( LINK^Q_LINK^P + LINK^P_INTEGRITY + RESULTIS P+1 + $) OR + $( LET L = P+K + SIZE^P_K + SIZE^L_N + LINK^L_INTEGRITY + RESULTIS L+1 + $) + $) + Q_P + P ^_LINK + $) +// Expand the current region if necessary + $( LET D, ORIG, SIZ = NIL, NIL, NIL + AND Q = QUANTUM + TEST QUANTUM<0 THEN + $( D_-1 + SIZ_#1000*-QUANTUM + ORIG_#1000*(1+PAGE+QUANTUM) + $) OR + $( D_1 + ORIG_#1000*PAGE + SIZ_#1000*QUANTUM + $) + UNTIL Q=!#74 DO + $( UNLESS GETPAGE(PAGE) STOREERROR(S,ERR.NEWPAGE,@ORIGIN) + PAGE+_D + Q-_D + $) + SIZE^ORIG, LINK^ORIG_SIZ, 0 + LINK^ORIG_INTEGRITY + FREEVEC(ORIG+1) + RESULTIS NEWVEC(S) + $) +$) +AND FREEVEC(B) BE +$( LET P0, Q, P = B-1, @FREELIST, FREELIST + LET N = SIZE^P0 + UNLESS LINK^P0=INTEGRITY DO STOREERROR(B,ERR.FREEBAD,@ORIGIN) + UNTIL P=!#74\/P>P0 DO + $( Q_P + P_LINK^P + $) + TEST P0+N=P THEN + $( N+_SIZE^P + SIZE^P0, LINK^P0_N, LINK^P + $) OR SIZE^P0, LINK^P0_N, P + $( LET S = SIZE^Q + TEST Q+S=P0 THEN SIZE^Q, LINK^Q_S+N, LINK^P0 OR LINK^Q_P0 + $) +$) +AND GETPAGE(N) = VALOF TEST (N<<9) < SL THEN RESULTIS FALSE OR +$[ $MOVE B, !((1<<18)+C) + $MOVEI C, 1 + $MOVE D, N + $PAGE. B, 0 + $CAIN B, 3 //PAGE ALREADY EXISTS? + $JRST OK //THEN OK + $CAIE B, #12 //NO ROOM IN WORKING SET + $JRST FAIL //NO, THEN CANT HELP + $MOVE B, !((1<<18)+C) + $HRLI D, #200000 //TRY TO CREATE ON DISK + $PAGE. B, 0 + $CAIN B, 3 //PAGE EXISTS? + $JRST OK //YES, THEN OK +FAIL: $SETZ AC, 0 + $( return $) +OK: $MOVE AC, N + $LSH AC, 9 + $CAMGE AC, FL //LOWER THAN LAST FL? + $MOVEM AC, FL //YES, BECOMES NEW FL + $SETO AC, 0 +$] +AND STOREERROR(S,ERR,ATORIGIN) BE + outz($az"*C*L?MUDNFF - Newvec or Freevec failure.*C*L") <> FINISH +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 +$( LET FV=VEC 128 + UNPACKSTRING(FS,FV) + FV!(1+FV!0)_-1 + OV(OUTPUT,FV+1,@A) +$) +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 +$( LET FV=VEC 128 + UNPACKSTRING(FS,FV) + FV!(1+FV!0)_-1 + + OV(ST,FV+1,@A) +$) +and writesecs(str,t) be +$( let h, m, s=t/3600, (t rem 3600/60), t rem 60 + if h write(str," :N hr:S", h, h=1->"","s") + if m write(str," :N min:S",m, m=1->"","s") + if s write(str," :N sec:S",s, s=1->"","s") +$) +AND OV(STR,C,A)=VALOF +$( SWITCHON !C INTO + $( CASE -1: + RESULTIS A // END OF STRING + DEFAULT: + WRITECH(STR,!C); C+_1; LOOP + CASE ':': + C+_1 + SWITCHON !C INTO + $( CASE 'N': + CASE 'n': + WRITENO(STR,!A) + ENDCASE + CASE '8': + WRITE8(STR,!A) + ENDCASE + case '6': + there_!a + CASE 'F': + case 'f': + WRITE6(STR,!A) + ENDCASE + CASE 'S': + CASE 's': + WRITES(STR,!A) + ENDCASE + case 'P': + case 'p': + writename(str,!A) + endcase + case 'U': + case 'u': + writeuc(str,!a) + endcase + case 'r': + case 'R': + $( let t, r=tabs!(!a-1), random(LH of t)+1 + dscribe((r rem 2 -> RH, LH) from t!(r/2), comput) + $) + endcase + case 'i': + case 'I': + inventory(!A, 0) + endcase + case 'D': + case 'd': + writedate(str,!a) + endcase + case 'T': + case 't': + writetime(str,!a) + endcase + CASE 'C': + CASE 'c': + WRITECH(STR,!A) + ENDCASE + CASE 'Z': + CASE 'z': + WRITEZ(STR,!A) + ENDCASE + CASE 'G': + CASE 'g': + ENDCASE + CASE ':': + C+_1 + default 0 ... #177: + writech(str,':') + loop + $) + C+_1 + A+_1 + $) +$) REPEAT +AND WRITE8(S,N) BE +$( UNLESS 0<=N<=7 THEN WRITE8(S,n>>3) + WRITECH(S,(N&7)+'0') +$) +AND WRITENO(S,N) BE +$( IF N<0 THEN N_-N <> WRITECH(S, '-') + WRITEPN(S,N) +$) +AND WRITEPN(S,N) BE +$( IF N>9 THEN WRITEPN(S,(N/10)) + WRITECH(S,N REM 10 + '0') +$) +AND OUTS(S) BE +$( let p=selector 7:29:s + and n=valof $[ $LDB AC, p $] + for i=1 to n do writech(output,valof $[ $ILDB AC, p $]) +$) +AND WRITES(S,STR) BE +$( let p=selector 7:29:str + and n=valof $[ $LDB AC, P $] + for i=1 to n do writech(s,valof $[ $ILDB AC, p $]) +$) +AND WRITE6(S,N) BE +$( MANIFEST $( L6=BYTE 6:30 $) // LEFTMOST 6 BITS + UNTIL N=!#74 DO WRITECH(S,L6&&N+#40)<>N_N<<6 +$) +and writez(str,az,nocrlf) be unless detch() +if az then prompted_false<> +test str=tty/\logstr=!#74 /\ snoopedon=!#74 then +$[ $MOVE AC, az + $SKIPN 0(AC) + $( return $) + $OUTSTR 0(AC) + $setz 1, 0 + $skipn nocrlf + $skpinc + $( return $) + $outstr $az "*C*L" +$] or +$( let ptr=selector 7:36:az + writech(str,valof + $[ $ILDB AC, ptr + $SKIPN AC + $( return $) + $] ) repeat + if str=tty unless valof + $[ $setz 1, 0 + $skipn nocrlf + $skpinc + $seto 1, 0 + $] outs("*C*L") +$) +and writeudate() be +$( let when = (LH from ud.time())-(LH from LSTM of rec) + outz($az "Your last game was ") + test when ge 2 then Write(tty, ":N days ago.*C*L", when) or + $( Write(tty, ":Sday at ", when->"yester","to") + when_(RH from LSTM of rec)*24 + write(tty,":N::", when/#1000000) + when_(when rem #1000000)*60 + if when/#1000000 ls 10 Writech(tty,'0') + write(tty,":N::", when/#1000000) + when_(when rem #1000000)*60 + if when/#1000000 ls 10 Writech(tty,'0') + write(tty,":N.*C*L", when/#1000000) + $) +$) +AND RUN(D,F,E,PP,S) BE +$( LET T,U,V,W,X,Y,Z=?,?,?,?,?,?,? + SWITCHON NUMBARGS() INTO + $( CASE 1: F_D;D_$SIXBIT "SYS" + CASE 2: E_0 + CASE 3: PP_0 + CASE 4: S_0 + $) + T,U,V,W,X,Y,Z_SIXBIT(D),SIXBIT(F),SIXBIT(E),0,PP,0,0 + $[ $HRLI AC, 7(P) // LV T + $HRRI AC, #144 // JOBS LOWEST CORE+4 + $BLT AC, #152 // THE 7 WORD ARG BLOCK + $MOVS AC, CODEX // XWD #140,CODE + $BLT AC, #143 // MOVE THE CODE DOWN + $HRL PDL, S // STARTING OFFSET + $HRRI PDL, #144 + $MOVE AC, ONEONE + $JRST #140 +CODE: $CORE AC, 0 // REDUCE CORE + $HALT #141 + $RUN PDL, 0 // CALL THE PROGRAM + $HALT #143 +CODEX: $EXP #140, CODE +ONEONE: $EXP #1, #1 + $] +$) +AND SIXBIT(S) = VALOF +$[ $HLRZ AC, S + $JUMPE AC, STRSIX + $MOVE AC, S // ALREADY SIXBIT + $( return $) +STRSIX: $SETZ AC, 0 + $SKIPN 0, S + $( return $) + $MOVSI B, LH&&(BYTE 7:29) + $HRR B, S + $LDB C, B + $CAILE C, 6 + $MOVEI C, 6 + $HRLZI E, #600 +SIXL3: $SOSGE 0, C + $( return $) + $ILDB D, B + $CAIL D, #40 + $CAILE D, #137 + $JRST SIXL1 + $SUBI D, #40 +SIXL2: $IDPB D, E + $JRST SIXL3 +SIXL1: $CAIGE D, #140 + $MOVEI D, #100 + $SUBI D, #100 + $JRST SIXL2 +$] +AND LOOKUP(CH,ADDR)=IOUUO($LOOKUP,CH,ADDR) +AND ENTER(CH,ADDR)=IOUUO($ENTER,CH,ADDR) +AND HOPEN(CH,ADDR)=IOUUO($OPEN,CH,ADDR) +AND RELEASE(CH,ADDR)=IOUUO($RELEAS,CH,ADDR) +AND OUTBUF(CH,ADDR)=IOUUO($OUTBUF,CH,ADDR) +AND INBUF(CH,ADDR)=IOUUO($INBUF,CH,ADDR) +AND SETSTS(STREAM,VAL) = IOUUO($SETSTS,SC.CHANNEL^STREAM,VAL) +AND GETSTS(SCB) = VALOF +$[ $MOVE SCBREG, SCB + $MOVE B, SC.CHANNEL(SCBREG) + $IOR B, GWD + $XCT B + $( return $) +GWD: $GETSTS 0, AC +$] +AND USETI(STR,BL) = VALOF +$[ $MOVE SCBREG, STR + $XCT SC.USETI(SCBREG) +$] +AND USETO(STR,BL) = VALOF +$[ $MOVE SCBREG, STR + $XCT SC.USETO(SCBREG) +$] +and inuuo(str,addr)=not iouuo($in,SC.CHANNEL^str,numbargs()=1->0, addr) +and outuuo(str,addr)=not iouuo($out,SC.CHANNEL^str,numbargs()=1->0,addr) +and readch(stream,lvch,val) be +$( (SC.READER^stream)(stream,lvch) + if numbargs()=3 return + if logstr /\ bstr=!#74 then wrb(logstr,!lvch) + unless bstr checksnoop(!lvch) +$) +and outch(c) be writech(output,c) +and checksnoop(ch) be +$( ccnt_valof switchon ch into + $( case '*C': resultis 0 + case '*T': resultis (ccnt+8)-(ccnt rem 8) + case '*0' ... '*B': + case '*L' ... '*P': resultis ccnt + default '*0' ... '*D': resultis ccnt+1 //near enough... + $) + if firstsnoop + $( firstsnoop_false + checksnoop(SNOOPROMPT) + $) + if snoopedon then + $( !snoopbuffer+_1 + snoopbuffer!!snoopbuffer_ch + if !snoopbuffer=69 \/ linebreak(ch) then + $( for i=!#74 to 35 do if (1< 3 + $SETZM 0(AC) // FIRST WORD OF DEST'N STRING + $JUMPE 3, PSLP // BUT NO MORE! + $HRLI 4, 0(AC) + $HRRI 4, 1(AC) + $ADDI 3, #777777(4) + $BLT 4, 0(3) +PSLP: $MOVE 3, 5 +PSL: $IDPB 5, AC + $ADDI 2, 1 + $MOVE 5, 0(2) + $SOJGE 3, PSL + $MOVE AC, S// RESULTIS THE DESTINATION +$] +AND UNPACKSTRING(V,S) = VALOF +$[ $MOVSI AC, LH&&(BYTE 7:29) + $HRR AC, V + $LDB 3, AC + $MOVEM 3, @S //THE COUNT + $JUMPN 3, SOME + $MOVE AC, S // RESULT FOR .. + $( return $) // ZERO COUNT +SOME: $MOVN 3, 3 + $HRLZ 3, 3 + $HRR 3, S //-COUNT,,V +UL: $ILDB 4, AC + $MOVEM 4, 1(3) + $AOBJN 3, UL + $MOVE AC, S // RESULTIS THE DESTINATION +$] +AND IOUUO(FN,ACC,ADDR) = VALOF +$[ $SETOM 0, AC + $MOVE B, FN + $LSH B, 27 + $HRLZ C, ACC + $LSH C, 5 + $IOR B, C + $HRR B, ADDR + $XCT 0, B + $SETZM 0, AC // FALSE IF DIDN'T SKIP +$] +AND IOWD(N,BL) = VALOF +$[ $MOVE AC, BL + $SUBI AC, 1 + $MOVN B, N + $HRL AC, B +$] +AND ECHO() BE +$[ $SETO AC, 0 + $GETLCH AC + $TLZ AC, B15>>18 + $SETLCH AC +$] +AND NOECHO() BE +$[ $SETO AC, 0 + $GETLCH AC + $TLO AC, B15>>18 + $SETLCH AC +$] +AND WORDS(ST) = VALOF +$[ $SETZ AC, 0 + $MOVE SCBREG, ST + $SKIPGE WSC.FLAGS(SCBREG) + $MOVE AC, WSC.WORDS(SCBREG) + $JUMPGE AC, FIN + $HLRE AC, AC + $MOVN AC, AC +FIN: +$] +AND LABEL(LAB) = VALOF +$[ $MOVE AC, P + $SUBI AC, @0(T) + $HRL AC, AC + $HRR AC, LAB +$] +AND JUMP(LAB) BE +$[ $HRRZ AC, LAB + $HLRZ P, LAB + $JRST 0(AC) +$] +and resetgame()=valof +$( let str=? + unless supers + $( str_dofile(disc, mud6, $6"exe",mainta, label(rats),0,0,lookup, sterr,sterr, closefile) + if rename(str) supers_true + $) + Outs("*C*LEverything in the game has been reset to its starting state!*C*L") +rats: resultis supers +$) + +and initialise() be +$( lvmdoor_@message.door + chain_findtmp(callnm->callnm,$6"mud", label(notch)) +//dofile(disc,callnm->callnm,$6"mud",$6"tmp",0,label(notch),0,2,lookup,rda,sterr,closefile) + $( let ch,vect,str=?,newvec(2),vec 9 + readch(chain,@ch) + if ch ne '*^A' then abort() + readch(chain,@ch) + !str_0 + $( !str+_1 + str!!str_ch + readch(chain,@ch) + $) repeatwhile 'a' le ch le 'z' \/ !str=9 + unless ch=8\/ch=3 abort() + packstring(str,vect) + readno(chain, @str) + unless daytime-str ls TIMECHK \/ daytime+WHOLEDAY-str ls TIMECHK abort() + Readno(chain, @daytime) + readno(chain, @room) + readno(chain,@ps.word) + readno(chain,@oldscore) + room_find.room(room) + if room room_LH of room + logstr_ch=3->false,appendfile($6"dsk",vect,$6"log",ppn,label(prob)) + if false do +prob: logstr_false + chain_vect + $) + if false do +notch: chain_false + access() + profile_getmblock() + name_profile+14 + me_name + SENDER of profile,LINK of profile_player.no,0 + INFO of profile,PNAME of profile_player.bit,name + quitflg_1 + player.names!player.no_(profile<<18) bitor name + createprofile() + quitflg_true + unless room room_random(!stlist)!(stlist+1) //Select a random start. + oldroom_room + savescr_SCORE of profile + unless savescr savescr_-1 + CROOM of profile_room + JBNUM of profile_jobno + OPR of profile_privved + jobnos!player.no_jobno + unless chain write(tty, "*C*LHello:s, :p!*L*S*C*L", (games.played of profile)>1->" again","",name) + if YOULLBESORRY entered("joined") + room.been_newvec(max.room.no/36) + clearvec(room.been,max.room.no/36) + clearvec(fight,35) + objct_fake.node("that") + test us(me) \/ (A.HIDE bitand ATTRIB of room) then + for i=0 to 35 unless i=player.no + $( let them=player.names!i + unless them loop + them_LH from them + if A.SILENT bitand ATTRIB of CROOM of them loop + if us(PNAME of them) transmit(i,0,K.INH,GAMES.PLAYED of profile-1) + $) + or sendall(true,K.INH,false,true,GAMES.PLAYED of profile-1) + lvrdoor_room+DOOR + lvqdoor_queue.doors+player.no + lvqueue_queue+player.no + lvcarry_@carry + setbit() + unless WIZARD of profile cccnt_CCTRIP*10 + if maint Outz($az"^C trap is OFF*C*L")<>Ctrap() + unless BZK/\BERSERK of profile /\ demo + $( describe(room) + been.in(RNUMB of room)_true + $) + alive() + if BZK/\BERSERK of profile/\ demo + $( outz("*C*LSorry, there's a demonstration in progress, no berserkers.*C*L") + quit() + $) +$) +and been.in(num, val)=valof +$( let sel=selector 1:num rem 36:num/36 + test numbargs()=2 then sel of room.been_val //alternatively, define lhs()... + or resultis sel of room.been +$) +and readno(str,addr)=valof +$( let ch,neg=?,1 + !addr_0 + readch(str,@ch) + if ch='-' neg_-1<>readch(str,@ch) + while '0' le ch le '9' do + $( !addr_!addr*10-'0'+ch + readch(str,@ch) + $) + !addr*_neg + resultis !addr +$) +and abort() be +$( outz($az"*C*LSomething suspicious here...*C*L") + finish +$) +and entered(s) be if YOULLBESORRY //all these YOULLBESORRY's to cut down code compiled +$( let ap, ch, tmpfil=?, ?, ? + ap_appendfile(DISC, mud6, $6"log", MPPN, label(wot)) + $( LET S = SIXBIT("idm")>>18 + LET JOBNO = VALOF $[ $PJOB AC, 0 $] + (BYTE 6:30)&&S,(BYTE 6:24)&&S,(BYTE 6:18)&&S := + JOBNO/100+('0'-#40),(JOBNO/10)REM 10+('0'-#40),JOBNO REM 10+('0'-#40) + tmpfil_dofile(DISC,s,$6"tmp",0,label(try1),0,2,lookup,rda,sterr,closefile) + if false +try1: tmpfil_dofile(DISC,s,$6"tmp",0,label(try2),0,2,lookup,rda,sterr,closefile) + if false +try2: tmpfil_false + $) + if tmpfil + $( for i=1 to 8 + $( Readch(tmpfil, @ch) + Writech(ap, ch) + $) + writech(ap,'*T') + Close(tmpfil) + $) + write(ap,"[:8,:8]*T:D*T:T*T:P :S :6, pts=:N.*C*L", + LH from ppn, RH from PPN, + valof $[ $date ac, 0, $], + valof $[ $mstime ac, 0 $], + me, s, mud6, + STAMINA of profile le 0 -> -1,SCORE of profile) + close(ap) +wot: +$) +and load.data() be +$( let play=false + magic_true + ctrap() + $( for i=!#74 to 35 do if player.names!i then play_true<>break + unless play break + play_false + outz($az"*C*Lsomeone playing...") + hibernate() + $) repeat + outz($az"*C*LLoading database from MUD.DMP") + input_dofile($6"all",$6"mud",$6"dmp",0,0,#14,2,lookup,rdb,sterr,closefile) + for i=startloc to @free.space do readch(input,i) + $[ $hrlz 1, free.space + $core 1, 0 + $trna + $jrst ok + $outstr $az"*C*LMUDCGC - cannot get core.*C*L" + $( finish $) +ok: $] + for i=@free.space+1 to free.space-1 do readch(input, i) + close(input) + low1_TOOLOW + low2_BITLOW + $[ $MOVE AC, MUD6 + $SETNAM AC, 0 + $] + ctrap() + outz($az"*C*L") + $[ $clrbfi $] + forcetty($AZ "ssa*C*L") + magic_false + finish +$) +and readusername(nme, numsok) be +$( /* + Reads in a player's pseudonym. Any character outside the range 'a' to 'z' + or 'A' to 'Z' ends the name. + */ + let n,ch,linev,myname=!#74,?,vec NAMELENGTH, vec 2 + wait.for.input() + readch(input,@ch) + while 'a'<=(ch bitor #40)<='z' \/ (numbargs()=2/\'0' le ch le '9') do // While in the desired range + $( n+:1 // Increment count + unless n>NAMELENGTH linev!n_'A'<=ch<='Z'->ch+#40,ch // Put it in + readch(input,@ch) // Read another one + $) + !linev_n>NAMELENGTH->NAMELENGTH,n // Insert the count + packstring(linev,nme) + test ch='-' then + $( $( chcnt+_1 + readch(tty,linebuffer+chcnt) + $) repeatuntil linebreak(linebuffer!chcnt)\/chcnt=BUFLENGTH + !linebuffer_chcnt + if chcnt=BUFLENGTH then until linebreak(linebuffer!chcnt) readch(tty,linebuffer+BUFLENGTH) + unless linebuffer!(chcnt-1)='*C' writech(tty,'*C') //so always get one on buffer full + unless linebuffer!chcnt='*L' writech(tty,'*L') + nextch_linebuffer + $) or until eol(ch) readch(input,@ch) + if ESSEX unless maint if !nme=!"gail" then !nme_!"gali" + if !nme break + outz($az"*C*L**") +$) repeat +and eol(ch)='*L'<=ch<='*P'\/ch='*$'\/ch='*^G' +and us(name)=valof +$( let nm0, nm1=?, ? + lH from name_0 + nm0_!name>>1 + nm1_(LENGTH of name gr 4)-> 1!name>>1, 0 + resultis ((nm0=!"richard">>1)/\(nm1=1!"richard">>1))\/ + (nm0=!"roy">>1)\/ + ((nm0=!"brian">>1)/\(nm1=1!"brian">>1))\/ + ((nm0=!"ronan">>1)/\(nm1=1!"ronan">>1))\/ + ((nm0=!"friday">>1)/\(nm1=1!"friday">>1))\/ + (nm0=!"yawn">>1)\/ + ((nm0=!"debugger">>1)/\(nm1=1!"debugger">>1))\/ OTHERS /\ + ( ((nm0=!"archone">>1)/\(nm1=1!"archone">>1))\/ + ((nm0=!"archtwo">>1)/\(nm1=1!"archtwo">>1))\/ + ((nm0=!"archthree">>1)/\(nm1=1!"archthree">>1))\/ + ((nm0=!"archfour">>1)/\(nm1=1!"archfour">>1))\/ + ((nm0=!"archfive">>1)/\(nm1=1!"archfive">>1))\/ + (nm0=!"muse">>1) + ) +$) +and createprofile() be +$( let nm=? + test chain then + $( !name_!chain + if ESSEX if us(name)/\ maint=0 outz($az"charlatan!*C*L")<>finish + 1!name_1!chain + free(chain) + $) or + $( outz($az"Welcome! By what name shall I call you?") + $( outz($az"*C*L**") + readusername(name) + $) repeatuntil LENGTH of name + $) + checkname(name) + quitflg_false + perput_dofile($6"all",ps6,$6".pm",MAINTA,label(drat),#17,1,lookup,rdb,wrb,closefile) + assign() + $( searchrec(name) + deassign() + close(perput) + if rec + $( rec_(rec rem WDSPERBUF)+dmpbuf + quitflg_1 + test PSWD of rec then + $( let c=? + unless chain + $( outz($az"*C*LThis persona already exists - what's the password?*C*L**") + setpswd() + $) + c_ps.word + for i=!#74 to 12 c_ (c>>1) #* 11.0 + unless c=787512805 + unless (!name=!"richard" & 1!name=1!"richard" -> valof + $( let c=@name<<17 + for i=!#74 to 23 do c_(c>>3)*7 + ps.word_c>>7 + resultis c=-188321 + $), false) + unless ps.word=PSWD of rec + $( outz($az"*C*LNo!*C*L") + giveback() + $) + unless chain outz($az"*C*Yes!*C*L") + $) or + $( out("*C*LNo password on this persona - give me one of up to :N letters, please.*C*L**", NAMELENGTH) + setpswd() + $) + STATES of profile_WIZD of rec + unless ISWIZ of profile ne 0/\ps.word WIZARD of profile_false + if us(name) WIZARD of profile_true<>maint_true + brief_BREEF of profile->-1,0 + SCORE of profile_SCRE of rec + unless chain oldscore_SCRE of rec + STRENGTH of profile_rationalise(STRN of rec) + DEXTERITY of profile_rationalise(DXTY of rec) + STAMINA of profile_rationalise(STNA of rec) + GAMES.PLAYED of profile_chain->GAMES of rec, valof + $( let g=(GAMES of rec)+1 + GAMES.PLAYED of profile_g + test g=10 then outz($az"*C*LWell done! You've managed 10 games so far without getting killed!*C*L") + or test g=100 then outz($az"*C*LCongratulations! Your 100th game!*C*L") + or test g=1000 Outz($az "*C*LAmazing! This is your 1000th game! What dedication!*C*L") + or if g=10000 Outz($az"*C*LYes, you DO get a message congratulating you on your 10000th game!*C*L") + resultis g + $) + STAMINAMAX of profile_STMX of rec + nm_ud.time()-(LSTM of rec) + STAMINA of profile+_(nm/182) + unless 0BERSERKMAX, 100 + resultis val>max -> max, val<1 -> 1, val +$) +and setpswd() be +$( let nme=vec 1 + noecho() + !nme, 1!nme_0, 0 + readusername(nme,true) + echo() + ps.word_encrypt(nme) +$) +and encrypt(nam)= valof +$( let temp=!nam+(LENGTH of nam>4 -> 1!nam,0) + temp_(temp rem ((1<<20)-1))*(temp rem ((1<<25)-1)) + resultis temp +$) +and newpersona(name) be +$( outz($az"Creating new persona:*C*L") //bit inconsistant these $az's... + for i=!#74 to valof $[ $MSTIME AC, 0 $]/54321 do ran() // Bump RAN() + SCORE of profile,GAMES.PLAYED of profile_0,1 // Obviously + STRENGTH of profile _ crechar() // Create STRENGTH characteristic + DEXTERITY of profile _ crechar() // Create DEXTERITY ditto + STAMINA of profile _ crechar() // Create STAMINA ditto + STAMINAMAX of profile_STAMINA of profile //Max. stamina + SEX of profile_get.sex(name) //Wish i could... + ASLEEP of profile_0 //Start off awake... + if SEX of profile sexify(1) +$) +and checkname(name) be unless us(name) //allow 2 of us lot on... +$( let old.one=player.names!player.no + jar(@name.door) + player.names!player.no_0 + while (find.word(name)\=!#74)\/(find.player(name)\=-1)\/(LENGTH of name = 0) do + $( test(find.player(name)=-1) then out("I can't call you :p, try a different name.*C*L**",name) + or out("I can't call you the same name as :p, try a different one*C*L**",name) + unjar(@name.door) + readusername(name) + jar(@name.door) + $) + player.names!player.no_old.one + unjar(@name.door) +$) +and writeprofile(chaining) be +$( if YOULLBESORRY entered("left") + unless chaining + if oldscore ls EXP.STEP*(1<<(MAX.LEVEL-1))le SCORE of profile/\STAMINA of profile gr 0 + $( write(tty,"Your level of experience is now :p*C*L",(SEX of profile->female,male)!(MAX.LEVEL)) + test BZK/\BERSERK of profile then + $( STRENGTH of profile_BERSERKMAX + Write(tty,"Since you're berserk, I can't put you into :s mode. If*C*L", (SEX of profile -> female, male)!max.level) + Write(tty, "it's any consolation, your max. strength is now :n.*C*L", BERSERKMAX) + $) or + $( ISWIZ of profile_true + 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 + $) + $[ $clrbfi $] + $) + test (ATTED of profile=0) /\ + seq(me, "glai")=0 /\ seq(me, "gali")=0 /\ + ( (GAMES.PLAYED of profile gr 1)\/ + savedp\/ + ( (STAMINA of profile gr 0)/\ + ( chaining ne 0 \/ + (SCORE of profile) ne 0 + ) + ) + ) then //hmm... + $( if false +curses: test SCORE of profile ge oldscore /\ STAMINA of profile gr 0 then + $( writes(tty,"*C*LSomeone is accessing the persona file. To quit without updating*C*L") + writes(tty,"your persona, hit Q. To try again, hit something else.*C*L") + if valof + $[ $clrbfi + $inchrw 1 + $clrbfi + $trz 1, '*S' + $caie 1, 'Q' + $setz 1, 0 + $] + $( outz($az"*C*LNot updating persona.*C*L") + output_tty + return + $) + $) or + $( cccnt+_CCTRIP*10000 + writes(tty,"*L*S*C*LSomeone is accessing the persona file. Since you have less points than*C*L") + writes(tty,"you started with, I have to update your persona so I'll keep on trying...*C*L") + $[ $movei 1, 2 + $sleep 1, 0 + $] + $) + perput_dofile($6"all",ps6,$6".pm",MAINTA,label(curses),#17,1,lookup.enter,rdb,wrb,closefile) + assign() + useti(perput,1) + (STAMINA of profile le 0 ->deleterec,saverec)(profile+14) + deassign() + close(perput) + $) or outz($az"*C*LNot updating persona.*C*L") + output_tty +$) +and load.block(stream,block) be +$( if stream=laststream /\ block=lastblock return + useti(stream,block) + inuuo(stream,cbl) + laststream_stream + lastblock_block +$) +and save.block(block) be +$( let blk=numbargs()->block,lastblock + useto(laststream,blk) + outuuo(laststream,cbl) +$) +and searchrec(nam) = valof +$( let pnt,lrec,str=?,0,vec 1 + !str_!nam + 1!str_LENGTH of nam>4 -> 1!nam, 0 + load.block(perput,1) + lrec_hashval(str) + rec_dmpbuf!lrec + while rec + $( load.block(perput,rec/WDSPERBUF+1) + pnt_(rec rem WDSPERBUF)+dmpbuf + if seq(str,2+pnt) break + lrec_rec + rec_POINTR of pnt + $) + resultis lrec +$) +and saverec(nam) = valof +$( searchrec(nam) + unless rec addrec(nam) + if rec test SCRE of (rec rem WDSPERBUF+dmpbuf) >= savescr then //In case addrec hasn't added them. + $( load.block(perput,rec/WDSPERBUF+1) + dumpersona(rec rem WDSPERBUF+dmpbuf) + save.block() + $) or + $( outs("Your score seems to have changed without my noticing.*C*L") + rec_0 + $) + resultis rec //return a value to indicate whether you've been saved. +$) +and deleterec(nam) be +$( let olrec,odel,lrec=?,?,searchrec(nam) + and pnt=rec rem WDSPERBUF+dmpbuf + unless rec return //Can't find record + //Ok, this may look a little long-winded + load.block(perput,rec/WDSPERBUF+1) //but it's worth it not to corrupt the persona file in case of a crash + WRD1 of pnt_0 + WRD2 of pnt_0 //Zero names for purges etc. + GAMES of pnt_0 //Yawn thinks we need this, too! (WE DO! - Yawn xx) + olrec_!pnt + save.block() + + load.block(perput,lrec/WDSPERBUF+1) + dmpbuf!(lrec rem WDSPERBUF)_olrec //Old pointer to rec now points to old pointer of rec. + save.block() + + load.block(perput,1) //Get the deleted record pointer + odel_DEL of dmpbuf + save.block() + + load.block(perput,rec/WDSPERBUF+1) //And plonk it in the record to be deleted + !pnt_odel //Does anyone read all these comments? + save.block() //Richard does! + + load.block(perput,1) //Finally update the deleted record pointer to point to the newly deleted record! + DEL of dmpbuf_rec + save.block() +$) +and addrec(nam) be +$( let hashcont,olrec=?,? + if GAMES.PLAYED of profile>1 outs("*C*LHow can you have no persona AND have played before?!*C*L")<>rec_0<>return + load.block(perput,1) + rec_DEL of dmpbuf + test rec then + $( load.block(perput,rec/WDSPERBUF+1) + olrec_POINTR of (rec rem WDSPERBUF+dmpbuf) + save.block() + $) or + $( rec_FLEN of dmpbuf + unless rec //No persona file exists. + $( rec_2*WDSPERBUF + FLEN of dmpbuf_rec //Create hash table + $) + olrec_0 //No deleted records + FLEN of dmpbuf+_RECLENGTH + save.block() + $) + load.block(perput,1) + DEL of dmpbuf_olrec + hashcont_dmpbuf!hashval(nam) + save.block() + + load.block(perput,rec/WDSPERBUF+1) + POINTR of (dmpbuf+rec rem WDSPERBUF)_hashcont + save.block() + + load.block(perput,1) + dmpbuf!hashval(nam)_rec + save.block() +$) +and hashval(nam) = ((!nam+1!nam)>>1) rem 253 +and dumpersona(place) be +$( BREEF of profile_brief>>1 + place!2_profile!14 + place!3_profile!15 + GAMES of place_GAMES.PLAYED of profile + SCRE of place_SCORE of profile + STRN of place_STRENGTH of profile + DXTY of place_DEXTERITY of profile + STNA of place_STAMINA of profile + STMX of place_STAMINAMAX of profile + LSTM of place_ud.time() + if GAMES.PLAYED of profile=1 then PN of place_peen + WIZD of place_(STATES of profile) + unless WIZARD of profile WIZD of place bitand_NOTINVIS + PSWD of place_ps.word +$) +and realwiz(nam)=valof +$( let wizstr, ch, initptr, len= + ?, ?, selector 7:29:nam, (selector 7:29:0) of nam + wizstr_dofile(disc, ps6, $6"wiz", mainta, label(wah), 0, 2, lookup, rda, sterr, closefile) + readch(wizstr, @ch, true) + while ch ne '*E' + $( let ptr, count, nextch=initptr, 0, valof + $[ $ildb 1, ptr $] + while ch=nextch/\count le len + $( readch(wizstr, @ch, true) + nextch_valof + $[ $ildb 1, ptr $] + count+_1 + $) + if count=len/\ch='*C' + $( close(wizstr) + resultis true + $) + until ch='*L' readch(wizstr, @ch, true) + readch(wizstr, @ch, true) + $) + close(wizstr) +if false +wah: Outs("*C*LCan't access the WIZ file - try again?*C*L") + resultis false +$) +and get.sex(name)=valof +$( let ch=? + if us(name) resultis false + outz($az"*C*LWhat sex do you wish to be?*C*L**") + $[ $clrbfi + $inchrw ch + $clrbfi + $] + if ch='m' \/ ch='M' + $( unless ESSEX outz($az"*C*LM") + outz($az"ale*C*LOK*C*L") + resultis false + $) + if ch='f' \/ ch='F' + $( unless ESSEX outz($az"*C*LF") + outz($az"emale*C*LOK*C*L") + resultis true + $) + if ch='h' \/ ch='H' + $( unless ESSEX outz("*C*LH") + outz($az"elp*C*LI have to know what sex you want to be so I can get the terms right*C*L") + outz($az"eg hero/heroine, witch/wizard") + loop + $) + outz($az"*C*LEh? M for male, F for female") +$) repeat +and boost(facet) be unless facet of profile ge 100 facet of profile_ + facet of profile ge 100-BOOSTEP->100, facet of profile+BOOSTEP +and unboost(facet) be facet of profile_ + facet of profile le BOOSTEP->facet of profile, + facet of profile le 2*BOOSTEP->BOOSTEP, facet of profile-BOOSTEP +and sexify(gender) be +$( let s,d,c,sm=STRENGTH of profile,DEXTERITY of profile, STAMINA of profile,STAMINAMAX of profile + test gender then + $( unless s ge 100 STRENGTH of profile_s le 20 ->10, s-10 + unless d ge 100 DEXTERITY of profile_d ge 95->100, d+5 + unless c ge 100 STAMINA of profile_c ge 95->100, c+5 + unless sm ge 100 STAMINAMAX of profile_sm ge 95->100,sm+5 + $) or + $( unless s ge 100 STRENGTH of profile_s ge 90->100, s+10 + unless d ge 100 DEXTERITY of profile_d le 15->10, d-5 + unless c ge 100 STAMINA of profile_c le 6->1, c-5 //keep alive if in a fight + unless sm ge 100 STAMINAMAX of profile_sm le 15->10,sm-5 + $) +$) + +and writeuc(s,nm) be +$( let nmv=vec 127 + unpackstring(nm,nmv) + if 'a' le 1!nmv le 'z' 1!nmv-_#40 + for i=1 to !nmv writech(s,nmv!i) +$) +and writename(s,nm) be +$( let nmv,wflg,prof=vec 127,?,? + if nm=0 writes(s,"Someone")<>return + wflg_find.player(nm) + if blind & wflg ge 0 writes(s,"Someone")<>return // \wflg if you like + unless wflg=-1 + $( nm_player.names!wflg + prof_LH from nm + if invisible(prof) writes(s,"Someone")<>return + $) + unpackstring(nm,nmv) + if 'a' le 1!nmv le 'z' 1!nmv-:#40 + for i=1 to !nmv do writech(s,nmv!i) + if wflg=-1 return + unless hidden(wflg)\/wflg=player.no + $( (SEX of prof->her,him)_nm + them_nm + $) + test WIZARD of prof then write(s, " the :s:s",us(nm)->"arch-","", (SEX of prof->female, male)!MAX.LEVEL) or + $( nmv_SCORE of prof + for i=!#74 to MAX.LEVEL do if nmv ls exp.step*(1<"berserker ","", + i=MAX.LEVEL->"mortal ", "",(SEX of prof->female, male)!i) + break + $) + $) + if OPR of prof Writes(s, " opr") +$) +and startrap() be +$[ $MOVEI AC, restart + $MOVEM AC, jbsa + $MOVEM AC, jbren + $( return $) +restart:$( outz($az"Restarting...") + run("all",hsname,0,hsppn,0) + $) +$] +and setbit() be +$[ $( lock(lvrdoor) $) + $MOVE AC, room + $MOVE B, player.bit + $OR B, WHO(AC) + $MOVEM B, who.copy + $MOVEM B, WHO(AC) + $JSP T, @unlock + $SUBI P, 2 +$] +and unsetbit() be +$[ $( lock(lvrdoor) $) + $MOVE AC, room + $MOVE B, WHO(AC) + $TDZ B, player.bit + $MOVEM B, WHO(AC) + $JSP T, @unlock + $SUBI P, 2 +$] +and ud.time()=valof +$[ $hrli ac, #53 + $hrri ac, #11 + $gettab ac, 0 + $trn +$] +and timeok(low)=demo\/valof +$( let day=(LH from ud.time()) rem 7 + and time=(valof $[ $mstime 1, 0 $])/3600000 + day_times!day //day!_times? + while day/\FTIME of day ge time + $( if STIME of day le time ls FTIME of day resultis ~overload(numbargs()->low, low1) + day of_LINK + $) + resultis false +$) +and overload(low)=ESSEX/\LOADCHK/\valof +$[ $hrli 2, #54 + $hrri 2, #11 + $gettab 2, 0 + $jrst huh + $hrli 1, #50 + $hrri 1, #11 + $gettab 1, 0 + $jrst huh + $sub 1, 2 + $camle 1, low +huh: $tdza 1, 1 + $seto 1, 0 +$] +and access() be +$( let lab=? + unless maint\/timeok(low2) //incorporate maint into timeok()? + $( let day=? + out("*C*L:6 isn't available at the moment", mud6) + if overload(low2) + $( outz($az" - the computer is becoming overloaded.*C*LTry again later.*C*L") + finish + $) + day_(LH from ud.time()) rem 7 + for i=(valof $[ $mstime 1, 0 $])/3600000+1 to 24 + $( let check=times!day + while check/\FTIME of check ge i + $( if STIME of check le i ls FTIME of check + out(" - next time you can play is at :C:N00hrs*C*L", + i<10->'0','*0',i)<>finish + check of_LINK + $) + $) + outz($az". Try again tomorrow?*C*L") + finish + $) + unless chain if privved + $( outz($az"You shouldn't run MUD privileged!*C*L") + unless random(200) + $[ $sleep 13, 0 + $outstr $az "Well there goes ACCT.SYS!*C*L" + $] + $) + lab_label(nodisc) + unless maint do + $( if batch outz(strtab!5)<>finish + if magic outz(strtab!7)<>finish + if locked outz(strtab!9)<>finish + if micstatus outz($az"*C*LYou can't run me under MIC!*C*L")<>finish +// if ESSEX/\guest unless peen=GUESTPN outz($az"*C*LYou're on the wrong PPN, chum!*C*L")<>finish + $) + if ccl/\maint then load.data() + unless index test maint then load.data() + or outz(strtab!7)<>finish + quitflg_false + !cbl_(-BUFFERS<<18)bitor(dmpbuf-1) + 1!cbl_0 + roomput_true + roomput_dofile(DISC,mud6,$6".rm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile) + textput_true + textput_dofile(DISC,mud6,$6".tm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile) + objput_true + objput_dofile(DISC,mud6,$6".om",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile) + comput_true + comput_dofile(DISC,mud6,$6".cm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile) + mapput_true + mapput_dofile(DISC,mud6,$6".mm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile) + perput_true + cmndput_true + cmndput_dofile(DISC,mud6,$6".gm",MAINTA,lab,#17,1,lookup,rdb,sterr,closefile) + if false + $( +whoops: unless maint/\first jump(lab) + first_false + perput_dofile($6"all",ps6,$6".pm",mainta,label(huh),#17,1,enter,sterr,wrb,closefile) + assign() + useto(perput,2) + clearvec(dmpbuf, BUFFERS) + outuuo(perput, cbl) + deassign() + close(perput) + if false +huh: jump(lab) + $) + perput_dofile($6"all",ps6,$6".pm",MAINTA,label(whoops),#17,1,lookup,rdb,wrb,closefile) + close(perput) + unless hsname=mud6 write(tty,"Wrong name for :F!*C*L",mud6)<>finish + startrap() + unless chain + $( out("*L *C*L:SMulti-User Dungeon.*L *C*LThis :s created:: :D at :T*C*L", + BOASTNAME->"ESSEX UNIVERSITY: ","",MUDNAM->@MUDNAM,"Dungeon",date,time) + out("Origin of version:: :T", rdate) + if rhours + $( out(".*C*LAccumulated game time::") + writesecs(tty,rhours) //hmm, lousy name! + $) + out(".*C*L") + $) + lock(@inidr) + if player>=35 then + $( outz($az"*C*LIt looks as if you are too late for this game mate! I'll reset one for you.") + unlock() + resetgame() + finish + $) + player+:1 + player.no_plynum!player + $( let r, oldseln, oldr4=randoms, 0, 0 + while r + $( let sel1, dest, sel2, roomlist=1!r, 2!r, 3!r, RH from 4!r + test r!4=oldr4 then roomlist_oldseln or + $( for i=1 to random(LH from r!4) roomlist_LINK of roomlist + roomlist_LH of roomlist + oldseln, oldr4_roomlist, r!4 + $) + test sel2 then unless firsttime + $( sel1 of dest_sel2 of roomlist + sel2 of roomlist_dest + $) or sel1 of dest_roomlist + r_LINK of r //won't let me do r of_LINK + $) + $) + unless firsttime while randirs + $( $( let rd1, ptr=randirs+1, RH of rd1 + for i=1 to random(LH of rd1) ptr_RH of ptr + LH of LH of randirs_LH of ptr + $) + randirs_RH of randirs + $) + firsttime_true + unlock() + player.bit_1<ps6,mud6,perput->$6".pm",mapput->$6".mm", + comput->$6".cm",objput->$6".om",textput->$6".tm", + cmndput->$6".gm",$6".rm", + LH from mainta, RH from mainta) or + outz($az"You are stood in a void and shapeless world, which has not yet been*C*Lcreated. Please try again later.") + finish +$) +and get.cmnd(num,fast.action)=valof +$( let block=num/WDSPERBUF+1 + unless num resultis 0 + if fast.action resultis num //Action stored in core. + unless laststream=cmndput /\ block=lastblock + $( useti(cmndput, block) + inuuo(cmndput, cbl) + laststream_cmndput + lastblock_block + $) + num_dmpbuf+(num rem WDSPERBUF) + for i=0 to DRSIZE i!cmndbuf_i!num //In case dmpbuf gets altered by the command + resultis cmndbuf +$) +and delete(s) be +$( let v=vec 3 + for i=0 to 3 v!i_0 + iouuo($rename,sc.channel^s,v) + close(s) +$) +and rename(s)=valof +$( let v, res=vec 3, ? + !v_WSC.FILENAME!s + 1!v_WSC.EXTWORD!s + 2!v_WSC.TIMEDATE!s + 3!v_WSC.PPN!s + res_iouuo($rename,sc.channel^s,v) + close(s) + resultis res +$) +and seq(s1,s2)=valof +$( for i=!#74 to (LENGTH of s1)/5 do if (s1!i>>1) ne (s2!i>>1) resultis false + resultis true +$) +and random(n)=valof //gives random no. between 0 and n-1 +$( let m=fixd(ran()#*floatd(n)) + resultis m>=n->n-1,m +$) +/* LOCK and JAR have been improved by Alan Grieg, incorporating the + 'first part done' stuff. It can still deadlock though, just not so + likely... I'm not sure WHY it works, I thought AOSN was non-interruptable, + but it seems to! Also a bug spotted by Ronan Flood - ta' Rho! +*/ +and lock(lvdr) be +$[ $SETZ B, 0 + $move c, player + $aosg c + $movei c, 1 + $imul c, napct + $MOVE AC, lvdr + $MOVEM AC, lastdr + $AOS lockflg + $SKIP 0(AC) //ensure we're swapped in for this page +L1: $jfcl #17, L2 +L2: $AOSN 0(AC) + $( return $) + $jcry0 L3 + $SLEEP B, 0 + $caml c 0(ac) + $JRST L1 + $setzm JBINT + $move c, magic + $jumpn c, l5 + $setom magic + $( resetgame() //doesn't matter if get 2 of these... + $) +l5: $( outs("*C*LSomething unexpected has happened magically...*C*L") + writeprofile(false) + $) + $exit 1, 0 +L3: $setom 0(ac) + $jrst L1 +$] +and jar(lvdr) be +$[ $setz b, 0 + $move c, player + $aosg c + $movei c, 1 + $imul c, napct + $move ac, lvdr + $aos lockflg + $SKIP 0(AC) //ensure we're swapped in for this page +l1: $jfcl #17, l2 +l2: $aosn 0(ac) + $jrst l4 + $jcry0 l3 + $sleep b, 0 + $caml c, 0(ac) + $jrst l1 + $setzm jbint + $move c, magic + $jumpn c, l5 + $setom magic + $( resetgame() + $) +l5: $( outs("*C*LSomething evil has happened unexpectedly...*C*L") + writeprofile(false) + $) + $exit 1, 0 +l3: $setom 0(ac) + $jrst l1 +l4: $trn +$] +and unjar(lvdr) be +$[ $setom @lvdr + $sos lockflg +$] +and unlock() be +$[ $SETOM @lastdr + $SETZM lastdr + $sos lockflg +$] +and read.line() be +$( let cha=valof //take this out the instant they make skpinl work properly! (^C's mucked up) + $[ $( if ESSEX + $[ $jrst testch + $] + $) + $skpinl //skip if there is an input line + $trna +testch: $inchrs ac + $( return $) + $movem 13, chcnt + $] + if logstr/\bstr=!#74 wrb(logstr,cha) + unless bstr checksnoop(cha) + linebuffer!chcnt_cha + unless linebreak(cha) + $( $( chcnt+_1 + readch(tty,linebuffer+chcnt) + $) repeatuntil linebreak(linebuffer!chcnt)\/chcnt=BUFLENGTH + !linebuffer_chcnt + if chcnt=BUFLENGTH then until linebreak(linebuffer!chcnt) readch(tty,linebuffer+BUFLENGTH) + $) + unless linebuffer!(chcnt-1)='*C' writech(tty,'*C') //so always get one on buffer full + unless linebuffer!chcnt='*L' writech(tty,'*L') + nextch_linebuffer +$) +and getch()=valof +$( let ch=valof + $( if chcnt<=0\/nextch-linebuffer=BUFLENGTH+1 resultis '*L' + chcnt,nextch+:-1,1 + resultis !nextch + $) + resultis ch +$) +and linebreak(ch)=valof +$[ $SETO AC, 0 + $MOVE B, ch + $CAIG B, '*P' + $CAIGE B, '*L' + $TRNA + $( return $) + $CAIE B, '*$' + $CAIN B, '*E' + $( return $) + $CAIN B, '*^G' + $( return $) + $SETZ AC, 0 +$] +and unlink(lvlist)=valof +$( let node=LINK of lvlist + if node LINK of lvlist_LINK of node + resultis node +$) +and hibernate()=valof +$[ $MOVE AC, hibflg + $HIBER AC, 0 + $TRN + $SKPINL + $SETZ AC, 0 +$] +and wait.for.input() be +$[ $MOVE AC, hibflg +l1: $SKPINL + $TRNA + $( return $) + $HIBER AC, 0 + $TRN + $JRST l1 +$] +and ran()=valof +$[ $MOVE AC, !630360016 //14**29 (MOD 2^31 - 1) + $MUL AC, ranseed + $ASHC AC, 4 + $LSH B, -4 + $ADD AC, B + $TLZE AC, #760000 + $ADDI AC, 1 + $MOVEM AC, ranseed + $HLRZ B, AC + $FSC B, #216 + $HRLI AC, AC + $FSC AC, #174 + $FAD AC, B +$] +and crechar()=valof +$( let sum=0 + for i=0 to 4 do sum+:random(20) //5d20+5 + resultis sum ge 90 -> 100, sum+10 +$) +and writetime(s,t) be +$( let h,m,c=?,?,? + if numbargs()<2 t_valof $[ $MSTIME AC, 0 $] + h,m,c_t/3600000,(t REM 3600000)/60000,(t REM 60000)/1000 + if h<10 writech(s,'0'); writeno(s,h); writech(s,':') + if m<10 writech(s,'0'); writeno(s,m); writech(s,':') + if c<10 writech(s,'0'); writeno(s,c) +$) +and writedate(s,d) be +$( let dy,mn,yr,rd=?,?,?,? + if numbargs()<2 d_valof $[ $DATE AC, 0 $] + dy,mn,yr_(d rem 31)+1,(d/31) rem 12,(d/372)+1964 + rd_dy rem 10 + 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) +$) +and outz(msg,nocrlf) be writez(output,msg,numbargs()=2/\nocrlf) //used to have the if msg test here not in writez +and getmblock(sht)=valof +$( let blk=? and messages=? and count=0 + unless numbargs() sht_false + messages_sht->@shortmess, @longmess + jar(lvmdoor) + until !messages + $( unjar(lvmdoor) + if count=napct then + $( unless magic + $( magic_true + resetgame() + $) + outs("*C*LSomething unexpectedly magical has happened...*C*L") + $[ $setzm JBINT $] + writeprofile(false) + $) + $[ $aos count + $setz 1, 0 + $sleep 1, 0 + $] + jar(lvmdoor) + $) + blk_!messages + !messages_LINK of blk + unjar(lvmdoor) + clearvec(blk,sht->2,15) + SHORT of blk_messages + resultis blk +$) +and freemblock(blk) be +$( let messages=SHORT of blk + jar(lvmdoor) + LINK of blk_!messages + !messages_blk + unjar(lvmdoor) +$) +and pushlist(lvlist,blk) be LINK of blk_LINK of lvlist<>LINK of lvlist_blk +and forcetty(s) be +$[ $MOVE C, ttyno + $MOVEI B, #21 + $MOVE D, s + $HRLI AC, 3 + $HRRI AC, B + $TRMOP. AC, 0 + $TRN +$] +and outstr(tab,n,a,b,c) be out(tab!random(n),a,b,c)<>outs("*C*L")//not $az please! +and clearvec(vect,size) be +$[ $MOVE AC, vect + $HRLI B, 0(AC) + $HRRI B, 1(AC) + $SETZM 0(AC) + $ADD AC, size + $BLT B, 0(AC) +$] +and copy(vect,dest,size) be +$[ $HRL AC, vect + $HRRZ B, dest + $HRRI AC, 0(B) + $ADD B, size + $BLT AC, 0(B) +$] +and ctrap() be +$[ $SETZ AC, 0 + $SKIPN JBINT + $MOVEI AC, INTBLK + $MOVEM AC, JBINT +$] +and fixd(n)=valof +$[ $FIX AC, n $] +and floatd(n)=valof +$[ $FLTR AC, n $] +and giveback() be +$( quitflg_false + player.names!player.no_0 + jar(@inidr) + plynum!player_player.no + player-_1 + unjar(@inidr) + freemblock(profile) + echo() + finish +$) + + +/* rda, rdb, wrb, wrdmp, rddmp all jump to errstatus + when a status error happens after an in or an out, + which is not caused by an end-file being set. + scbreg has the stream in (as does 2(P)) +*/ +$[ eof: $EXP eoflab +eoflab: $MOVEI AC, ERR.EOF + $JRST erl1 +errstatus: + $EXP erslab +erslab: $MOVEI AC, ERR.STATUS +erl1: $MOVEM AC, 3(P) + $MOVE AC, WSC.ERROR(SCBREG) + $MOVEM AC, 4(P) + $( goto ioerror+2 $) +el1: $EXP ERR.EOF +BCPL.: $mstime 1, 0 + $movem 1, daytime + $skipn rdate //it's actually time, not date... + $movem 1, rdate + $hrli 1, #53 + $hrri 1, #11 + $gettab 1, 0 + $trn + $movem 1, udaytime + $SETZM BATCH + $HRROI AC, #40 + $GETTAB AC, 0 + $CAIA BCPL // ALSO SERVES TO LOAD MBOOTS + $TLNE AC, #200 // ARE WE BATCH + $SETOM BATCH // IF ERROR OR CONTROLLED, SET TRUE + $MOVE ZERCAL + $MOVEI ONE, 1 + $HRRZ P, JBFF // INITIAL VALUE OF P + $MOVEI AC, #2000(P) + $CAML AC, JBREL + $CORE AC, 0 // TRY FOR 2K INITIAL CORE (MINIMUM) + $TRN // IGNORE ERROR RETURN + $MOVE AC, JBREL + $MOVEM AC, SL + $MOVEI AC, #400000 + $MOVEM AC, FL + $MOVEM P, stackbase + $MOVE PDL stack + $SETO AC, 0 + $WAKE AC, 0 + $TRN + $MOVEI AC, 1 + $HIBER AC, 0 //no wait protection + $TRN + $MOVEI AC, intloc + $HRRM AC, intblk + $MOVEI AC, intblk + $MOVEM AC, jbint + $PJOB B, 0 + $MOVEM B, jobno + $TRMNO. B, 0 + $SETZ B, 0 + $MOVEM B, ttyno + $MOVEI AC, #22 + $MOVE D, trmpar + $( if ESSEX + $[ $TRMOP. D, 0 + $] + $) + $SETZ C, 0 + $MOVEM C, micstatus + $SETZ B, 0 + $GETPPN AC, 0 + $TRN + $MOVEM AC, ppn + $HRRZM AC, peen + $HLLM AC, hwmain + $CAME AC, hwmain + $CAMN AC, mainta + $SETO B, 0 + $MOVEM B, maint + $( if ESSEX guest_valof $[ + $setob 1, 2 + $trmno. 2, 0 + $move 2, tty6 + $gtntn. 2, 0 + $seto 2, 0 + $hlrz 3, 2 + $hrli 2, 0 + $cain 3, #3 + $caige 2, #21 + $setz 1, 0 + $] $) + $MOVE AC, jobno + $CTLJOB AC, 0 + $SETO AC, 0 + $MOVEM AC, ctlno + $MOVE AC, getarg1 + $GETTAB AC, 0 + $MOVE AC, ppn + $MOVEM AC, hsppn + $MOVE AC, getarg2 + $GETTAB AC, 0 + $SETZ AC, 0 + $MOVEM AC, hsname + $SETO AC, 0 + $MOVE B, ttyno + $DVURS. B, 0 + $SETZ AC, 0 + $MOVEM AC, privved + $MSTIME AC, 0 + $MOVEM 1, ranseed + $JSP T, @START + $SUBI P, 2 +fn: $EXIT 1, 0 + $JRST fn +intloc: $PUSH PDL, retadr + $SETZM retadr + $CLRBFI + $outstr $az "ouch!*C*L" + $sosg cccnt + $jrst whoops +conted: + $SKIPE lockflg + $POPJ PDL, 0 + $aos pain + $SKIPN quitflg + $POPJ PDL, 0 + $SKIPL quitflg + $JRST startin + $JSP T, @quit + $SUBI P, 2 + $JRST fn +whoops: $clrbfo + $outstr $az"*C*LToo many ^C's for me - I'm off! CONT to continue.*C*L" + $exit 1, 0 + $movem 1, cccnt + $movei 1, CCTRIP + $exch 1, cccnt + $jrst conted +startin:$( giveback() $) +ZERCAL: $JRST ZERO +arg: $XWD 2, B +getarg1:$XWD #777776,2 +getarg2:$XWD #777776,3 +NUMBARGS:$EXP numl1 +numl1: $MOVE AC, 0(P) // LINK ADDRESS + $MOVE AC, 0(AC) // ADDRESS OF INFO WORD + $LDB AC, SELCTR // LOAD 12 BIT FIELD + $JRST 2, 1(T) // RETURN PAST SUBI +SELCTR: $EXP 0, (SELECTOR 12:23:0) + (AC << 18) +TTY: $EXP TTYSTR +TTYSTR: $EXP #030001 // 3 WORD SCB + $EXP TTYRD + $EXP TTYWR + $EXP TTYCL +ttyrd: $ADDI P, @0(T) + $MOVEM T, 0(P) + $INCHWL AC + $MOVEM AC, @3(P) + $JRST ttyret +ttywr: $ADDI P, @0(T) + $MOVEM T, 0(P) + $pjob 1, 0 + $setz 2, 0 + $trmno. 1, 0 + $seto 2, 0 + $skipn 2 + $OUTCHR 3(P) + $MOVE AC, 3(P) +ttyret: $CAIG AC, '*P' + $CAIGE AC, '*L' + $TRNA + $SETZM prompted + $CAIE AC, '*$' + $CAIN AC, '*E' + $SETZM prompted + $CAIN AC, '*^G' + $SETZM prompted + $( return $) +TTYCL: $ADDI P, @0(T) + $MOVEM T, 0(P) + $( return $) +zero: $SKPINC + $TRN + $OUTSTR $AZ "*C*L?MUDJTZ jump to zero" +nogo: $EXIT 1, 0 + $SKPINC + $TRN + $OUTSTR $AZ "*C*L?MUDCCT can't continue" + $JRST nogo +$] + diff --git a/MUDLIB.GET b/MUDLIB.GET new file mode 100644 index 0000000..b4fc35d --- /dev/null +++ b/MUDLIB.GET @@ -0,0 +1,632 @@ +$nolist + +/* +Copyright (C) 1980 by +Roy Trubshaw & Richard Bartle, +Essex University, Colchester. CO4 3SQ. + + This software is furnished on the understanding that +it may be used and or copied only with the inclusion of this +notice. No title or ownership of this software is hereby +transferred. The information in this software is subject to +change without notice. No responsibility is assumed for the +use or reliability of this software. +*/ + +external //Statics common to all +$( cmndbuf //buffer for current command + ctcflg //Fourth word of interrupt block. + hibflg //Hibernate flags. + quitflg //Set true if ^C gets u out. + rec //pointer to dmpbuf record + lastdr //Last door LOCKed. + ccnt //character count + savedp //saved a persona? + pain //number of unnecessary ^C's typed + hsppn //his ppn... + strtab //Table of random messages. + fight //Table of people u r fighting. + who.copy //Who's in the room last. + lvmdoor //Address of message freelist door. + lvqdoor //Address of our queue door. + lvrdoor //Address of current room door. + lvqueue //Address of our queue entry. + lvcarry //Address of carrying freelist. + name //Our name 15 and 16 words of profile. + oldscore //Old score..! + savescore //Score at last save.! + profile //Our player profile so far. + player.no :pno //Our player number. + player.bit :pbit //The bit corresonding to player.no. + ppn //Players's ppn. + him //last male mentioned + her //last female mentioned + them //last player mentioned + there //Last room mentioned + me //my player name + roomput //SCB for .RM file + textput //SCB for .TM file + objput //SCB for .OM file + comput //SCB for .CM file + perput //SCB for .PM file + mapput //SCB for .MM file + laststream //last SCB used + lastblock //last block in the last stream + peen //RH of player's PPn + jobno //Player's job. + ttyno //Player's tty udx. + ctlno //Controlling job, if any. + cccnt //^C chuckout count + room //Current room. + oldroom //Last room we were alive in! + carry //The carry freelist. + verb //Last valid verb. + objct //Last valid object or player. + instrmnt //Last valid intrument. + dmpbuf //dump mode buffer. + cbl //argument block for the above. + rep2 :pno //player number for resetting + low1 //quit if this or less free sys jobs + low2 //let in if more than this free sys jobs + linebuffer //Line buffer for read.line and getch + chcnt //Characters left. + nextch //L-Value of next character. + logstr //Non zero indicates logging enabled. + bstr //Bug stream. + level //The scores on the doors + snooping //If not snooping then you're snooping... + snoopedon //Who's snooping on you + snoopbuffer //No. of characters in snoop buffer + scanch //The last character read. + scan.info //The last word read. + name.string //A string. + fake.string //Space for another string. + mbuffer //Buffer for quote mode. + mainloop //Contains the mainloop. + prompted //Whether you've prompted. + somethingarrived //Whether some creature just arrived + firstsnoop //if this is the first snoop line or not + lineflg //True if typed a line. + fake //Fake node. + bcplrm //bcpl version of a 6bit room + lastdir //The last direction you went + autowho //auto-who seconds count (spectacularing) + autoint //how long to wait txixt autowho's + kept //kept object + events //events due to demons + leading //true if not following + pwcnt //no. of times you've said "password" + followers //People following + frontman //true if not assisted + joined //people joined to you + animal //animal you're following + snobj //object you're snooping on + brief //whether in brief mode or not... + lastmoments //whether closing soon or not + verbname //To make printing errors easier + objname //ditto + insname //ditto + fodsville //was I just fodded? + pretend //Pretending not playing? + holdfirst //A hack into the actions... + it //name of last thing mentioned + flipping //flipping between characters + fodded //Whether you've fodded anyone yet + mins + hrs + days + res6 //for no.-to-6bit result + at //reversed object and instrument + ps.word //user's persona password + conversing //in conversation mode? + deaf //\ + dumb // \ + blind // / has this ailment afflicted me? + paralysed /// + olog //save place for logstr + osnop //save place for snoopedon + savescr //your score when you last saved + justforced //true if you've just been forced +$) + +external //Routines +$( encrypt + get.cmnd + load.block + searchrec //Does a certain persona exist? + visible + invisible + desc.short : dshort + luminous + swapobjins + announcechange + adjustdown : adown + get.rid.of + parse.command + execute.command + full.up + adjustup : aup + bashfull + break.off + dud + stopmoving + inform + killmonster + sb + assign + ATTACH + BUG + CHECKOUT + CH.SENDLEVEL + deassign + DESTROY + DETACH + DETCH + DISENABLE + DROP + DSCRIBE + EMPTY + ENABLE : enbl + ENABLED : enbld + EXORCISE + EXTRA + FLUSH + GETNUM + GETT + GETTRUE + HERE + INSERT + LOCKDOWN + LOCKUP + LOOKINSIDE + NEXTNUM + OBJMATCH + OPEN + PERSON + PLACE + PLAYING + PURGE + REMOVE + SAVE + SAYINSIDES + SAYROOM + SAYWHERE + SCANNER + SENDALL + SENDLEVEL + SETEXP + SETIT + SETPROP + SUSPEND + TIDY + TOTING : tot + TRANSMIT + UNFOLLOW + UNSNOOP + DROP.CLASS + DROP.DELAY + GET.ALL + GET.CLASS + HERE.CLASS + HERE.OR.TOTING : h.o.t + HERE.OR.TOTING.CLASS : h.o.tc + OBJECT + MOVE.SER + TAB12 + TOTING.CLASS : totc + retaliated + player.level : plalev + drop.everything + setscore + check.stuff + infrm + holding + fightmess + plonk + occupied + reinstate + instate + start.leading + lose.followers + carrying.class : carrc + carrying : carr + is.or.was.here + longdescribe + max.obj + max.wt + broadcast + doownthing + lose.joiners + classmatch + stop.fighting + interact + wake.up + can.wake + new.stamina + error + private + public + moveobject + special + normalise + dormant + alive + check.gone : cgone + handledemons + swap + move + action + read.message + initialise //Initialisation stuff. + send //from MUD rather than MUDLIB + hidden //ditto + us //hardwired maintainer names + newpersona //set up a new persona + sexify //adjust str, dex and sta for sex + jar //a sort of lock + realwiz //verifies wiz's by looking in a file + rationalise //put characteristics within right limits + unjar //a sort of unlock! + fake.node //Needed in initialisation... + ud.time //Universal date-time + ctrap //control-c toggle + load.data //Load data would you believe. + resetgame //renames the .exe file + readusername :rnm //read the user name up to 9 chars. + createprofile :cpr //Create a user profile from file or new. + writeprofile :wpr //Write out a user profile. + setbit :sbt //Set player bit in current room. + unsetbit :usb //Unset bit in current room. + access //Can I play now? + boost //add 10 to my attributes + unboost //take 10 off my attributes! + seq //String equality. + random //Random numbers. + lock //Loack doors. + unlock //Unlock doors. + maint //Am I the maintainer? + checksnoop //For when being snooped on + unlink //First off a list. + read.ch //Same as readch bit quit if control C. + hibernate //Hibernate for a sec or until a line ready. + crechar //Create a characteristic. + deleterec :delrec //Delete a persona from .pm file + saverec //Save a persona in .pm file + getmblock //Get a message block. + freemblock //Free a message block. + pushlist //Push onto list. + forcetty //Push string into input buffer of tty. + clearvec //Clear a vector. + fixd //Same as FIX using machine code fix not luuos. + floatd //Ditto above but for FLOAT. + been.in //been in this room before or not? + locked //Whether game is wizard locked + outstr //Stick one of n messages randomly. + find.word :fwrd //Find a word in dictionary. + find.player :fply //Find a player. + find.room :frm //Find a room. + quit //Quit from t' game. + describe //A room and contents. + copy //Move contents of vectors about. + read.line :rline //Read line. + getch //get next character. + linebreak //True if character. + reset //Reset linebuffer stuff. + wait.for.input //What it says. + inventory //Take an inventory. + timeok //Now is an acceptable playing time +$) +/* + The following part of the GETfile is distilled from various BCPL + library get files. Only those procedures declared as external here + will be found in MUDLIB. Beware using standard library modules + with this file. If you want to use BCPLIB.REL then don't load + MUDLIB. +*/ +MANIFEST +$( LH = BYTE 18:18 + RH = BYTE 18:0 + TIMECHK = 10000 //give 4 seconds for MUD to load + WHOLEDAY = 86400000 //Whole day in milliseconds + DELAY = 120000 //before you get timed out + TOOLOW = 4 //<= this no. of jobs left and you're chucked out + BITLOW = TOOLOW+2 //no. of jobs left before lets you in +$) + +EXTERNAL +$( start +$) + +EXTERNAL "%" +$( newvec + free + freevec : free + outo + writeo : wro + outs + writes : wrs + writesecs : wrsx + outno + writeno : wrno + outoct : outo + writeoct : wro + out + write + outch + writech : wrch + inno + readno : rno + rdno + inch + readch : rch + rdch + close + tty + input + output + label + jump + numbargs + packstring + unpackstring + run + ccl + callnm + batch + daytime + udaytime + ran + ranseed + bufull + eof + errstatus + dofile + createtmp + enter + closefile : clsfl + rda + rdb + rddmp + wrb + wrdmp + ioerror : ioerr + sterr : strmr + storeerror + inuuo + useti + outz + writez : wrz + out6 + write6 : wr6 + out8 + write8 : wr8 + outdate + writedate : wrdat + outtime + writetime : wrtim + iowd + iomessage : iomsg + sixbit + echo + noecho + appendfile + words + lookup + lookup.enter : luent +$) + +EXTERNAL "%%" +$( stackbase +$) + +EXTERNAL "." +$( er + fn + sl + sy + bcpl. + fl + bcpl : ".bcpl" + zero +$) + +EXTERNAL "." +$( //Job data area symbols + JBUUO; JB41; JBERR; JBREL + JBBLT; JBDDT; JBCN6; JBPFI + JBHRL; JBSYM; JBUSY; JBSA + JBFF; JBREN; JBAPR; JBCNI + JBTPC; JBOPC; JBCHN; JBCOR + JBINT; JBOPS; JBCST; JBVER + JBDA; JBHSA; JBH41; JBHCR + JBHRN; JBHVR; JBHNM; JBNSM + JBHDA +$) +//BCPL library error codes + +MANIFEST +$( //subsystem codes + IO = #010000 //I/O system + ST = #020000 //free storage system + USER = #700000 //reserved for user + ERR.BIG = ST+4 //biggest system code + //I/O error codes + ERR.NOCHANNEL = IO+1 + ERR.NODEV = IO+2 + ERR.NOFILE = IO+3 + ERR.RENAME = IO+4 + ERR.STATUS = IO+5 + ERR.EOF = IO+6 + ERR.BADMODE = IO+7 + ERR.DIRECTION = IO+8 + ERR.FINDTMP = IO+9 + ERR.CREATETMP = IO+10 + ERR.REWIND = IO+11 + ERR.REWFILE = IO+12 + ERR.IO.BIG = IO+12 + //Storage error codes + ERR.FREEBAD = ST+1 + ERR.NEWVEC = ST+2 + ERR.NEWFAIL = ST+3 + ERR.NEWPAGE = ST+4 + ERR.ST.BIG = ST+4 +$) + +EXTERNAL "%" +$( ERR //Holds latest system error code (all systems) + SCB //Holds stream on which latest I/O error occured +$) + +MANIFEST +$( AC = 1 + B = 2 + C = 3 + D = 4 + E = 5 + F = 6 + G = 7 + H = 8 + I = 9 + J = 10 + K = 11 + T = 12 + P = 14 + SCBREG = 3 + ONE = 13 + COVER = 11 + PDL = 15 +$) + +//Layout of a stream-control block +MANIFEST +$( +SC.FLAGS=SELECTOR 36:0:0 // FLAG WORD +SC.MONITORSTREAM=SELECTOR 1:35:0 // B0 - SET IN A MONITOR STREAM +SC.SIZE=SELECTOR 6:12:0 // B18-23 SIZE OF THIS SCB +SC.SCB=SELECTOR 1:0:0 // B35 - ALWAYS SET IN AN SCB +WSC.FLAGS=0 // FLAG WORD +SC.READER=SELECTOR 36:0:1 // READ ROUTINE FOR THIS STREAM +WSC.READER=1 +SC.WRITER=SELECTOR 36:0:2 // WRITE ROUTINE +WSC.WRITER=2 +SC.CLOSER=SELECTOR 36:0:3 // CLOSE ROUTINE +WSC.CLOSER=3 +SC.ERROR=SELECTOR 36:0:4 // ERROR PARAMETER +WSC.ERROR=4 +SC.PUTSTACK=SELECTOR 18:18:5 // STACK OF CHARACTERS PUT BACK INTO A READ STREAM +SC.OLDREAD=SELECTOR 18:0:5 // SAVED ORIGINAL READ ROUTINE ON PUTBACK'D STREAM +WSC.PUTBACK=5 +SC.USER6=SELECTOR 36:0:6 //Ought to use for helping not doing usetis unnecessarily +WSC.USER6=6 +SC.USER7=SELECTOR 36:0:7 +WSC.USER7=7 +SC.USER10=SELECTOR 36:0:#10 +WSC.USER10=#10 +SC.STATUS=SELECTOR 36:0:#11 // MONITOR OPEN BLOCK +WSC.STATUS=#11 +SC.DEV=SELECTOR 36:0:#12 +WSC.DEV=#12 +SC.OBUFHDR=SELECTOR 18:18:#13 +SC.IBUFHDR=SELECTOR 18:0:#13 +WSC.BUFHDR=#13 +SC.IBUF=SELECTOR 18:0:#14 // INPUT BUFFER HEADER FOR MONITOR +WSC.IBUF=#14 +SC.IBYTE=SELECTOR 36:0:#15 +SC.IWD=SELECTOR 18:0:#15 +WSC.IBYTE=#15 +SC.ICOUNT=SELECTOR 36:0:#16 +WSC.ICOUNT=#16 +// 17 - RESERVED +// 20 - RESERVED +// 21 - RESERVED +SC.OBUF=SELECTOR 18:0:#22 // OUTPUT BUFFER HEADER FOR MONITOR +WSC.OBUF=#22 +SC.OBYTE=SELECTOR 36:0:#23 +SC.OWD=SELECTOR 18:0:#23 +WSC.OBYTE=#23 +SC.OCOUNT=SELECTOR 36:0:#24 +WSC.OCOUNT=#24 +// 25 - RESERVED +// 26 - RESERVED +// 27 - RESERVED +SC.CHANNEL=SELECTOR 4:23:#30 // CHANNEL WORD ( CHANNEL IN AC FIELD - REST 0 ) +WSC.CHANNEL=#30 +SC.IN=SELECTOR 36:0:#31 // IN CHANNEL,0 ORDER +WSC.IN=#31 +SC.OUT=SELECTOR 36:0:#32 // OUT CHANNEL,0 ORDER +WSC.OUT=#32 +SC.USETI=SELECTOR 36:0:#33 // USETI CHANNEL,@3(#16) +WSC.USETI=#33 +SC.USETO=SELECTOR 36:0:#34 // USETO CHANNEL,@3(#16) +WSC.USETO=#34 +SC.STATZ=SELECTOR 36:0:#35 +WSC.STATZ=#35 +SC.APPENDCL=SELECTOR 36:0:#36 +WSC.APPENDCL=#36 +SC.COUNT=SELECTOR 36:0:#37 // LOOKUP BLOCK WORD COUNT +WSC.COUNT=#37 +SC.PPN=SELECTOR 36:0:#40 +SC.PROJ=SELECTOR 18:18:#40 +SC.PROG=SELECTOR 18:0:#40 +WSC.PPN=#40 +SC.FILENAME=SELECTOR 36:0:#41 // MONITOR LOOKUP/ENTER/RENAME BLOCK +WSC.FILENAME=#41 +SC.MONERROR=SELECTOR 18:0:#42 +SC.EXT=SELECTOR 18:18:#42 +SC.HIDATE=SELECTOR 3:15:#42 // HIGH ORDER 3 BITS OF CREATE DATE +SC.ACCESSDATE=SELECTOR 15:0:#42 +WSC.EXTWORD=#42 +SC.PROTECTION=SELECTOR 9:27:#43 +SC.MODE=SELECTOR 4:23:#43 +SC.TIME=SELECTOR 11:12:#43 +SC.CREATEDATE=SELECTOR 12:0:#43 +WSC.TIMEDATE=#43 +SC.WORDS=SELECTOR 36:0:#44 +WSC.WORDS=#44 +SC.VMAJOR=SELECTOR 9:12:#45 +SC.VMINOR=SELECTOR 6:18:#45 +SC.VEDIT=SELECTOR 18:0:#45 +SC.VWHO=SELECTOR 3:33:#45 +SC.VERSION=SELECTOR 36:0:#45 +WSC.VERSION=#45 +SC.PATH=SELECTOR 36:0:#46 +WSC.PATH=#46 //PATH BLOCK IS 8 WORDS LONG +SC.DEFAULT.SIZE=#55 +SC.TMPNAME=SELECTOR 36:0:#11 // TMPCOR SCB ASSIGNMENTS +WSC.TMPNAME=#11 +SC.TMPBYTEP=SELECTOR 36:0:#12 +SC.TMPWORD=SELECTOR 18:0:#12 +WSC.TMPBYTEP=#12 +SC.TMPLIMIT=SELECTOR 36:0:#13 +WSC.TMPLIMIT=#13 +SC.TMPCOR.SIZE=#14 +$) + +EXTERNAL "%" +$( SCBSIZE +$) + +//Bit definitions +MANIFEST +$( +B0 =#400000000000; B1 =#200000000000; B2 =#100000000000 +B3 =#040000000000; B4 =#020000000000; B5 =#010000000000 +B6 =#004000000000; B7 =#002000000000; B8 =#001000000000 +B9 =#000400000000; B10=#000200000000; B11=#000100000000 +B12=#000040000000; B13=#000020000000; B14=#000010000000 +B15=#000004000000; B16=#000002000000; B17=#000001000000 +B18=#000000400000; B19=#000000200000; B20=#000000100000 +B21=#000000040000; B22=#000000020000; B23=#000000010000 +B24=#000000004000; B25=#000000002000; B26=#000000001000 +B27=#000000000400; B28=#000000000200; B29=#000000000100 +B30=#000000000040; B31=#000000000020; B32=#000000000010 +B33=#000000000004; B34=#000000000002; B35=#000000000001 +$) + +EXTERNAL +$( DISC + MAINTA +$) //for MBOOTS to put stuff in... + +$list + diff --git a/MUDTXT.SUB b/MUDTXT.SUB new file mode 100644 index 0000000..4292fc0 --- /dev/null +++ b/MUDTXT.SUB @@ -0,0 +1,18 @@ +MUDTXT.SUB +VALLEY.TXT +TXTCBT.GET +TXTLEV.GET +TXTHRS.GET +TXTRMS.GET +TXTMAP.GET +TXTVOC.GET +TXTCSY.GET +TXTOBJ.GET +TXTOSY.GET +TXTMTN.GET +TXTTOP.GET +TXTBTM.GET +TXTDAC.GET +TXTDMN.GET +TXTTXT.GET +TALK.TXT diff --git a/TXTBTM.GET b/TXTBTM.GET new file mode 100644 index 0000000..4b06c27 --- /dev/null +++ b/TXTBTM.GET @@ -0,0 +1,475 @@ + visible none none ifinvis null 0 21 + visible none none unlesswiz null 19 0 + visible .vis none none null null 23 0 + rubbish none none unlesswiz null 19 0 + rubbish .ignore none none null null 0 0 + invisible none none ifinvis null 1 20 + invisible none none unlesswiz null 19 0 + invisible .invis none none null null 22 0 + shelve .shelve none none null null 0 0 + unshelve .unshelve none none null null 0 0 + mix medication liquid destroyinc second 573 0 + mix liquid medication incdestroy second 573 0 + climb forest none null null 381 0 + invent none none null null 8 0 + i .inven none none null null 0 0 + level none none null null 833 0 + taste none none null null 869 0 + wear headdress none null null 382 0 + thanks none none null null 822 0 + keywords none none null null 823 0 + sorry none none null null 13 0 + hammer none none null null 714 0 + god none none null null 739 0 + help none 1 null null 1 0 + help .assist none none null null 0 0 + h none none null null 1 0 + refuse .refuse none none null null 0 0 + command none none ifwiz null 6 0 + command none none null null 5 0 + explain none none null null 2 0 + xyzzy none none null null 9 0 + hours .hours none none null null 0 0 + newhours .newhours none none null null 0 0 + go .go none none null null 0 0 + sget .sget none none ifwiz null 0 0 + sgo .sgo none none null null 0 0 + pi none none null null 654 0 + pu none none unlesswiz null 486 0 + pu .remove anything container null null 0 0 + pu .remove anything flame null null 0 0 + pu .get none none null null 0 0 + letgo none none unlesswiz null 486 0 + letgo .drop none none null null 0 0 + swear none none ifin null limbo 4 + swear none none iffighting null 3 0 + swear none none dead null 49 0 + kiss person none emotion null 50 328 + stroke familiar none ifprop null 9 443 + stroke familiar none null null 444 0 + stroke person none emotion null 25 552 + wake .wake none none null null 0 0 + piss none none ifin null limbo 4 + piss none none iffighting null 3 0 + piss none none dead null 49 0 + rape .blind person none ifself null 540 0 + rape familiar none testsex null 473 981 + rape none none ifin null limbo 4 + rape none none iffighting null 3 0 + rape none none dead null 49 0 + masturbate .blind none none null null 540 0 + unlock access none ifprop null 0 185 + unlock access none ifprop null 1 185 + unlock access yale set null 1 186 + unlock access none ifhave key 559 0 ;only works for one set of keys + unlock access none null null 184 0 + lock access none ifprop null 2 189 + lock access yale set null 2 188 + lock access none null null 505 0 + back .back none none null null 0 0 + light torch none unlesswiz null 588 0 + light torch none dec null 131 4 + fell access tool destroydestroy second 88 0 + fell access none null null 90 0 + feed serpent none null null 976 0 + feed familiar none null null 433 0 + feed none none null null 778 0 + dig none none null null 596 0 + drink none water null null 862 0 + drink none none null null 158 0 + eat victuals none ifprop null 1 985 + eat victuals none destroy null 115 0 + eat none none null null 873 0 + kill knob none null null 45 0 + kill access tool destroydestroy second 88 0 + kill access none null null 90 0 + kill something tool hurt null 20 0 -4 + kill .kill serpent none enable null 1 970 -4 + kill .kill none none null null 0 0 -4 + proof .proof none none null null 0 0 + move .go none none null null 0 0 + debug .debug none none null null 0 0 + demo .demo none none null null 0 0 + laugh .laugh none none null null 0 0 + freeze none none unlesswiz null 4 0 + freeze .freeze none none null null 577 0 + melt none none unlesswiz null 4 0 + melt .unfreeze none none null null 578 0 + mobile .mobile none none null null 0 0 + haste .haste none none null null 0 0 + stamina .stamina none none null null 0 0 + att .attach none none null null 0 0 + det .detach none none null null 0 0 + humble .humble none none null null 0 0 + tell .tell none none null null 0 0 + get bowl none null null 828 0 + get serpent none null null 971 0 -1 + get .get none none null null 0 0 + say .say none none null null 0 0 + who .who none none null null 0 0 + awho .autowho none none null null 0 0 + qwho .quickwho none none null null 0 0 + set .set none none null null 0 0 + purge .purge none none null null 0 0 + save .save none none null null 0 0 + quit .quit none none null null 0 0 + q none none null null 1508 0 + score .score none none null null 0 0 + bye .bye none none null null 0 0 + bug .bug none none null null 0 0 + log .log none none null null 0 0 + ctrap .ctrap none none null null 0 0 + follow .follow none none null null 0 0 + lose .lose none none null null 0 0 + begone .begone none none null null 849 0 + peace none none unlesswiz null 4 0 + peace .peace none none null null 979 0 979 + spectacular .spectacular none none null null 0 0 + war none none unlesswiz null 4 0 + war .war none none null null 980 0 980 + l .look none none null null 0 0 + map .map none none null null 0 0 + brief .brief none none null null 0 0 + verbose .verbose none none null null 0 0 + p .p none none null null 0 0 + exits .exits none none null null 0 0 + pronouns .pronouns none none null null 0 0 + unsnoop .unsnoop none none null null 0 0 + direct .direct none none null null 0 0 + exorcise .exorcise none none null null 0 0 + open access none ifprop null 0 183 + open access 2 set null 0 100 + open access yale set null 0 100 + open access none ifprop null 2 184 + open access none set null 0 100 + close access yale set null 2 188 + close access none ifprop null 1 187 + close access none set null 1 101 + spells none none null null 7 0 + flush lavatory none iflevel null 2 831 + flush lavatory none exp null 1 831 + flush none none flush null 762 0 + sleep .sleep none none unlessobjplayer null 171 0 + sleep .sleep none none ifwiz null 171 0 + sleep none none unlessrlevel null 6 650 -50 + sleep .sleep none none null null 756 0 + wish .flush none none ifdumb null 1 26 + wish .flush none none unlessplaying null 10 882 -50 + wish .sleep none none sendlevel null 10 882 + crash .crash none none null null 0 0 + change .change none none ifwiz null 0 0 + change none none ifsmall null 27 0 + change .flush none none unlessrlevel null 10 968 -50 + change .change none none null null 756 0 + enchant .enchant none none flush null 0 0 + police .police none none flush null 0 0 + unveil .unveil none none null null 0 0 + resurrect .resurrect none none null null 0 0 + reset none none unlesswiz null 486 0 + reset .reset none none null null 889 0 + keep .keep none none null null 0 0 + unkeep .unkeep none none null null 0 0 + putin .insert none none null null 0 0 + takeout .remove none none null null 0 0 + fod .fod none none null null 0 0 + sick none none ifdisenable null 1 834 + sick none none ifdisenable null 3 871 + sick none none ifdisenable null 16 871 + sick none none null null 834 0 + fix .insert torch container unlessprop null 0 0 + fix torch container destroydestroy second 771 0 + fix .insert anything flame null null 781 0 + fix .insert none none null null 0 0 + search none none null null 370 0 + how none none null null 11 0 + please none none null null 14 0 + consume none none null null 874 0 + winter none none ifwiz null 958 0 -33 + summer none none ifwiz null 974 0 -41 + flee none none ifberserk null 814 0 + flee .flee none none null null 0 0 + drop .drop none none null null 0 0 + locations .rooms none none null null 0 0 + summon none none null null 4 0 + make none none null null 4 0 + where none none null null 4 0 + wizards none none iflevel null 10 504 + berserk .berserk none none null null 0 0 + weigh .weigh none none null null 0 0 + value .value none none null null 0 0 + converse .converse none none null null 0 0 + write none none flush null 888 0 + read forum none null null 548 0 + password .password none none null null 0 0 + retaliate tool none retal null 10 0 + retaliate none none iffighting null 46 0 + retaliate none none null null 47 0 + when .time none none null null 0 0 + diagnose .diagnose none none ifwiz null 0 0 + deafen person none ifdeaf null 1 32 + deafen .deafen person none unlessrlevel null 4 44 + deafen person none noifr null 0 0 + deafen person none ssendemon null 52 756 -56 + deafen none none null null 24 0 + blind person none ifblind null 1 31 + blind .blind person none unlessrlevel null 4 41 + blind person none noifr null 0 0 + blind person none ssendemon null 53 756 -56 + blind none none null null 24 0 + paralyse person none ifparalysed null 1 30 + paralyse .paralyse person none unlessrlevel null 4 38 + paralyse person none noifr null 0 0 + paralyse person none ssendemon null 54 756 -56 + paralyse none none null null 24 0 + dumb person none ifdumb null 1 29 + dumb .dumb person none unlessrlevel null 4 35 + dumb person none noifr null 0 0 + dumb person none ssendemon null 55 756 -56 + dumb none none null null 24 0 + cure person none unlessrlevel null 8 755 + cure person none noifr null 0 0 + cure person none ssendemon null 57 756 -56 + cure none none null null 24 0 + examine none none null null 245 0 +;;vocabulary action synonyms +syn info explain + diag diagnose + cripple paralyse + deaf deafen + daytime when + da when + persona purge + personas purge + personae purge + delete purge + dump save + levels level + apologies sorry + oops sorry + apologise sorry + ta thanks + thank thanks + attatch att + attach att + assist help + instruction command + commands command + instructions command + information explain + syntax command + shut close + raise open + lower close + lift open + retreat back + logout bye + plugh xyzzy + ignite light + burn light + cremate light + extinguish douse + quench douse + chop fell + cut fell + flip toss + roast cook + bake cook + thaw melt + unfreeze melt + ptrans go + propel drop + grasp get + ingest eat + expel swear + mtrans score + speak tell + sen tell + attend l + mbuild log + atrans drop + vomit sick + spew sick + puke sick + pronoun pronouns + pn pronouns + pns pronouns + ex exorcise + inventory i + hrs hours + times hours + k kill + ki kill + skin kill + smash kill + break kill + upturn kill + strangle kill + tip kill + empty kill + swat kill + press kill + depress kill + push kill + attack kill + exterminate kill + sacrifice kill + slay kill + flog kill + hit kill + fight kill + strike kill + frig enchant + b back + restore resurrect + res resurrect + supercede reset + chill freeze + mobiles mobile + rest sleep + nap sleep + kip sleep + doze sleep + speed haste + sp haste + hasten haste + directory direct + dir direct + force make + chase follow + pursue follow + track follow + unbrief brief + unverbose verbose + banish begone + chant say + recite say + snopp snoop + unsnopp unsnoop + watch snoop + nsnoop unsnoop + unwatch unsnoop + unwatch unsnoop + observe snoop + dot fod + bung fix + insert fix + hang fix + put fix + manipulate fix + wizad wizard + wicth witch + wiard wizard + wiazrd wizard + wiz wizard + wi with + locs locations + loc locations + shit piss + urinate piss + wee piss + cunt swear + arse swear + anus swear + fuck rape + fucking swear + bugger swear + bloody swear + penis swear + vagina swear + prick swear + fanny swear + masterbate masturbate + wank masturbate + g get + remove get + steal get + give drop + tether fix + sh shout + bellow shout + yell shout + call summon + goto go + supergo sgo + superget sget + sg sget + slide move + moveto go + sc score + experience score + status score + points score + pts score + diary log + script log + look l + describe l + desc l + pour drop + spill drop + splash drop + throw drop + dr drop + cast drop + run flee + f flee + fl flee + ask tell + whisper tell + take get + carry get + catch get + screw rape + bang rape + pause quit + qq quit + qu quit + players who + autowho awho + aw awho + quickwho qwho + qw qwho + wq qwho + wa awho + pretend p + whom who + player who + suggestion bug + suggest bug + complaint bug + complain bug + question bug + typo bug + moan bug + report bug + idea bug + query bug + memo bug + message tell + feature bug + devour eat + pinch steal + pickup pu + lg letgo + putdown letgo + pd letgo + donate drop + gi drop + st steal + fling drop + pw password + newpassword password + witches wizards + sta stamina + snog kiss + ret retaliate + pat stroke + rub stroke + hug stroke + pet stroke + cuddle stroke + dep visible + vis visible + indep invisible + invis invisible + undemo demo diff --git a/TXTCBT.GET b/TXTCBT.GET new file mode 100644 index 0000000..3f2e8af --- /dev/null +++ b/TXTCBT.GET @@ -0,0 +1,260 @@ +*combat 9 ;1 + sneering + looking + staring + snarling + glaring + coming + scowling + grimacing + rushing + 12 ;2 + fiercely + ferociously + aggressively + ominously + purposefully + angrily + madly + hatefully + menacingly + threateningly + venomously + furiously + 13 ;3 + strike home at + take aim at + hit + strike + beat + catch + smite + bash + thrash + wallop + strike at + hit out at + strike out at + 16 ;4 + crushing + weighty + glancing + vicious + violent + hefty + mighty + powerful + tremendous + forceful + severe + furious + punishing + savage + fierce + stunning + 13 ;5 + blow + blow + swing + thump + whack + punch + lunge + thrust + clout + slash + backhand + forehand + cross + 10 ;6 + beat + evade + elude + dodge + side-step + avoid + duck + shrug off + take + parry + 14 ;7 + terrible + clumsy + dreadful + weak + hasty + wild + limp + feeble + puny + tame + poor + bungled + pathetic + mis-timed + 10 ;8 + affray + contest + battle + melee + engagement + action + tussle + carnage + slaughter + fight + 2 ;9 + from + by + 14 ;10 + easily matched by + way off + no problem for + a mile off + nowhere near + easily dodged by + avoided with ease by + parried effortlessly by + side-stepped by + a yard off + blocked by + too weak to hurt + too feeble to worry + hardly noticed by + 13 ;11 + worried + grazed + stricken + stunned + dazed + jolted + hurt + numbed + wounded + troubled + bruised + jarred + winded + 14 ;12 + power + energy + vigour + viciousness + speed + furiosity + savageness + fierceness + violence + weight + strength + might + force + momentum + 2 ;13 + feel + sense + 9 ;14 + strength + life-blood + energy + final breath + life force + last seconds + soul + final moments + time + 6 ;15 + ebbing away + leaving you + departing + slipping away + draining away + slipping + 7 ;16 + see + spot + notice + sense + perceive + discern + can see + 13 ;17 + However + But + With renewed vigour + But courageously + Gritting your teeth + With a vast effort + Groggily + Summoning strength + Dazedly + Indomitably + Yet + Yet courageously + With tremendous willpower + 8 ;18 + pull through + pull together + recover + compose + revitalise + carry on + bear up + concentrate + 11 ;19 + charge back + launch yourself + stagger forward + wade + head back + hurl yourself + throw yourself + start + advance + press forward + hurtle + 7 ;20 + retaliatory + retributive + counter + follow-up + follow-through + next + return + 9 ;21 + sideways + reeling + staggering + flying + to the floor + sprawling + backwards + to the ground + spinning + 5 ;22 + simply + easily + effortlessly + comfortably + narrowly + 8 ;23 + absorbed + dodged + avoided + parried + ducked + side-stepped + shrugged off + taken + 11 ;24 + took the life of + did away with + slayed + killed + was the end of + finished off + polished off + murdered + killed + was enough to kill + disposed of diff --git a/TXTCSY.GET b/TXTCSY.GET new file mode 100644 index 0000000..728d798 --- /dev/null +++ b/TXTCSY.GET @@ -0,0 +1,8 @@ +syn valuables treasure + t treasure + treas treasure + presents present + coins money + torches torch + brands torch + food victuals diff --git a/TXTDAC.GET b/TXTDAC.GET new file mode 100644 index 0000000..c793f9a --- /dev/null +++ b/TXTDAC.GET @@ -0,0 +1,56 @@ + $null none none null null 0 0 + $flush none none flush null 0 0 + $poison none none ifenabled null 1 0 + $poison none none ifenabled null 3 0 + $poison none none ifenabled null 16 0 + $poison none none null null 765 0 -3 + $poison1 none none null null 907 0 -16 + $poison2 none none dead null 48 0 + $provoke none none ifasleep null 1 0 + $provoke none none ifinvis null 1 0 + $provoke none none ifwiz null 0 0 + $provoke .provoke something none ifrstas null 0 0 -4 + $cure none none destroy medicine 0 0 + $calm none none sendeffect rain 955 0 -28 + $brewing none none set rain 1 0 -31 + $brewing1 none none sendeffect rain 956 0 -29 + $pouring none none set rain 0 0 -32 + $pouring1 none none sendeffect rain 957 0 -30 + $winter none none ifdisenable null 28 0 -34 + $winter none none ifdisenable null 29 0 -34 + $winter none none ifdisenable null 30 0 -34 + $winter none none ifdisenable null 31 0 -34 + $winter none none ifdisenable null 32 0 -34 + $summer none none ifdisenable null 28 0 -42 + $summer none none ifdisenable null 29 0 -42 + $summer none none ifdisenable null 31 0 -42 + $summer none none ifdisenable null 32 0 -42 + $summer none none ifdisenable null 33 0 -42 + $summer none none ifdisenable null 34 0 -42 + $summer none none ifdisenable null 35 0 -42 + $summer none none ifdisenable null 36 0 -42 + $summer none none ifdisenable null 37 0 -42 + $summer none none ifdisenable null 38 0 -42 + $summer none none ifdisenable null 39 0 -42 + $summer1 none none set rain 0 0 -30 + $snow none none set rain 2 0 -35 + $snow1 none none sendeffect rain 959 0 -36 + $snow2 none none set rain 0 0 -37 + $snow3 none none sendeffect rain 960 0 -38 + $snow4 none none sendeffect rain 955 0 -39 + $snake none none ifr null 90 0 + $snake none none null null 973 0 -1 + $change .sleep none none null null 0 0 + $dead none none dead null 0 0 + $deaf none none ifwiz null 42 0 + $deaf .deafen none none null null 43 0 + $blind none none ifwiz null 39 0 + $blind .blind none none null null 40 0 + $paralyse none none ifwiz null 36 0 + $paralyse .paralyse none none null null 37 0 + $dumb none none ifwiz null 33 0 + $dumb .dumb none none null null 34 0 + $cured none none unlessill null 0 0 + $cured .cure none none null null 28 0 + $alter none none stamina null 100 0 -58 + $firework none none sendeffect rain 1502 1502 diff --git a/TXTDMN.GET b/TXTDMN.GET new file mode 100644 index 0000000..b94c37c --- /dev/null +++ b/TXTDMN.GET @@ -0,0 +1,32 @@ +0 $null none none -1 +1 $poison none none 60 +3 $poison1 none none 30 +4 $smash none none -1 always +6 $provoke whichever none -1 +16 $poison2 none none 30 +23 $cure none none -1 always +28 $brewing none none 15-30 global +29 $pouring none none 300-600 global +30 $calm none none 600-1500 global enabled +31 $brewing1 none none -1 global +32 $pouring1 none none -1 global +33 $winter none none -1 global +34 $snow none none -1 global +35 $snow1 none none -1 global +36 $snow2 none none 300-1200 global +37 $snow3 none none -1 global +38 $snow4 none none 300-1200 global +39 $snow none none 15-30 global +40 $snake none none -1 +41 $summer none none -1 global +42 $summer1 none none -1 global +49 $dead none none -1 +50 $change none none -1 +52 $deaf none none -1 +53 $blind none none -1 +54 $paralyse none none -1 +55 $dumb none none -1 +56 $flush none none -1 +57 $cured none none -1 +58 $alter none none 5 +59 $firework none none 5 diff --git a/TXTHRS.GET b/TXTHRS.GET new file mode 100644 index 0000000..985366d --- /dev/null +++ b/TXTHRS.GET @@ -0,0 +1,24 @@ +*hours +;0 0 24 +;1 0 24 +;2 0 24 +;3 0 24 +;4 0 24 +;5 0 24 +;6 0 24 +;0 0 10 +;0 16 24 +;1 0 7 +;2 1 7 +;3 1 7 +;4 1 7 +;5 1 7 +;6 1 10 +;6 16 24 +0 0 24 +1 0 7 +2 2 7 +3 2 7 +4 2 7 +5 2 7 +6 2 24 diff --git a/TXTLEV.GET b/TXTLEV.GET new file mode 100644 index 0000000..d48b08e --- /dev/null +++ b/TXTLEV.GET @@ -0,0 +1,21 @@ +*levels +male novice + warrior + hero + champion + superhero + enchanter + sorcerer + necromancer + legend + wizard +female novice + warrior + heroine + champion + superheroine + enchantress + sorceress + necromancess + legend + witch diff --git a/TXTMAP.GET b/TXTMAP.GET new file mode 100644 index 0000000..696247c --- /dev/null +++ b/TXTMAP.GET @@ -0,0 +1,15 @@ +*maps +12 +0/M/ clear screen +|/-%/ vertical line +-/ ,/ horizontal line +3/-'/ lower left corner +4/ */ upper left corner +5/ ./ upper right corner +6/-#/ lower right corner +7/-!/ cross between | and - +8/#l/ symbol for a door +[/O2/ dim on +]/O0/ dim off +/("/ RH of right-justified tree diff --git a/TXTMTN.GET b/TXTMTN.GET new file mode 100644 index 0000000..7dbdf06 --- /dev/null +++ b/TXTMTN.GET @@ -0,0 +1,88 @@ +conj and +fprep with +bprep at +quant all +pron it +mpron him +fpron her +ppron them +place there +self me +inst whichever +universal shout +noclass none +persn person +sthing something +athing anything +motion in + out + up + down + north + south + east + west + southeast + northwest + northeast + southwest + jump + $special + swamp + $unswamp +syn u up + above up + exit out + away out + upwards up + d down + downwards down + below down + upward up + ascend up + descend down + downward down + e east + easterly east + w west + westerly west + n north + northerly north + s south + southerly south + se southeast + sw southwest + ne northeast + nw northwest + inside in + outside out + o out + leap jump + to at + do and + that and + then and + using with + into with + unto and + from with + on with + onto with + lot all + everything all + do and + em them + they them + er her + she her + im him + he him +noise the + a + an + someone ;To prevent people from having this 'name' + bartle ;why should anyone have my surname?! + mallett ;he made me do it, guv! + is + again + repeat diff --git a/TXTOBJ.GET b/TXTOBJ.GET new file mode 100644 index 0000000..dac1896 --- /dev/null +++ b/TXTOBJ.GET @@ -0,0 +1,63 @@ +object sack container 300 0 + pin tack 1 30 + bouquet flowers 1000 16 + bag container 4000 0 + button knob 100000 0 + water h2o 100000 0 + trees forest 100000 0 + coin money 15 15 + beads decoration 100 13 + coinval headstails 0 0 + jewels gems 50 100 + starstone gem 10 37 + jet gem 50 20 + topaz gem 30 50 + bloodstone gem 10 100 + amethyst gem 40 100 + clasp decoration 50 25 + garnet gem 500 38 + banger firework 40 70 + rocket missile 40 100 + sparkler spark 20 10 + holly present 20 10 + xmastree present 1000 50 + mousse present 250 15 + mouse present 400 15 + candle present 100 10 + snowman present 1000 50 + cracker present 100 10 + carolbook present 100 10 + reindeer present 1000 50 + sleigh present 1000 10 + santaclaus present 1000 50 + mincepies present 20 10 + plumpudding present 100 10 + turkey present 100 10 + buckle decoration 150 15 + potion liquid 0 25 + sapphire gem 10 100 + doubloons money 1000 30 + pieces money 800 32 + groats money 1000 18 + firestone stone 10 30 + cat familiar 6000 49 + snake serpent 5000 10 + wall space 100000 0 + painting decoration 4000 35 + candlestick decoration 2500 10 + toilet lavatory 0 0 + river stream 0 0 + basin bowl 0 0 + diamond gem 30 235 + medicine medication 100 -100 + key yale 100 10 + door access 0 0 + crown headdress 1500 900 + rain weather 0 0 + axe tool 7000 13 + brand torch 1000 0 + fire flame 0 0 + off toggles 0 0 + curiosity toggles 0 0 + sesame cliche 0 0 + almanac forum 20000 0 ;heavy reading diff --git a/TXTOSY.GET b/TXTOSY.GET new file mode 100644 index 0000000..3b7fc80 --- /dev/null +++ b/TXTOSY.GET @@ -0,0 +1,44 @@ +syn snow rain + ax axe + union key + lf key + landf key + poison potion + fs firestone + fstone firestone + medecine medicine ;well I sometimes misspell, see... + medicines medicine + viper snake + adder snake + bough holly + pine xmastree + father santaclaus + stnicholas santaclaus + rudolph reindeer + mince mincepies + pies mincepies + plum plumpudding + pudding plumpudding + santa santaclaus + claus santaclaus + christmas santaclaus + fatherchristmas santaclaus + sledge sleigh + cs candlestick + picture painting + bog toilet + lavy toilet + cistern toilet + lav toilet + lavvy toilet + thunderbox toilet + you off + feline cat + pussy cat + puss cat + moggy cat + vial potion + fence wall + keys key + stick brand + panther cat diff --git a/TXTRMS.GET b/TXTRMS.GET new file mode 100644 index 0000000..5a05338 --- /dev/null +++ b/TXTRMS.GET @@ -0,0 +1,22 @@ +home hide + Wizards' room. + This is a room reserved exclusively for wizards. Its ornate oaken + panelling and antique furniture make it the perfect place for its + honoured users to relax in the style to which they are justly + entitled. To find exits type exits. +store hide hideaway + Wizards' storeroom. + The immensity of this room is enough to fill any mortal with awe and + insignificance, but you are naturally unimpressed. This is the room + used by wizards as a store for things to be dumped at random out on + the poor unsuspecting adventurers to add a bit of spice to the game. +limbo light hideaway nolook silent + Limbo. + Everything around you is a glowing white, and there are no walls you + can focus on. You feel as if you are floating on air. You are. +xmasbx light death hide hideaway sanctuary + Christmas box. + This room is for the benefit only of those wizards and witches who + want to make Christmas a nice time of year. Use no other season, please! + The command to make it snow instead of rain is WINTER. Oh, and don't + forget the mistletoe and the ivy! Merry Christmas! diff --git a/TXTTOP.GET b/TXTTOP.GET new file mode 100644 index 0000000..3a4c356 --- /dev/null +++ b/TXTTOP.GET @@ -0,0 +1,91 @@ + swing familiar none testsmall null 792 793 + write forum none writein null 0 0 + melt something torch ifprop null 1 308 + light container flame destroy null 771 0 + light torch flame dec null 109 4 + light something torch unlessgot second 391 0 + light something torch ifprop second 1 307 + light container torch destroy null 771 0 + light firework torch expdestroy null 17 0 16 + light firework none null null 18 0 + light missile none unlesshere rain 1500 0 + light missile torch expdestroy null 1501 0 -59 + light missile none null null 18 0 + light spark torch dec null 1503 1504 + light spark none null null 18 0 + light torch torch ifprop second 1 242 + light torch torch dec null 131 4 + light torch stone null null 67 0 + stroke torch torch null null 132 4 + douse none none holdfirst null 0 0 + douse flame none null null 177 0 + douse torch none inc null 110 4 + douse stone none null null 68 0 + douse spark none null null 1505 0 + cook familiar none null null 640 0 + cook serpent none null null 975 0 + fell something tool unlesslevel null 3 845 + fell none forest null null 436 0 + feed familiar none ifprop null 9 519 + drink liquid medication destroydestroy second 575 0 + drink medication liquid destroydestroy second 575 0 + drink liquid none ifprop null 0 574 -1 + drink liquid none expdestroy null 365 0 + drink .sleep medication none ifdisenable null 1 139 -23 + drink .sleep medication none ifdisenable null 3 914 -23 + drink .sleep medication none ifdisenable null 16 914 -23 + drink .sleep medication none expset null 1 139 + eat familiar none unlessprop null 9 637 + eat familiar none expdestroy null 638 0 + eat serpent none null null 969 0 + kill something tool unlesslevel null 3 845 + kill person tool unlesslevel null 3 845 + kill lavatory none null null 830 0 + kill .empty container none null null 0 0 + kill person tool hurt null 15 0 -4 + kill .kill person torch ifprop second 1 0 -4 + kill person torch hurt null 5 0 -4 + kill familiar none ifinsis curiosity 560 0 + kill .kill familiar none ifprop null 10 488 -4 + kill familiar none inc null 431 432 -4 + drop .insert torch container unlessprop null 0 0 + drop torch container destroydestroy second 771 0 + drop .insert anything flame null null 781 0 + drop .insert anything container null null 0 0 + drop .insert something flame null null 781 0 + drop medication liquid destroyinc second 573 0 ;don't need drop liquid medication + drop something lavatory ifweighs null 2001 826 + drop something stream ifweighs null 2001 836 + drop tack none null null 1506 0 1507 + toss money none ifrprop coinval 0 724 + toss money none null null 725 0 + summon .summon none none ifwiz null 0 0 + summon .summon none none ifrlevel null 4 756 + snoop .snoop none none ifwiz null 0 0 + l none none ifblind null 1 25 + l flame none unlesswiz null 0 782 + make .make none none ifwiz null 0 0 + make .flush none none ifin null limbo 590 + make .make none none ifrlevel null 4 756 + where .where none none iflevel null 9 0 ;let legends where anyway + where .where none none ifrlevel null 6 756 + fix none none holdfirst null 0 0 + fix something lavatory ifweighs null 2001 826 + fix something stream ifweighs null 2001 836 + piss none none ifobjis off 846 0 + rape none none ifobjis off 846 0 + open none none ifobjis sesame 344 0 + open container none unlessobjis bag 809 0 + open container none dec null 811 810 + close container none unlessobjis bag 809 0 + close container none inc null 812 813 + quit .quit none none ifwiz null 0 0 + quit none none ifin null limbo 696 + bye none none ifin null limbo 696 + piss none lavatory null null 829 0 + get .get anything person null null 0 0 + get anything container ifprop null 1 816 + get .remove anything container unlessobjis cat 0 0 + get .remove anything container unlessinsis bag 0 0 + get .remove anything container null null 764 0 + get anything flame null null 780 0 diff --git a/TXTTXT.GET b/TXTTXT.GET new file mode 100644 index 0000000..599b408 --- /dev/null +++ b/TXTTXT.GET @@ -0,0 +1,285 @@ +1 ? +2 ? +3 Not during a fight! +4 Nothing happens. +5 ? +6 ? +7 ? +8 Don't be silly, it takes years to invent something REALLY useful. +9 That's a very adventurous thing to say. Some people will try anything if + they're especially desperate... +11 Work it out yourself, where's the fun in asking me if you get stuck? +12 I'm afraid nothing happens. Well now what are you going to do? +13 Oh that's quite all right, no need to apologise. +14 It's very polite of you to say please, but I can't help. Well, I + won't... +16 *You hear a sudden + BBBBBB AAAAA NN NN GGGGG + BBBBBBB AAAAAAA NNN NN GGGGGGG + BB BB AA AA NNN NN GG GG + BB BB AA AA NNNN NN GG + BBBBBB AAAAAAA NNNN NN GG GGGG + BBBBBBB AAAAAAA NN NNNN GG GGGG + BB BB AA AA NN NNNN GG GG + BB BB AA AA NN NNN GG GG + BBBBBBB AA AA NN NNN GGGGGGG + BBBBBB AA AA NN NN GGGGG + in the distance. +17 *BBBBBB BBBBB NN NN GGGGG + BBBBBBB AAAAAAA NNN NN GGGGGGG + BB BB AA AA NNN NN GG GG + BB BB AA AA NNNN NN GG + BBBBBB AAAAAAA NNNN NN GG GGGG + BBBBBBB AAAAAAA NN NNNN GG GGGG + BB BB AA AA NN NNNN GG GG + BB BB AA AA NN NNN GG GG + BBBBBBB AA AA NN NNN GGGGGGG + BBBBBB AA AA NN NN GGGGG +18 Light it from a lit torch, you want to burn yourself or something?! + Remember the firework code... +19 You can't do that, you're not a high enough level. +20 You're already invisible! +21 You're already visible! +22 You've just become invisible! +23 You've just become visible! +24 That spell only works on people, I'm afraid. +25 You can't look, you're blind, aren't you? +26 You NEED to wish when you're dumb, like you are! The only thing is, you + can't speak the words... +27 You can't make the necessary hand movements to execute the spell + in such a small room as this. +28 You are cured of all your disablements! +29 The spell won't work if you're dumb yourself. +30 The spell won't work if you're crippled yourself. +31 The spell won't work if you're blind yourself. +32 The spell won't work if you're deaf yourself. +33 If you weren't a wiz you'd have just been struck dumb! +34 You have been struck dumb magically! +35 The spell doesn't work, and you are struck dumb yourself! +36 If you weren't a wiz you'd have just been crippled! +37 You have been crippled magically! +38 The spell doesn't work, and you are crippled yourself! +39 If you weren't a wiz you'd have just gone blind! +40 You have gone blind magically! +41 The spell doesn't work, and you go blind yourself! +42 If you weren't a wiz you'd have just gone deaf! +43 You have gone deaf magically! +44 The spell doesn't work, and you go deaf yourself! +45 There's not enough in the swamp for me to oblige. +46 You need to retaliate with a weapon. +47 You're not fighting anyone to retaliate against! +48 There is a sudden burning sensation in your chest, which grows + sharply in intensity and spreads to your throat. Coughing and + choking, you fall to your knees as it worsens, and you feel wracking + pains all through your body. Your eyesight grows blurred, and you + start to froth at the mouth. At once, your eyes roll upwards, your + tongue flops out, and you keel over backwards, dead... +49 In an attempt to keep the game uncorrupted, you have been killed. +67 This firestone GLOWS! You can't light other stuff from it! +68 The firestone glows, and you can't stop it... +88 You swing your mighty axe, and the next moment the portal is but + matchwood, and the doorway passable. Your axe breaks too, however, + due to the force of the chop. Delinquent vandal, I don't know... +90 Use an axe if you want to break down a door. You don't expect them + to be made out of balsa, do you? +100 The door creaks slowly open. +101 The door swings shut. +109 Your brand is now lit. +110 Your brand is now doused. +115 Ok, hope you're hungry! +131 The stick is now alight. +132 Nice try, but the sticks here are too thick for an old boy-scout + trick like that... +139 Ugh! It is foul! Hastily you stop drinking, but too late. Everything + swims about you and you feel giddy. You fall unconcious to the floor. +158 Drinking stuff in this land rarely has any effect. Now is no exception. +171 ZZZzzz... +177 This is a MAGIC fire so you can't extinguish it! How do you think it + keeps burning all the time? +183 The door is already open. +184 The door is locked shut, and needs keys to open it. +185 The door is already unlocked. +186 The key grates in the lock and unlocks the door. +187 The door is already closed. +188 The key grates in the lock and locks the door shut. +189 The door is already locked. +242 You have to be holding something alight to ignite something. +245 You can examine 'til your heart's content, you won't find anything + special. Heavens, if I let folk examine things they'd spend the whole + game doing it! +307 The torch isn't lit so you can't light anything from it... +308 The torch isn't lit so you can't melt anything with it... +328 You give them a great big sloppy kiss. +344 Think of something else sesaME... +365 You take a great draught, and a power swells through your body. The + liquid has a taste quite unlike any you have tasted before, and you + feel fully invigorated. Then, quite by surprise, the empty bottle + vanishes! +370 You don't find anything. +381 Far too difficult, I'm afraid, there are too many branches about. You + have to give up. +382 And very regal you look too! Shame you don't get any points for it, + though..! +391 You have to be carrying a lit brand if you want to light anything. +431 The cat tries to get out of your way but you graunch its head in. +432 It's dead for heaven's sake! They only have nine lives you know... +433 The cat isn't hungry. It's been living off enchanted sugar mice for + the past hundred and fifty years... +436 This is an enchanted forest. Hence, virtually every tree resists your + chops as if you'd been using an axe of wet paper. There might be a few + which you CAN chop down though, if you can find them... +443 Your hand gets cacked up with red goo from the cat's corpse... +444 The cat mioaws. +473 Oh my god, that's disgusting! I can't let you do that in THIS Land! +486 What? +488 The usually complacent cat suddenly becomes a spitting, biting, + clawing killer! +504 ? +505 If you want to lock it, try using a key. +519 How the hell do you expect a dead cat to eat anything?! +540 You know what happens to people who do that, don't you..? +548 I already told you what it said! +552 You give them an enormous big hug! +558 Light it with what? If you want to burn it with a torch, say so! +559 Unlock the door with what? If you want to unlock the door with keys, + why not say so? Just to please me? +560 Mere curiosity won't kill THIS cat, I'm afraid! +573 The clear, coloured liquid becomes cloudy when the medicine is added. Soon + you have added all the medicine and the container disintigrates. You + are now left with the potion only. Is it safe to drink..? +574 You take a gulp, but nothing seems to happen. The level of liquid in the + vial doesn't seem to lower. +575 You drink them both, and nothing happens. Maybe you should have mixed + them first? +577 OK, the mobiles are immobile. +578 The mobiles are mobile. +588 With what do you want to light the torch? Say things in full, + bedlamite! +590 The force isn't with you... +596 You can't dig here; wait until some tunnel or something collapses if + you REALLY want to get your hands dirty. +637 It's still alive! Kill it first, you moron - don't you know + ANYTHING about eating cats? +638 MMmm, yum-yum! That tasted good! +640 One doesn't cook cats, one eats them raw. I thought EVERYONE knew + that... +650 Your spell doesn't work, but the power of the magic involved makes you + fall asleep yourself instead! +654 3.14159, or thereabouts. +696 Limbo is nowhere, so there is nowhere to go when you leave the game. +714 Hammering things may be fun, but apart from that there's no effect. +724 It comes up heads. +725 It comes up tails. +739 Yes? +755 Your spell doesn't work. +756 Your spell worked! +762 OK, I've flushed out the last object you typed and all your pronouns. +764 That's let the cat out of the bag! +765 You start feeling queasy all of a sudden... +771 The flame catches hold, and burns the container to ashes, along + with everything inside it, at quite some considerable speed (magic?). + Well that was clever, wasn't it? +778 The syntax is FEED WITH . +780 You reach into the fire but its magical flames are too hot, and you + are forced to withdraw hastily before you are burned! +781 The magical flame consumes anything put in it. +782 The flames flicker around, and you can't see anything in them. +792 There's not enough room to swing a cat here. +793 There's enough room, and the cat swings quite well. +809 It doesn't make much difference with the sack, opened or closed. + Nothing will fall out anyway, and it's airtight. +810 It's already open, why don't you read the description? +811 The bag creaks open slowly. +812 The bag is now closed. +813 It's already closed. +814 Not when you're berserk! +816 The bag is closed. +823 Yale, union, lf. +826 There's not enough room down the toilet. +828 The basin is fixed down so you can't get it. +829 Better to be safe than sorry! +830 Not that old, "smash the cistern" joke again... +831 The toilet flushes. +833 *Levels of experience in MUD & VALLEY: + Level Points Male Female + 1 0 Novice Novice + 2 400 Warrior Warrior + 3 800 Hero Heroine + 4 1600 Champion Champion + 5 3200 Superhero Superheroine + 6 6400 Enchanter Enchantress + 7 12800 Sorcerer Sorceress + 8 25600 Necromancer Necromancess + 9 51200 Legend Legend + 10 102400 Wizard Witch +834 I suppose you must have a reason for being sick, but there's no + advantage in it. Still, it'd be a dull world if we were all the same, + eh? +836 You put it in, but it's too heavy to be carried off by the current so + you take it out again. +845 You have to be a hero or heroine before you are experienced enough to + wield an axe. +846 You can guarantee that some bright spark is going to type that just to + show how clever it is to swear at a dumb program. +849 Don't forget it's wizard locked... +862 That was refreshing! +871 A second or so later, as you wipe the vomit from your chin, you feel + much better. +873 You can't eat that! +874 By 'consume' I don't know whether you mean eat or drink. Since people + try some weird things in The Land, I'd appreciate your saying which + you meant to do explicitly, please. +879 I'm afraid you don't seem to be able to at the moment! +882 Your spell works, but the power of the magic you have invoked causes you + to fall into a deep slumber... +888 You have to say what it is you're writing in, followed by a comma, then + the message you wish to write. +889 OK, you're in a superseded version now. +907 Your stomach turns over and you feel quite giddy. You are feeling + very unwell, in fact. +914 You feel much better for the medicine, but it makes you feel EVER so + tired...>YAWN<... +955 Clouds are beginning to gather in the sky. +956 It has started to rain. +957 The skies clear, and it stops raining. +958 OK, it's winter... +959 It has started to snow. +960 The skies clear, and it stops snowing. +968 Your spell doesn't work. All of a sudden, you feel drowsy...ZZZ...zzz... +969 If you want to eat it you'll have to pick it up first. +970 The snake bites its fangs into your leg! You feel the poison flood + through your body... +971 As you reach to pick it up, the viper sinks its fangs into your arm! + You withdraw it, sucking at the wound, but it seems too late to stop + the poison infusion taking effect... +974 It's summer! +975 Cooked snake? Pick it up first then... +976 It ignores you. It's a full adder... +973 The viper suddenly bites deep into your foot with its fangs! You + manage to shake it off, but the poison is now in your blood... +979 Fighting is forbidden. +980 Fighting is allowed. +981 The cat is male, and it'll be buggered if it'll let you do THAT! +982 Well you chopped it up. Fun, eh? +1500 You're not in a clear enough space to let off a rocket, pick somewhere + out in the open more. +1501 It skeets up into the sky, leaving a blood-red trail behind it. You + watch, breathless... +1502 *High up in the sky you see an enormous red + ~~~~~~~ ~~ ~~~~~ ~~~~~ ~~ ~~ + ~~~~~~~ ~~ ~~~~~~~ ~~~~~~~ ~~ ~~ + ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ + ~~ ~~ ~~ ~~ ~~ ~~ ~~ + ~~~~ ~~ ~~~~~~~ ~~~~~~ ~~~~~~~ + ~~~~ ~~ ~~~~~~~ ~~~~~~ ~~~~~~~ + ~~ ~~ ~~ ~~ ~~ ~~ ~~ + ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ + ~~ ~~~~~~~ ~~ ~~ ~~~~~~~ ~~ ~~ + ~~ ~~~~~~~ ~~ ~~ ~~~~~ ~~ ~~. +1503 Your sparkler starts to sparkle! +1504 It's already lit! It's sparkling away quite happily! +1505 It's a magic sparkler, it won't go out... +1506 You hear a pin drop. +1507 In the distance you hear a pin drop. +1508 Type QUIT to quit, some dozy people keep hitting Q by accident. +1509 >>>>>SPARE<<<<< diff --git a/TXTVOC.GET b/TXTVOC.GET new file mode 100644 index 0000000..d7c918b --- /dev/null +++ b/TXTVOC.GET @@ -0,0 +1,37 @@ +*vocabulary +class treasure + gem + gems + tack + h2o + headstails + flowers + lavatory + stream + decoration + headdress + serpent + bowl + liquid + container + present + money + stone + space + medication + torch + forest + victuals + weather + access + yale + tool + flame + familiar + toggles + cliche + forum + firework + missile + spark + knob diff --git a/VALLEY.TXT b/VALLEY.TXT new file mode 100644 index 0000000..f1353fa --- /dev/null +++ b/VALLEY.TXT @@ -0,0 +1,1715 @@ +;Copyright (C) 1983 by +;Richard Bartle & Roy Trubshaw, +;Essex University, Colchester. CO4 3SQ. +; +; This software is furnished on the understanding that +;it may be used and or copied only with the inclusion of this +;notice. No title or ownership of this software is hereby +;transferred. The information in this software is subject to +;change without notice. No responsibility is assumed for the +;use or reliability of this software. +*name valley +*persona mud +@txtcbt +@txtlev +@txthrs +*rooms 96 +;Apart from rooms in the .GET file, this and the travel table are in +;alphabetical order. Keep it that way or you'll be sorry... +@txtrms +bank1 light + Bank of river. + You are stood on the grassy, west bank of a fast-flowing river. The + river flows from the north to the south, where can be seen a ford + across it. To the west you can see a tumble-down stable, and in the + distance north of that, mountains. On the opposite bank of the river + is dense forest. +bank2 light + %bank1 + This is the west bank of a river, which flows north to south very + quickly. The opposite bank is forested, but here the ground is clear. + To the northwest rise the steep slopes of a tall mountain, its peak + towering high above the clouds. +bank3 light + %bank1 + This is a narrow strip of land wedged between a fast-flowing river to + the east, and a (climbable) mountain to the west. The river cuts its + way north-south, and makes quite some noise. You can't see much of what + the landscape on the opposite bank is like for the trees there. +bank4 light + %bank1 + You find yourself on the bank of a fast-flowing river, where the + heath to the west is parted from the forest on the opposite bank. The + river flows from the north, and continues to the south, cutting off a + narrow strip of land trapped between it and the steep mountain you spy + to the southwest. +bank5 light + %bank1 + Flowing from the northeast and curving viciously to the south is a + fast-flowing river, upon the banks of which you now find yourself + situated. On the opposite bank are trees, although the river is too + quick to enable your swimming across. To the north is a curious, ornate + wall, decorated in exotic, colourful designs of seemingly eastern + origin. The wall is too tall to climb, as is the enormous hedge you find + to the west, over the top of which you can just see what looks to be a + belfry. The hedge stops on the edge of some trees, which are clumped + together to the southwest. +belfry small + Inside belfry. + You find yourself at the bottom of a belfry stood in a forest clearing. + Outside, to the east the way is blocked by a huge hedge, and to the + north is an ornate wall, decorated in colourful, oriental friezes. + Elsewhere is more forest. The tower of the belfry rises high above + you, but you can't climb the walls. +briar light + Briar patch. + You are gingerly pushing your way through a prickly briar patch, + skillfully avoiding being scratched from the many thorns about. To + the north runs an east-west road, and to the east is a yard outside + an old inn. South lies pasture, beyond which is a river, and west are + the foothills of a majestic mountain, spearing its way through the + fluffy clouds. +bridge light + Bridge over river. + You are crossing a narrow, wooden bridge over a fast-flowing river. + To the west lie the dark oaks of an evil wood, with the noise made by + the river only adding to the eerie effect of their hideous shadows. At + the eastern end of the bridge is a small island, bereft of trees, yet + looking quite lush compared to the fearsome dark of the forest. +dead1 light death + Did you think you could fly? Sorry if I gave that impression... +dead2 light death + You jump up and down, but the extra force is too much for the part + of the swamp where you stand, and to your horror you find yourself + being sucked under! Well that's something not to try again, eh? +dead3 light death + The volatile marsh gases catch light from your naked flame, and before + you know it, #WHOOMSH#... +efrst1 light + Dense forest. + You are wandering around in some dense forest on the west bank of a + fast-flowing river. To the north, the river is crossed by a ford, and + to the south it runs beside a meadow, beyond which you can see what + looks like a belvedere of some kind. At that point the river splits, + and curves round to the southwest of where you stand. West, the forest + seems to be primarily of fruit trees, and northwest through the greenery + you can see what looks like a well. +epstre light + East pasture. + You are standing in lush pasture, irrigated by a river which curves from + being to the east round to the north and continuing west of there to the + northwest of where you stand. The pasture carries on to the west and + southwest, but south is some rougher pasture which isn't so good. +ewd1 light + Evil wood. + You are wandering around in among the hideously deformed oaks of an evil + wood. To the north and east runs a river, and west is a rough pasture. + The wood gets thicker to the south, where it continues in an almost + impenetrable darkness... +ewd2 light + %ewd1 + You are forcing your way through the ancient, misshapen oaks which make + up an evil wood. The only ways out which do not involve continuing + into the denseness of the trees are to the north and west. Otherwise, + the darkness envelops... +ewd3 light + %ewd1 + You are thrusting your way through a mangled assortment of aged oak + trees which are part of an evil wood. Northwards, the trees give way to + a rough pasture, and to the easterly directions they continue in the + same density as here. Other directions, however, the forest becomes too + thick for you to force your way through... +ewd4 light + %ewd1 + You are in the midst of an evil wood, surrounded by gnarled oaks of + ancient origin. The forest continues all around you, in a darkness + which seems unnatural, although to the south and southwest it appears + too thick to move through... +ewd5 light + %ewd1 + You are in the depths of a murky, evil wood, its gloomy oaks seeming to + stare down at you as though watching your every movement. All around, + the forest continues, although in the southerly directions it appears + too thick to enable passage... +ewd6 light + %ewd1 + You are in an evil wood, on the west bank of a fast-flowing river. The + malformed oaks which enclose the area loom over you, throwing the whole + place into deep shadow. The wood continues in all directions except the + east, where the river runs, although to the south it is too dense for + you to venture that way... +ewd7 light + %ewd1 + You are in the middle of an evil wood, built up over many centuries from + a ghastly assortment of wizened oaks, twisted into a tangled + conglomeration. The forest continues in all directions... +ewd8 light + %ewd1 + This is part of an evil wood, on the west bank of a fast-flowing river. + The knotted, wicked-looking oaks continue in the south and westerly + directions, but other ways is the river. Through the trees, to the east, + can be seen a small bridge which spans the river to an island in mid- + stream... +ewd9 light + %ewd1 + You are pushing your way through the forlorn branches of some ancient + oaks in the middle of an evil wood. All around, the wood continues, its + oppressive gloom enveloping the entire scene... +ewd10 light + %ewd1 + You are stood in the very heart of an evil wood, its intense blackness + and eerie silence casting fear into your soul. The dense, warped oaks + carry on in all directions, and their thick branches obscure the sky + from view... +gazebo light small silent + Inside gazebo. + This is an ornate and elegant gazebo, built on a small eminence to + afford a better prospect of the surrounding countryside. North can + be seen a lush meadow, beyond which is a forest, and further still + a mountain. East is a fast-flowing river, which splits in two and + curves from the north round to the west, as well as continuing to the + south. Over the river can be seen forest, although south the trees are + of a hideous, misshapen form. +heath1 light + Rough heath. + You are striding across a rough heath, between a forest in the north + and a mountain to the south. East is the bank of a river, and west the + heath continues. Through the trees to the north can be glimpsed a + small tower of some kind. +heath2 light + %heath1 + You are walking across a rough heath, which continues to the east, west + and southwest. South is the base of a large mountain, the peak of which + is partly obscured by the clouds which flank it some way up. North from + here is mainly forest, although in the distance to the northwest is an + enormous mountain, more majestic than the other. +heath3 light + %heath1 + This is a band of rough heathland, which curves from the south to + continue to the east. Southeast lies the base of a large mountain, but + northwest are the foothills of one even larger, and far more majestic. + North is forest, through which can be espied an ornate wall. +heath4 light + %heath1 + You are scrambling over a rough heath, which rises out of a deep valley + to the south and carries on to the north and northeast. East is the + bottom of a large mountain, and west lie the foothills of an even + greater peak. The ground here is very awkward to walk on, but you can + keep your footing without too much trouble. +inn light + Inside the "Admiral Bombow" inn. + You stand inside what used to be a cheery, hospitable tavern, which has + now unfortunately fallen into a state of gross disrepair. All the + windows have long since been smashed, and now only a howling wind + whistles through where once there was warmth and light. +island light + Small island. + You are stood on a small island in the middle of a fast-flowing river. + The only exit is via a bridge to the west, which crosses the river into + a dark, evil wood. The island itself, mysteriously enough, has no trees, + but apart from that there is plenty of vegetation. +meadow light + Riverside meadow. + You are strolling through a pleasant meadow on the west bank of a fast- + flowing river. The river splits further to the south, and one branch + meanders northwards to end up to the west of where you stand. North + is a forest, and northwest a more cultivated section which seems to be + an orchard. South, by the fork in the river, stands a gazebo. +mmtn1 light + Middle mountain. + You are on the north face of a steep, yet climbable, mountain. Above + you to the south the slopes rise into the clouds, and poking out + through the top you espy the peak. The mountain continues at this level + to the southeast and southwest, whereas northwards is heathland. +mmtn2 light + %mmtn1 + This is the west face of a steep mountain. The summit lies beyond a + mantle of cloud which encircles the mountain just above you. Southwards + and to the northeast the mountain continues at this level, but to the + southwest it descends into a deep valley. North and west lie heaths, + and beyond them the mighty slopes of another mountain. +mmtn3 light + %mmtn1 + You are clambering about the southwest face of the Middle mountain. + Just above you, to the northeast, lie clouds hugging the slopes and + obscuring the summit. The mountain continues at roughly your present + altitude to the north and east, but to the west the gradient increases + dramatically and plunges into a deep valley. Southwards is a badly-paved + road running east to west, and beyond that to the southeast is another + mountain thrusting above the clouds. +mmtn4 light + %mmtn1 + This is a steep, yet thankfully climbable, mountain. The present height + above sea level is maintained to the west and northeast, but to the + north the mountain rises into the clouds and beyond. To the east you can + see a stable, and further still, a deep river. To the south is a badly- + paved road running east-west, on the opposite side of which there is an + inn. +mmtn5 light + %mmtn1 + You are now scaling the rugged east face of the middle mountain. + Although steep, it is still possible to ascend (into the mists which + drape the mountain beneath the peak) and descend (onto the banks of a + river to the east). At the same altitude, the mountain continues to the + northwest and southwest, and ceases to the south where is nestled a + ramshackle old stable. +mmtn6 light + Misty part of middle mountain. +mmtn7 light + %mmtn6 +mmtn8 light + %mmtn6 +mmtn9 light + %mmtn6 +mmtn10 light + Top of middle mountain. + The marvellous panoramic view this spot affords is breath-taking in its + splendour. Lower down the mountain, beyond the wreaths of cloud which + circle this peak, are heaths to the north, beyond which is forest. To + the east at the bottom can be seen a fast-flowing river, running from + the north to diverge some way south, by a meadow. South, there is an + old inn close by an east-west road, and southwest is another mountain. + The scene is dominated, however, by a third mountain to the northwest, + so immense that it dwarfs either of the other two. Its ancient slopes + are shrouded in mist, with rugged cliffs running for hundreds of feet + just below. +nfrst1 light + %efrst1 + You are wandering around in some dense forest. East, the forest + continues, and to the south lie heathlands. West are the foothills of a + majestic mountain, which towers high up above the clouds. Your progress + north is blocked by an ornate wall, decorated in exotic, eastern + patterns, which stops at the base of an enormous cliff at roughly the + same spot the forest ends to the west. +nfrst2 light + %efrst1 + You find yourself stood in a section of dense forest, which continues to + the west and southeast. Through the trees to the east can be seen the + tower of what looks to be a belfry, and south is heath. Northwards is + a strange, ornate wall, curiously enlivened by all manner of stylised + eastern symbols. +nfrst3 light + %efrst1 + You are wandering around in some dense forest to the north of some + sprawling heathlands. Eastwards is the bank of a fast-flowing river, + and northwest the forest continues. To the north, however, through the + trees, can be seen a clearing containing some sort of edifice. +nhill1 light + Foothills. + These are the rolling foothills of a majestic mountain which towers + high above you some way to the north, beyond some higher foothills. + South is an east-west road, across which can be seen yet more foothills + of a slightly smaller mountain. East lies a deep valley, which rises up + into a heath to the northeast of where you stand. West is a sturdy wall, + too large to scale. +nhill2 light + %nhill1 + You are stood amongst the foothills of a majestic mountain, which rises + to the north. South and northeast are more foothills, and east lies a + heath. Your movement west is prevented by a large wall, built to repel + intruders such as yourself. +nhill3 light + %nhill1 + You are clambering about the foothills of a majestic mountain which + climbs above the clouds to the north. Unfortunately, there is a towering + cliff there, too large to ascend, but part of the mountain, to the west, + is accessible. Southwest lie further foothills, and southeast is all + heath. Northeast is a forest. +nmtn1 light + Forested part of north mountain. + You are stood in amongst some trees which cloak the lower slopes of a + majestic mountain, rising to the north above the timber-line. West, the + forest becomes too dense for you to proceed, and south is a wall, also + blocking your way. All other directions, the mountain continues, + although southeast is only foothills. +nmtn2 light + North mountain. + You are scaling the lower slopes of a majestic mountain. Its peak lies + high above the clouds far to the north, although progress that way is + only limited due to an interposing cliff which stands out boldly after + some more climbable slopes. South are foothills. +nmtn3 light + %nmtn2 + You are standing in the lower slopes of a majestic mountain, which + rises to the north and descends to the east and south into foothills. +nmtn4 light + %nmtn2 + You are scrambling up the slopes of a majestic mountain which spears + through the clouds far to the north, above a steep cliff. East lie + foothills, and there are lower slopes to the south. The sheer + immensity of the mountain takes your breath away. +nmtn5 light + %nmtn2 + You are stood in the lower slopes of a majestic mountain beside a + huge cliff to the north, which towers high above you. So rugged is the + cliff that you cannot climb it, only gasp at the geological wonder of + it all. The mountain slopes downwards to the south, and continues at the + same level to the west. +nmtn6 light + %nmtn2 + You are in the corner of a horseshoe-shaped cliff, which curves round + from the north to the west, blocking your way. All around you in other + directions lie the slopes leading up to the cliff, which towers high + above you, ending just below the clouds. +nmtn7 light + %nmtn2 + You are ascending the lower slopes of a majestic mountain, which + forces its way through the clouds further to the north, above a rugged + cliff beyond where the slopes end. The cliff curves round, and blocks + your immediate passage to the west, although in other directions the + comparatively gentle slopes lead down to the foothills. +nmtn8 light + %nmtn2 + You are climbing the slopes of a majestic mountain, which continue to + rise awesomely in the northern and western directions, and descend less + spectacularly to the south and east. +npstre light + North pasture. + You are treading over the soft grass of a gorgeous pasture. To the north + is a river, which continues to the northeast and flows beneath a + mountain to the northwest. East, west and south, the pasture continues, + yet to the southeast it becomes much rougher and more desolate. To the + southwest lies forest. +orchrd light + Ancient orchard. + You stand among the aged trees of an orchard. Most of them are apple + trees, but there is the occasional pear tree to add character. None + bear fruit or leaves, however, which makes the scene unnaturally + desolate. East and west from here are normal forests, and southeast is a + sweet meadow. South and southwest is a river, and north is a yard, + beyond which is an inn. +pines1 light + Pine forest. + You are pushing your way through the pine needles in a dense forest. + Eastwards, the make-up of the forest changes to normal, deciduous trees. + Northeast is a pasture, and north can be smelled a fuming swamp. In all + other directions the pines get thicker, and you probably won't be able + to get through. +river1 light death hideaway + You have left The Land. +river2 light + Fast-flowing river. + You are wading through a fast-flowing, yet shallow, river, which + originates from a fork in a much faster river to the southeast, and + continues to the northwest. North is an orchard, which by the northeast + has become a normal forest. East is a meadow, south of which is a + gazebo. To the west lies a lush pasture, but southwest it is rough and + desolate. +river3 light + %river2 + This is a river flowing from the southeast to the west. On the south + bank lie exclusively pastures, and on the north, forest. The forest + directly to the north seems to be an orchard of some kind, and through + the trees there can be seen a building. +river4 light + %river2 + You are stood by a river, flowing from the east to the west, where it + disappears under a mountain. Foothills of the mountain are to the + northwest, covered in forest which extends to the north of your current + position, and become an orchard to the northeast. In all southerly + directions are pastures of soft, deep-green grass. +road1 light + Badly-paved road. + You are stood on a badly-paved road between a mountain, to the north, + and a wayside inn, to the south. East, the road fords a fast-flowing + river, and west it continues. To the northeast is a ramshackle old + building, and southeast there seems to be a well of some kind. +road2 light + %road1 + You find yourself on a badly-paved road, which continues to the east and + west. North and northeast are the lower regions of a mountain, which + rises up beyond the clouds. Southeast is a yard, belonging to an inn + which can be seen just beyond it. South is a briar patch, and southwest + the foothills of a more impressive mountain. Northwest is a deep valley, + whose western slopes rise up to the foothills of a mountain more + majestic still. The view is quite breathtaking. +road3 light + %road1 + You are walking along a badly-paved east-west road. From here can be + seen three mountains: one to the northeast; one to the south and south- + west; and one to the northwest, which is the largest. To the north, + between two of the mountains, lies a deep valley. The only other nearby + feature is a briar patch to the southeast. +road4 light + %road1 + You are stood on a badly-paved road, which runs from the east to stop + at a large wall constructed to the west. There is a narrow gap in this + blockage, but it is so tight that if you wanted to go that way you'd + have to drop everything to get through. North and south are the foot- + hills of a pair of majestic mountains, and northeast is a deep valley. +rough light + Rough pasture. + You are stood in a bleak, rough pasture. This seems to be due to the + presence of an evil wood to the east and south, for north and west are + more pastures which seem to be far greener and lusher than here. South- + west is a forest, and northeast there seems to be a fast-flowing river. +sfrst1 light + %efrst1 + You are standing in a dense forest. It continues to the southeast at + a passable level, but south it is too thick to allow movement through. + Westwards it becomes a pine forest. North, northeast and east are + pastures, and northwest lies a festering, fuming swamp. +sfrst2 light + %efrst1 + This is a forest, to the south of a pasture. The trees continue in most + directions, but only to the northwest are they thinly spread enough to + enable your walking through. Northwest is another pasture, but rougher + than the first. +shill1 light + %nhill1 + You are stood in among the foothills of a majestic mountain to the + south. North is a narrow road which runs east-west, and everywhere else + is more mountain. Your progress to the west is impeded by a strong wall, + built to keep out trespassers. +shill2 light + %nhill1 + You are standing in the foothills of a tall mountain, which rises away + to the southwest. North is a badly-paved road, which runs east-west, and + east is a briar patch. There are more foothills to the west, and to the + south are forested slopes of the mountain. +smtn1 light + South mountain. + You are clambering around the slopes of a tall mountain, which rises up + to the northeast into the clouds. North and east the mountain is at the + same level as here, and to the southeast it slops down into a gentle + pasture. Southwest is a swamp, fuming with marsh-gases, and west is the + top of a tall cliff, which looks very dangerous... +smtn2 light + %smtn1 + This is a steep climb at the base of a tall mountain. Further heights + are to the west and northeast at this level (the latter area covered in + forest), and north and northwest where the clouds hug the slopes. The + mountain lowers slowly in the southerly directions to become pastures. + East, a river flows and disappears under the mountain beneath where you + now stand. +smtn3 light + Forested part of south mountain. + Your are stood amongst the trees in the forested slopes of the south + mountain. There is more forest to the east, and the mountain ascends to + the west, its peak hidden from view by the clouds near the top. North + are foothills, and northeast a briar patch. Southeast flows a river. +smtn4 light + Misty part of south mountain. +smtn5 light + %smtn4 +smtn6 light + %smtn4 +smtn7 light + %smtn1 + You are on a steep slope to the west of a tall mountain. The mountain + continues in all directions, although to the east you can see nothing + for the clouds, and to the west there is a large wall in the way. +smtn8 light + %smtn4 +smtn9 light + Top of south mountain + You are standing at the very peak of the south mountain. A glorious + view is to be beheld all around. To the northeast is a mountain, on + the opposite side of a road from some building. To the north is a third + mountain much larger than either of the other two, and far more + majestic. South lie pastures, and southeast is an evil-looking wood, + hard up against the side of a river, in which can be seen a small + island. West, over a wall just visible through the clouds, is a stange, + anachronistic world, centred around a house. +spstre light + South pasture. + This is a pleasant pasture, which spreads far away in all the northerly + directions; eastwards, it becomes rougher. There is forest everywhere + else. +swamp1 light hideaway sanctuary nolook dmove uswamp + You are waylaid in a fuming swamp. +stable + Stable. + This ramshackle old stone building is what is left of a once proud + stable. It has sadly fallen into disrepair, due to the constant + battering of the elements, nestled as it is to the southeast of a + towering mountain. To the east is a river bank, the river running + north-south and forded to the southeast of where you now stand. To + the southwest, running west from the ford, is a badly-paved road, + beside which is an inn, the patrons of which stabled their horses here + before The Land became what it is today. +start light startrm + Ford across river. + You are stood on a ford across a fast-flowing river. To the west is a + badly-paved road, which carries on into the distance. Northwest is a + ramshackle old building, and southwest is some sort of well. South lies + a forest, and north is the west bank of the river you now cross. The + east bank leads away, out of The Land. +uswamp light death sanctuary + Bottom of swamp. + If you can read this, you used magic! +valley light + Valley between mountains. + This is a beautiful and awesome sight. You are stood in a deep valley, + carved between two tall mountains, to the west and east, eons ago. The + steep slopes are barely climbable, and abound in curious fauna and + strange, half-shadowed creatures. South, outside the valley, is an + east-west road, and north is heathland. This place is very eerie. +wayout light nolook chain mud start + You force yourself through the narrow gap... +wellrm light + Well near inn. + You stand beside what used to be a well, but which on closer inspection + seems to be blocked off now. West is an inn, for which the well was + probably originally constructed, although some way to the east can be + heard running water. North is an east-west road, and southwest an + orchard of mainly apple trees. Southeast is dense forest. +wfrst1 light + %efrst1 + This is dense forest, at the bottom of a majestic mountain to the west. + The trees continue up the mountain, and there is an orchard to the east. + North is a briar patch, and south is an east-west flowing river. To the + Northeast is a yard adjacent to an old inn. +wpstre light + West pasture. + This is a pasture which sprawls at the feet of a majestic mountain to + the north. The pasture continues to the east and southeast, but south + and southwest are forests. West, the pasture ends beside a fuming swamp. +yard1 light + Side yard of inn. + This is a narrow yard at the western side of an inn. North is a badly- + paved raod, and west a briar patch. Southeast, the yard becomes the back + yard of the inn. +yard2 light + Back yard of inn. + This is a wide yard to the south of an old tavern, and continues to the + side of it to the northwest. South is an orchard, and southwest is a + forest. To the east there seems to be a well, near the inn. +@txtmap +@txtvoc + bats + beacon + bolt + bow + clove + coat + crucifix + denizen + edge + hawthorn + insect + lucifer + mb + mist + pit + quiver + sheep + undead +@txtcsy +@txtobj + flock bats 50000 17 + beacon1 beacon 0 0 + beacon2 beacon 0 0 + beacon3 beacon 0 0 + box mb 5 7 + butterfly insect 2 30 + case quiver 1000 0 + cliff edge 0 0 + cross crucifix 100 10 + crossbow bow 6000 0 + fleece coat 2000 18 + fog mist 0 0 + garlic clove 20 3 + hedge hawthorn 0 0 + match lucifer 1 3 + quarrel bolt 100 0 + ram sheep 70000 50 + troll denizen 80000 75 + vampire undead 120000 200 + well pit 0 0 + wraith undead 100000 200 +@txtosy + bf butterfly + cb crossbow + matchbox box + cloud mist + silver cross + tree trees + qu quarrel +@txtmtn +action drop none none holdfirst null 0 0 + drop none none flipat null 0 0 + drop something stream move null store 1022 + drop something lavatory move null store 1023 + drop lucifer container ifprop null 0 1051 +@txttop + blow lucifer none unlessprop null 0 1041 + blow lucifer none set null 2 0 + climb space none null null 1013 0 + climb forest none null null 1067 0 + climb hawthorn none null null 1070 0 + close mb none inc null 1033 1034 + douse lucifer none unlessprop null 0 1041 + douse lucifer none set null 2 1042 ;as $burning + douse beacon none ifzero null 1056 1057 + drop anything mb ifprop box 1 1053 + drop .insert lucifer mb unlessprop null 0 0 + drop .insert lucifer mb destroydestroy second 1052 0 + drop .insert anything mb null null 0 0 + drop .insert anything quiver null null 0 0 ;let them put lit brands in etc + drop .drop familiar pit expdestroy null 1060 0 + drop coat sheep inc null 1064 1063 + eat clove none expdestroy null 1029 0 + enter none none null null 1014 0 + fell none none null null 1021 0 + fix something stream move null store 1022 + fix something lavatory move null store 1023 + fix anything mb ifprop box 1 1053 + fix .insert lucifer mb unlessprop null 0 0 + fix .insert lucifer mb destroydestroy second 1052 0 + fix .insert anything mb null null 0 0 + fix .insert anything quiver null null 0 0 + fix coat sheep inc null 1064 1063 + fly none none null null 1018 0 + get anything mb unlessprop null 0 1059 + get .remove anything mb null null 0 0 + get .remove anything quiver null null 0 0 + get .get crucifix none null null 1030 0 + get anything denizen null null 1068 0 + get familiar none unlessprop null 9 1069 + hints none none null null 1012 0 + kill .kill undead none unlessobjis vampire 0 0 + kill undead crucifix null null 1027 0 + kill undead clove null null 1027 0 + kill .kill undead none ifgot cross 0 0 + kill .kill undead none ifgot garlic 0 0 + kill .kill undead none loseexp null 200 1028 + kill lucifer none unlessgot box 1043 0 + kill lucifer none ifprop null 0 1035 + kill lucifer none ifprop null 2 1036 + kill lucifer none dec null 1037 0 -44 + kill mb none unlessprop null 0 1058 + kill .empty mb none null null 0 0 + kill .empty quiver none null null 0 0 + kill .kill denizen torch ifprop second 1 0 -4 + kill denizen torch hurt null 40 1061 -4 + kill insect none destroy null 1065 0 -4 + leave none none null null 1015 0 + light beacon torch ifprop null 0 1047 + light beacon torch dec null 1046 1047 -45 + light lucifer torch null null 1045 0 + light lucifer none unlessgot box 1043 0 + light lucifer none ifprop null 0 1035 + light lucifer none ifprop null 2 1036 + light lucifer none dec null 1037 0 -44 + light something lucifer ifprop second 1 1038 + light something lucifer ifprop second 2 1039 + light torch lucifer dec null 109 1040 + light something lucifer null null 1044 0 + light mb torch destroy null 771 0 + light mb flame destroy null 771 0 + light something beacon unlessprop second 0 1054 + light torch beacon dec null 109 4 + light something beacon null null 1055 0 + load bow none ifprop null 0 1072 + load bow bolt decdestroy second 1073 0 + load bow none null null 1074 0 + make none none null null 1050 0 + open mb none dec null 1031 1032 + shear sheep none null null 1062 0 + shoot bow none unlessprop crossbow 0 1079 + shoot something bow unlessprop crossbow 0 1079 + shoot person bow unlessprop crossbow 0 1079 + shoot person bow sendemon null 47 1077 -51 + shoot person bow null null 1083 0 + shoot sheep bow injure null 10 1077 -51 + shoot denizen bow injure null 10 1077 -51 + shoot bats bow injure null 10 1077 -51 + shoot serpent bow injure null 10 1077 -51 + shoot feline bow null null 1080 0 + shoot undead bow null null 1081 0 -51 + shoot insect bow null null 1082 0 -51 + shoot bow none inc crossbow 1078 1079 + shoot something bow inc crossbow 1078 1079 + summon none none null null 1050 0 + swim none river null null 1016 0 + swim none h2o null null 1025 0 + swim none none null null 1017 0 + tap none none null null 1020 0 + unload bow none ifzero null 1075 1076 + where none none null null 1050 0 + worship none none null null 1019 0 +@txtbtm + pray worship + hint hints + lo load +;;vocabulary demon actions +action $alllit none none ifprop beacon1 1 0 + $alllit none none ifprop beacon2 1 0 + $alllit none none ifprop beacon3 1 0 + $alllit none none exp null 45 1049 + $burning none none set match 2 0 + $deaded none none destroy butterfly 0 0 + $ouch none none losestamina null 7 1071 + $shoot none none set crossbow 1 0 + $smash .vis none none null null 0 0 + $vampire none none ifwiz null 0 0 + $vampire none none ifgot garlic 1027 0 + $vampire none none ifgot cross 1027 0 + $vampire .provoke something none ifgot cross 0 0 + $vampire .provoke something none ifgot garlic 0 0 + $vampire .provoke something none loseexp null 200 0 +@txtdac +*demons 59 +@txtdmn +43 $vampire whichever none -1 +44 $burning none none 12 always +45 $alllit none none -1 +46 $deaded none none 120-300 global enabled +47 $ouch none none -1 +51 $shoot none none -1 always +*objects +case island 0 0 1 contains 1000 transparent opened +0 A quarrel case lies here. +bouquet store 0 0 0 +0 A beautiful bouquet of fragrant flowers lines by your feet. +pin store 0 0 0 +0 A shiny new pin lies at your feet! +crossbow smtn3 1 1 2 +0 A loaded crossbow has been dropped here. +1 An unloaded crossbow lies on the ground. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +quarrel case 0 0 1 +0 A crossbow bolt has fallen here. +almanac store 0 0 1 noget bright +0 ? +bag stable 0 1 2 contains 7000 opened +0 A musty old bag is here, opened. +1 A musty old bag is here, closed. +sack bag 0 0 1 contains 5000 +0 There is an old sack here. +coin inn 0 0 0 +0 A golden coin lies here, bearing on one side the image of a head, on + the reverse a picture of a tail. +beads belfry 0 0 0 +0 Some smoked-glass beads are strewn at your feet. +coinval store 0 -1 2 noget +0 Someone tossed a heads. +1 Someone tossed a tails. +jewels store 0 0 0 +0 Some fabulous jewels here make you catch your breath in amazement! +starstone store 0 0 0 +0 A loose starstone has tumbled here. +jet store 0 0 0 +0 A piece of jet has been left here. +topaz store 0 0 0 +0 At your feet lies a large topaz. +troll 15 0 6 mmtn9 0 0 0 80 noget contains 20000 disguised +0 A slimy troll is lurking here... +bloodstone troll 0 0 0 +0 To one side, a deep-red bloodstone attracts your attention. +amethyst store 0 0 0 +0 Glinting in the light you espy a polished amethyst. +clasp store 0 0 0 +0 A silver clasp has been dropped on the ground here. +garnet store 0 0 0 +0 You notice a strangely-carven piece of garnet by your feet. +;banger nfrst1 0 0 0 +;0 A firework marked "banger" lies at your feet. +;rocket nfrst1 0 0 0 +;0 A rocket (firework variety) has been discarded here. +;sparkler nfrst1 1 1 1 bright +;0 There is a sparkling sparkler here, its pretty, glittering flecks of +; light cascading around it! +;1 There is an unlit sparkler here. +holly xmasbx 0 0 0 +0 A bough of holly is not decking the hall here. +xmastree xmasbx 0 0 0 +0 A beautiful Christmas tree is here, bedecked with baubles. +mousse xmasbx 0 0 0 +0 The heady aroma of a shockingly pink-flavoured mousse here tempts your + palate! +mouse xmasbx 0 0 0 +0 A sugar mouse is not-quite-enchanted here. +candle xmasbx 0 0 0 bright +0 A candle shines brightly here, and the darkness has never quenched it. +snowman xmasbx 0 0 0 +0 A snowman nearby gives you a frosty stare. +cracker xmasbx 0 0 0 +0 A Christmas cracker lies here. +carolbook xmasbx 0 0 0 +0 There is a Christmas carol book here, full of Christmas carols too + numerous to recount and too twee to sing. +reindeer 20 0 6 xmasbx 0 0 0 bright noget +0 A sturdy reindeer lumbers past you nearby. +sleigh xmasbx 0 0 0 +0 Nearby is a sleigh. +santaclaus 0 0 6 xmasbx 0 0 0 noget +0 Ho ho ho, Father Christmas here again, with your Christmas gifts! +mincepies xmasbx 0 0 0 +0 Some prettily-mouldy mince pies sit sumptiously on the floor, beautiful + to behold. +plumpudding xmasbx 0 0 0 +0 There is some plum pudding here, recently doused. +turkey 5 0 6 xmasbx 0 0 0 50 noget +0 A turkey here tries frantically to put its feathers back in. +buckle gazebo 0 0 0 +0 A shiny buckle has somehow found its way here. +potion island 0 1 1 +0 A vial of clear purple potion has been placed here. +1 A vial of cloudy purple potion has been placed here. +sapphire store 0 0 0 +0 A deep blue sapphire draws your attention nearby. +doubloons store 0 0 0 +0 A pile of doubloons glisters here! +pieces inn 0 0 0 +0 Some pieces of eight lie scattered around here. +groats inn 0 0 0 +0 Some golden groats lie here! +firestone store 0 0 0 bright nosummon +0 A beautiful, irridescent firestone glows nearby. +cat 300 0 6 ewd6 0 9 9 +9 A dead cat has been left here. +8 A panther the size of a house, with sabre-teeth, billowing forth roars + of flame, stares at you in a maddened rage with its fiery eyes! +7 A massive, enraged, sabre-toothed panther roars uncontrollably + before you! +6 An enormous, fire-breathing panther roars terrifyingly at you! +5 A large, fiery-eyed panther growls loudly at you! +4 A lithe panther stands here, growling darkly. +3 A gigantic, jet-black cat arches its back here, menacingly. +2 An enormous, coal-black cat is here, hissing and spitting angrily. +1 A large, velvet-black cat is here, purring discontentedly. +0 A small, sleek, black cat sits here, purring happily to itself. +snake 15 0 40 ewd2 0 0 0 90 +0 A viper slithers past your feet. +wall nfrst1 0 0 1 noget noit +wall nfrst2 0 0 1 noget noit +wall belfry 0 0 1 noget noit +wall bank5 0 0 1 noget noit +wall nmtn1 0 0 1 noget noit +wall nhill2 0 0 1 noget noit +wall nhill1 0 0 1 noget noit +wall road4 0 0 1 noget noit +wall shill1 0 0 1 noget noit +wall smtn6 0 0 1 noget noit +wall smtn7 0 0 1 noget noit +hedge belfry 0 0 1 noget noit +hedge bank5 0 0 1 noget noit +cliff smtn1 0 0 1 noget noit +trees nfrst1 0 0 1 noget noit +trees nfrst2 0 0 1 noget noit +trees nfrst3 0 0 1 noget noit +trees nmtn1 0 0 1 noget noit +trees smtn3 0 0 1 noget noit +trees orchrd 0 0 1 noget noit +trees efrst1 0 0 1 noget noit +trees wfrst1 0 0 1 noget noit +trees sfrst1 0 0 1 noget noit +trees sfrst2 0 0 1 noget noit +trees pines1 0 0 1 noget noit +trees ewd1 0 0 1 noget noit +trees ewd2 0 0 1 noget noit +trees ewd3 0 0 1 noget noit +trees ewd4 0 0 1 noget noit +trees ewd5 0 0 1 noget noit +trees ewd6 0 0 1 noget noit +trees ewd7 0 0 1 noget noit +trees ewd8 0 0 1 noget noit +trees ewd9 0 0 1 noget noit +trees ewd10 0 0 1 noget noit +painting store 0 0 0 +0 Catching your attention is a beautiful painting, which has not + yet been finished. +candlestick store 0 0 0 +0 A richly decorated brass candlestick lies on the ground. +toilet store 0 0 1 noget noit +river bank1 0 0 1 noget noit +river bank2 0 0 1 noget noit +river bank3 0 0 1 noget noit +river bank4 0 0 1 noget noit +river bank5 0 0 1 noget noit +river start 0 0 1 noget noit +river river1 0 0 1 noget noit +river river2 0 0 1 noget noit +river river3 0 0 1 noget noit +river river4 0 0 1 noget noit +river efrst1 0 0 1 noget noit +river meadow 0 0 1 noget noit +river gazebo 0 0 1 noget noit +river ewd1 0 0 1 noget noit +river ewd8 0 0 1 noget noit +river bridge 0 0 1 noget noit +river island 0 0 1 noget noit +river ewd6 0 0 1 noget noit +water bank1 0 0 1 noget noit +water bank2 0 0 1 noget noit +water bank3 0 0 1 noget noit +water bank4 0 0 1 noget noit +water bank5 0 0 1 noget noit +water start 0 0 1 noget noit +water river2 0 0 1 noget noit +water river3 0 0 1 noget noit +water river4 0 0 1 noget noit +water efrst1 0 0 1 noget noit +water meadow 0 0 1 noget noit +water gazebo 0 0 1 noget noit +water ewd1 0 0 1 noget noit +water ewd8 0 0 1 noget noit +water bridge 0 0 1 noget noit +water island 0 0 1 noget noit +water ewd6 0 0 1 noget noit +water wellrm 0 0 1 noget noit +basin store 0 0 1 noget noit +well wellrm 0 0 1 noget noit +diamond store 0 0 0 +0 A diamond weighing about an ounce catches your gaze here! +medicine inn 0 1 0 +0 There is some medicine here. +1 There is some partially-drunk medicine here. +key store 0 0 1 +0 A set of rusty keys can be seen on the ground. +key store 0 0 0 +0 A set of shiny keys can be seen on the ground. +door store 2 2 3 +0 The door is open. +1 The door is closed. +2 The door is locked shut. +crown store 0 0 0 +0 Gleaming in front of you is a magnificent crown! +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 +1 It is raining. +2 It is snowing. +fog mmtn6 mmtn7 mmtn8 mmtn9 smtn4 smtn5 smtn6 smtn8 0 0 1 noit noget +axe 0 -1 0 +0 A mighty axe lies on the ground here. +1 A mighty axe shines on the ground here. +beacon1 mmtn10 1 1 2 bright noget +0 A warning beacon shines here, brightly. +1 There is a long-disused warning beacon here. +beacon2 nmtn6 1 1 2 bright noget +0 %beacon1 +1 %beacon1 +beacon3 smtn9 1 1 2 bright noget +0 %beacon1 +1 %beacon1 +brand 1 1 2 bright +0 There is a burning fire brand here. +1 There is a large stick on the ground. +brand nhill1 1 1 2 bright +0 %brand +1 %brand +brand efrst1 1 1 2 bright +0 %brand +1 %brand +brand smtn3 1 1 2 bright +0 %brand +1 %brand +brand nmtn1 1 1 2 bright +0 %brand +1 %brand +brand orchrd 1 1 2 bright +0 %brand +1 %brand +brand ewd6 1 1 2 bright +0 %brand +1 %brand +fire store 0 0 1 bright contains 256000 noget disguised +0 A roaring fire is burning in the grate, spreading a cosy feeling around + the room. +off store 0 0 1 noget +curiosity store 0 0 1 noget +sesame store 0 0 1 noget +box 1 2 1 contains 40 opened +0 There is an open matchbox here. +1 There is a closed matchbox here. +match box 1 3 3 bright +0 You can see a lit match. +1 You can see an unused safety match. +2 You can see a spent match. +flock 20 0 6 belfry 0 0 0 60 noget +0 A flock of bats swoops around your head. +flock 3 0 6 ewd3 0 0 0 80 noget +0 A flock of vampire bats swoops around your head. +vampire 7 0 43 ewd4 0 0 0 200 noget +0 A powerful vampire materialises before you! +wraith 9 0 6 ewd5 0 0 0 100 noget +0 A wraith of death glides silently towards you... +garlic yard1 0 0 0 +0 A clove of garlic lies by your feet. +cross belfry 0 0 0 +0 You see a silver cross here! +butterfly 1 0 6 valley 0 0 0 1 +0 A butterfly flutters by. +fleece ewd5 0 1 1 +0 The fleece of a sheep is here. +1 A silver fleece glisters before you! +ram 2 0 6 smtn6 0 0 0 70 noget +0 A recently-sheared ram grazes here. +*travel go +home n store in + n start [o n ne e] + n swamp1 swamp +store n road4 n ne e se s sw w nw in o swamp jump u d +limbo door limbo o +xmasbx n xmasbx n +bank1 n bank2 nw n ne u + 1002 e + n start se s sw swamp o d + n stable w in +bank2 n bank3 n ne u + 1002 e + n bank1 se s swamp o d + n stable sw in + n mmtn5 w nw +bank3 n bank4 n ne u + 1002 e + n bank2 se s swamp o d + n mmtn5 sw w nw +bank4 n bank5 n ne u + 1002 e + n bank3 se s o d + n mmtn5 sw swamp + n heath1 w + n nfrst3 nw +bank5 1003 nw n + 1002 ne e u + n bank4 se s swamp o d + n nfrst3 sw + 1004 w +belfry 1003 n ne + 1004 e se + n nfrst3 s sw swamp o d + n nfrst2 w nw +briar n road2 n + n road1 ne o + n yard1 e + n yard2 se + n wfrst1 s + n smtn3 sw swamp u + n shill2 w + n road3 nw +bridge 1002 n ne se s sw nw u d + n island e + n ewd8 w swamp o +dead1 n dead2 n +dead2 n dead3 n +dead3 n dead1 n +efrst1 n start n ne o u + 1002 e + n meadow se s d + n river2 sw swamp + n orchrd w in + n wellrm nw +epstre n river3 n ne + n river2 e o + n rough se s + n spstre sw + n npstre w swamp + n river4 nw +ewd1 serpent 0 n ne o u w nw swamp + bats 0 n ne o u w nw swamp + undead 0 n ne o u w nw swamp + n river2 n ne o u + 1002 e d + n se + n ewd9 s + n ewd2 sw + n rough w nw swamp +ewd2 serpent 0 w nw n swamp + bats 0 w nw n swamp + undead 0 w nw n swamp + n rough w nw n swamp + n ne o + n ewd9 e + n ewd10 se + n ewd4 s + n ewd3 sw +ewd3 serpent 0 nw n swamp o + bats 0 nw n swamp o + undead 0 nw n swamp o + n rough nw n swamp o + n ewd2 ne e + n ewd4 se + 1005 s sw w +ewd4 n ewd2 n + n ewd9 ne o + n ewd10 e + n ewd7 se + 1005 s sw + n ewd3 w nw swamp +ewd5 n ewd7 n o + n ewd6 ne e se + 1005 s sw w + n ewd4 nw swamp +ewd6 n ewd8 n o u + 1002 ne e se d + 1005 s + n ewd5 sw + n ewd7 w + n ewd10 nw swamp +ewd7 n ewd10 n + n ewd8 ne o + n ewd6 e se + n ewd5 s + 1005 sw + n ewd4 w nw swamp +ewd8 serpent 0 e + bats 0 e + undead 0 e + 1002 ne se u + n bridge e + n ewd6 s d + n ewd10 sw + n ewd9 w + n ewd1 nw swamp o +ewd9 n n ne o + n ewd8 e se + n ewd10 s + n ewd4 sw + n ewd2 w nw swamp +ewd10 n ewd9 n o + n ne e + n ewd6 se + n ewd7 s + n ewd4 sw w + n ewd2 nw swamp +gazebo n meadow n ne o u + 1002 e se s sw d + n river2 w nw swamp +heath1 n nfrst3 n + n bank4 ne e + n mmtn5 se swamp o + n mmtn1 s sw u + n heath2 w nw +heath2 n nfrst2 n + n nfrst3 ne + n heath1 e + n mmtn1 se + n mmtn2 s o + n heath4 sw swamp u + n heath3 w + n nfrst1 nw +heath3 n nfrst1 n + n nfrst2 ne + n heath2 e + n mmtn2 se u + n heath4 s swamp o + n nhill2 sw + n nhill3 w nw +heath4 n heath3 n + n heath2 ne + n mmtn2 e u + n mmtn3 se o + n valley s swamp d + n nhill1 sw + n nhill2 w nw +inn n road1 nw n + n start ne o + n wellrm e se + n yard2 s sw swamp + n yard1 w +island 1002 nw n ne e se s sw u d + n bridge w swamp o +meadow n efrst1 n ne o u + 1002 e + n gazebo se s in d + n river2 sw w swamp + n orchrd nw +mmtn1 n heath1 n ne d + n mmtn5 e se o + n mmtn7 s u + n mmtn2 sw swamp + n heath2 w nw +mmtn2 n heath2 n + n mmtn1 ne + n mmtn7 e + n mmtn8 se u + n mmtn3 s o + n valley sw swamp in d + n heath4 w + n heath3 nw +mmtn3 n mmtn2 n + n mmtn9 ne u + n mmtn4 e + n road1 se o + n road2 s + n road3 sw swamp + n valley w in d + n heath4 nw +mmtn4 n mmtn9 n u + n mmtn5 ne + n stable e se in + n road1 s o d + n road2 sw swamp + n mmtn3 w + n mmtn8 nw +mmtn5 n heath1 n + n bank4 ne + n bank3 e d + n bank2 se + n stable s o in + n mmtn4 sw swamp + n mmtn6 w u + n mmtn1 nw +mmtn6 n mmtn1 nw n + n mmtn5 ne e se o d + n mmtn9 s sw swamp + n mmtn7 w u +mmtn7 n mmtn1 nw n ne d + n mmtn6 e + n mmtn10 se s u + n mmtn8 sw swamp o + n mmtn2 w +mmtn8 n mmtn7 n ne + n mmtn10 e u + n mmtn4 se o + n mmtn3 s sw swamp + n mmtn2 w nw d +mmtn9 n mmtn10 n u + n mmtn6 ne + n mmtn5 e + n stable se o in d + n mmtn4 s + n mmtn3 sw swamp + n mmtn8 w nw +mmtn10 n mmtn7 nw n d + n mmtn6 ne e + n mmtn9 se s swamp o + n mmtn8 sw w +nfrst1 1003 n + n nfrst2 ne e + n heath2 se o + n heath3 s swamp + n nhill3 sw w nw u +nfrst2 bats 0 s o sw swamp w nw + 1003 n + n belfry ne e in + n nfrst3 se + n heath2 s o + n heath3 sw swamp + n nfrst1 w nw +nfrst3 bats 0 ne e se o s sw w swamp + n belfry n in + n bank5 ne e + n bank4 se o + n heath1 s + n heath2 sw w swamp + n nfrst2 nw +nhill1 n nhill2 nw n u + n heath4 ne + n valley e in d + n road3 se o + n road4 s sw swamp + 1006 w +nhill2 n nmtn2 n u + n nhill3 ne + n heath4 e + n valley se o in d + n nhill1 s sw swamp + 1006 w + n nmtn1 nw +nhill3 1007 n u + n nfrst1 ne + n heath3 e se d + n nhill2 s sw swamp o + n nmtn4 w + n nmtn5 nw +nmtn1 n nmtn7 nw n + n nmtn8 ne u + n nmtn2 e + n nhill2 se swamp o d + 1006 s sw + 1005 w +nmtn2 n nmtn8 n u + n nmtn3 ne e + n nhill2 se s sw swamp o d + n nmtn1 w + n nmtn7 nw +nmtn3 n nmtn4 n + n nhill3 ne e d + n nhill2 se s swamp o + n nmtn2 sw w + n nmtn8 nw u +nmtn4 n nmtn5 nw n u + n nhill3 ne e se o d + n nmtn2 s sw swamp + n nmtn8 w +nmtn5 1007 n ne u + n nhill3 e o d + n nmtn4 se + n nmtn8 s swamp + n nmtn7 sw + n nmtn6 w nw +nmtn6 1007 w nw n u + n nmtn5 ne e + n nmtn8 se o d + n nmtn7 s sw swamp +nmtn7 n nmtn6 nw n u + n nmtn5 ne + n nmtn8 e + n nmtn2 se o d + n nmtn1 s sw swamp +nmtn8 n nmtn5 n ne + n nmtn4 e + n nmtn3 se o + n nmtn2 s swamp d + n nmtn1 sw + n nmtn7 w + n nmtn6 nw u +npstre n river4 n + n river3 ne o + n epstre e + n rough se + n spstre s + n sfrst1 sw + n wpstre w swamp + n smtn2 nw u +orchrd n yard2 nw n + n wellrm ne o + n efrst1 e + n meadow se + n river3 s swamp + n river4 sw + n wfrst1 w +pines1 torch dead3 nw n swamp in + lucifer dead3 nw n swamp in + spark dead3 nw n swamp in + n swamp1 nw n swamp in + n wpstre ne o + n sfrst1 e se + 1008 s sw w +river1 e start w swamp +river2 n orchrd nw n in + n efrst1 ne o + n meadow e + n gazebo se in u + n ewd1 s + n rough sw + n epstre w swamp + n river3 nw d +river3 n orchrd n ne o + n meadow e + n river2 se u + n epstre s + n npstre sw swamp + n river4 w d + n wfrst1 nw +river4 n wfrst1 n + n orchrd ne o in + n river3 e u + n epstre se + n npstre s sw swamp + n smtn2 w + n smtn3 nw +road1 n mmtn4 n u + n stable ne + n start e o + n wellrm se + n inn s in + n yard1 sw swamp + n road2 w + n mmtn3 nw +road2 n mmtn3 n u + n mmtn4 ne + n road1 e o + n yard1 se + n briar s + n shill2 sw swamp + n road3 w + n valley nw in +road3 n valley n in d + n mmtn3 ne u + n road2 e o + n briar se + n shill2 s swamp + n shill1 sw + n road4 w + n nhill1 nw +road4 n nhill1 nw n + n valley ne in d + n road3 e o + n shill2 se + n shill1 s sw u swamp + e wayout west + 1026 west +rough n epstre n + n river2 ne o + n ewd1 e + n ewd2 se + n ewd3 s + n sfrst2 sw + n spstre w swamp + n spstre nw +sfrst1 n wpstre n + n npstre ne o + n spstre e + n sfrst2 se + 1005 s + n pines1 sw w + torch dead3 nw swamp in + lucifer dead3 nw swamp in + spark dead3 nw swamp in + n swamp1 nw swamp in +sfrst2 n spstre n + n rough ne o + 1005 e se s sw w + n sfrst1 nw swamp +shill1 sheep 0 n ne nw o d + n road4 nw n d + n road3 ne o + n shill2 e + n smtn5 se u + n smtn6 s sw swamp + 1006 w +shill2 sheep 0 n ne e se nw o d + n road3 n d + n road2 ne o + n briar e + n wfrst1 se + n smtn3 s swamp + n smtn4 sw u + n shill1 w + n road4 nw +smtn1 sheep 0 se s sw swamp in d jump + n smtn7 nw n + n smtn8 ne u + n smtn2 e o + n wpstre se s + torch dead3 sw swamp in d + lucifer dead3 sw swamp in d + spark dead3 sw swamp in d + n swamp1 sw swamp in d + 1009 w + n dead1 jump +smtn2 sheep 0 e se s sw swamp d + n smtn4 n + n smtn3 ne o + n river4 e + n npstre se s d + n wpstre sw swamp + n smtn1 w + n smtn8 nw u +smtn3 sheep 0 ne e se s swamp o d + n shill2 n + n briar ne o + n wfrst1 e d + n river4 se + n npstre s swamp + n smtn2 sw + n smtn4 w nw u +smtn4 n shill2 n ne o d + n smtn3 e se + n smtn2 s swamp + n smtn8 sw + n smtn9 w u + n smtn5 nw +smtn5 n shill1 w nw n d + n shill2 ne e o + n smtn4 se + n smtn9 s d + n smtn6 sw swamp +smtn6 n shill1 nw n d + n smtn5 ne o + n smtn9 e u + n smtn8 se + n smtn7 s swamp + 1006 sw w +smtn7 n smtn6 n ne + n smtn8 e o u + n smtn1 se s sw swamp d + 1006 w nw +smtn8 n smtn9 n ne u + n smtn4 ne e o + n smtn2 se s d + n smtn1 sw swamp + n smtn7 w + n smtn6 nw +smtn9 n smtn5 n + n smtn4 ne e se o d + n smtn8 s sw swamp + n smtn6 w nw +spstre n npstre n + n epstre ne o + n rough e + n sfrst2 s se sw + n sfrst1 w swamp + n wpstre nw +swamp1 1010 w nw n + n smtn1 ne u + n wpstre e o + n sfrst1 se + n pines1 s sw + 1011 swamp + n dead2 jump +stable n mmtn5 n + n bank2 ne + n bank1 e + n start se s o + n road1 sw swamp + n mmtn4 w + n mmtn9 nw u +start n bank1 n ne u + e river1 e o + n efrst1 se s swamp d + n wellrm sw + n road1 w + n stable nw in +uswamp n swamp1 o u swamp in +valley n heath4 n + n mmtn2 ne + n mmtn3 e u + n road2 se o + n road3 s swamp + n road4 sw + n nhill1 w + n nhill2 nw +wayout e road4 e o +wellrm n start n ne o + n efrst1 e se + n orchrd s sw swamp + n inn w in + n road1 nw +wfrst1 n briar n + n yard2 ne + n orchrd e o in + n river3 se + n river4 s sw swamp + n smtn3 w u + n shill2 nw +wpstre n smtn1 nw n u + n smtn2 ne + n npstre e o + n spstre se + n sfrst1 s + n pines1 sw + torch dead3 w swamp in + lucifer dead3 w swamp in + spark dead3 w swamp in + n swamp1 w swamp in +yard1 n road1 n ne o + n inn e in + n yard2 se s + n wfrst1 sw swamp + n briar w + n road2 nw +yard2 n inn n in + n wellrm ne e o + n orchrd se s + n wfrst1 sw swamp + n briar w + n yard1 nw +*text 1600 +@txttxt +1001 Testing, testing, one two? + ?Illegal memory reference at user PC 100160 +1002 The river is flowing too fast for you to be able to cross. +1003 Your way is blocked by the ornate wall. +1004 You cannot move that way for the tall hedge. +1005 The forest becomes too dense to move in that direction. +1006 The wall is too high to climb. +1007 The mountain is too steep to ascend in that direction. +1008 The pines are too thick for you to go that way. +1009 You can't go that way! It's an enormous cliff! +1010 The swamp is too treacherous to travel in that direction. +1011 You're already here! Have a look around if you don't believe me! +1012 There's only one hint at the moment: it's useless asking for hints! +1013 The surface of the wall is too smooth to climb. +1014 Use "in" if you want to enter something, as "enter" is reserved for + entering objects within a room. At the moment, there aren't any such + objects, but the term is preserved for compatibility with MUD. +1015 Use "out" if you want to leave somewhere, as "leave" is reserved for + leaving objects within a room. At the moment, there aren't any such + objects, but the term is preserved for compatibility with MUD. +1016 The river's too fast to swim in, I'm afraid. +1017 There's no water here! +1018 You flap your wings and...nothing happens. +1019 Why worship? There aren't any gods around. +1020 Tap...tap...tappity-tap... +1021 There aren't any trees here, and nothing else is fell-able. +1022 That's the last time you'll see that! It floats off down the river + at a great speed, and fast disappears from view... +1023 The object flushes away. Now where do you suppose THAT went? +1024 >>>>>SPARE<<<<< +1025 The water isn't deep enough to swim in. +1026 The gap is too narrow, you'll have to drop everything to get through. +1027 The vampire shies away from you. +1028 The vampire's chilling touch makes you feel cold all over. +1029 Your breath smells a bit, but it was quite tasty! +1030 With a touch of annoyance, you pick it up. +1031 The matchbox is now open. +1032 It's already open, look at it! +1033 The matchbox is now closed. +1034 You can't close closed matchboxes, or is that too hard a concept for + you to grasp? +1035 The match is already alight! Do something, before it goes out! +1036 The match is spent, they only light the once... +1037 The match bursts into flame! +1038 The match isn't lit. +1039 The match has gone out. +1040 The stick is already alight. +1041 The match isn't lit anyway. +1042 The match goes out. +1043 It's a safety match, you need the box. +1044 The match's flame doesn't give off enough heat to do it. +1045 The match is unaffected. +1046 The beacon quickly catches fire, and is soon burning well. +1047 It's already lit...sigh. +1048 The match won't light anything as large as a beacon. +1049 When you light the last unlit beacon, a great thrill runs through + your body at the magnificence of it all. +1050 It doesn't work me old mate. +1051 You'd set fire to the container! +1052 The match and matchbox burn away. +1053 The matchbox is closed, how do you expect to put anything in it? Let + me guess - you're thick. +1054 The beacon isn't alight, chum. +1055 The beacon is too hot to get close enough to light anything, although + you could perhaps be able to stand a stick held at arm's length. +1056 You can't get close enough to the beacon to douse it, it's too hot. +1057 It's not alight anyway. +1058 The matchbox is closed, open it to empty it. +1059 The matchbox is closed, open it if you want to remove something. +1060 OK, so you know all the nursery rhymes... +1061 The troll reels back in terror as you brandish your brand, but it's + too late and your strike scorches deep into its flesh. +1062 It's just BEEN sheared, it's got no wool on! +1063 The ram wants nothing to do with the silver fleece. +1064 The fleece glows a white light for an instant, then transmutes to + silver! Naturally you remove it from the ram as soon as this happens, + about which the ram seems relieved. +1065 You swat the butterfly stone dead, but it disintigrates in the process. + Don't be TOO upset, they don't live that long anyway! +1066 >>>>>SPARE<<<<< +1067 The trees are unclimbable, even the ones that aren't too tall are still + too branchy. +1068 The troll won't let you near it, it's prepared to kill rather than + give up its treasure! +1069 The cat doesn't want to be picked up, and successfully avoids your + attempts to do so. +1070 Nope, it's too prickly. +1071 A crossbow bolt thuds into your chest! +1072 It's already loaded! They only take one bolt at a time, you know... +1073 The crossbow is now loaded. +1074 The crossbow can only be loaded with quarrels. If you've got one, why + not try loading it with that? +1075 The bolt is in too tight to unload the crossbow, you'll have to shoot + it at something or someone to get it out. +1076 It already is unloaded, don't you believe the descriptions you're given? +1077 You score a direct hit! +1078 The crossbow misfires and embeds the bolt deep in the ground where you + can't recover it. +1079 It's not loaded... +1080 Your crossbow jams when you aim at your target. Who says black cats + aren't lucky? +1081 You score a direct hit, but it has no effect on the undead! +1082 It's too small, you miss... +1083 You can only shoot targets in the same room as you, the crossbow is only + effective over short ranges. -- 2.31.1