From: Mark Oteiza Date: Wed, 18 Jan 2017 00:11:06 +0000 (-0500) Subject: Move all dunnet globals up to the top X-Git-Tag: emacs-26.0.90~780 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=33400529c61d98a8db9e8dbb1b686a5b55964403;p=emacs.git 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. --- diff --git a/lisp/play/dunnet.el b/lisp/play/dunnet.el index 8ddb680f252..08189c1b0a3 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 (ronnie@driver-aces.com - @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 ronnie@driver-aces.com -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 (ronnie@driver-aces.com - @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 ronnie@driver-aces.com +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. ;;;;