emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 3340052 1/4: Move all dunnet globals up to the top


From: Mark Oteiza
Subject: [Emacs-diffs] master 3340052 1/4: Move all dunnet globals up to the top
Date: Sun, 19 Feb 2017 08:50:12 -0500 (EST)

branch: master
commit 33400529c61d98a8db9e8dbb1b686a5b55964403
Author: Mark Oteiza <address@hidden>
Commit: Mark Oteiza <address@hidden>

    Move all dunnet globals up to the top
    
    * lisp/play/dunnet.el: Adjust comments to reflect moved forms.
    (dun-visited, dun-current-room, dun-exitf):
    (dun-badcd, dun-computer, dun-floppy, dun-key-level, dun-hole):
    (dun-correct-answer, dun-lastdir, dun-numsaves, dun-jar, dun-dead):
    (room, dun-numcmds, dun-wizard, dun-endgame-question, dun-logged-in):
    (dungeon-mode, dun-unix-verbs, dun-dos-verbs, dun-batch-mode):
    (dun-cdpath, dun-cdroom, dun-uncompressed, dun-ethernet):
    (dun-restricted, dun-ftptype, dun-endgame, dun-rooms):
    (dun-light-rooms, dun-verblist, dun-inbus, dun-nomail, dun-ignore):
    (dun-mode, dun-sauna-level, north, south, east, west, northeast):
    (southeast, northwest, southwest, up, down, in, out, dungeon-map):
    (dun-objnames, obj-special, dun-room-objects, dun-room-silents):
    (dun-inventory, dun-objects, dun-object-lbs, dun-object-pts):
    (dun-objfiles, dun-perm-objects, dun-physobj-desc, dun-permobj-desc):
    (dun-diggables, dun-room-shorts, dun-endgame-questions): Move to the
    top of the file, before any uses.
---
 lisp/play/dunnet.el | 3767 ++++++++++++++++++++++++++-------------------------
 1 file changed, 1886 insertions(+), 1881 deletions(-)

diff --git a/lisp/play/dunnet.el b/lisp/play/dunnet.el
index 8ddb680..08189c1 100644
--- a/lisp/play/dunnet.el
+++ b/lisp/play/dunnet.el
@@ -43,1350 +43,56 @@
   :type 'file
   :group 'dunnet)
 
-;;;; Mode definitions for interactive mode
-
-(define-derived-mode dun-mode text-mode "Dungeon"
-  "Major mode for running dunnet."
-  (make-local-variable 'scroll-step)
-  (setq scroll-step 2))
-
-(defun dun-parse (_arg)
-  "Function called when return is pressed in interactive mode to parse line."
-  (interactive "*p")
-  (beginning-of-line)
-  (let ((beg (1+ (point)))
-        line)
-    (end-of-line)
-    (if (and (not (= beg (point))) (not (< (point) beg))
-             (string= ">" (buffer-substring (- beg 1) beg)))
-        (progn
-          (setq line (downcase (buffer-substring beg (point))))
-          (princ line)
-          (if (eq (dun-vparse dun-ignore dun-verblist line) -1)
-              (dun-mprinc "I don't understand that.\n")))
-    (goto-char (point-max))
-    (dun-mprinc "\n")))
-  (dun-messages))
-
-(defun dun-messages ()
-  (if dun-dead
-      (text-mode)
-    (if (eq dungeon-mode 'dungeon)
-       (progn
-         (if (not (= room dun-current-room))
-             (progn
-               (dun-describe-room dun-current-room)
-               (setq room dun-current-room)))
-         (dun-fix-screen)
-         (dun-mprinc ">")))))
-
-
-;;;###autoload
-(defun dunnet ()
-  "Switch to *dungeon* buffer and start game."
-  (interactive)
-  (switch-to-buffer "*dungeon*")
-  (dun-mode)
-  (setq dun-dead nil)
-  (setq room 0)
-  (dun-messages))
-
 ;;;;
-;;;; This section contains all of the verbs and commands.
+;;;; This section defines the globals that are used in dunnet.
 ;;;;
+;;;; IMPORTANT
+;;;; All globals which can change must be saved from 'save-game.  Add
+;;;; all new globals to bottom of file.
 
-;;; Give long description of room if haven't been there yet.  Otherwise
-;;; short.  Also give long if we were called with negative room number.
-
-(defun dun-describe-room (room)
-  (if (and (not (member (abs room) dun-light-rooms))
-          (not (member obj-lamp dun-inventory))
-          (not (member obj-lamp (nth dun-current-room dun-room-objects))))
-      (dun-mprincl "It is pitch dark.  You are likely to be eaten by a grue.")
-    (dun-mprincl (cadr (nth (abs room) dun-rooms)))
-    (if (and (and (or (member room dun-visited)
-                     (string= dun-mode "dun-superb")) (> room 0))
-            (not (string= dun-mode "long")))
-       nil
-      (dun-mprinc (car (nth (abs room) dun-rooms)))
-    (dun-mprinc "\n"))
-    (if (not (string= dun-mode "long"))
-       (if (not (member (abs room) dun-visited))
-           (setq dun-visited (append (list (abs room)) dun-visited))))
-    (dolist (xobjs (nth dun-current-room dun-room-objects))
-      (if (= xobjs obj-special)
-         (dun-special-object)
-       (if (>= xobjs 0)
-           (dun-mprincl (car (nth xobjs dun-objects)))
-         (if (not (and (= xobjs obj-bus) dun-inbus))
-             (progn
-               (dun-mprincl (car (nth (abs xobjs) dun-perm-objects)))))))
-      (if (and (= xobjs obj-jar) dun-jar)
-         (progn
-           (dun-mprincl "The jar contains:")
-           (dolist (x dun-jar)
-             (dun-mprinc "     ")
-             (dun-mprincl (car (nth x dun-objects)))))))
-    (if (and (member obj-bus (nth dun-current-room dun-room-objects)) 
dun-inbus)
-       (dun-mprincl "You are on the bus."))))
-
-;;; There is a special object in the room.  This object's description,
-;;; or lack thereof, depends on certain conditions.
-
-(defun dun-special-object ()
-  (if (= dun-current-room computer-room)
-      (if dun-computer
-         (dun-mprincl
-"The panel lights are flashing in a seemingly organized pattern.")
-       (dun-mprincl "The panel lights are steady and motionless.")))
-
-  (if (and (= dun-current-room red-room)
-          (not (member obj-towel (nth red-room dun-room-objects))))
-      (dun-mprincl "There is a hole in the floor here."))
-
-  (if (and (= dun-current-room marine-life-area) dun-black)
-      (dun-mprincl
-"The room is lit by a black light, causing the fish, and some of
-your objects, to give off an eerie glow."))
-  (if (and (= dun-current-room fourth-vermont-intersection) dun-hole)
-      (progn
-       (if (not dun-inbus)
-           (progn
-             (dun-mprincl "You fall into a hole in the ground.")
-             (setq dun-current-room vermont-station)
-             (dun-describe-room vermont-station))
-         (progn
-           (dun-mprincl
-"The bus falls down a hole in the ground and explodes.")
-           (dun-die "burning")))))
-
-  (if (> dun-current-room endgame-computer-room)
-      (progn
-       (if (not dun-correct-answer)
-           (dun-endgame-question)
-         (dun-mprincl "Your question is:")
-         (dun-mprincl dun-endgame-question))))
-
-  (if (= dun-current-room sauna)
-      (progn
-       (dun-mprincl (nth dun-sauna-level '(
-"It is normal room temperature in here."
-"It is luke warm in here."
-"It is comfortably hot in here."
-"It is refreshingly hot in here."
-"You are dead now.")))
-       (if (= dun-sauna-level 3)
-           (progn
-             (if (or (member obj-rms dun-inventory)
-                     (member obj-rms (nth dun-current-room dun-room-objects)))
-                 (progn
-                   (dun-mprincl
-"You notice the wax on your statuette beginning to melt, until it completely
-melts off.  You are left with a beautiful diamond!")
-                   (if (member obj-rms dun-inventory)
-                       (progn
-                         (dun-remove-obj-from-inven obj-rms)
-                         (setq dun-inventory (append dun-inventory
-                                                     (list obj-diamond))))
-                     (dun-remove-obj-from-room dun-current-room obj-rms)
-                     (dun-replace dun-room-objects dun-current-room
-                                  (append (nth dun-current-room 
dun-room-objects)
-                                          (list obj-diamond))))))
-             (if (or (member obj-floppy dun-inventory)
-                     (member obj-floppy (nth dun-current-room 
dun-room-objects)))
-                 (progn
-                   (dun-mprincl
-"You notice your floppy disk beginning to melt.  As you grab for it, the
-disk bursts into flames, and disintegrates.")
-                   (dun-remove-obj-from-inven obj-floppy)
-                   (dun-remove-obj-from-room dun-current-room 
obj-floppy))))))))
-
-
-(defun dun-die (murderer)
-  (dun-mprinc "\n")
-  (if murderer
-      (dun-mprincl "You are dead."))
-  (dun-do-logfile 'dun-die murderer)
-  (dun-score nil)
-  (setq dun-dead t))
-
-(defun dun-quit (_args)
-  (dun-die nil))
+(setq dun-visited '(27))
+(setq dun-current-room 1)
+(setq dun-exitf nil)
+(setq dun-badcd nil)
+(setq dun-computer nil)
+(setq dun-floppy nil)
+(setq dun-key-level 0)
+(setq dun-hole nil)
+(setq dun-correct-answer nil)
+(setq dun-lastdir 0)
+(setq dun-numsaves 0)
+(setq dun-jar nil)
+(setq dun-dead nil)
+(setq room 0)
+(setq dun-numcmds 0)
+(setq dun-wizard nil)
+(setq dun-endgame-question nil)
+(setq dun-logged-in nil)
+(setq dungeon-mode 'dungeon)
+(setq dun-unix-verbs '((ls . dun-ls) (ftp . dun-ftp) (echo . dun-echo)
+                      (exit . dun-uexit) (cd . dun-cd) (pwd . dun-pwd)
+                      (rlogin . dun-rlogin) (ssh . dun-rlogin)
+                      (uncompress . dun-uncompress) (cat . dun-cat)))
 
-;;; Print every object in player's inventory.  Special case for the jar,
-;;; as we must also print what is in it.
+(setq dun-dos-verbs '((dir . dun-dos-dir) (type . dun-dos-type)
+                     (exit . dun-dos-exit) (command . dun-dos-spawn)
+                     (b: . dun-dos-invd) (c: . dun-dos-invd)
+                     (a: . dun-dos-nil)))
 
-(defun dun-inven (_args)
-  (dun-mprinc "You currently have:")
-  (dun-mprinc "\n")
-  (dolist (curobj dun-inventory)
-    (if curobj
-       (progn
-         (dun-mprincl (cadr (nth curobj dun-objects)))
-         (if (and (= curobj obj-jar) dun-jar)
-             (progn
-               (dun-mprincl "The jar contains:")
-               (dolist (x dun-jar)
-                 (dun-mprinc "     ")
-                 (dun-mprincl (cadr (nth x dun-objects))))))))))
 
-(defun dun-shake (obj)
-  (let (objnum)
-    (when (setq objnum (dun-objnum-from-args-std obj))
-      (if (member objnum dun-inventory)
-         (progn
-;;;    If shaking anything will do anything, put here.
-           (dun-mprinc "Shaking ")
-           (dun-mprinc (downcase (cadr (nth objnum dun-objects))))
-           (dun-mprinc " seems to have no effect.")
-           (dun-mprinc "\n")
-           )
-       (if (and (not (member objnum (nth dun-current-room dun-room-silents)))
-                (not (member objnum (nth dun-current-room dun-room-objects))))
-           (dun-mprincl "I don't see that here.")
-;;;     Shaking trees can be deadly
-         (if (= objnum obj-tree)
-             (progn
-               (dun-mprinc
- "You begin to shake a tree, and notice a coconut begin to fall from the air.
-As you try to get your hand up to block it, you feel the impact as it lands
-on your head.")
-               (dun-die "a coconut"))
-           (if (= objnum obj-bear)
-               (progn
-                 (dun-mprinc
-"As you go up to the bear, it removes your head and places it on the ground.")
-                 (dun-die "a bear"))
-             (if (< objnum 0)
-                 (dun-mprincl "You cannot shake that.")
-               (dun-mprincl "You don't have that.")))))))))
+(setq dun-batch-mode nil)
 
-
-(defun dun-drop (obj)
-  (if dun-inbus
-      (dun-mprincl "You can't drop anything while on the bus.")
-  (let (objnum)
-    (when (setq objnum (dun-objnum-from-args-std obj))
-      (if (not (member objnum dun-inventory))
-         (dun-mprincl "You don't have that.")
-       (progn
-         (dun-remove-obj-from-inven objnum)
-         (dun-replace dun-room-objects dun-current-room
-                  (append (nth dun-current-room dun-room-objects)
-                          (list objnum)))
-         (dun-mprincl "Done.")
-         (if (member objnum (list obj-food obj-weight obj-jar))
-             (dun-drop-check objnum))))))))
-
-;;; Dropping certain things causes things to happen.
-
-(defun dun-drop-check (objnum)
-  (if (and (= objnum obj-food) (= room bear-hangout)
-          (member obj-bear (nth bear-hangout dun-room-objects)))
-      (progn
-       (dun-mprincl
-"The bear takes the food and runs away with it. He left something behind.")
-       (dun-remove-obj-from-room dun-current-room obj-bear)
-       (dun-remove-obj-from-room dun-current-room obj-food)
-       (dun-replace dun-room-objects dun-current-room
-                (append (nth dun-current-room dun-room-objects)
-                        (list obj-key)))))
-
-  (if (and (= objnum obj-jar) (member obj-nitric dun-jar)
-          (member obj-glycerine dun-jar))
-      (progn
-       (dun-mprincl
-        "As the jar impacts the ground it explodes into many pieces.")
-       (setq dun-jar nil)
-       (dun-remove-obj-from-room dun-current-room obj-jar)
-       (if (= dun-current-room fourth-vermont-intersection)
-           (progn
-             (setq dun-hole t)
-             (setq dun-current-room vermont-station)
-             (dun-mprincl
-"The explosion causes a hole to open up in the ground, which you fall
-through.")))))
-
-  (if (and (= objnum obj-weight) (= dun-current-room maze-button-room))
-      (dun-mprincl "A passageway opens.")))
-
-;;; Give long description of current room, or an object.
-
-(defun dun-examine (obj)
-  (let (objnum)
-    (setq objnum (dun-objnum-from-args obj))
-    (if (eq objnum obj-special)
-       (dun-describe-room (* dun-current-room -1))
-      (if (and (eq objnum obj-computer)
-              (member obj-pc (nth dun-current-room dun-room-silents)))
-         (dun-examine '("pc"))
-       (if (eq objnum nil)
-           (dun-mprincl "I don't know what that is.")
-         (if (and (not (member objnum
-                               (nth dun-current-room dun-room-objects)))
-                  (not (and (member obj-jar dun-inventory)
-                            (member objnum dun-jar)))
-                  (not (member objnum
-                               (nth dun-current-room dun-room-silents)))
-                  (not (member objnum dun-inventory)))
-             (dun-mprincl "I don't see that here.")
-           (if (>= objnum 0)
-               (if (and (= objnum obj-bone)
-                        (= dun-current-room marine-life-area) dun-black)
-                   (dun-mprincl
-"In this light you can see some writing on the bone.  It says:
-For an explosive time, go to Fourth St. and Vermont.")
-                 (if (nth objnum dun-physobj-desc)
-                     (dun-mprincl (nth objnum dun-physobj-desc))
-                   (dun-mprincl "I see nothing special about that.")))
-             (if (nth (abs objnum) dun-permobj-desc)
-                 (progn
-                   (dun-mprincl (nth (abs objnum) dun-permobj-desc)))
-               (dun-mprincl "I see nothing special about that.")))))))))
-
-(defun dun-take (obj)
-    (setq obj (dun-firstword obj))
-    (if (not obj)
-       (dun-mprincl "You must supply an object.")
-      (if (string= obj "all")
-         (let (gotsome)
-           (if dun-inbus
-               (dun-mprincl "You can't take anything while on the bus.")
-             (setq gotsome nil)
-             (dolist (x (nth dun-current-room dun-room-objects))
-               (if (and (>= x 0) (not (= x obj-special)))
-                   (progn
-                     (setq gotsome t)
-                     (dun-mprinc (cadr (nth x dun-objects)))
-                     (dun-mprinc ": ")
-                     (dun-take-object x))))
-             (if (not gotsome)
-                 (dun-mprincl "Nothing to take."))))
-       (let (objnum)
-         (setq objnum (cdr (assq (intern obj) dun-objnames)))
-         (if (eq objnum nil)
-             (progn
-               (dun-mprinc "I don't know what that is.")
-               (dun-mprinc "\n"))
-           (if (and dun-inbus (not (and (member objnum dun-jar)
-                                        (member obj-jar dun-inventory))))
-               (dun-mprincl "You can't take anything while on the bus.")
-             (dun-take-object objnum)))))))
-
-(defun dun-take-object (objnum)
-  (if (and (member objnum dun-jar) (member obj-jar dun-inventory))
-      (let (newjar)
-       (dun-mprincl "You remove it from the jar.")
-       (setq newjar nil)
-       (dolist (x dun-jar)
-         (if (not (= x objnum))
-             (setq newjar (append newjar (list x)))))
-       (setq dun-jar newjar)
-       (setq dun-inventory (append dun-inventory (list objnum))))
-    (if (not (member objnum (nth dun-current-room dun-room-objects)))
-       (if (not (member objnum (nth dun-current-room dun-room-silents)))
-           (dun-mprinc "I do not see that here.")
-         (dun-try-take objnum))
-      (if (>= objnum 0)
-         (progn
-           (if (and (car dun-inventory)
-                    (> (+ (dun-inven-weight) (nth objnum dun-object-lbs)) 11))
-               (dun-mprinc "Your load would be too heavy.")
-             (setq dun-inventory (append dun-inventory (list objnum)))
-             (dun-remove-obj-from-room dun-current-room objnum)
-             (dun-mprinc "Taken.  ")
-             (if (and (= objnum obj-towel) (= dun-current-room red-room))
-                 (dun-mprinc
-                  "Taking the towel reveals a hole in the floor."))))
-       (dun-try-take objnum)))
-    (dun-mprinc "\n")))
-
-(defun dun-inven-weight ()
-  (let (total)
-    (setq total 0)
-    (dolist (x dun-jar)
-      (setq total (+ total (nth x dun-object-lbs))))
-    (dolist (x dun-inventory)
-      (setq total (+ total (nth x dun-object-lbs)))) total))
-
-;;; We try to take an object that is untakable.  Print a message
-;;; depending on what it is.
-
-(defun dun-try-take (_obj)
-  (dun-mprinc "You cannot take that."))
-
-(defun dun-dig (_args)
-  (if dun-inbus
-      (dun-mprincl "Digging here reveals nothing.")
-  (if (not (member 0 dun-inventory))
-      (dun-mprincl "You have nothing with which to dig.")
-    (if (not (nth dun-current-room dun-diggables))
-       (dun-mprincl "Digging here reveals nothing.")
-      (dun-mprincl "I think you found something.")
-      (dun-replace dun-room-objects dun-current-room
-              (append (nth dun-current-room dun-room-objects)
-                      (nth dun-current-room dun-diggables)))
-      (dun-replace dun-diggables dun-current-room nil)))))
-
-(defun dun-climb (obj)
-  (let (objnum)
-    (setq objnum (dun-objnum-from-args obj))
-    (cond ((not objnum)
-          (dun-mprincl "I don't know what that object is."))
-         ((and (not (eq objnum obj-special))
-               (not (member objnum (nth dun-current-room dun-room-objects)))
-               (not (member objnum (nth dun-current-room dun-room-silents)))
-               (not (and (member objnum dun-jar) (member obj-jar 
dun-inventory)))
-               (not (member objnum dun-inventory)))
-          (dun-mprincl "I don't see that here."))
-         ((and (eq objnum obj-special)
-               (not (member obj-tree (nth dun-current-room dun-room-silents))))
-          (dun-mprincl "There is nothing here to climb."))
-         ((and (not (eq objnum obj-tree)) (not (eq objnum obj-special)))
-          (dun-mprincl "You can't climb that."))
-         (t
-          (dun-mprincl
-           "You manage to get about two feet up the tree and fall back down.  
You
-notice that the tree is very unsteady.")))))
-
-(defun dun-eat (obj)
-  (let (objnum)
-    (when (setq objnum (dun-objnum-from-args-std obj))
-      (if (not (member objnum dun-inventory))
-         (dun-mprincl "You don't have that.")
-       (if (not (= objnum obj-food))
-           (progn
-             (dun-mprinc "You forcefully shove ")
-             (dun-mprinc (downcase (cadr (nth objnum dun-objects))))
-             (dun-mprincl " down your throat, and start choking.")
-             (dun-die "choking"))
-         (dun-mprincl "That tasted horrible.")
-         (dun-remove-obj-from-inven obj-food))))))
-
-(defun dun-put (args)
-    (let (newargs objnum objnum2 obj)
-      (setq newargs (dun-firstwordl args))
-      (if (not newargs)
-         (dun-mprincl "You must supply an object")
-       (setq obj (intern (car newargs)))
-       (setq objnum (cdr (assq obj dun-objnames)))
-       (if (not objnum)
-           (dun-mprincl "I don't know what that object is.")
-         (if (not (member objnum dun-inventory))
-             (dun-mprincl "You don't have that.")
-           (setq newargs (dun-firstwordl (cdr newargs)))
-           (setq newargs (dun-firstwordl (cdr newargs)))
-           (if (not newargs)
-               (dun-mprincl "You must supply an indirect object.")
-             (setq objnum2 (cdr (assq (intern (car newargs)) dun-objnames)))
-             (if (and (eq objnum2 obj-computer) (= dun-current-room pc-area))
-                 (setq objnum2 obj-pc))
-             (if (not objnum2)
-                 (dun-mprincl "I don't know what that indirect object is.")
-               (if (and (not (member objnum2
-                                     (nth dun-current-room dun-room-objects)))
-                        (not (member objnum2
-                                     (nth dun-current-room dun-room-silents)))
-                        (not (member objnum2 dun-inventory)))
-                   (dun-mprincl "That indirect object is not here.")
-                 (dun-put-objs objnum objnum2)))))))))
-
-(defun dun-put-objs (obj1 obj2)
-  (if (and (= obj2 obj-drop) (not dun-nomail))
-      (setq obj2 obj-chute))
-
-  (if (= obj2 obj-disposal) (setq obj2 obj-chute))
-
-  (if (and (= obj1 obj-cpu) (= obj2 obj-computer))
-      (progn
-       (dun-remove-obj-from-inven obj-cpu)
-       (setq dun-computer t)
-       (dun-mprincl
-"As you put the CPU board in the computer, it immediately springs to life.
-The lights start flashing, and the fans seem to startup."))
-    (if (and (= obj1 obj-weight) (= obj2 obj-button))
-       (dun-drop '("weight"))
-      (if (= obj2 obj-jar)                 ;; Put something in jar
-         (if (not (member obj1 (list obj-paper obj-diamond obj-emerald
-                                     obj-license obj-coins obj-egg
-                                     obj-nitric obj-glycerine)))
-             (dun-mprincl "That will not fit in the jar.")
-           (dun-remove-obj-from-inven obj1)
-           (setq dun-jar (append dun-jar (list obj1)))
-           (dun-mprincl "Done."))
-       (if (= obj2 obj-chute)                 ;; Put something in chute
-           (progn
-             (dun-remove-obj-from-inven obj1)
-             (dun-mprincl
-"You hear it slide down the chute and off into the distance.")
-             (dun-put-objs-in-treas (list obj1)))
-         (if (= obj2 obj-box)              ;; Put key in key box
-             (if (= obj1 obj-key)
-                 (progn
-                   (dun-mprincl
-"As you drop the key, the box begins to shake.  Finally it explodes
-with a bang.  The key seems to have vanished!")
-                   (dun-remove-obj-from-inven obj1)
-                   (dun-replace dun-room-objects computer-room (append
-                                                       (nth computer-room
-                                                            dun-room-objects)
-                                                       (list obj1)))
-                   (dun-remove-obj-from-room dun-current-room obj-box)
-                   (setq dun-key-level (1+ dun-key-level)))
-               (dun-mprincl "You can't put that in the key box!"))
-
-           (if (and (= obj1 obj-floppy) (= obj2 obj-pc))
-               (progn
-                 (setq dun-floppy t)
-                 (dun-remove-obj-from-inven obj1)
-                 (dun-mprincl "Done."))
-
-             (if (= obj2 obj-urinal)                   ;; Put object in urinal
-                 (progn
-                   (dun-remove-obj-from-inven obj1)
-                   (dun-replace dun-room-objects urinal (append
-                                                 (nth urinal dun-room-objects)
-                                                  (list obj1)))
-                   (dun-mprincl
-                    "You hear it plop down in some water below."))
-               (if (= obj2 obj-mail)
-                   (dun-mprincl "The mail chute is locked.")
-                 (if (member obj1 dun-inventory)
-                     (dun-mprincl
-"I don't know how to combine those objects.  Perhaps you should
-just try dropping it.")
-                   (dun-mprincl "You can't put that there.")))))))))))
-
-(defun dun-type (_args)
-  (if (not (= dun-current-room computer-room))
-      (dun-mprincl "There is nothing here on which you could type.")
-    (if (not dun-computer)
-       (dun-mprincl
-"You type on the keyboard, but your characters do not even echo.")
-      (dun-unix-interface))))
-
-;;; Various movement directions
-
-(defun dun-n (_args)
-  (dun-move north))
-
-(defun dun-s (_args)
-  (dun-move south))
-
-(defun dun-e (_args)
-  (dun-move east))
-
-(defun dun-w (_args)
-  (dun-move west))
-
-(defun dun-ne (_args)
-  (dun-move northeast))
-
-(defun dun-se (_args)
-  (dun-move southeast))
-
-(defun dun-nw (_args)
-  (dun-move northwest))
-
-(defun dun-sw (_args)
-  (dun-move southwest))
-
-(defun dun-up (_args)
-  (dun-move up))
-
-(defun dun-down (_args)
-  (dun-move down))
-
-(defun dun-in (_args)
-  (dun-move in))
-
-(defun dun-out (_args)
-  (dun-move out))
-
-(defun dun-go (args)
-  (if (or (not (car args))
-         (eq (dun-doverb dun-ignore dun-verblist (car args)
-                         (cdr (cdr args))) -1))
-      (dun-mprinc "I don't understand where you want me to go.\n")))
-
-;;; Uses the dungeon-map to figure out where we are going.  If the
-;;; requested direction yields 255, we know something special is
-;;; supposed to happen, or perhaps you can't go that way unless
-;;; certain conditions are met.
-
-(defun dun-move (dir)
-  (if (and (not (member dun-current-room dun-light-rooms))
-          (not (member obj-lamp dun-inventory))
-          (not (member obj-lamp (nth dun-current-room dun-room-objects))))
-      (progn
-       (dun-mprinc
-"You trip over a grue and fall into a pit and break every bone in your
-body.")
-       (dun-die "a grue"))
-    (let (newroom)
-      (setq newroom (nth dir (nth dun-current-room dungeon-map)))
-      (if (eq newroom -1)
-         (dun-mprinc "You can't go that way.\n")
-       (if (eq newroom 255)
-           (dun-special-move dir)
-         (setq room -1)
-         (setq dun-lastdir dir)
-         (if dun-inbus
-             (progn
-               (if (or (< newroom 58) (> newroom 83))
-                   (dun-mprincl "The bus cannot go this way.")
-                 (dun-mprincl
-                  "The bus lurches ahead and comes to a screeching halt.")
-                 (dun-remove-obj-from-room dun-current-room obj-bus)
-                 (setq dun-current-room newroom)
-                 (dun-replace dun-room-objects newroom
-                          (append (nth newroom dun-room-objects)
-                                  (list obj-bus)))))
-           (setq dun-current-room newroom)))))))
-
-;;; Movement in this direction causes something special to happen if the
-;;; right conditions exist.  It may be that you can't go this way unless
-;;; you have a key, or a passage has been opened.
-
-;;; coding note: Each check of the current room is on the same 'if' level,
-;;; i.e. there aren't else's.  If two rooms next to each other have
-;;; specials, and they are connected by specials, this could cause
-;;; a problem.  Be careful when adding them to consider this, and
-;;; perhaps use else's.
-
-(defun dun-special-move (dir)
-  (if (= dun-current-room building-front)
-      (if (not (member obj-key dun-inventory))
-         (dun-mprincl "You don't have a key that can open this door.")
-       (setq dun-current-room old-building-hallway))
-    (if (= dun-current-room north-end-of-cave-passage)
-       (let (combo)
-         (dun-mprincl
-"You must type a 3 digit combination code to enter this room.")
-         (dun-mprinc "Enter it here: ")
-         (setq combo (dun-read-line))
-         (if (not dun-batch-mode)
-             (dun-mprinc "\n"))
-         (if (string= combo dun-combination)
-             (setq dun-current-room gamma-computing-center)
-           (dun-mprincl "Sorry, that combination is incorrect."))))
-
-    (if (= dun-current-room bear-hangout)
-       (if (member obj-bear (nth bear-hangout dun-room-objects))
-           (progn
-             (dun-mprinc
-"The bear is very annoyed that you would be so presumptuous as to try
-and walk right by it.  He tells you so by tearing your head off.
-")
-             (dun-die "a bear"))
-         (dun-mprincl "You can't go that way.")))
-
-    (if (= dun-current-room vermont-station)
-       (progn
-         (dun-mprincl
-"As you board the train it immediately leaves the station.  It is a very
-bumpy ride.  It is shaking from side to side, and up and down.  You
-sit down in one of the chairs in order to be more comfortable.")
-         (dun-mprincl
-"\nFinally the train comes to a sudden stop, and the doors open, and some
-force throws you out.  The train speeds away.\n")
-         (setq dun-current-room museum-station)))
-
-    (if (= dun-current-room old-building-hallway)
-       (if (and (member obj-key dun-inventory)
-                (> dun-key-level 0))
-           (setq dun-current-room meadow)
-         (dun-mprincl "You don't have a key that can open this door.")))
-
-    (if (and (= dun-current-room maze-button-room) (= dir northwest))
-       (if (member obj-weight (nth maze-button-room dun-room-objects))
-           (setq dun-current-room 18)
-         (dun-mprincl "You can't go that way.")))
-
-    (if (and (= dun-current-room maze-button-room) (= dir up))
-       (if (member obj-weight (nth maze-button-room dun-room-objects))
-           (dun-mprincl "You can't go that way.")
-         (setq dun-current-room weight-room)))
-
-    (if (= dun-current-room classroom)
-       (dun-mprincl "The door is locked."))
-
-    (if (or (= dun-current-room lakefront-north)
-           (= dun-current-room lakefront-south))
-       (dun-swim nil))
-
-    (if (= dun-current-room reception-area)
-       (if (not (= dun-sauna-level 3))
-           (setq dun-current-room health-club-front)
-         (dun-mprincl
-"As you exit the building, you notice some flames coming out of one of the
-windows.  Suddenly, the building explodes in a huge ball of fire.  The flames
-engulf you, and you burn to death.")
-         (dun-die "burning")))
-
-    (if (= dun-current-room red-room)
-       (if (not (member obj-towel (nth red-room dun-room-objects)))
-           (setq dun-current-room long-n-s-hallway)
-         (dun-mprincl "You can't go that way.")))
-
-    (if (and (> dir down) (> dun-current-room gamma-computing-center)
-            (< dun-current-room museum-lobby))
-       (if (not (member obj-bus (nth dun-current-room dun-room-objects)))
-           (dun-mprincl "You can't go that way.")
-         (if (= dir in)
-             (if dun-inbus
-                 (dun-mprincl
-                  "You are already in the bus!")
-               (if (member obj-license dun-inventory)
-                   (progn
-                     (dun-mprincl
-                      "You board the bus and get in the driver's seat.")
-                     (setq dun-nomail t)
-                     (setq dun-inbus t))
-                 (dun-mprincl "You are not licensed for this type of 
vehicle.")))
-           (if (not dun-inbus)
-               (dun-mprincl "You are already off the bus!")
-             (dun-mprincl "You hop off the bus.")
-             (setq dun-inbus nil))))
-      (if (= dun-current-room fifth-oaktree-intersection)
-         (if (not dun-inbus)
-             (progn
-               (dun-mprincl "You fall down the cliff and land on your head.")
-               (dun-die "a cliff"))
-           (dun-mprincl
-"The bus flies off the cliff, and plunges to the bottom, where it explodes.")
-           (dun-die "a bus accident")))
-      (if (= dun-current-room main-maple-intersection)
-         (progn
-           (if (not dun-inbus)
-               (dun-mprincl "The gate will not open.")
-             (dun-mprincl
-"As the bus approaches, the gate opens and you drive through.")
-             (dun-remove-obj-from-room main-maple-intersection obj-bus)
-             (dun-replace dun-room-objects museum-entrance
-                      (append (nth museum-entrance dun-room-objects)
-                              (list obj-bus)))
-             (setq dun-current-room museum-entrance)))))
-    (if (= dun-current-room cave-entrance)
-       (progn
-         (dun-mprincl
-"As you enter the room you hear a rumbling noise.  You look back to see
-huge rocks sliding down from the ceiling, and blocking your way out.\n")
-         (setq dun-current-room misty-room)))))
-
-(defun dun-long (_args)
-  (setq dun-mode "long"))
-
-(defun dun-turn (obj)
-  (let (objnum direction)
-    (when (setq objnum (dun-objnum-from-args-std obj))
-      (if (not (or (member objnum (nth dun-current-room dun-room-objects))
-                  (member objnum (nth dun-current-room dun-room-silents))))
-         (dun-mprincl "I don't see that here.")
-       (if (not (= objnum obj-dial))
-           (dun-mprincl "You can't turn that.")
-         (setq direction (dun-firstword (cdr obj)))
-         (if (or (not direction)
-                 (not (or (string= direction "clockwise")
-                          (string= direction "counterclockwise"))))
-             (dun-mprincl "You must indicate clockwise or counterclockwise.")
-           (if (string= direction "clockwise")
-               (setq dun-sauna-level (+ dun-sauna-level 1))
-             (setq dun-sauna-level (- dun-sauna-level 1)))
-
-           (if (< dun-sauna-level 0)
-               (progn
-                 (dun-mprincl
-                  "The dial will not turn further in that direction.")
-                 (setq dun-sauna-level 0))
-             (dun-sauna-heat))))))))
-
-(defun dun-sauna-heat ()
-  (if (= dun-sauna-level 0)
-      (dun-mprincl
-       "The temperature has returned to normal room temperature."))
-  (if (= dun-sauna-level 1)
-      (dun-mprincl "It is now luke warm in here.  You are perspiring."))
-  (if (= dun-sauna-level 2)
-      (dun-mprincl "It is pretty hot in here.  It is still very comfortable."))
-  (if (= dun-sauna-level 3)
-      (progn
-       (dun-mprincl
-"It is now very hot.  There is something very refreshing about this.")
-       (if (or (member obj-rms dun-inventory)
-               (member obj-rms (nth dun-current-room dun-room-objects)))
-           (progn
-             (dun-mprincl
-"You notice the wax on your statuette beginning to melt, until it completely
-melts off.  You are left with a beautiful diamond!")
-             (if (member obj-rms dun-inventory)
-                 (progn
-                   (dun-remove-obj-from-inven obj-rms)
-                   (setq dun-inventory (append dun-inventory
-                                               (list obj-diamond))))
-               (dun-remove-obj-from-room dun-current-room obj-rms)
-               (dun-replace dun-room-objects dun-current-room
-                        (append (nth dun-current-room dun-room-objects)
-                                (list obj-diamond))))))
-       (if (or (member obj-floppy dun-inventory)
-               (member obj-floppy (nth dun-current-room dun-room-objects)))
-           (progn
-             (dun-mprincl
-"You notice your floppy disk beginning to melt.  As you grab for it, the
-disk bursts into flames, and disintegrates.")
-             (if (member obj-floppy dun-inventory)
-                 (dun-remove-obj-from-inven obj-floppy)
-               (dun-remove-obj-from-room dun-current-room obj-floppy))))))
-
-  (if (= dun-sauna-level 4)
-      (progn
-       (dun-mprincl
-"As the dial clicks into place, you immediately burst into flames.")
-       (dun-die "burning"))))
-
-(defun dun-press (obj)
-  (let (objnum)
-    (when (setq objnum (dun-objnum-from-args-std obj))
-      (if (not (or (member objnum (nth dun-current-room dun-room-objects))
-                  (member objnum (nth dun-current-room dun-room-silents))))
-         (dun-mprincl "I don't see that here.")
-       (if (not (member objnum (list obj-button obj-switch)))
-           (progn
-             (dun-mprinc "You can't ")
-             (dun-mprinc (car line-list))
-             (dun-mprincl " that."))
-         (if (= objnum obj-button)
-             (dun-mprincl
-"As you press the button, you notice a passageway open up, but
-as you release it, the passageway closes."))
-         (if (= objnum obj-switch)
-             (if dun-black
-                 (progn
-                   (dun-mprincl "The button is now in the off position.")
-                   (setq dun-black nil))
-               (dun-mprincl "The button is now in the on position.")
-               (setq dun-black t))))))))
-
-(defun dun-swim (_args)
-  (if (not (member dun-current-room (list lakefront-north lakefront-south)))
-      (dun-mprincl "I see no water!")
-    (if (not (member obj-life dun-inventory))
-       (progn
-         (dun-mprincl
-"You dive in the water, and at first notice it is quite cold.  You then
-start to get used to it as you realize that you never really learned how
-to swim.")
-         (dun-die "drowning"))
-      (if (= dun-current-room lakefront-north)
-         (setq dun-current-room lakefront-south)
-       (setq dun-current-room lakefront-north)))))
-
-
-(defun dun-score (_args)
-  (if (not dun-endgame)
-      (let (total)
-       (setq total (dun-reg-score))
-       (dun-mprinc "You have scored ")
-       (dun-mprinc total)
-       (dun-mprincl " out of a possible 90 points.") total)
-    (dun-mprinc "You have scored ")
-    (dun-mprinc (dun-endgame-score))
-    (dun-mprincl " endgame points out of a possible 110.")
-    (if (= (dun-endgame-score) 110)
-       (dun-mprincl
-"\n\nCongratulations.  You have won.  The wizard password is ‘moby’"))))
-
-(defun dun-help (_args)
-  (dun-mprincl
-"Welcome to dunnet (2.02), by Ron Schnell (address@hidden - @RonnieSchnell).
-Here is some useful information (read carefully because there are one
-or more clues in here):
-- If you have a key that can open a door, you do not need to explicitly
-  open it.  You may just use ‘in’ or walk in the direction of the door.
-
-- If you have a lamp, it is always lit.
-
-- You will not get any points until you manage to get treasures to a certain
-  place.  Simply finding the treasures is not good enough.  There is more
-  than one way to get a treasure to the special place.  It is also
-  important that the objects get to the special place *unharmed* and
-  *untarnished*.  You can tell if you have successfully transported the
-  object by looking at your score, as it changes immediately.  Note that
-  an object can become harmed even after you have received points for it.
-  If this happens, your score will decrease, and in many cases you can never
-  get credit for it again.
-
-- You can save your game with the ‘save’ command, and use restore it
-  with the ‘restore’ command.
-
-- There are no limits on lengths of object names.
-
-- Directions are: north,south,east,west,northeast,southeast,northwest,
-                  southwest,up,down,in,out.
-
-- These can be abbreviated: n,s,e,w,ne,se,nw,sw,u,d,in,out.
-
-- If you go down a hole in the floor without an aid such as a ladder,
-  you probably won't be able to get back up the way you came, if at all.
-
-- To run this game in batch mode (no Emacs window), use:
-     emacs -batch -l dunnet
-NOTE: This game *should* be run in batch mode!
-
-If you have questions or comments, please contact address@hidden
-My home page is http://www.driver-aces.com/ronnie.html
-"))
-
-(defun dun-flush (_args)
-  (if (not (= dun-current-room bathroom))
-      (dun-mprincl "I see nothing to flush.")
-    (dun-mprincl "Whoooosh!!")
-    (dun-put-objs-in-treas (nth urinal dun-room-objects))
-    (dun-replace dun-room-objects urinal nil)))
-
-(defun dun-piss (_args)
-  (if (not (= dun-current-room bathroom))
-      (dun-mprincl "You can't do that here, don't even bother trying.")
-    (if (not dun-gottago)
-       (dun-mprincl "I'm afraid you don't have to go now.")
-      (dun-mprincl "That was refreshing.")
-      (setq dun-gottago nil)
-      (dun-replace dun-room-objects urinal (append
-                                           (nth urinal dun-room-objects)
-                                           (list obj-URINE))))))
-
-
-(defun dun-sleep (_args)
-  (if (not (= dun-current-room bedroom))
-      (dun-mprincl
-"You try to go to sleep while standing up here, but can't seem to do it.")
-    (setq dun-gottago t)
-    (dun-mprincl
-"As soon as you start to doze off you begin dreaming.  You see images of
-workers digging caves, slaving in the humid heat.  Then you see yourself
-as one of these workers.  While no one is looking, you leave the group
-and walk into a room.  The room is bare except for a horseshoe
-shaped piece of stone in the center.  You see yourself digging a hole in
-the ground, then putting some kind of treasure in it, and filling the hole
-with dirt again.  After this, you immediately wake up.")))
-
-(defun dun-break (obj)
-  (let (objnum)
-    (if (not (member obj-axe dun-inventory))
-       (dun-mprincl "You have nothing you can use to break things.")
-      (when (setq objnum (dun-objnum-from-args-std obj))
-       (if (member objnum dun-inventory)
-           (progn
-             (dun-mprincl
-"You take the object in your hands and swing the axe.  Unfortunately, you miss
-the object and slice off your hand.  You bleed to death.")
-             (dun-die "an axe"))
-         (if (not (or (member objnum (nth dun-current-room dun-room-objects))
-                      (member objnum
-                              (nth dun-current-room dun-room-silents))))
-             (dun-mprincl "I don't see that here.")
-           (if (= objnum obj-cable)
-               (progn
-                 (dun-mprincl
-"As you break the ethernet cable, everything starts to blur.  You collapse
-for a moment, then straighten yourself up.
-")
-                 (dun-replace dun-room-objects gamma-computing-center
-                          (append
-                           (nth gamma-computing-center dun-room-objects)
-                           dun-inventory))
-                 (if (member obj-key dun-inventory)
-                     (progn
-                       (setq dun-inventory (list obj-key))
-                       (dun-remove-obj-from-room
-                        gamma-computing-center obj-key))
-                   (setq dun-inventory nil))
-                 (setq dun-current-room computer-room)
-                 (setq dun-ethernet nil)
-                 (dun-mprincl "Connection closed.")
-                 (dun-unix-interface))
-             (if (< objnum 0)
-                 (progn
-                   (dun-mprincl "Your axe shatters into a million pieces.")
-                   (dun-remove-obj-from-inven obj-axe))
-               (dun-mprincl "Your axe breaks it into a million pieces.")
-               (dun-remove-obj-from-room dun-current-room objnum)))))))))
-
-(defun dun-drive (_args)
-  (if (not dun-inbus)
-      (dun-mprincl "You cannot drive when you aren't in a vehicle.")
-    (dun-mprincl "To drive while you are in the bus, just give a direction.")))
-
-(defun dun-superb (_args)
-  (setq dun-mode 'dun-superb))
-
-(defun dun-reg-score ()
-  (let (total)
-    (setq total 0)
-    (dolist (x (nth treasure-room dun-room-objects))
-      (setq total (+ total (nth x dun-object-pts))))
-    (if (member obj-URINE (nth treasure-room dun-room-objects))
-       (setq total 0)) total))
-
-(defun dun-endgame-score ()
-  (let (total)
-    (setq total 0)
-    (dolist (x (nth endgame-treasure-room dun-room-objects))
-      (setq total (+ total (nth x dun-object-pts)))) total))
-
-(defun dun-answer (args)
-  (if (not dun-correct-answer)
-      (dun-mprincl "I don't believe anyone asked you anything.")
-    (setq args (car args))
-    (if (not args)
-       (dun-mprincl "You must give the answer on the same line.")
-      (if (dun-members args dun-correct-answer)
-         (progn
-           (dun-mprincl "Correct.")
-           (if (= dun-lastdir 0)
-               (setq dun-current-room (1+ dun-current-room))
-             (setq dun-current-room (- dun-current-room 1)))
-           (setq dun-correct-answer nil))
-       (dun-mprincl "That answer is incorrect.")))))
-
-(defun dun-endgame-question ()
-(if (not dun-endgame-questions)
-    (progn
-      (dun-mprincl "Your question is:")
-      (dun-mprincl "No more questions, just do ‘answer foo’.")
-      (setq dun-correct-answer '("foo")))
-  (let (which i newques)
-    (setq i 0)
-    (setq newques nil)
-    (setq which (random (length dun-endgame-questions)))
-    (dun-mprincl "Your question is:")
-    (dun-mprincl (setq dun-endgame-question (car
-                                            (nth which
-                                                 dun-endgame-questions))))
-    (setq dun-correct-answer (cdr (nth which dun-endgame-questions)))
-    (while (< i which)
-      (setq newques (append newques (list (nth i dun-endgame-questions))))
-      (setq i (1+ i)))
-    (setq i (1+ which))
-    (while (< i (length dun-endgame-questions))
-      (setq newques (append newques (list (nth i dun-endgame-questions))))
-      (setq i (1+ i)))
-    (setq dun-endgame-questions newques))))
-
-(defun dun-power (_args)
-  (if (not (= dun-current-room pc-area))
-      (dun-mprincl "That operation is not applicable here.")
-    (if (not dun-floppy)
-       (dun-dos-no-disk)
-      (dun-dos-interface))))
-
-(defun dun-feed (args)
-  (let (objnum)
-    (when (setq objnum (dun-objnum-from-args-std args))
-      (if (and (= objnum obj-bear)
-              (member obj-bear (nth dun-current-room dun-room-objects)))
-         (progn
-           (if (not (member obj-food dun-inventory))
-               (dun-mprincl "You have nothing with which to feed it.")
-             (dun-drop '("food"))))
-       (if (not (or (member objnum (nth dun-current-room dun-room-objects))
-                    (member objnum dun-inventory)
-                    (member objnum (nth dun-current-room dun-room-silents))))
-           (dun-mprincl "I don't see that here.")
-         (dun-mprincl "You cannot feed that."))))))
-
-
-;;;;
-;;;;  This section defines various utility functions used
-;;;;  by dunnet.
-;;;;
-
-
-;;; Function which takes a verb and a list of other words.  Calls proper
-;;; function associated with the verb, and passes along the other words.
-
-(defun dun-doverb (dun-ignore dun-verblist verb rest)
-  (if (not verb)
-      nil
-    (if (member (intern verb) dun-ignore)
-       (if (not (car rest)) -1
-         (dun-doverb dun-ignore dun-verblist (car rest) (cdr rest)))
-      (if (not (cdr (assq (intern verb) dun-verblist))) -1
-       (setq dun-numcmds (1+ dun-numcmds))
-       (funcall (cdr (assq (intern verb) dun-verblist)) rest)))))
-
-
-;;; Function to take a string and change it into a list of lowercase words.
-
-(defun dun-listify-string (strin)
-  (let (pos ret-list end-pos)
-    (setq pos 0)
-    (setq ret-list nil)
-    (while (setq end-pos (string-match "[ ,:;]" (substring strin pos)))
-      (setq end-pos (+ end-pos pos))
-      (if (not (= end-pos pos))
-         (setq ret-list (append ret-list (list
-                                          (downcase
-                                           (substring strin pos end-pos))))))
-      (setq pos (+ end-pos 1))) ret-list))
-
-(defun dun-listify-string2 (strin)
-  (let (pos ret-list end-pos)
-    (setq pos 0)
-    (setq ret-list nil)
-    (while (setq end-pos (string-match " " (substring strin pos)))
-      (setq end-pos (+ end-pos pos))
-      (if (not (= end-pos pos))
-         (setq ret-list (append ret-list (list
-                                          (downcase
-                                           (substring strin pos end-pos))))))
-      (setq pos (+ end-pos 1))) ret-list))
-
-(defun dun-replace (list n number)
-  (rplaca (nthcdr n list) number))
-
-
-;;; Get the first non-ignored word from a list.
-
-(defun dun-firstword (list)
-  (if (not (car list))
-      nil
-    (while (and list (member (intern (car list)) dun-ignore))
-      (setq list (cdr list)))
-    (car list)))
-
-(defun dun-firstwordl (list)
-  (if (not (car list))
-      nil
-    (while (and list (member (intern (car list)) dun-ignore))
-      (setq list (cdr list)))
-    list))
-
-;;; parse a line passed in as a string  Call the proper verb with the
-;;; rest of the line passed in as a list.
-
-(defun dun-vparse (dun-ignore dun-verblist line)
-  (dun-mprinc "\n")
-  (setq line-list (dun-listify-string (concat line " ")))
-  (dun-doverb dun-ignore dun-verblist (car line-list) (cdr line-list)))
-
-(defun dun-parse2 (dun-ignore dun-verblist line)
-  (dun-mprinc "\n")
-  (setq line-list (dun-listify-string2 (concat line " ")))
-  (dun-doverb dun-ignore dun-verblist (car line-list) (cdr line-list)))
-
-;;; Read a line, in window mode
-
-(defun dun-read-line ()
-  (let (line)
-    (setq line (read-string ""))
-    (dun-mprinc line) line))
-
-;;; Insert something into the window buffer
-
-(defun dun-minsert (string)
-  (if (stringp string)
-      (insert string)
-    (insert (prin1-to-string string))))
-
-;;; Print something out, in window mode
-
-(defun dun-mprinc (string)
-  (if (stringp string)
-      (insert string)
-    (insert (prin1-to-string string))))
-
-;;; In window mode, keep screen from jumping by keeping last line at
-;;; the bottom of the screen.
-
-(defun dun-fix-screen ()
-  (interactive)
-  (forward-line (- 0 (- (window-height) 2 )))
-  (set-window-start (selected-window) (point))
-  (goto-char (point-max)))
-
-;;; Insert something into the buffer, followed by newline.
-
-(defun dun-minsertl (string)
-  (dun-minsert string)
-  (dun-minsert "\n"))
-
-;;; Print something, followed by a newline.
-
-(defun dun-mprincl (string)
-  (dun-mprinc string)
-  (dun-mprinc "\n"))
-
-;;; Function which will get an object number given the list of
-;;; words in the command, except for the verb.
-
-(defun dun-objnum-from-args (obj)
-  (setq obj (dun-firstword obj))
-  (if (not obj)
-      obj-special
-    (cdr (assq (intern obj) dun-objnames))))
-
-(defun dun-objnum-from-args-std (obj)
-  (let (result)
-  (if (eq (setq result (dun-objnum-from-args obj)) obj-special)
-      (dun-mprincl "You must supply an object."))
-  (if (eq result nil)
-      (dun-mprincl "I don't know what that is."))
-  (if (eq result obj-special)
-      nil
-    result)))
-
-;;; Take a short room description, and change spaces and slashes to dashes.
-
-(defun dun-space-to-hyphen (string)
-  (let (space)
-    (if (setq space (string-match "[ /]" string))
-       (progn
-         (setq string (concat (substring string 0 space) "-"
-                              (substring string (1+ space))))
-         (dun-space-to-hyphen string))
-      string)))
-
-;;; Given a unix style pathname, build a list of path components (recursive)
-
-(defun dun-get-path (dirstring startlist)
-  (let (slash)
-    (if (= (length dirstring) 0)
-       startlist
-      (if (string= (substring dirstring 0 1) "/")
-         (dun-get-path (substring dirstring 1) (append startlist (list "/")))
-       (if (not (setq slash (string-match "/" dirstring)))
-           (append startlist (list dirstring))
-         (dun-get-path (substring dirstring (1+ slash))
-                   (append startlist
-                           (list (substring dirstring 0 slash)))))))))
-
-
-;;; Is a string a member of a string list?
-
-(defun dun-members (string string-list)
-  (let (found)
-    (setq found nil)
-    (dolist (x string-list)
-      (if (string= x string)
-         (setq found t))) found))
-
-;;; Function to put objects in the treasure room.  Also prints current
-;;; score to let user know he has scored.
-
-(defun dun-put-objs-in-treas (objlist)
-  (let (oscore newscore)
-    (setq oscore (dun-reg-score))
-    (dun-replace dun-room-objects 0 (append (nth 0 dun-room-objects) objlist))
-    (setq newscore (dun-reg-score))
-    (if (not (= oscore newscore))
-       (dun-score nil))))
-
-;;; Load an encrypted file, and eval it.
-
-(defun dun-load-d (filename)
-  (let (old-buffer result)
-    (setq result t)
-    (setq old-buffer (current-buffer))
-    (switch-to-buffer (get-buffer-create "*loadc*"))
-    (erase-buffer)
-    (condition-case nil
-       (insert-file-contents filename)
-      (error (setq result nil)))
-    (unless (not result)
-      (condition-case nil
-         (dun-rot13)
-       (error (yank)))
-      (eval-buffer)
-      (kill-buffer (current-buffer)))
-      (switch-to-buffer old-buffer)
-    result))
-
-;;; Functions to remove an object either from a room, or from inventory.
-
-(defun dun-remove-obj-from-room (room objnum)
-  (let (newroom)
-    (setq newroom nil)
-    (dolist (x (nth room dun-room-objects))
-      (if (not (= x objnum))
-         (setq newroom (append newroom (list x)))))
-    (rplaca (nthcdr room dun-room-objects) newroom)))
-
-(defun dun-remove-obj-from-inven (objnum)
-  (let (new-inven)
-    (setq new-inven nil)
-    (dolist (x dun-inventory)
-      (if (not (= x objnum))
-         (setq new-inven (append new-inven (list x)))))
-    (setq dun-inventory new-inven)))
-
-(defun dun-rot13 ()
-  (rot13-region (point-min) (point-max)))
-
-;;;;
-;;;; This section defines the globals that are used in dunnet.
-;;;;
-;;;; IMPORTANT
-;;;; All globals which can change must be saved from 'save-game.  Add
-;;;; all new globals to bottom of file.
-
-(setq dun-visited '(27))
-(setq dun-current-room 1)
-(setq dun-exitf nil)
-(setq dun-badcd nil)
-(define-obsolete-variable-alias 'dungeon-mode-map 'dun-mode-map "22.1")
-(define-key dun-mode-map "\r" 'dun-parse)
-(defvar dungeon-batch-map (make-keymap))
-(if (string= (substring emacs-version 0 2) "18")
-    (let (n)
-      (setq n 32)
-      (while (< 0 (setq n (- n 1)))
-       (aset dungeon-batch-map n 'dungeon-nil)))
-  (let (n)
-    (setq n 32)
-    (while (< 0 (setq n (- n 1)))
-      (aset (car (cdr dungeon-batch-map)) n 'dungeon-nil))))
-(define-key dungeon-batch-map "\r" 'exit-minibuffer)
-(define-key dungeon-batch-map "\n" 'exit-minibuffer)
-(setq dun-computer nil)
-(setq dun-floppy nil)
-(setq dun-key-level 0)
-(setq dun-hole nil)
-(setq dun-correct-answer nil)
-(setq dun-lastdir 0)
-(setq dun-numsaves 0)
-(setq dun-jar nil)
-(setq dun-dead nil)
-(setq room 0)
-(setq dun-numcmds 0)
-(setq dun-wizard nil)
-(setq dun-endgame-question nil)
-(setq dun-logged-in nil)
-(setq dungeon-mode 'dungeon)
-(setq dun-unix-verbs '((ls . dun-ls) (ftp . dun-ftp) (echo . dun-echo)
-                      (exit . dun-uexit) (cd . dun-cd) (pwd . dun-pwd)
-                      (rlogin . dun-rlogin) (ssh . dun-rlogin)
-                      (uncompress . dun-uncompress) (cat . dun-cat)))
-
-(setq dun-dos-verbs '((dir . dun-dos-dir) (type . dun-dos-type)
-                     (exit . dun-dos-exit) (command . dun-dos-spawn)
-                     (b: . dun-dos-invd) (c: . dun-dos-invd)
-                     (a: . dun-dos-nil)))
-
-
-(setq dun-batch-mode nil)
-
-(setq dun-cdpath "/usr/toukmond")
-(setq dun-cdroom -10)
-(setq dun-uncompressed nil)
-(setq dun-ethernet t)
-(setq dun-restricted
-      '(dun-room-objects dungeon-map dun-rooms
-                        dun-room-silents dun-combination))
-(setq dun-ftptype 'ascii)
-(setq dun-endgame nil)
-(setq dun-gottago t)
-(setq dun-black nil)
+(setq dun-cdpath "/usr/toukmond")
+(setq dun-cdroom -10)
+(setq dun-uncompressed nil)
+(setq dun-ethernet t)
+(setq dun-restricted
+      '(dun-room-objects dungeon-map dun-rooms
+                        dun-room-silents dun-combination))
+(setq dun-ftptype 'ascii)
+(setq dun-endgame nil)
+(setq dun-gottago t)
+(setq dun-black nil)
 
 (setq dun-rooms '(
              (
@@ -1888,593 +594,1892 @@ a hallway leads to the south."
 "You are in the winner's room.  A door leads back to the south."
                "Winner's room"                 ;103
               )
-             (
-"You have reached a dead end.  There is a PC on the floor here.  Above
-it is a sign that reads:
-          Type the ‘reset’ command to type on the PC.
-A hole leads north."
-               "PC area"                       ;104
-               )
+             (
+"You have reached a dead end.  There is a PC on the floor here.  Above
+it is a sign that reads:
+          Type the ‘reset’ command to type on the PC.
+A hole leads north."
+               "PC area"                       ;104
+               )
+))
+
+(setq dun-light-rooms '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 25 26 27 28 58 59
+                    60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
+                    77 78 79 80 81 82 83))
+
+(setq dun-verblist '((die . dun-die) (ne . dun-ne) (north . dun-n)
+                    (south . dun-s) (east . dun-e) (west . dun-w)
+                    (u . dun-up) (d . dun-down) (i . dun-inven)
+                    (inventory . dun-inven) (look . dun-examine) (n . dun-n)
+                    (s . dun-s) (e . dun-e) (w . dun-w) (se . dun-se)
+                    (nw . dun-nw) (sw . dun-sw) (up . dun-up)
+                    (down . dun-down) (in . dun-in) (out . dun-out)
+                    (go . dun-go) (drop . dun-drop) (southeast . dun-se)
+                    (southwest . dun-sw) (northeast . dun-ne)
+                    (northwest . dun-nw) (save . dun-save-game)
+                    (restore . dun-restore) (long . dun-long) (dig . dun-dig)
+                    (shake . dun-shake) (wave . dun-shake)
+                    (examine . dun-examine) (describe . dun-examine)
+                    (climb . dun-climb) (eat . dun-eat) (put . dun-put)
+                    (type . dun-type)  (insert . dun-put)
+                    (score . dun-score) (help . dun-help) (quit . dun-quit)
+                    (read . dun-examine) (verbose . dun-long)
+                    (urinate . dun-piss) (piss . dun-piss)
+                    (flush . dun-flush) (sleep . dun-sleep) (lie . dun-sleep)
+                    (x . dun-examine) (break . dun-break) (drive . dun-drive)
+                    (board . dun-in) (enter . dun-in) (turn . dun-turn)
+                    (press . dun-press) (push . dun-press) (swim . dun-swim)
+                    (on . dun-in) (off . dun-out) (chop . dun-break)
+                    (switch . dun-press) (cut . dun-break) (exit . dun-out)
+                    (leave . dun-out) (reset . dun-power) (flick . dun-press)
+                    (superb . dun-superb) (answer . dun-answer)
+                    (throw . dun-drop) (l . dun-examine) (take . dun-take)
+                    (get . dun-take) (feed . dun-feed)))
+
+(setq dun-inbus nil)
+(setq dun-nomail nil)
+(setq dun-ignore '(the to at))
+(setq dun-mode 'moby)
+(setq dun-sauna-level 0)
+
+(defconst north 0)
+(defconst south 1)
+(defconst east 2)
+(defconst west 3)
+(defconst northeast 4)
+(defconst southeast 5)
+(defconst northwest 6)
+(defconst southwest 7)
+(defconst up 8)
+(defconst down 9)
+(defconst in 10)
+(defconst out 11)
+
+(setq dungeon-map '(
+;                    no  so  ea  we  ne  se  nw  sw  up  do  in  ot
+                   ( 96  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;0
+                   ( -1  -1   2  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;1
+                   ( -1  -1   3   1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;2
+                   ( -1  -1  -1   2   4   6  -1  -1  -1  -1  -1  -1 ) ;3
+                   ( -1  -1  -1  -1   5  -1  -1   3  -1  -1  -1  -1 ) ;4
+                   ( -1  -1  -1  -1  255 -1  -1   4  -1  -1  255 -1 ) ;5
+                   ( -1  -1  -1  -1  -1   7   3  -1  -1  -1  -1  -1 ) ;6
+                   ( -1  -1  -1  -1  -1  255  6  27  -1  -1  -1  -1 ) ;7
+                   ( 255  5   9  10  -1  -1  -1   5  -1  -1  -1   5 ) ;8
+                   ( -1  -1  -1   8  -1  -1  -1  -1  -1  -1  -1  -1 ) ;9
+                   ( -1  -1   8  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;10
+                   ( -1   8  -1  58  -1  -1  -1  -1  -1  -1  -1  -1 ) ;11
+                   ( -1  -1  13  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;12
+                   ( 15  -1  14  12  -1  -1  -1  -1  -1  -1  -1  -1 ) ;13
+                   ( -1  -1  -1  13  -1  -1  -1  -1  -1  -1  -1  -1 ) ;14
+                   ( -1  13  16  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;15
+                   ( -1  -1  -1  15  -1  -1  -1  -1  -1  17  16  -1 ) ;16
+                   ( -1  -1  17  17  17  17 255  17 255  17  -1  -1 ) ;17
+                   ( 18  18  18  18  18  -1  18  18  19  18  -1  -1 ) ;18
+                   ( -1  18  18  19  19  20  19  19  -1  18  -1  -1 ) ;19
+                   ( -1  -1  -1  18  -1  -1  -1  -1  -1  21  -1  -1 ) ;20
+                   ( -1  -1  -1  -1  -1  20  22  -1  -1  -1  -1  -1 ) ;21
+                   ( 18  18  18  18  16  18  23  18  18  18  18  18 ) ;22
+                   ( -1 255  -1  -1  -1  19  -1  -1  -1  -1  -1  -1 ) ;23
+                   ( 23  25  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;24
+                   ( 24 255  -1  -1  -1  -1  -1  -1  -1  -1 255  -1 ) ;25
+                   (255  28  -1  -1  -1  -1  -1  -1  -1  -1 255  -1 ) ;26
+                   ( -1  -1  -1  -1   7  -1  -1  -1  -1  -1  -1  -1 ) ;27
+                   ( 26 255  -1  -1  -1  -1  -1  -1  -1  -1  255 -1 ) ;28
+                   ( -1  -1  30  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;29
+                   ( -1  -1  31  29  -1  -1  -1  -1  -1  -1  -1  -1 ) ;30
+                   ( 32  33  -1  30  -1  -1  -1  -1  -1  -1  -1  -1 ) ;31
+                   ( -1  31  -1  255 -1  -1  -1  -1  -1  34  -1  -1 ) ;32
+                   ( 31  -1  -1  -1  -1  -1  -1  -1  -1  35  -1  -1 ) ;33
+                   ( -1  35  -1  -1  -1  -1  -1  -1  32  37  -1  -1 ) ;34
+                   ( 34  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;35
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;36
+                   ( -1  -1  -1  -1  -1  -1  -1  38  34  -1  -1  -1 ) ;37
+                   ( -1  -1  40  41  37  -1  -1  39  -1  -1  -1  -1 ) ;38
+                   ( -1  -1  -1  -1  38  -1  -1  -1  -1  -1  -1  -1 ) ;39
+                   ( -1  -1  -1  38  -1  -1  -1  -1  42  -1  -1  -1 ) ;40
+                   ( -1  -1  38  -1  -1  -1  -1  -1  -1  43  -1  -1 ) ;41
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  40  -1  -1 ) ;42
+                   ( 44  -1  46  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;43
+                   ( -1  43  45  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;44
+                   ( -1  46  -1  44  -1  -1  -1  -1  -1  -1  -1  -1 ) ;45
+                   ( 45  -1  -1  43  -1  -1  -1  -1  -1  255 -1  -1 ) ;46
+                   ( 48  50  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;47
+                   ( 49  47  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;48
+                   ( -1  48  -1  -1  -1  -1  -1  -1  52  -1  -1  -1 ) ;49
+                   ( 47  51  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;50
+                   ( 50  104 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;51
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  53  49  -1  -1 ) ;52
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  54  52  -1  -1 ) ;53
+                   ( -1  -1  -1  -1  55  -1  -1  -1  -1  53  -1  -1 ) ;54
+                   ( -1  -1  -1  -1  56  -1  -1  54  -1  -1  -1  54 ) ;55
+                   ( -1  -1  -1  -1  -1  -1  -1  55  -1  31  -1  -1 ) ;56
+                   ( -1  -1  32  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;57
+                   ( 59  -1  11  -1  -1  -1  -1  -1  -1  -1  255 255) ;58
+                   ( 60  58  63  -1  -1  -1  255 -1  -1  -1  255 255) ;59
+                   ( 61  59  64  -1  -1  -1  -1  -1  -1  -1  255 255) ;60
+                   ( 62  60  65  -1  -1  -1  -1  -1  -1  -1  255 255) ;61
+                   ( -1  61  66  -1  -1  -1  -1  -1  -1  -1  255 255) ;62
+                   ( 64  -1  67  59  -1  -1  -1  -1  -1  -1  255 255) ;63
+                   ( 65  63  68  60  -1  -1  -1  -1  -1  -1  255 255) ;64
+                   ( 66  64  69  61  -1  -1  -1  -1  -1  -1  255 255) ;65
+                   ( -1  65  70  62  -1  -1  -1  -1  -1  -1  255 255) ;66
+                   ( 68  -1  71  63  -1  -1  -1  -1  -1  -1  255 255) ;67
+                   ( 69  67  72  64  -1  -1  -1  -1  -1  -1  255 255) ;68
+                   ( 70  68  73  65  -1  -1  -1  -1  -1  -1  255 255) ;69
+                   ( -1  69  74  66  -1  -1  -1  -1  -1  -1  255 255) ;70
+                   ( 72  -1  75  67  -1  -1  -1  -1  -1  -1  255 255) ;71
+                   ( 73  71  76  68  -1  -1  -1  -1  -1  -1  255 255) ;72
+                   ( 74  72  77  69  -1  -1  -1  -1  -1  -1  255 255) ;73
+                   ( -1  73  78  70  -1  -1  -1  -1  -1  -1  255 255) ;74
+                   ( 76  -1  79  71  -1  -1  -1  -1  -1  -1  255 255) ;75
+                   ( 77  75  80  72  -1  -1  -1  -1  -1  -1  255 255) ;76
+                   ( 78  76  81  73  -1  -1  -1  -1  -1  -1  255 255) ;77
+                   ( -1  77  82  74  -1  -1  -1  -1  -1  -1  255 255) ;78
+                   ( 80  -1  -1  75  -1  -1  -1  -1  -1  -1  255 255) ;79
+                   ( 81  79  255 76  -1  -1  -1  -1  -1  -1  255 255) ;80
+                   ( 82  80  -1  77  -1  -1  -1  -1  -1  -1  255 255) ;81
+                   ( -1  81  -1  78  -1  -1  -1  -1  -1  -1  255 255) ;82
+                   ( 84  -1  -1  -1  -1  59  -1  -1  -1  -1  255 255) ;83
+                   ( -1  83  85  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;84
+                   ( 86  -1  87  84  -1  -1  -1  -1  -1  -1  -1  -1 ) ;85
+                   ( -1  85  88  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;86
+                   ( 88  -1  -1  85  -1  -1  -1  -1  -1  -1  -1  -1 ) ;87
+                   ( -1  87 255  86  -1  -1  -1  -1  -1  -1  -1  -1 ) ;88
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 255  -1 ) ;89
+                   ( 91  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;90
+                   ( 92  90  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;91
+                   ( -1  91  -1  -1  -1  -1  -1  -1  93  94  -1  -1 ) ;92
+                   ( -1  -1  -1  88  -1  -1  -1  -1  -1  92  -1  -1 ) ;93
+                   ( -1  -1  -1  -1  95  -1  -1  -1  92  -1  -1  -1 ) ;94
+                   ( -1  -1  -1  -1  -1  -1  -1  94  -1  -1  -1  -1 ) ;95
+                   ( 97   0  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;96
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;97
+                   ( 99  97  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;98
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;99
+                   ( 101 99  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;100
+                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;101
+                   ( 103 101 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;102
+                   ( -1  102 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;103
+                   ( 51  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;104
+                   )
+;                    no  so  ea  we  ne  se  nw  sw  up  do  in  ot
+)
+
+
+;;; How the user references *all* objects, permanent and regular.
+(setq dun-objnames '(
+                (shovel . 0)
+                (lamp . 1)
+                (cpu . 2) (board . 2) (card . 2) (chip . 2)
+                (food . 3)
+                (key . 4)
+                (paper . 5) (slip . 5)
+                (rms . 6) (statue . 6) (statuette . 6)  (stallman . 6)
+                (diamond . 7)
+                (weight . 8)
+                (life . 9) (preserver . 9)
+                (bracelet . 10) (emerald . 10)
+                (gold . 11)
+                (platinum . 12)
+                (towel . 13) (beach . 13)
+                (axe . 14)
+                (silver . 15)
+                (license . 16)
+                (coins . 17)
+                (egg . 18)
+                (jar . 19)
+                (bone . 20)
+                (acid . 21) (nitric . 21)
+                (glycerine . 22)
+                (ruby . 23)
+                (amethyst . 24)
+                (mona . 25)
+                (bill . 26)
+                (floppy . 27) (disk . 27)
+
+                (boulder . -1)
+                (tree . -2) (trees . -2) (palm . -2)
+                (bear . -3)
+                (bin . -4) (bins . -4)
+                (cabinet . -5) (computer . -5) (vax . -5) (ibm . -5)
+                (protoplasm . -6)
+                (dial . -7)
+                (button . -8)
+                (chute . -9)
+                (painting . -10)
+                (bed . -11)
+                (urinal . -12)
+                (URINE . -13)
+                (pipes . -14) (pipe . -14)
+                (box . -15) (slit . -15)
+                (cable . -16) (ethernet . -16)
+                (mail . -17) (drop . -17)
+                (bus . -18)
+                (gate . -19)
+                (cliff . -20)
+                (skeleton . -21) (dinosaur . -21)
+                (fish . -22)
+                (tanks . -23) (tank . -23)
+                (switch . -24)
+                (blackboard . -25)
+                (disposal . -26) (garbage . -26)
+                (ladder . -27)
+                (subway . -28) (train . -28)
+                (pc . -29) (drive . -29) (coconut . -30) (coconuts . -30)
+                (lake . -32) (water . -32)
+))
+
+(dolist (x dun-objnames)
+  (let (name)
+    (setq name (concat "obj-" (prin1-to-string (car x))))
+    (eval (list 'defconst (intern name) (cdr x)))))
+
+(defconst obj-special 255)
+
+;;; The initial setup of what objects are in each room.
+;;; Regular objects have whole numbers lower than 255.
+;;; Objects that cannot be taken but might move and are
+;;; described during room description are negative.
+;;; Stuff that is described and might change are 255, and are
+;;; handled specially by 'dun-describe-room.
+
+(setq dun-room-objects (list nil
+
+        (list obj-shovel)                     ;; treasure-room
+        (list obj-boulder)                    ;; dead-end
+        nil nil nil
+        (list obj-food)                       ;; se-nw-road
+        (list obj-bear)                       ;; bear-hangout
+        nil nil
+        (list obj-special)                    ;; computer-room
+        (list obj-lamp obj-license obj-silver);; meadow
+        nil nil
+        (list obj-special)                    ;; sauna
+        nil
+        (list obj-weight obj-life)            ;; weight-room
+        nil nil
+        (list obj-rms obj-floppy)             ;; thirsty-maze
+        nil nil nil nil nil nil nil
+        (list obj-emerald)                    ;; hidden-area
+        nil
+        (list obj-gold)                       ;; misty-room
+        nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
+        (list obj-towel obj-special)          ;; red-room
+        nil nil nil nil nil
+        (list obj-box)                        ;; stair-landing
+        nil nil nil
+        (list obj-axe)                        ;; small-crawlspace
+        nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
+        nil nil nil nil nil
+        (list obj-special)                    ;; fourth-vermont-intersection
+        nil nil
+        (list obj-coins)                      ;; fifth-oaktree-intersection
+        nil
+        (list obj-bus)                        ;; fifth-sycamore-intersection
+        nil
+        (list obj-bone)                       ;; museum-lobby
+        nil
+        (list obj-jar obj-special obj-ruby)   ;; marine-life-area
+        (list obj-nitric)                     ;; maintenance-room
+        (list obj-glycerine)                  ;; classroom
+        nil nil nil nil nil
+        (list obj-amethyst)                   ;; bottom-of-subway-stairs
+        nil nil
+        (list obj-special)                    ;; question-room-1
+        nil
+        (list obj-special)                    ;; question-room-2
+        nil
+        (list obj-special)                    ;; question-room-three
+        nil
+        (list obj-mona)                       ;; winner's-room
+nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
+nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
+nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
+nil))
+
+;;; These are objects in a room that are only described in the
+;;; room description.  They are permanent.
+
+(setq dun-room-silents (list nil
+        (list obj-tree obj-coconut)            ;; dead-end
+        (list obj-tree obj-coconut)            ;; e-w-dirt-road
+        nil nil nil nil nil nil
+        (list obj-bin)                         ;; mailroom
+        (list obj-computer)                    ;; computer-room
+        nil nil nil
+        (list obj-dial)                        ;; sauna
+        nil
+        (list obj-ladder)                      ;; weight-room
+        (list obj-button obj-ladder)           ;; maze-button-room
+        nil nil nil
+        nil nil nil nil
+       (list obj-lake)                        ;; lakefront-north
+       (list obj-lake)                        ;; lakefront-south
+       nil
+        (list obj-chute)                       ;; cave-entrance
+        nil nil nil nil nil
+        (list obj-painting obj-bed)            ;; bedroom
+        (list obj-urinal obj-pipes)            ;; bathroom
+        nil nil nil nil nil nil
+        (list obj-boulder)                     ;; horseshoe-boulder-room
+        nil nil nil nil nil nil nil nil nil nil nil nil nil nil
+        (list obj-computer obj-cable)          ;; gamma-computing-center
+        (list obj-mail)                        ;; post-office
+        (list obj-gate)                        ;; main-maple-intersection
+        nil nil nil nil nil nil nil nil nil nil nil nil nil
+        nil nil nil nil nil nil nil
+        (list obj-cliff)                       ;; fifth-oaktree-intersection
+        nil nil nil
+        (list obj-dinosaur)                    ;; museum-lobby
+        nil
+        (list obj-fish obj-tanks)              ;; marine-life-area
+        (list obj-switch)                      ;; maintenance-room
+        (list obj-blackboard)                  ;; classroom
+        (list obj-train)                       ;; vermont-station
+        nil nil
+        (list obj-disposal)                    ;; north-end-of-n-s-tunnel
+        nil nil
+        (list obj-computer)                    ;; endgame-computer-room
+        nil nil nil nil nil nil nil nil
+       (list obj-pc)                          ;; pc-area
+       nil nil nil nil nil nil
+))
+(setq dun-inventory '(1))
+
+;;; Descriptions of objects, as they appear in the room description, and
+;;; the inventory.
+
+(setq dun-objects '(
+               ("There is a shovel here." "A shovel")                ;0
+               ("There is a lamp nearby." "A lamp")                  ;1
+               ("There is a CPU card here." "A computer board")      ;2
+               ("There is some food here." "Some food")              ;3
+               ("There is a shiny brass key here." "A brass key")    ;4
+               ("There is a slip of paper here." "A slip of paper")  ;5
+               ("There is a wax statuette of Richard Stallman here." ;6
+                "An RMS statuette")
+               ("There is a shimmering diamond here." "A diamond")   ;7
+               ("There is a 10 pound weight here." "A weight")       ;8
+               ("There is a life preserver here." "A life preserver");9
+               ("There is an emerald bracelet here." "A bracelet")   ;10
+               ("There is a gold bar here." "A gold bar")            ;11
+               ("There is a platinum bar here." "A platinum bar")    ;12
+               ("There is a beach towel on the ground here." "A beach towel")
+               ("There is an axe here." "An axe") ;14
+               ("There is a silver bar here." "A silver bar")  ;15
+               ("There is a bus driver's license here." "A license") ;16
+               ("There are some valuable coins here." "Some valuable coins")
+               ("There is a jewel-encrusted egg here." "A valuable egg") ;18
+               ("There is a glass jar here." "A glass jar") ;19
+               ("There is a dinosaur bone here." "A bone") ;20
+               ("There is a packet of nitric acid here." "Some nitric acid")
+               ("There is a packet of glycerine here." "Some glycerine") ;22
+               ("There is a valuable ruby here." "A ruby") ;23
+               ("There is a valuable amethyst here." "An amethyst") ;24
+               ("The Mona Lisa is here." "The Mona Lisa") ;25
+               ("There is a 100 dollar bill here." "A $100 bill") ;26
+               ("There is a floppy disk here." "A floppy disk") ;27
+              )
+)
+
+;;; Weight of objects
+
+(setq dun-object-lbs
+      '(2 1 1 1 1 0 2 2 10 3 1 1 1 0 1 1 0 1 1 1 1 0 0 2 2 1 0 0))
+(setq dun-object-pts
+      '(0 0 0 0 0 0 0 10 0 0 10 10 10 0 0 10 0 10 10 0 0 0 0 10 10 10 10 0))
+
+
+;;; Unix representation of objects.
+(setq dun-objfiles '(
+                "shovel.o" "lamp.o" "cpu.o" "food.o" "key.o" "paper.o"
+                "rms.o" "diamond.o" "weight.o" "preserver.o" "bracelet.o"
+                "gold.o" "platinum.o" "towel.o" "axe.o" "silver.o" "license.o"
+                "coins.o" "egg.o" "jar.o" "bone.o" "nitric.o" "glycerine.o"
+                "ruby.o" "amethyst.o"
+                ))
+
+;;; These are the descriptions for the negative numbered objects from
+;;; dun-room-objects
+
+(setq dun-perm-objects '(
+                    nil
+                    ("There is a large boulder here.")
+                    nil
+                    ("There is a ferocious bear here!")
+                    nil
+                    nil
+                    ("There is a worthless pile of protoplasm here.")
+                    nil
+                    nil
+                    nil
+                    nil
+                    nil
+                    nil
+                    ("There is a strange smell in this room.")
+                    nil
+                    (
+"There is a box with a slit in it, bolted to the wall here."
+                     )
+                    nil
+                    nil
+                    ("There is a bus here.")
+                    nil
+                    nil
+                    nil
+))
+
+
+;;; These are the descriptions the user gets when regular objects are
+;;; examined.
+
+(setq dun-physobj-desc '(
+"It is a normal shovel with a price tag attached that says $19.99."
+"The lamp is hand-crafted by Geppetto."
+"The CPU board has a VAX chip on it.  It seems to have
+2 Megabytes of RAM onboard."
+"It looks like some kind of meat.  Smells pretty bad."
+nil
+"The paper says: Don't forget to type ‘help’ for help.  Also, remember
+this word: ‘worms’"
+"The statuette is of the likeness of Richard Stallman, the author of the
+famous EMACS editor.  You notice that he is not wearing any shoes."
+nil
+"You observe that the weight is heavy."
+"It says S. S. Minnow."
+nil
+nil
+nil
+"It has a picture of snoopy on it."
+nil
+nil
+"It has your picture on it!"
+"They are old coins from the 19th century."
+"It is a valuable Fabrege egg."
+"It is a plain glass jar."
+nil
+nil
+nil
+nil
+nil
+                     )
+)
+
+;;; These are the descriptions the user gets when non-regular objects
+;;; are examined.
+
+(setq dun-permobj-desc '(
+                    nil
+"It is just a boulder.  It cannot be moved."
+"They are palm trees with a bountiful supply of coconuts in them."
+"It looks like a grizzly to me."
+"All of the bins are empty.  Looking closely you can see that there
+are names written at the bottom of each bin, but most of them are
+faded away so that you cannot read them.  You can only make out three
+names:
+                   Jeffrey Collier
+                   Robert Toukmond
+                   Thomas Stock
+"
+                      nil
+"It is just a garbled mess."
+"The dial points to a temperature scale which has long since faded away."
+nil
+nil
+"It is a velvet painting of Elvis Presley.  It seems to be nailed to the
+wall, and you cannot move it."
+"It is a queen sized bed, with a very firm mattress."
+"The urinal is very clean compared with everything else in the cave.  There
+isn't even any rust.  Upon close examination you realize that the drain at the
+bottom is missing, and there is just a large hole leading down the
+pipes into nowhere.  The hole is too small for a person to fit in.  The
+flush handle is so clean that you can see your reflection in it."
+nil
+nil
+"The box has a slit in the top of it, and on it, in sloppy handwriting, is
+written: ‘For key upgrade, put key in here.’"
+nil
+"It says ‘express mail’ on it."
+"It is a 35 passenger bus with the company name ‘mobytours’ on it."
+"It is a large metal gate that is too big to climb over."
+"It is a HIGH cliff."
+"Unfortunately you do not know enough about dinosaurs to tell very much about
+it.  It is very big, though."
+"The fish look like they were once quite beautiful."
+nil
+nil
+nil
+nil
+"It is a normal ladder that is permanently attached to the hole."
+"It is a passenger train that is ready to go."
+"It is a personal computer that has only one floppy disk drive."
+                   )
+)
+
+(setq dun-diggables
+      (list nil nil nil (list obj-cpu) nil nil nil nil nil nil nil
+                 nil nil nil nil nil nil nil nil nil nil      ;11-20
+                 nil nil nil nil nil nil nil nil nil nil      ;21-30
+                 nil nil nil nil nil nil nil nil nil nil      ;31-40
+                 nil (list obj-platinum) nil nil nil nil nil nil nil nil))
+
+(setq dun-room-shorts nil)
+
+(setq dun-endgame-questions '(
+                         (
+"What is your password on the machine called ‘pokey’?" "robert")
+                         (
+"What password did you use during anonymous ftp to gamma?" "foo")
+                         (
+"Excluding the endgame, how many places are there where you can put
+treasures for points?" "4" "four")
+                         (
+"What is your login name on the ‘endgame’ machine?" "toukmond"
+)
+                         (
+"What is the nearest whole dollar to the price of the shovel?" "20" "twenty")
+                         (
+"What is the name of the bus company serving the town?" "mobytours")
+                         (
+"Give either of the two last names in the mailroom, other than your own."
+"collier" "stock")
+                         (
+"What cartoon character is on the towel?" "snoopy")
+                         (
+"What is the last name of the author of EMACS?" "stallman")
+                         (
+"How many megabytes of memory is on the CPU board for the Vax?" "2")
+                         (
+"Which street in town is named after a U.S. state?" "vermont")
+                         (
+"How many pounds did the weight weigh?" "ten" "10")
+                         (
+"Name the STREET which runs right over the subway stop." "fourth" "4" "4th")
+                         (
+"How many corners are there in town (excluding the one with the Post Office)?"
+                  "24" "twentyfour" "twenty-four")
+                         (
+"What type of bear was hiding your key?" "grizzly")
+                         (
+"Name either of the two objects you found by digging." "cpu" "card" "vax"
+"board" "platinum")
+                         (
+"What network protocol is used between pokey and gamma?" "tcp/ip" "ip" "tcp")
 ))
 
-(setq dun-light-rooms '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 25 26 27 28 58 59
-                    60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
-                    77 78 79 80 81 82 83))
 
-(setq dun-verblist '((die . dun-die) (ne . dun-ne) (north . dun-n)
-                    (south . dun-s) (east . dun-e) (west . dun-w)
-                    (u . dun-up) (d . dun-down) (i . dun-inven)
-                    (inventory . dun-inven) (look . dun-examine) (n . dun-n)
-                    (s . dun-s) (e . dun-e) (w . dun-w) (se . dun-se)
-                    (nw . dun-nw) (sw . dun-sw) (up . dun-up)
-                    (down . dun-down) (in . dun-in) (out . dun-out)
-                    (go . dun-go) (drop . dun-drop) (southeast . dun-se)
-                    (southwest . dun-sw) (northeast . dun-ne)
-                    (northwest . dun-nw) (save . dun-save-game)
-                    (restore . dun-restore) (long . dun-long) (dig . dun-dig)
-                    (shake . dun-shake) (wave . dun-shake)
-                    (examine . dun-examine) (describe . dun-examine)
-                    (climb . dun-climb) (eat . dun-eat) (put . dun-put)
-                    (type . dun-type)  (insert . dun-put)
-                    (score . dun-score) (help . dun-help) (quit . dun-quit)
-                    (read . dun-examine) (verbose . dun-long)
-                    (urinate . dun-piss) (piss . dun-piss)
-                    (flush . dun-flush) (sleep . dun-sleep) (lie . dun-sleep)
-                    (x . dun-examine) (break . dun-break) (drive . dun-drive)
-                    (board . dun-in) (enter . dun-in) (turn . dun-turn)
-                    (press . dun-press) (push . dun-press) (swim . dun-swim)
-                    (on . dun-in) (off . dun-out) (chop . dun-break)
-                    (switch . dun-press) (cut . dun-break) (exit . dun-out)
-                    (leave . dun-out) (reset . dun-power) (flick . dun-press)
-                    (superb . dun-superb) (answer . dun-answer)
-                    (throw . dun-drop) (l . dun-examine) (take . dun-take)
-                    (get . dun-take) (feed . dun-feed)))
+;;;; Mode definitions for interactive mode
+
+(define-derived-mode dun-mode text-mode "Dungeon"
+  "Major mode for running dunnet."
+  (make-local-variable 'scroll-step)
+  (setq scroll-step 2))
+
+(defun dun-parse (_arg)
+  "Function called when return is pressed in interactive mode to parse line."
+  (interactive "*p")
+  (beginning-of-line)
+  (let ((beg (1+ (point)))
+        line)
+    (end-of-line)
+    (if (and (not (= beg (point))) (not (< (point) beg))
+             (string= ">" (buffer-substring (- beg 1) beg)))
+        (progn
+          (setq line (downcase (buffer-substring beg (point))))
+          (princ line)
+          (if (eq (dun-vparse dun-ignore dun-verblist line) -1)
+              (dun-mprinc "I don't understand that.\n")))
+    (goto-char (point-max))
+    (dun-mprinc "\n")))
+  (dun-messages))
+
+(defun dun-messages ()
+  (if dun-dead
+      (text-mode)
+    (if (eq dungeon-mode 'dungeon)
+       (progn
+         (if (not (= room dun-current-room))
+             (progn
+               (dun-describe-room dun-current-room)
+               (setq room dun-current-room)))
+         (dun-fix-screen)
+         (dun-mprinc ">")))))
+
+
+;;;###autoload
+(defun dunnet ()
+  "Switch to *dungeon* buffer and start game."
+  (interactive)
+  (switch-to-buffer "*dungeon*")
+  (dun-mode)
+  (setq dun-dead nil)
+  (setq room 0)
+  (dun-messages))
+
+;;;;
+;;;; This section contains all of the verbs and commands.
+;;;;
+
+;;; Give long description of room if haven't been there yet.  Otherwise
+;;; short.  Also give long if we were called with negative room number.
+
+(defun dun-describe-room (room)
+  (if (and (not (member (abs room) dun-light-rooms))
+          (not (member obj-lamp dun-inventory))
+          (not (member obj-lamp (nth dun-current-room dun-room-objects))))
+      (dun-mprincl "It is pitch dark.  You are likely to be eaten by a grue.")
+    (dun-mprincl (cadr (nth (abs room) dun-rooms)))
+    (if (and (and (or (member room dun-visited)
+                     (string= dun-mode "dun-superb")) (> room 0))
+            (not (string= dun-mode "long")))
+       nil
+      (dun-mprinc (car (nth (abs room) dun-rooms)))
+    (dun-mprinc "\n"))
+    (if (not (string= dun-mode "long"))
+       (if (not (member (abs room) dun-visited))
+           (setq dun-visited (append (list (abs room)) dun-visited))))
+    (dolist (xobjs (nth dun-current-room dun-room-objects))
+      (if (= xobjs obj-special)
+         (dun-special-object)
+       (if (>= xobjs 0)
+           (dun-mprincl (car (nth xobjs dun-objects)))
+         (if (not (and (= xobjs obj-bus) dun-inbus))
+             (progn
+               (dun-mprincl (car (nth (abs xobjs) dun-perm-objects)))))))
+      (if (and (= xobjs obj-jar) dun-jar)
+         (progn
+           (dun-mprincl "The jar contains:")
+           (dolist (x dun-jar)
+             (dun-mprinc "     ")
+             (dun-mprincl (car (nth x dun-objects)))))))
+    (if (and (member obj-bus (nth dun-current-room dun-room-objects)) 
dun-inbus)
+       (dun-mprincl "You are on the bus."))))
+
+;;; There is a special object in the room.  This object's description,
+;;; or lack thereof, depends on certain conditions.
+
+(defun dun-special-object ()
+  (if (= dun-current-room computer-room)
+      (if dun-computer
+         (dun-mprincl
+"The panel lights are flashing in a seemingly organized pattern.")
+       (dun-mprincl "The panel lights are steady and motionless.")))
+
+  (if (and (= dun-current-room red-room)
+          (not (member obj-towel (nth red-room dun-room-objects))))
+      (dun-mprincl "There is a hole in the floor here."))
+
+  (if (and (= dun-current-room marine-life-area) dun-black)
+      (dun-mprincl
+"The room is lit by a black light, causing the fish, and some of
+your objects, to give off an eerie glow."))
+  (if (and (= dun-current-room fourth-vermont-intersection) dun-hole)
+      (progn
+       (if (not dun-inbus)
+           (progn
+             (dun-mprincl "You fall into a hole in the ground.")
+             (setq dun-current-room vermont-station)
+             (dun-describe-room vermont-station))
+         (progn
+           (dun-mprincl
+"The bus falls down a hole in the ground and explodes.")
+           (dun-die "burning")))))
+
+  (if (> dun-current-room endgame-computer-room)
+      (progn
+       (if (not dun-correct-answer)
+           (dun-endgame-question)
+         (dun-mprincl "Your question is:")
+         (dun-mprincl dun-endgame-question))))
+
+  (if (= dun-current-room sauna)
+      (progn
+       (dun-mprincl (nth dun-sauna-level '(
+"It is normal room temperature in here."
+"It is luke warm in here."
+"It is comfortably hot in here."
+"It is refreshingly hot in here."
+"You are dead now.")))
+       (if (= dun-sauna-level 3)
+           (progn
+             (if (or (member obj-rms dun-inventory)
+                     (member obj-rms (nth dun-current-room dun-room-objects)))
+                 (progn
+                   (dun-mprincl
+"You notice the wax on your statuette beginning to melt, until it completely
+melts off.  You are left with a beautiful diamond!")
+                   (if (member obj-rms dun-inventory)
+                       (progn
+                         (dun-remove-obj-from-inven obj-rms)
+                         (setq dun-inventory (append dun-inventory
+                                                     (list obj-diamond))))
+                     (dun-remove-obj-from-room dun-current-room obj-rms)
+                     (dun-replace dun-room-objects dun-current-room
+                                  (append (nth dun-current-room 
dun-room-objects)
+                                          (list obj-diamond))))))
+             (if (or (member obj-floppy dun-inventory)
+                     (member obj-floppy (nth dun-current-room 
dun-room-objects)))
+                 (progn
+                   (dun-mprincl
+"You notice your floppy disk beginning to melt.  As you grab for it, the
+disk bursts into flames, and disintegrates.")
+                   (dun-remove-obj-from-inven obj-floppy)
+                   (dun-remove-obj-from-room dun-current-room 
obj-floppy))))))))
+
+
+(defun dun-die (murderer)
+  (dun-mprinc "\n")
+  (if murderer
+      (dun-mprincl "You are dead."))
+  (dun-do-logfile 'dun-die murderer)
+  (dun-score nil)
+  (setq dun-dead t))
+
+(defun dun-quit (_args)
+  (dun-die nil))
+
+;;; Print every object in player's inventory.  Special case for the jar,
+;;; as we must also print what is in it.
+
+(defun dun-inven (_args)
+  (dun-mprinc "You currently have:")
+  (dun-mprinc "\n")
+  (dolist (curobj dun-inventory)
+    (if curobj
+       (progn
+         (dun-mprincl (cadr (nth curobj dun-objects)))
+         (if (and (= curobj obj-jar) dun-jar)
+             (progn
+               (dun-mprincl "The jar contains:")
+               (dolist (x dun-jar)
+                 (dun-mprinc "     ")
+                 (dun-mprincl (cadr (nth x dun-objects))))))))))
+
+(defun dun-shake (obj)
+  (let (objnum)
+    (when (setq objnum (dun-objnum-from-args-std obj))
+      (if (member objnum dun-inventory)
+         (progn
+;;;    If shaking anything will do anything, put here.
+           (dun-mprinc "Shaking ")
+           (dun-mprinc (downcase (cadr (nth objnum dun-objects))))
+           (dun-mprinc " seems to have no effect.")
+           (dun-mprinc "\n")
+           )
+       (if (and (not (member objnum (nth dun-current-room dun-room-silents)))
+                (not (member objnum (nth dun-current-room dun-room-objects))))
+           (dun-mprincl "I don't see that here.")
+;;;     Shaking trees can be deadly
+         (if (= objnum obj-tree)
+             (progn
+               (dun-mprinc
+ "You begin to shake a tree, and notice a coconut begin to fall from the air.
+As you try to get your hand up to block it, you feel the impact as it lands
+on your head.")
+               (dun-die "a coconut"))
+           (if (= objnum obj-bear)
+               (progn
+                 (dun-mprinc
+"As you go up to the bear, it removes your head and places it on the ground.")
+                 (dun-die "a bear"))
+             (if (< objnum 0)
+                 (dun-mprincl "You cannot shake that.")
+               (dun-mprincl "You don't have that.")))))))))
+
+
+(defun dun-drop (obj)
+  (if dun-inbus
+      (dun-mprincl "You can't drop anything while on the bus.")
+  (let (objnum)
+    (when (setq objnum (dun-objnum-from-args-std obj))
+      (if (not (member objnum dun-inventory))
+         (dun-mprincl "You don't have that.")
+       (progn
+         (dun-remove-obj-from-inven objnum)
+         (dun-replace dun-room-objects dun-current-room
+                  (append (nth dun-current-room dun-room-objects)
+                          (list objnum)))
+         (dun-mprincl "Done.")
+         (if (member objnum (list obj-food obj-weight obj-jar))
+             (dun-drop-check objnum))))))))
+
+;;; Dropping certain things causes things to happen.
+
+(defun dun-drop-check (objnum)
+  (if (and (= objnum obj-food) (= room bear-hangout)
+          (member obj-bear (nth bear-hangout dun-room-objects)))
+      (progn
+       (dun-mprincl
+"The bear takes the food and runs away with it. He left something behind.")
+       (dun-remove-obj-from-room dun-current-room obj-bear)
+       (dun-remove-obj-from-room dun-current-room obj-food)
+       (dun-replace dun-room-objects dun-current-room
+                (append (nth dun-current-room dun-room-objects)
+                        (list obj-key)))))
+
+  (if (and (= objnum obj-jar) (member obj-nitric dun-jar)
+          (member obj-glycerine dun-jar))
+      (progn
+       (dun-mprincl
+        "As the jar impacts the ground it explodes into many pieces.")
+       (setq dun-jar nil)
+       (dun-remove-obj-from-room dun-current-room obj-jar)
+       (if (= dun-current-room fourth-vermont-intersection)
+           (progn
+             (setq dun-hole t)
+             (setq dun-current-room vermont-station)
+             (dun-mprincl
+"The explosion causes a hole to open up in the ground, which you fall
+through.")))))
+
+  (if (and (= objnum obj-weight) (= dun-current-room maze-button-room))
+      (dun-mprincl "A passageway opens.")))
+
+;;; Give long description of current room, or an object.
+
+(defun dun-examine (obj)
+  (let (objnum)
+    (setq objnum (dun-objnum-from-args obj))
+    (if (eq objnum obj-special)
+       (dun-describe-room (* dun-current-room -1))
+      (if (and (eq objnum obj-computer)
+              (member obj-pc (nth dun-current-room dun-room-silents)))
+         (dun-examine '("pc"))
+       (if (eq objnum nil)
+           (dun-mprincl "I don't know what that is.")
+         (if (and (not (member objnum
+                               (nth dun-current-room dun-room-objects)))
+                  (not (and (member obj-jar dun-inventory)
+                            (member objnum dun-jar)))
+                  (not (member objnum
+                               (nth dun-current-room dun-room-silents)))
+                  (not (member objnum dun-inventory)))
+             (dun-mprincl "I don't see that here.")
+           (if (>= objnum 0)
+               (if (and (= objnum obj-bone)
+                        (= dun-current-room marine-life-area) dun-black)
+                   (dun-mprincl
+"In this light you can see some writing on the bone.  It says:
+For an explosive time, go to Fourth St. and Vermont.")
+                 (if (nth objnum dun-physobj-desc)
+                     (dun-mprincl (nth objnum dun-physobj-desc))
+                   (dun-mprincl "I see nothing special about that.")))
+             (if (nth (abs objnum) dun-permobj-desc)
+                 (progn
+                   (dun-mprincl (nth (abs objnum) dun-permobj-desc)))
+               (dun-mprincl "I see nothing special about that.")))))))))
+
+(defun dun-take (obj)
+    (setq obj (dun-firstword obj))
+    (if (not obj)
+       (dun-mprincl "You must supply an object.")
+      (if (string= obj "all")
+         (let (gotsome)
+           (if dun-inbus
+               (dun-mprincl "You can't take anything while on the bus.")
+             (setq gotsome nil)
+             (dolist (x (nth dun-current-room dun-room-objects))
+               (if (and (>= x 0) (not (= x obj-special)))
+                   (progn
+                     (setq gotsome t)
+                     (dun-mprinc (cadr (nth x dun-objects)))
+                     (dun-mprinc ": ")
+                     (dun-take-object x))))
+             (if (not gotsome)
+                 (dun-mprincl "Nothing to take."))))
+       (let (objnum)
+         (setq objnum (cdr (assq (intern obj) dun-objnames)))
+         (if (eq objnum nil)
+             (progn
+               (dun-mprinc "I don't know what that is.")
+               (dun-mprinc "\n"))
+           (if (and dun-inbus (not (and (member objnum dun-jar)
+                                        (member obj-jar dun-inventory))))
+               (dun-mprincl "You can't take anything while on the bus.")
+             (dun-take-object objnum)))))))
+
+(defun dun-take-object (objnum)
+  (if (and (member objnum dun-jar) (member obj-jar dun-inventory))
+      (let (newjar)
+       (dun-mprincl "You remove it from the jar.")
+       (setq newjar nil)
+       (dolist (x dun-jar)
+         (if (not (= x objnum))
+             (setq newjar (append newjar (list x)))))
+       (setq dun-jar newjar)
+       (setq dun-inventory (append dun-inventory (list objnum))))
+    (if (not (member objnum (nth dun-current-room dun-room-objects)))
+       (if (not (member objnum (nth dun-current-room dun-room-silents)))
+           (dun-mprinc "I do not see that here.")
+         (dun-try-take objnum))
+      (if (>= objnum 0)
+         (progn
+           (if (and (car dun-inventory)
+                    (> (+ (dun-inven-weight) (nth objnum dun-object-lbs)) 11))
+               (dun-mprinc "Your load would be too heavy.")
+             (setq dun-inventory (append dun-inventory (list objnum)))
+             (dun-remove-obj-from-room dun-current-room objnum)
+             (dun-mprinc "Taken.  ")
+             (if (and (= objnum obj-towel) (= dun-current-room red-room))
+                 (dun-mprinc
+                  "Taking the towel reveals a hole in the floor."))))
+       (dun-try-take objnum)))
+    (dun-mprinc "\n")))
+
+(defun dun-inven-weight ()
+  (let (total)
+    (setq total 0)
+    (dolist (x dun-jar)
+      (setq total (+ total (nth x dun-object-lbs))))
+    (dolist (x dun-inventory)
+      (setq total (+ total (nth x dun-object-lbs)))) total))
+
+;;; We try to take an object that is untakable.  Print a message
+;;; depending on what it is.
+
+(defun dun-try-take (_obj)
+  (dun-mprinc "You cannot take that."))
+
+(defun dun-dig (_args)
+  (if dun-inbus
+      (dun-mprincl "Digging here reveals nothing.")
+  (if (not (member 0 dun-inventory))
+      (dun-mprincl "You have nothing with which to dig.")
+    (if (not (nth dun-current-room dun-diggables))
+       (dun-mprincl "Digging here reveals nothing.")
+      (dun-mprincl "I think you found something.")
+      (dun-replace dun-room-objects dun-current-room
+              (append (nth dun-current-room dun-room-objects)
+                      (nth dun-current-room dun-diggables)))
+      (dun-replace dun-diggables dun-current-room nil)))))
+
+(defun dun-climb (obj)
+  (let (objnum)
+    (setq objnum (dun-objnum-from-args obj))
+    (cond ((not objnum)
+          (dun-mprincl "I don't know what that object is."))
+         ((and (not (eq objnum obj-special))
+               (not (member objnum (nth dun-current-room dun-room-objects)))
+               (not (member objnum (nth dun-current-room dun-room-silents)))
+               (not (and (member objnum dun-jar) (member obj-jar 
dun-inventory)))
+               (not (member objnum dun-inventory)))
+          (dun-mprincl "I don't see that here."))
+         ((and (eq objnum obj-special)
+               (not (member obj-tree (nth dun-current-room dun-room-silents))))
+          (dun-mprincl "There is nothing here to climb."))
+         ((and (not (eq objnum obj-tree)) (not (eq objnum obj-special)))
+          (dun-mprincl "You can't climb that."))
+         (t
+          (dun-mprincl
+           "You manage to get about two feet up the tree and fall back down.  
You
+notice that the tree is very unsteady.")))))
+
+(defun dun-eat (obj)
+  (let (objnum)
+    (when (setq objnum (dun-objnum-from-args-std obj))
+      (if (not (member objnum dun-inventory))
+         (dun-mprincl "You don't have that.")
+       (if (not (= objnum obj-food))
+           (progn
+             (dun-mprinc "You forcefully shove ")
+             (dun-mprinc (downcase (cadr (nth objnum dun-objects))))
+             (dun-mprincl " down your throat, and start choking.")
+             (dun-die "choking"))
+         (dun-mprincl "That tasted horrible.")
+         (dun-remove-obj-from-inven obj-food))))))
+
+(defun dun-put (args)
+    (let (newargs objnum objnum2 obj)
+      (setq newargs (dun-firstwordl args))
+      (if (not newargs)
+         (dun-mprincl "You must supply an object")
+       (setq obj (intern (car newargs)))
+       (setq objnum (cdr (assq obj dun-objnames)))
+       (if (not objnum)
+           (dun-mprincl "I don't know what that object is.")
+         (if (not (member objnum dun-inventory))
+             (dun-mprincl "You don't have that.")
+           (setq newargs (dun-firstwordl (cdr newargs)))
+           (setq newargs (dun-firstwordl (cdr newargs)))
+           (if (not newargs)
+               (dun-mprincl "You must supply an indirect object.")
+             (setq objnum2 (cdr (assq (intern (car newargs)) dun-objnames)))
+             (if (and (eq objnum2 obj-computer) (= dun-current-room pc-area))
+                 (setq objnum2 obj-pc))
+             (if (not objnum2)
+                 (dun-mprincl "I don't know what that indirect object is.")
+               (if (and (not (member objnum2
+                                     (nth dun-current-room dun-room-objects)))
+                        (not (member objnum2
+                                     (nth dun-current-room dun-room-silents)))
+                        (not (member objnum2 dun-inventory)))
+                   (dun-mprincl "That indirect object is not here.")
+                 (dun-put-objs objnum objnum2)))))))))
+
+(defun dun-put-objs (obj1 obj2)
+  (if (and (= obj2 obj-drop) (not dun-nomail))
+      (setq obj2 obj-chute))
+
+  (if (= obj2 obj-disposal) (setq obj2 obj-chute))
+
+  (if (and (= obj1 obj-cpu) (= obj2 obj-computer))
+      (progn
+       (dun-remove-obj-from-inven obj-cpu)
+       (setq dun-computer t)
+       (dun-mprincl
+"As you put the CPU board in the computer, it immediately springs to life.
+The lights start flashing, and the fans seem to startup."))
+    (if (and (= obj1 obj-weight) (= obj2 obj-button))
+       (dun-drop '("weight"))
+      (if (= obj2 obj-jar)                 ;; Put something in jar
+         (if (not (member obj1 (list obj-paper obj-diamond obj-emerald
+                                     obj-license obj-coins obj-egg
+                                     obj-nitric obj-glycerine)))
+             (dun-mprincl "That will not fit in the jar.")
+           (dun-remove-obj-from-inven obj1)
+           (setq dun-jar (append dun-jar (list obj1)))
+           (dun-mprincl "Done."))
+       (if (= obj2 obj-chute)                 ;; Put something in chute
+           (progn
+             (dun-remove-obj-from-inven obj1)
+             (dun-mprincl
+"You hear it slide down the chute and off into the distance.")
+             (dun-put-objs-in-treas (list obj1)))
+         (if (= obj2 obj-box)              ;; Put key in key box
+             (if (= obj1 obj-key)
+                 (progn
+                   (dun-mprincl
+"As you drop the key, the box begins to shake.  Finally it explodes
+with a bang.  The key seems to have vanished!")
+                   (dun-remove-obj-from-inven obj1)
+                   (dun-replace dun-room-objects computer-room (append
+                                                       (nth computer-room
+                                                            dun-room-objects)
+                                                       (list obj1)))
+                   (dun-remove-obj-from-room dun-current-room obj-box)
+                   (setq dun-key-level (1+ dun-key-level)))
+               (dun-mprincl "You can't put that in the key box!"))
+
+           (if (and (= obj1 obj-floppy) (= obj2 obj-pc))
+               (progn
+                 (setq dun-floppy t)
+                 (dun-remove-obj-from-inven obj1)
+                 (dun-mprincl "Done."))
+
+             (if (= obj2 obj-urinal)                   ;; Put object in urinal
+                 (progn
+                   (dun-remove-obj-from-inven obj1)
+                   (dun-replace dun-room-objects urinal (append
+                                                 (nth urinal dun-room-objects)
+                                                  (list obj1)))
+                   (dun-mprincl
+                    "You hear it plop down in some water below."))
+               (if (= obj2 obj-mail)
+                   (dun-mprincl "The mail chute is locked.")
+                 (if (member obj1 dun-inventory)
+                     (dun-mprincl
+"I don't know how to combine those objects.  Perhaps you should
+just try dropping it.")
+                   (dun-mprincl "You can't put that there.")))))))))))
+
+(defun dun-type (_args)
+  (if (not (= dun-current-room computer-room))
+      (dun-mprincl "There is nothing here on which you could type.")
+    (if (not dun-computer)
+       (dun-mprincl
+"You type on the keyboard, but your characters do not even echo.")
+      (dun-unix-interface))))
+
+;;; Various movement directions
+
+(defun dun-n (_args)
+  (dun-move north))
+
+(defun dun-s (_args)
+  (dun-move south))
+
+(defun dun-e (_args)
+  (dun-move east))
+
+(defun dun-w (_args)
+  (dun-move west))
+
+(defun dun-ne (_args)
+  (dun-move northeast))
+
+(defun dun-se (_args)
+  (dun-move southeast))
+
+(defun dun-nw (_args)
+  (dun-move northwest))
+
+(defun dun-sw (_args)
+  (dun-move southwest))
+
+(defun dun-up (_args)
+  (dun-move up))
+
+(defun dun-down (_args)
+  (dun-move down))
+
+(defun dun-in (_args)
+  (dun-move in))
+
+(defun dun-out (_args)
+  (dun-move out))
+
+(defun dun-go (args)
+  (if (or (not (car args))
+         (eq (dun-doverb dun-ignore dun-verblist (car args)
+                         (cdr (cdr args))) -1))
+      (dun-mprinc "I don't understand where you want me to go.\n")))
+
+;;; Uses the dungeon-map to figure out where we are going.  If the
+;;; requested direction yields 255, we know something special is
+;;; supposed to happen, or perhaps you can't go that way unless
+;;; certain conditions are met.
+
+(defun dun-move (dir)
+  (if (and (not (member dun-current-room dun-light-rooms))
+          (not (member obj-lamp dun-inventory))
+          (not (member obj-lamp (nth dun-current-room dun-room-objects))))
+      (progn
+       (dun-mprinc
+"You trip over a grue and fall into a pit and break every bone in your
+body.")
+       (dun-die "a grue"))
+    (let (newroom)
+      (setq newroom (nth dir (nth dun-current-room dungeon-map)))
+      (if (eq newroom -1)
+         (dun-mprinc "You can't go that way.\n")
+       (if (eq newroom 255)
+           (dun-special-move dir)
+         (setq room -1)
+         (setq dun-lastdir dir)
+         (if dun-inbus
+             (progn
+               (if (or (< newroom 58) (> newroom 83))
+                   (dun-mprincl "The bus cannot go this way.")
+                 (dun-mprincl
+                  "The bus lurches ahead and comes to a screeching halt.")
+                 (dun-remove-obj-from-room dun-current-room obj-bus)
+                 (setq dun-current-room newroom)
+                 (dun-replace dun-room-objects newroom
+                          (append (nth newroom dun-room-objects)
+                                  (list obj-bus)))))
+           (setq dun-current-room newroom)))))))
+
+;;; Movement in this direction causes something special to happen if the
+;;; right conditions exist.  It may be that you can't go this way unless
+;;; you have a key, or a passage has been opened.
+
+;;; coding note: Each check of the current room is on the same 'if' level,
+;;; i.e. there aren't else's.  If two rooms next to each other have
+;;; specials, and they are connected by specials, this could cause
+;;; a problem.  Be careful when adding them to consider this, and
+;;; perhaps use else's.
+
+(defun dun-special-move (dir)
+  (if (= dun-current-room building-front)
+      (if (not (member obj-key dun-inventory))
+         (dun-mprincl "You don't have a key that can open this door.")
+       (setq dun-current-room old-building-hallway))
+    (if (= dun-current-room north-end-of-cave-passage)
+       (let (combo)
+         (dun-mprincl
+"You must type a 3 digit combination code to enter this room.")
+         (dun-mprinc "Enter it here: ")
+         (setq combo (dun-read-line))
+         (if (not dun-batch-mode)
+             (dun-mprinc "\n"))
+         (if (string= combo dun-combination)
+             (setq dun-current-room gamma-computing-center)
+           (dun-mprincl "Sorry, that combination is incorrect."))))
+
+    (if (= dun-current-room bear-hangout)
+       (if (member obj-bear (nth bear-hangout dun-room-objects))
+           (progn
+             (dun-mprinc
+"The bear is very annoyed that you would be so presumptuous as to try
+and walk right by it.  He tells you so by tearing your head off.
+")
+             (dun-die "a bear"))
+         (dun-mprincl "You can't go that way.")))
+
+    (if (= dun-current-room vermont-station)
+       (progn
+         (dun-mprincl
+"As you board the train it immediately leaves the station.  It is a very
+bumpy ride.  It is shaking from side to side, and up and down.  You
+sit down in one of the chairs in order to be more comfortable.")
+         (dun-mprincl
+"\nFinally the train comes to a sudden stop, and the doors open, and some
+force throws you out.  The train speeds away.\n")
+         (setq dun-current-room museum-station)))
+
+    (if (= dun-current-room old-building-hallway)
+       (if (and (member obj-key dun-inventory)
+                (> dun-key-level 0))
+           (setq dun-current-room meadow)
+         (dun-mprincl "You don't have a key that can open this door.")))
+
+    (if (and (= dun-current-room maze-button-room) (= dir northwest))
+       (if (member obj-weight (nth maze-button-room dun-room-objects))
+           (setq dun-current-room 18)
+         (dun-mprincl "You can't go that way.")))
+
+    (if (and (= dun-current-room maze-button-room) (= dir up))
+       (if (member obj-weight (nth maze-button-room dun-room-objects))
+           (dun-mprincl "You can't go that way.")
+         (setq dun-current-room weight-room)))
+
+    (if (= dun-current-room classroom)
+       (dun-mprincl "The door is locked."))
+
+    (if (or (= dun-current-room lakefront-north)
+           (= dun-current-room lakefront-south))
+       (dun-swim nil))
+
+    (if (= dun-current-room reception-area)
+       (if (not (= dun-sauna-level 3))
+           (setq dun-current-room health-club-front)
+         (dun-mprincl
+"As you exit the building, you notice some flames coming out of one of the
+windows.  Suddenly, the building explodes in a huge ball of fire.  The flames
+engulf you, and you burn to death.")
+         (dun-die "burning")))
+
+    (if (= dun-current-room red-room)
+       (if (not (member obj-towel (nth red-room dun-room-objects)))
+           (setq dun-current-room long-n-s-hallway)
+         (dun-mprincl "You can't go that way.")))
+
+    (if (and (> dir down) (> dun-current-room gamma-computing-center)
+            (< dun-current-room museum-lobby))
+       (if (not (member obj-bus (nth dun-current-room dun-room-objects)))
+           (dun-mprincl "You can't go that way.")
+         (if (= dir in)
+             (if dun-inbus
+                 (dun-mprincl
+                  "You are already in the bus!")
+               (if (member obj-license dun-inventory)
+                   (progn
+                     (dun-mprincl
+                      "You board the bus and get in the driver's seat.")
+                     (setq dun-nomail t)
+                     (setq dun-inbus t))
+                 (dun-mprincl "You are not licensed for this type of 
vehicle.")))
+           (if (not dun-inbus)
+               (dun-mprincl "You are already off the bus!")
+             (dun-mprincl "You hop off the bus.")
+             (setq dun-inbus nil))))
+      (if (= dun-current-room fifth-oaktree-intersection)
+         (if (not dun-inbus)
+             (progn
+               (dun-mprincl "You fall down the cliff and land on your head.")
+               (dun-die "a cliff"))
+           (dun-mprincl
+"The bus flies off the cliff, and plunges to the bottom, where it explodes.")
+           (dun-die "a bus accident")))
+      (if (= dun-current-room main-maple-intersection)
+         (progn
+           (if (not dun-inbus)
+               (dun-mprincl "The gate will not open.")
+             (dun-mprincl
+"As the bus approaches, the gate opens and you drive through.")
+             (dun-remove-obj-from-room main-maple-intersection obj-bus)
+             (dun-replace dun-room-objects museum-entrance
+                      (append (nth museum-entrance dun-room-objects)
+                              (list obj-bus)))
+             (setq dun-current-room museum-entrance)))))
+    (if (= dun-current-room cave-entrance)
+       (progn
+         (dun-mprincl
+"As you enter the room you hear a rumbling noise.  You look back to see
+huge rocks sliding down from the ceiling, and blocking your way out.\n")
+         (setq dun-current-room misty-room)))))
+
+(defun dun-long (_args)
+  (setq dun-mode "long"))
+
+(defun dun-turn (obj)
+  (let (objnum direction)
+    (when (setq objnum (dun-objnum-from-args-std obj))
+      (if (not (or (member objnum (nth dun-current-room dun-room-objects))
+                  (member objnum (nth dun-current-room dun-room-silents))))
+         (dun-mprincl "I don't see that here.")
+       (if (not (= objnum obj-dial))
+           (dun-mprincl "You can't turn that.")
+         (setq direction (dun-firstword (cdr obj)))
+         (if (or (not direction)
+                 (not (or (string= direction "clockwise")
+                          (string= direction "counterclockwise"))))
+             (dun-mprincl "You must indicate clockwise or counterclockwise.")
+           (if (string= direction "clockwise")
+               (setq dun-sauna-level (+ dun-sauna-level 1))
+             (setq dun-sauna-level (- dun-sauna-level 1)))
+
+           (if (< dun-sauna-level 0)
+               (progn
+                 (dun-mprincl
+                  "The dial will not turn further in that direction.")
+                 (setq dun-sauna-level 0))
+             (dun-sauna-heat))))))))
+
+(defun dun-sauna-heat ()
+  (if (= dun-sauna-level 0)
+      (dun-mprincl
+       "The temperature has returned to normal room temperature."))
+  (if (= dun-sauna-level 1)
+      (dun-mprincl "It is now luke warm in here.  You are perspiring."))
+  (if (= dun-sauna-level 2)
+      (dun-mprincl "It is pretty hot in here.  It is still very comfortable."))
+  (if (= dun-sauna-level 3)
+      (progn
+       (dun-mprincl
+"It is now very hot.  There is something very refreshing about this.")
+       (if (or (member obj-rms dun-inventory)
+               (member obj-rms (nth dun-current-room dun-room-objects)))
+           (progn
+             (dun-mprincl
+"You notice the wax on your statuette beginning to melt, until it completely
+melts off.  You are left with a beautiful diamond!")
+             (if (member obj-rms dun-inventory)
+                 (progn
+                   (dun-remove-obj-from-inven obj-rms)
+                   (setq dun-inventory (append dun-inventory
+                                               (list obj-diamond))))
+               (dun-remove-obj-from-room dun-current-room obj-rms)
+               (dun-replace dun-room-objects dun-current-room
+                        (append (nth dun-current-room dun-room-objects)
+                                (list obj-diamond))))))
+       (if (or (member obj-floppy dun-inventory)
+               (member obj-floppy (nth dun-current-room dun-room-objects)))
+           (progn
+             (dun-mprincl
+"You notice your floppy disk beginning to melt.  As you grab for it, the
+disk bursts into flames, and disintegrates.")
+             (if (member obj-floppy dun-inventory)
+                 (dun-remove-obj-from-inven obj-floppy)
+               (dun-remove-obj-from-room dun-current-room obj-floppy))))))
+
+  (if (= dun-sauna-level 4)
+      (progn
+       (dun-mprincl
+"As the dial clicks into place, you immediately burst into flames.")
+       (dun-die "burning"))))
+
+(defun dun-press (obj)
+  (let (objnum)
+    (when (setq objnum (dun-objnum-from-args-std obj))
+      (if (not (or (member objnum (nth dun-current-room dun-room-objects))
+                  (member objnum (nth dun-current-room dun-room-silents))))
+         (dun-mprincl "I don't see that here.")
+       (if (not (member objnum (list obj-button obj-switch)))
+           (progn
+             (dun-mprinc "You can't ")
+             (dun-mprinc (car line-list))
+             (dun-mprincl " that."))
+         (if (= objnum obj-button)
+             (dun-mprincl
+"As you press the button, you notice a passageway open up, but
+as you release it, the passageway closes."))
+         (if (= objnum obj-switch)
+             (if dun-black
+                 (progn
+                   (dun-mprincl "The button is now in the off position.")
+                   (setq dun-black nil))
+               (dun-mprincl "The button is now in the on position.")
+               (setq dun-black t))))))))
+
+(defun dun-swim (_args)
+  (if (not (member dun-current-room (list lakefront-north lakefront-south)))
+      (dun-mprincl "I see no water!")
+    (if (not (member obj-life dun-inventory))
+       (progn
+         (dun-mprincl
+"You dive in the water, and at first notice it is quite cold.  You then
+start to get used to it as you realize that you never really learned how
+to swim.")
+         (dun-die "drowning"))
+      (if (= dun-current-room lakefront-north)
+         (setq dun-current-room lakefront-south)
+       (setq dun-current-room lakefront-north)))))
+
+
+(defun dun-score (_args)
+  (if (not dun-endgame)
+      (let (total)
+       (setq total (dun-reg-score))
+       (dun-mprinc "You have scored ")
+       (dun-mprinc total)
+       (dun-mprincl " out of a possible 90 points.") total)
+    (dun-mprinc "You have scored ")
+    (dun-mprinc (dun-endgame-score))
+    (dun-mprincl " endgame points out of a possible 110.")
+    (if (= (dun-endgame-score) 110)
+       (dun-mprincl
+"\n\nCongratulations.  You have won.  The wizard password is ‘moby’"))))
+
+(defun dun-help (_args)
+  (dun-mprincl
+"Welcome to dunnet (2.02), by Ron Schnell (address@hidden - @RonnieSchnell).
+Here is some useful information (read carefully because there are one
+or more clues in here):
+- If you have a key that can open a door, you do not need to explicitly
+  open it.  You may just use ‘in’ or walk in the direction of the door.
+
+- If you have a lamp, it is always lit.
+
+- You will not get any points until you manage to get treasures to a certain
+  place.  Simply finding the treasures is not good enough.  There is more
+  than one way to get a treasure to the special place.  It is also
+  important that the objects get to the special place *unharmed* and
+  *untarnished*.  You can tell if you have successfully transported the
+  object by looking at your score, as it changes immediately.  Note that
+  an object can become harmed even after you have received points for it.
+  If this happens, your score will decrease, and in many cases you can never
+  get credit for it again.
+
+- You can save your game with the ‘save’ command, and use restore it
+  with the ‘restore’ command.
+
+- There are no limits on lengths of object names.
+
+- Directions are: north,south,east,west,northeast,southeast,northwest,
+                  southwest,up,down,in,out.
+
+- These can be abbreviated: n,s,e,w,ne,se,nw,sw,u,d,in,out.
+
+- If you go down a hole in the floor without an aid such as a ladder,
+  you probably won't be able to get back up the way you came, if at all.
+
+- To run this game in batch mode (no Emacs window), use:
+     emacs -batch -l dunnet
+NOTE: This game *should* be run in batch mode!
+
+If you have questions or comments, please contact address@hidden
+My home page is http://www.driver-aces.com/ronnie.html
+"))
+
+(defun dun-flush (_args)
+  (if (not (= dun-current-room bathroom))
+      (dun-mprincl "I see nothing to flush.")
+    (dun-mprincl "Whoooosh!!")
+    (dun-put-objs-in-treas (nth urinal dun-room-objects))
+    (dun-replace dun-room-objects urinal nil)))
+
+(defun dun-piss (_args)
+  (if (not (= dun-current-room bathroom))
+      (dun-mprincl "You can't do that here, don't even bother trying.")
+    (if (not dun-gottago)
+       (dun-mprincl "I'm afraid you don't have to go now.")
+      (dun-mprincl "That was refreshing.")
+      (setq dun-gottago nil)
+      (dun-replace dun-room-objects urinal (append
+                                           (nth urinal dun-room-objects)
+                                           (list obj-URINE))))))
+
+
+(defun dun-sleep (_args)
+  (if (not (= dun-current-room bedroom))
+      (dun-mprincl
+"You try to go to sleep while standing up here, but can't seem to do it.")
+    (setq dun-gottago t)
+    (dun-mprincl
+"As soon as you start to doze off you begin dreaming.  You see images of
+workers digging caves, slaving in the humid heat.  Then you see yourself
+as one of these workers.  While no one is looking, you leave the group
+and walk into a room.  The room is bare except for a horseshoe
+shaped piece of stone in the center.  You see yourself digging a hole in
+the ground, then putting some kind of treasure in it, and filling the hole
+with dirt again.  After this, you immediately wake up.")))
+
+(defun dun-break (obj)
+  (let (objnum)
+    (if (not (member obj-axe dun-inventory))
+       (dun-mprincl "You have nothing you can use to break things.")
+      (when (setq objnum (dun-objnum-from-args-std obj))
+       (if (member objnum dun-inventory)
+           (progn
+             (dun-mprincl
+"You take the object in your hands and swing the axe.  Unfortunately, you miss
+the object and slice off your hand.  You bleed to death.")
+             (dun-die "an axe"))
+         (if (not (or (member objnum (nth dun-current-room dun-room-objects))
+                      (member objnum
+                              (nth dun-current-room dun-room-silents))))
+             (dun-mprincl "I don't see that here.")
+           (if (= objnum obj-cable)
+               (progn
+                 (dun-mprincl
+"As you break the ethernet cable, everything starts to blur.  You collapse
+for a moment, then straighten yourself up.
+")
+                 (dun-replace dun-room-objects gamma-computing-center
+                          (append
+                           (nth gamma-computing-center dun-room-objects)
+                           dun-inventory))
+                 (if (member obj-key dun-inventory)
+                     (progn
+                       (setq dun-inventory (list obj-key))
+                       (dun-remove-obj-from-room
+                        gamma-computing-center obj-key))
+                   (setq dun-inventory nil))
+                 (setq dun-current-room computer-room)
+                 (setq dun-ethernet nil)
+                 (dun-mprincl "Connection closed.")
+                 (dun-unix-interface))
+             (if (< objnum 0)
+                 (progn
+                   (dun-mprincl "Your axe shatters into a million pieces.")
+                   (dun-remove-obj-from-inven obj-axe))
+               (dun-mprincl "Your axe breaks it into a million pieces.")
+               (dun-remove-obj-from-room dun-current-room objnum)))))))))
+
+(defun dun-drive (_args)
+  (if (not dun-inbus)
+      (dun-mprincl "You cannot drive when you aren't in a vehicle.")
+    (dun-mprincl "To drive while you are in the bus, just give a direction.")))
+
+(defun dun-superb (_args)
+  (setq dun-mode 'dun-superb))
+
+(defun dun-reg-score ()
+  (let (total)
+    (setq total 0)
+    (dolist (x (nth treasure-room dun-room-objects))
+      (setq total (+ total (nth x dun-object-pts))))
+    (if (member obj-URINE (nth treasure-room dun-room-objects))
+       (setq total 0)) total))
+
+(defun dun-endgame-score ()
+  (let (total)
+    (setq total 0)
+    (dolist (x (nth endgame-treasure-room dun-room-objects))
+      (setq total (+ total (nth x dun-object-pts)))) total))
+
+(defun dun-answer (args)
+  (if (not dun-correct-answer)
+      (dun-mprincl "I don't believe anyone asked you anything.")
+    (setq args (car args))
+    (if (not args)
+       (dun-mprincl "You must give the answer on the same line.")
+      (if (dun-members args dun-correct-answer)
+         (progn
+           (dun-mprincl "Correct.")
+           (if (= dun-lastdir 0)
+               (setq dun-current-room (1+ dun-current-room))
+             (setq dun-current-room (- dun-current-room 1)))
+           (setq dun-correct-answer nil))
+       (dun-mprincl "That answer is incorrect.")))))
+
+(defun dun-endgame-question ()
+(if (not dun-endgame-questions)
+    (progn
+      (dun-mprincl "Your question is:")
+      (dun-mprincl "No more questions, just do ‘answer foo’.")
+      (setq dun-correct-answer '("foo")))
+  (let (which i newques)
+    (setq i 0)
+    (setq newques nil)
+    (setq which (random (length dun-endgame-questions)))
+    (dun-mprincl "Your question is:")
+    (dun-mprincl (setq dun-endgame-question (car
+                                            (nth which
+                                                 dun-endgame-questions))))
+    (setq dun-correct-answer (cdr (nth which dun-endgame-questions)))
+    (while (< i which)
+      (setq newques (append newques (list (nth i dun-endgame-questions))))
+      (setq i (1+ i)))
+    (setq i (1+ which))
+    (while (< i (length dun-endgame-questions))
+      (setq newques (append newques (list (nth i dun-endgame-questions))))
+      (setq i (1+ i)))
+    (setq dun-endgame-questions newques))))
+
+(defun dun-power (_args)
+  (if (not (= dun-current-room pc-area))
+      (dun-mprincl "That operation is not applicable here.")
+    (if (not dun-floppy)
+       (dun-dos-no-disk)
+      (dun-dos-interface))))
+
+(defun dun-feed (args)
+  (let (objnum)
+    (when (setq objnum (dun-objnum-from-args-std args))
+      (if (and (= objnum obj-bear)
+              (member obj-bear (nth dun-current-room dun-room-objects)))
+         (progn
+           (if (not (member obj-food dun-inventory))
+               (dun-mprincl "You have nothing with which to feed it.")
+             (dun-drop '("food"))))
+       (if (not (or (member objnum (nth dun-current-room dun-room-objects))
+                    (member objnum dun-inventory)
+                    (member objnum (nth dun-current-room dun-room-silents))))
+           (dun-mprincl "I don't see that here.")
+         (dun-mprincl "You cannot feed that."))))))
+
+
+;;;;
+;;;;  This section defines various utility functions used
+;;;;  by dunnet.
+;;;;
 
-(setq dun-inbus nil)
-(setq dun-nomail nil)
-(setq dun-ignore '(the to at))
-(setq dun-mode 'moby)
-(setq dun-sauna-level 0)
 
-(defconst north 0)
-(defconst south 1)
-(defconst east 2)
-(defconst west 3)
-(defconst northeast 4)
-(defconst southeast 5)
-(defconst northwest 6)
-(defconst southwest 7)
-(defconst up 8)
-(defconst down 9)
-(defconst in 10)
-(defconst out 11)
+;;; Function which takes a verb and a list of other words.  Calls proper
+;;; function associated with the verb, and passes along the other words.
 
-(setq dungeon-map '(
-;                    no  so  ea  we  ne  se  nw  sw  up  do  in  ot
-                   ( 96  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;0
-                   ( -1  -1   2  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;1
-                   ( -1  -1   3   1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;2
-                   ( -1  -1  -1   2   4   6  -1  -1  -1  -1  -1  -1 ) ;3
-                   ( -1  -1  -1  -1   5  -1  -1   3  -1  -1  -1  -1 ) ;4
-                   ( -1  -1  -1  -1  255 -1  -1   4  -1  -1  255 -1 ) ;5
-                   ( -1  -1  -1  -1  -1   7   3  -1  -1  -1  -1  -1 ) ;6
-                   ( -1  -1  -1  -1  -1  255  6  27  -1  -1  -1  -1 ) ;7
-                   ( 255  5   9  10  -1  -1  -1   5  -1  -1  -1   5 ) ;8
-                   ( -1  -1  -1   8  -1  -1  -1  -1  -1  -1  -1  -1 ) ;9
-                   ( -1  -1   8  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;10
-                   ( -1   8  -1  58  -1  -1  -1  -1  -1  -1  -1  -1 ) ;11
-                   ( -1  -1  13  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;12
-                   ( 15  -1  14  12  -1  -1  -1  -1  -1  -1  -1  -1 ) ;13
-                   ( -1  -1  -1  13  -1  -1  -1  -1  -1  -1  -1  -1 ) ;14
-                   ( -1  13  16  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;15
-                   ( -1  -1  -1  15  -1  -1  -1  -1  -1  17  16  -1 ) ;16
-                   ( -1  -1  17  17  17  17 255  17 255  17  -1  -1 ) ;17
-                   ( 18  18  18  18  18  -1  18  18  19  18  -1  -1 ) ;18
-                   ( -1  18  18  19  19  20  19  19  -1  18  -1  -1 ) ;19
-                   ( -1  -1  -1  18  -1  -1  -1  -1  -1  21  -1  -1 ) ;20
-                   ( -1  -1  -1  -1  -1  20  22  -1  -1  -1  -1  -1 ) ;21
-                   ( 18  18  18  18  16  18  23  18  18  18  18  18 ) ;22
-                   ( -1 255  -1  -1  -1  19  -1  -1  -1  -1  -1  -1 ) ;23
-                   ( 23  25  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;24
-                   ( 24 255  -1  -1  -1  -1  -1  -1  -1  -1 255  -1 ) ;25
-                   (255  28  -1  -1  -1  -1  -1  -1  -1  -1 255  -1 ) ;26
-                   ( -1  -1  -1  -1   7  -1  -1  -1  -1  -1  -1  -1 ) ;27
-                   ( 26 255  -1  -1  -1  -1  -1  -1  -1  -1  255 -1 ) ;28
-                   ( -1  -1  30  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;29
-                   ( -1  -1  31  29  -1  -1  -1  -1  -1  -1  -1  -1 ) ;30
-                   ( 32  33  -1  30  -1  -1  -1  -1  -1  -1  -1  -1 ) ;31
-                   ( -1  31  -1  255 -1  -1  -1  -1  -1  34  -1  -1 ) ;32
-                   ( 31  -1  -1  -1  -1  -1  -1  -1  -1  35  -1  -1 ) ;33
-                   ( -1  35  -1  -1  -1  -1  -1  -1  32  37  -1  -1 ) ;34
-                   ( 34  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;35
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;36
-                   ( -1  -1  -1  -1  -1  -1  -1  38  34  -1  -1  -1 ) ;37
-                   ( -1  -1  40  41  37  -1  -1  39  -1  -1  -1  -1 ) ;38
-                   ( -1  -1  -1  -1  38  -1  -1  -1  -1  -1  -1  -1 ) ;39
-                   ( -1  -1  -1  38  -1  -1  -1  -1  42  -1  -1  -1 ) ;40
-                   ( -1  -1  38  -1  -1  -1  -1  -1  -1  43  -1  -1 ) ;41
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  40  -1  -1 ) ;42
-                   ( 44  -1  46  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;43
-                   ( -1  43  45  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;44
-                   ( -1  46  -1  44  -1  -1  -1  -1  -1  -1  -1  -1 ) ;45
-                   ( 45  -1  -1  43  -1  -1  -1  -1  -1  255 -1  -1 ) ;46
-                   ( 48  50  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;47
-                   ( 49  47  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;48
-                   ( -1  48  -1  -1  -1  -1  -1  -1  52  -1  -1  -1 ) ;49
-                   ( 47  51  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;50
-                   ( 50  104 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;51
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  53  49  -1  -1 ) ;52
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  54  52  -1  -1 ) ;53
-                   ( -1  -1  -1  -1  55  -1  -1  -1  -1  53  -1  -1 ) ;54
-                   ( -1  -1  -1  -1  56  -1  -1  54  -1  -1  -1  54 ) ;55
-                   ( -1  -1  -1  -1  -1  -1  -1  55  -1  31  -1  -1 ) ;56
-                   ( -1  -1  32  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;57
-                   ( 59  -1  11  -1  -1  -1  -1  -1  -1  -1  255 255) ;58
-                   ( 60  58  63  -1  -1  -1  255 -1  -1  -1  255 255) ;59
-                   ( 61  59  64  -1  -1  -1  -1  -1  -1  -1  255 255) ;60
-                   ( 62  60  65  -1  -1  -1  -1  -1  -1  -1  255 255) ;61
-                   ( -1  61  66  -1  -1  -1  -1  -1  -1  -1  255 255) ;62
-                   ( 64  -1  67  59  -1  -1  -1  -1  -1  -1  255 255) ;63
-                   ( 65  63  68  60  -1  -1  -1  -1  -1  -1  255 255) ;64
-                   ( 66  64  69  61  -1  -1  -1  -1  -1  -1  255 255) ;65
-                   ( -1  65  70  62  -1  -1  -1  -1  -1  -1  255 255) ;66
-                   ( 68  -1  71  63  -1  -1  -1  -1  -1  -1  255 255) ;67
-                   ( 69  67  72  64  -1  -1  -1  -1  -1  -1  255 255) ;68
-                   ( 70  68  73  65  -1  -1  -1  -1  -1  -1  255 255) ;69
-                   ( -1  69  74  66  -1  -1  -1  -1  -1  -1  255 255) ;70
-                   ( 72  -1  75  67  -1  -1  -1  -1  -1  -1  255 255) ;71
-                   ( 73  71  76  68  -1  -1  -1  -1  -1  -1  255 255) ;72
-                   ( 74  72  77  69  -1  -1  -1  -1  -1  -1  255 255) ;73
-                   ( -1  73  78  70  -1  -1  -1  -1  -1  -1  255 255) ;74
-                   ( 76  -1  79  71  -1  -1  -1  -1  -1  -1  255 255) ;75
-                   ( 77  75  80  72  -1  -1  -1  -1  -1  -1  255 255) ;76
-                   ( 78  76  81  73  -1  -1  -1  -1  -1  -1  255 255) ;77
-                   ( -1  77  82  74  -1  -1  -1  -1  -1  -1  255 255) ;78
-                   ( 80  -1  -1  75  -1  -1  -1  -1  -1  -1  255 255) ;79
-                   ( 81  79  255 76  -1  -1  -1  -1  -1  -1  255 255) ;80
-                   ( 82  80  -1  77  -1  -1  -1  -1  -1  -1  255 255) ;81
-                   ( -1  81  -1  78  -1  -1  -1  -1  -1  -1  255 255) ;82
-                   ( 84  -1  -1  -1  -1  59  -1  -1  -1  -1  255 255) ;83
-                   ( -1  83  85  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;84
-                   ( 86  -1  87  84  -1  -1  -1  -1  -1  -1  -1  -1 ) ;85
-                   ( -1  85  88  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;86
-                   ( 88  -1  -1  85  -1  -1  -1  -1  -1  -1  -1  -1 ) ;87
-                   ( -1  87 255  86  -1  -1  -1  -1  -1  -1  -1  -1 ) ;88
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 255  -1 ) ;89
-                   ( 91  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;90
-                   ( 92  90  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;91
-                   ( -1  91  -1  -1  -1  -1  -1  -1  93  94  -1  -1 ) ;92
-                   ( -1  -1  -1  88  -1  -1  -1  -1  -1  92  -1  -1 ) ;93
-                   ( -1  -1  -1  -1  95  -1  -1  -1  92  -1  -1  -1 ) ;94
-                   ( -1  -1  -1  -1  -1  -1  -1  94  -1  -1  -1  -1 ) ;95
-                   ( 97   0  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;96
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;97
-                   ( 99  97  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;98
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;99
-                   ( 101 99  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;100
-                   ( -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;101
-                   ( 103 101 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;102
-                   ( -1  102 -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;103
-                   ( 51  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 ) ;104
-                   )
-;                    no  so  ea  we  ne  se  nw  sw  up  do  in  ot
-)
+(defun dun-doverb (dun-ignore dun-verblist verb rest)
+  (if (not verb)
+      nil
+    (if (member (intern verb) dun-ignore)
+       (if (not (car rest)) -1
+         (dun-doverb dun-ignore dun-verblist (car rest) (cdr rest)))
+      (if (not (cdr (assq (intern verb) dun-verblist))) -1
+       (setq dun-numcmds (1+ dun-numcmds))
+       (funcall (cdr (assq (intern verb) dun-verblist)) rest)))))
+
+
+;;; Function to take a string and change it into a list of lowercase words.
+
+(defun dun-listify-string (strin)
+  (let (pos ret-list end-pos)
+    (setq pos 0)
+    (setq ret-list nil)
+    (while (setq end-pos (string-match "[ ,:;]" (substring strin pos)))
+      (setq end-pos (+ end-pos pos))
+      (if (not (= end-pos pos))
+         (setq ret-list (append ret-list (list
+                                          (downcase
+                                           (substring strin pos end-pos))))))
+      (setq pos (+ end-pos 1))) ret-list))
+
+(defun dun-listify-string2 (strin)
+  (let (pos ret-list end-pos)
+    (setq pos 0)
+    (setq ret-list nil)
+    (while (setq end-pos (string-match " " (substring strin pos)))
+      (setq end-pos (+ end-pos pos))
+      (if (not (= end-pos pos))
+         (setq ret-list (append ret-list (list
+                                          (downcase
+                                           (substring strin pos end-pos))))))
+      (setq pos (+ end-pos 1))) ret-list))
+
+(defun dun-replace (list n number)
+  (rplaca (nthcdr n list) number))
+
+
+;;; Get the first non-ignored word from a list.
+
+(defun dun-firstword (list)
+  (if (not (car list))
+      nil
+    (while (and list (member (intern (car list)) dun-ignore))
+      (setq list (cdr list)))
+    (car list)))
+
+(defun dun-firstwordl (list)
+  (if (not (car list))
+      nil
+    (while (and list (member (intern (car list)) dun-ignore))
+      (setq list (cdr list)))
+    list))
+
+;;; parse a line passed in as a string  Call the proper verb with the
+;;; rest of the line passed in as a list.
+
+(defun dun-vparse (dun-ignore dun-verblist line)
+  (dun-mprinc "\n")
+  (setq line-list (dun-listify-string (concat line " ")))
+  (dun-doverb dun-ignore dun-verblist (car line-list) (cdr line-list)))
+
+(defun dun-parse2 (dun-ignore dun-verblist line)
+  (dun-mprinc "\n")
+  (setq line-list (dun-listify-string2 (concat line " ")))
+  (dun-doverb dun-ignore dun-verblist (car line-list) (cdr line-list)))
+
+;;; Read a line, in window mode
+
+(defun dun-read-line ()
+  (let (line)
+    (setq line (read-string ""))
+    (dun-mprinc line) line))
+
+;;; Insert something into the window buffer
 
+(defun dun-minsert (string)
+  (if (stringp string)
+      (insert string)
+    (insert (prin1-to-string string))))
 
-;;; How the user references *all* objects, permanent and regular.
-(setq dun-objnames '(
-                (shovel . 0)
-                (lamp . 1)
-                (cpu . 2) (board . 2) (card . 2) (chip . 2)
-                (food . 3)
-                (key . 4)
-                (paper . 5) (slip . 5)
-                (rms . 6) (statue . 6) (statuette . 6)  (stallman . 6)
-                (diamond . 7)
-                (weight . 8)
-                (life . 9) (preserver . 9)
-                (bracelet . 10) (emerald . 10)
-                (gold . 11)
-                (platinum . 12)
-                (towel . 13) (beach . 13)
-                (axe . 14)
-                (silver . 15)
-                (license . 16)
-                (coins . 17)
-                (egg . 18)
-                (jar . 19)
-                (bone . 20)
-                (acid . 21) (nitric . 21)
-                (glycerine . 22)
-                (ruby . 23)
-                (amethyst . 24)
-                (mona . 25)
-                (bill . 26)
-                (floppy . 27) (disk . 27)
+;;; Print something out, in window mode
 
-                (boulder . -1)
-                (tree . -2) (trees . -2) (palm . -2)
-                (bear . -3)
-                (bin . -4) (bins . -4)
-                (cabinet . -5) (computer . -5) (vax . -5) (ibm . -5)
-                (protoplasm . -6)
-                (dial . -7)
-                (button . -8)
-                (chute . -9)
-                (painting . -10)
-                (bed . -11)
-                (urinal . -12)
-                (URINE . -13)
-                (pipes . -14) (pipe . -14)
-                (box . -15) (slit . -15)
-                (cable . -16) (ethernet . -16)
-                (mail . -17) (drop . -17)
-                (bus . -18)
-                (gate . -19)
-                (cliff . -20)
-                (skeleton . -21) (dinosaur . -21)
-                (fish . -22)
-                (tanks . -23) (tank . -23)
-                (switch . -24)
-                (blackboard . -25)
-                (disposal . -26) (garbage . -26)
-                (ladder . -27)
-                (subway . -28) (train . -28)
-                (pc . -29) (drive . -29) (coconut . -30) (coconuts . -30)
-                (lake . -32) (water . -32)
-))
+(defun dun-mprinc (string)
+  (if (stringp string)
+      (insert string)
+    (insert (prin1-to-string string))))
 
-(dolist (x dun-objnames)
-  (let (name)
-    (setq name (concat "obj-" (prin1-to-string (car x))))
-    (eval (list 'defconst (intern name) (cdr x)))))
+;;; In window mode, keep screen from jumping by keeping last line at
+;;; the bottom of the screen.
 
-(defconst obj-special 255)
+(defun dun-fix-screen ()
+  (interactive)
+  (forward-line (- 0 (- (window-height) 2 )))
+  (set-window-start (selected-window) (point))
+  (goto-char (point-max)))
 
-;;; The initial setup of what objects are in each room.
-;;; Regular objects have whole numbers lower than 255.
-;;; Objects that cannot be taken but might move and are
-;;; described during room description are negative.
-;;; Stuff that is described and might change are 255, and are
-;;; handled specially by 'dun-describe-room.
+;;; Insert something into the buffer, followed by newline.
 
-(setq dun-room-objects (list nil
+(defun dun-minsertl (string)
+  (dun-minsert string)
+  (dun-minsert "\n"))
 
-        (list obj-shovel)                     ;; treasure-room
-        (list obj-boulder)                    ;; dead-end
-        nil nil nil
-        (list obj-food)                       ;; se-nw-road
-        (list obj-bear)                       ;; bear-hangout
-        nil nil
-        (list obj-special)                    ;; computer-room
-        (list obj-lamp obj-license obj-silver);; meadow
-        nil nil
-        (list obj-special)                    ;; sauna
-        nil
-        (list obj-weight obj-life)            ;; weight-room
-        nil nil
-        (list obj-rms obj-floppy)             ;; thirsty-maze
-        nil nil nil nil nil nil nil
-        (list obj-emerald)                    ;; hidden-area
-        nil
-        (list obj-gold)                       ;; misty-room
-        nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-        (list obj-towel obj-special)          ;; red-room
-        nil nil nil nil nil
-        (list obj-box)                        ;; stair-landing
-        nil nil nil
-        (list obj-axe)                        ;; small-crawlspace
-        nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-        nil nil nil nil nil
-        (list obj-special)                    ;; fourth-vermont-intersection
-        nil nil
-        (list obj-coins)                      ;; fifth-oaktree-intersection
-        nil
-        (list obj-bus)                        ;; fifth-sycamore-intersection
-        nil
-        (list obj-bone)                       ;; museum-lobby
-        nil
-        (list obj-jar obj-special obj-ruby)   ;; marine-life-area
-        (list obj-nitric)                     ;; maintenance-room
-        (list obj-glycerine)                  ;; classroom
-        nil nil nil nil nil
-        (list obj-amethyst)                   ;; bottom-of-subway-stairs
-        nil nil
-        (list obj-special)                    ;; question-room-1
-        nil
-        (list obj-special)                    ;; question-room-2
-        nil
-        (list obj-special)                    ;; question-room-three
-        nil
-        (list obj-mona)                       ;; winner's-room
-nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-nil))
+;;; Print something, followed by a newline.
 
-;;; These are objects in a room that are only described in the
-;;; room description.  They are permanent.
+(defun dun-mprincl (string)
+  (dun-mprinc string)
+  (dun-mprinc "\n"))
 
-(setq dun-room-silents (list nil
-        (list obj-tree obj-coconut)            ;; dead-end
-        (list obj-tree obj-coconut)            ;; e-w-dirt-road
-        nil nil nil nil nil nil
-        (list obj-bin)                         ;; mailroom
-        (list obj-computer)                    ;; computer-room
-        nil nil nil
-        (list obj-dial)                        ;; sauna
-        nil
-        (list obj-ladder)                      ;; weight-room
-        (list obj-button obj-ladder)           ;; maze-button-room
-        nil nil nil
-        nil nil nil nil
-       (list obj-lake)                        ;; lakefront-north
-       (list obj-lake)                        ;; lakefront-south
-       nil
-        (list obj-chute)                       ;; cave-entrance
-        nil nil nil nil nil
-        (list obj-painting obj-bed)            ;; bedroom
-        (list obj-urinal obj-pipes)            ;; bathroom
-        nil nil nil nil nil nil
-        (list obj-boulder)                     ;; horseshoe-boulder-room
-        nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-        (list obj-computer obj-cable)          ;; gamma-computing-center
-        (list obj-mail)                        ;; post-office
-        (list obj-gate)                        ;; main-maple-intersection
-        nil nil nil nil nil nil nil nil nil nil nil nil nil
-        nil nil nil nil nil nil nil
-        (list obj-cliff)                       ;; fifth-oaktree-intersection
-        nil nil nil
-        (list obj-dinosaur)                    ;; museum-lobby
-        nil
-        (list obj-fish obj-tanks)              ;; marine-life-area
-        (list obj-switch)                      ;; maintenance-room
-        (list obj-blackboard)                  ;; classroom
-        (list obj-train)                       ;; vermont-station
-        nil nil
-        (list obj-disposal)                    ;; north-end-of-n-s-tunnel
-        nil nil
-        (list obj-computer)                    ;; endgame-computer-room
-        nil nil nil nil nil nil nil nil
-       (list obj-pc)                          ;; pc-area
-       nil nil nil nil nil nil
-))
-(setq dun-inventory '(1))
+;;; Function which will get an object number given the list of
+;;; words in the command, except for the verb.
 
-;;; Descriptions of objects, as they appear in the room description, and
-;;; the inventory.
+(defun dun-objnum-from-args (obj)
+  (setq obj (dun-firstword obj))
+  (if (not obj)
+      obj-special
+    (cdr (assq (intern obj) dun-objnames))))
 
-(setq dun-objects '(
-               ("There is a shovel here." "A shovel")                ;0
-               ("There is a lamp nearby." "A lamp")                  ;1
-               ("There is a CPU card here." "A computer board")      ;2
-               ("There is some food here." "Some food")              ;3
-               ("There is a shiny brass key here." "A brass key")    ;4
-               ("There is a slip of paper here." "A slip of paper")  ;5
-               ("There is a wax statuette of Richard Stallman here." ;6
-                "An RMS statuette")
-               ("There is a shimmering diamond here." "A diamond")   ;7
-               ("There is a 10 pound weight here." "A weight")       ;8
-               ("There is a life preserver here." "A life preserver");9
-               ("There is an emerald bracelet here." "A bracelet")   ;10
-               ("There is a gold bar here." "A gold bar")            ;11
-               ("There is a platinum bar here." "A platinum bar")    ;12
-               ("There is a beach towel on the ground here." "A beach towel")
-               ("There is an axe here." "An axe") ;14
-               ("There is a silver bar here." "A silver bar")  ;15
-               ("There is a bus driver's license here." "A license") ;16
-               ("There are some valuable coins here." "Some valuable coins")
-               ("There is a jewel-encrusted egg here." "A valuable egg") ;18
-               ("There is a glass jar here." "A glass jar") ;19
-               ("There is a dinosaur bone here." "A bone") ;20
-               ("There is a packet of nitric acid here." "Some nitric acid")
-               ("There is a packet of glycerine here." "Some glycerine") ;22
-               ("There is a valuable ruby here." "A ruby") ;23
-               ("There is a valuable amethyst here." "An amethyst") ;24
-               ("The Mona Lisa is here." "The Mona Lisa") ;25
-               ("There is a 100 dollar bill here." "A $100 bill") ;26
-               ("There is a floppy disk here." "A floppy disk") ;27
-              )
-)
+(defun dun-objnum-from-args-std (obj)
+  (let (result)
+  (if (eq (setq result (dun-objnum-from-args obj)) obj-special)
+      (dun-mprincl "You must supply an object."))
+  (if (eq result nil)
+      (dun-mprincl "I don't know what that is."))
+  (if (eq result obj-special)
+      nil
+    result)))
+
+;;; Take a short room description, and change spaces and slashes to dashes.
+
+(defun dun-space-to-hyphen (string)
+  (let (space)
+    (if (setq space (string-match "[ /]" string))
+       (progn
+         (setq string (concat (substring string 0 space) "-"
+                              (substring string (1+ space))))
+         (dun-space-to-hyphen string))
+      string)))
 
-;;; Weight of objects
+;;; Given a unix style pathname, build a list of path components (recursive)
 
-(setq dun-object-lbs
-      '(2 1 1 1 1 0 2 2 10 3 1 1 1 0 1 1 0 1 1 1 1 0 0 2 2 1 0 0))
-(setq dun-object-pts
-      '(0 0 0 0 0 0 0 10 0 0 10 10 10 0 0 10 0 10 10 0 0 0 0 10 10 10 10 0))
+(defun dun-get-path (dirstring startlist)
+  (let (slash)
+    (if (= (length dirstring) 0)
+       startlist
+      (if (string= (substring dirstring 0 1) "/")
+         (dun-get-path (substring dirstring 1) (append startlist (list "/")))
+       (if (not (setq slash (string-match "/" dirstring)))
+           (append startlist (list dirstring))
+         (dun-get-path (substring dirstring (1+ slash))
+                   (append startlist
+                           (list (substring dirstring 0 slash)))))))))
 
 
-;;; Unix representation of objects.
-(setq dun-objfiles '(
-                "shovel.o" "lamp.o" "cpu.o" "food.o" "key.o" "paper.o"
-                "rms.o" "diamond.o" "weight.o" "preserver.o" "bracelet.o"
-                "gold.o" "platinum.o" "towel.o" "axe.o" "silver.o" "license.o"
-                "coins.o" "egg.o" "jar.o" "bone.o" "nitric.o" "glycerine.o"
-                "ruby.o" "amethyst.o"
-                ))
+;;; Is a string a member of a string list?
 
-;;; These are the descriptions for the negative numbered objects from
-;;; dun-room-objects
+(defun dun-members (string string-list)
+  (let (found)
+    (setq found nil)
+    (dolist (x string-list)
+      (if (string= x string)
+         (setq found t))) found))
 
-(setq dun-perm-objects '(
-                    nil
-                    ("There is a large boulder here.")
-                    nil
-                    ("There is a ferocious bear here!")
-                    nil
-                    nil
-                    ("There is a worthless pile of protoplasm here.")
-                    nil
-                    nil
-                    nil
-                    nil
-                    nil
-                    nil
-                    ("There is a strange smell in this room.")
-                    nil
-                    (
-"There is a box with a slit in it, bolted to the wall here."
-                     )
-                    nil
-                    nil
-                    ("There is a bus here.")
-                    nil
-                    nil
-                    nil
-))
+;;; Function to put objects in the treasure room.  Also prints current
+;;; score to let user know he has scored.
 
+(defun dun-put-objs-in-treas (objlist)
+  (let (oscore newscore)
+    (setq oscore (dun-reg-score))
+    (dun-replace dun-room-objects 0 (append (nth 0 dun-room-objects) objlist))
+    (setq newscore (dun-reg-score))
+    (if (not (= oscore newscore))
+       (dun-score nil))))
 
-;;; These are the descriptions the user gets when regular objects are
-;;; examined.
+;;; Load an encrypted file, and eval it.
 
-(setq dun-physobj-desc '(
-"It is a normal shovel with a price tag attached that says $19.99."
-"The lamp is hand-crafted by Geppetto."
-"The CPU board has a VAX chip on it.  It seems to have
-2 Megabytes of RAM onboard."
-"It looks like some kind of meat.  Smells pretty bad."
-nil
-"The paper says: Don't forget to type ‘help’ for help.  Also, remember
-this word: ‘worms’"
-"The statuette is of the likeness of Richard Stallman, the author of the
-famous EMACS editor.  You notice that he is not wearing any shoes."
-nil
-"You observe that the weight is heavy."
-"It says S. S. Minnow."
-nil
-nil
-nil
-"It has a picture of snoopy on it."
-nil
-nil
-"It has your picture on it!"
-"They are old coins from the 19th century."
-"It is a valuable Fabrege egg."
-"It is a plain glass jar."
-nil
-nil
-nil
-nil
-nil
-                     )
-)
+(defun dun-load-d (filename)
+  (let (old-buffer result)
+    (setq result t)
+    (setq old-buffer (current-buffer))
+    (switch-to-buffer (get-buffer-create "*loadc*"))
+    (erase-buffer)
+    (condition-case nil
+       (insert-file-contents filename)
+      (error (setq result nil)))
+    (unless (not result)
+      (condition-case nil
+         (dun-rot13)
+       (error (yank)))
+      (eval-buffer)
+      (kill-buffer (current-buffer)))
+      (switch-to-buffer old-buffer)
+    result))
 
-;;; These are the descriptions the user gets when non-regular objects
-;;; are examined.
+;;; Functions to remove an object either from a room, or from inventory.
 
-(setq dun-permobj-desc '(
-                    nil
-"It is just a boulder.  It cannot be moved."
-"They are palm trees with a bountiful supply of coconuts in them."
-"It looks like a grizzly to me."
-"All of the bins are empty.  Looking closely you can see that there
-are names written at the bottom of each bin, but most of them are
-faded away so that you cannot read them.  You can only make out three
-names:
-                   Jeffrey Collier
-                   Robert Toukmond
-                   Thomas Stock
-"
-                      nil
-"It is just a garbled mess."
-"The dial points to a temperature scale which has long since faded away."
-nil
-nil
-"It is a velvet painting of Elvis Presley.  It seems to be nailed to the
-wall, and you cannot move it."
-"It is a queen sized bed, with a very firm mattress."
-"The urinal is very clean compared with everything else in the cave.  There
-isn't even any rust.  Upon close examination you realize that the drain at the
-bottom is missing, and there is just a large hole leading down the
-pipes into nowhere.  The hole is too small for a person to fit in.  The
-flush handle is so clean that you can see your reflection in it."
-nil
-nil
-"The box has a slit in the top of it, and on it, in sloppy handwriting, is
-written: ‘For key upgrade, put key in here.’"
-nil
-"It says ‘express mail’ on it."
-"It is a 35 passenger bus with the company name ‘mobytours’ on it."
-"It is a large metal gate that is too big to climb over."
-"It is a HIGH cliff."
-"Unfortunately you do not know enough about dinosaurs to tell very much about
-it.  It is very big, though."
-"The fish look like they were once quite beautiful."
-nil
-nil
-nil
-nil
-"It is a normal ladder that is permanently attached to the hole."
-"It is a passenger train that is ready to go."
-"It is a personal computer that has only one floppy disk drive."
-                   )
-)
+(defun dun-remove-obj-from-room (room objnum)
+  (let (newroom)
+    (setq newroom nil)
+    (dolist (x (nth room dun-room-objects))
+      (if (not (= x objnum))
+         (setq newroom (append newroom (list x)))))
+    (rplaca (nthcdr room dun-room-objects) newroom)))
 
-(setq dun-diggables
-      (list nil nil nil (list obj-cpu) nil nil nil nil nil nil nil
-                 nil nil nil nil nil nil nil nil nil nil      ;11-20
-                 nil nil nil nil nil nil nil nil nil nil      ;21-30
-                 nil nil nil nil nil nil nil nil nil nil      ;31-40
-                 nil (list obj-platinum) nil nil nil nil nil nil nil nil))
+(defun dun-remove-obj-from-inven (objnum)
+  (let (new-inven)
+    (setq new-inven nil)
+    (dolist (x dun-inventory)
+      (if (not (= x objnum))
+         (setq new-inven (append new-inven (list x)))))
+    (setq dun-inventory new-inven)))
+
+(defun dun-rot13 ()
+  (rot13-region (point-min) (point-max)))
+
+;;;;
+;;;; This section sets up the keymaps for interactive and batch dunnet.
+;;;;
+
+(define-obsolete-variable-alias 'dungeon-mode-map 'dun-mode-map "22.1")
+(define-key dun-mode-map "\r" 'dun-parse)
+(defvar dungeon-batch-map (make-keymap))
+(if (string= (substring emacs-version 0 2) "18")
+    (let (n)
+      (setq n 32)
+      (while (< 0 (setq n (- n 1)))
+       (aset dungeon-batch-map n 'dungeon-nil)))
+  (let (n)
+    (setq n 32)
+    (while (< 0 (setq n (- n 1)))
+      (aset (car (cdr dungeon-batch-map)) n 'dungeon-nil))))
+(define-key dungeon-batch-map "\r" 'exit-minibuffer)
+(define-key dungeon-batch-map "\n" 'exit-minibuffer)
 
-(setq dun-room-shorts nil)
 (dolist (x dun-rooms)
   (setq dun-room-shorts
                     (append dun-room-shorts (list (downcase
                                                    (dun-space-to-hyphen
                                                     (cadr x)))))))
 
-(setq dun-endgame-questions '(
-                         (
-"What is your password on the machine called ‘pokey’?" "robert")
-                         (
-"What password did you use during anonymous ftp to gamma?" "foo")
-                         (
-"Excluding the endgame, how many places are there where you can put
-treasures for points?" "4" "four")
-                         (
-"What is your login name on the ‘endgame’ machine?" "toukmond"
-)
-                         (
-"What is the nearest whole dollar to the price of the shovel?" "20" "twenty")
-                         (
-"What is the name of the bus company serving the town?" "mobytours")
-                         (
-"Give either of the two last names in the mailroom, other than your own."
-"collier" "stock")
-                         (
-"What cartoon character is on the towel?" "snoopy")
-                         (
-"What is the last name of the author of EMACS?" "stallman")
-                         (
-"How many megabytes of memory is on the CPU board for the Vax?" "2")
-                         (
-"Which street in town is named after a U.S. state?" "vermont")
-                         (
-"How many pounds did the weight weigh?" "ten" "10")
-                         (
-"Name the STREET which runs right over the subway stop." "fourth" "4" "4th")
-                         (
-"How many corners are there in town (excluding the one with the Post Office)?"
-                  "24" "twentyfour" "twenty-four")
-                         (
-"What type of bear was hiding your key?" "grizzly")
-                         (
-"Name either of the two objects you found by digging." "cpu" "card" "vax"
-"board" "platinum")
-                         (
-"What network protocol is used between pokey and gamma?" "tcp/ip" "ip" "tcp")
-))
-
 (let (a)
   (setq a 0)
   (dolist (x dun-room-shorts)
     (eval (list 'defconst (intern x) a))
     (setq a (+ a 1))))
 
-
-
 ;;;;
 ;;;; This section defines the UNIX emulation functions for dunnet.
 ;;;;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]