summaryrefslogtreecommitdiff
path: root/elisp/erbot/erbp.el
diff options
context:
space:
mode:
Diffstat (limited to 'elisp/erbot/erbp.el')
-rw-r--r--elisp/erbot/erbp.el3376
1 files changed, 3376 insertions, 0 deletions
diff --git a/elisp/erbot/erbp.el b/elisp/erbot/erbp.el
new file mode 100644
index 0000000..bc59be7
--- /dev/null
+++ b/elisp/erbot/erbp.el
@@ -0,0 +1,3376 @@
+;;; erbp.el --- not yet functional, personal erbot-interface, stolen from dunnet.el
+;; we should perhaps remove this file, is not in use -- DG.
+
+;; Copyright (C) 1992, 1993, 2001 Free Software Foundation, Inc.
+
+;; Author: Ron Schnell <ronnie@driver-aces.com>
+;; Created: 25 Jul 1992
+;; Version: 0.0dev
+;; Keywords: games
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; For starters, namespaces: dun, dunnet, erbpeon, mostly get mapped
+;; to erbp, erbpne and erbpeon respectively.
+;; room-->erbp-room
+
+;;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+;;; The log file should be set for your system, and it must
+;;; be writable by all.
+
+;;; Code:
+
+(defgroup erbpnet nil
+ "Text adventure for Emacs."
+ :prefix "erbp-"
+ :group 'games)
+
+(defconst erbp-version "0.0dev")
+
+(defcustom erbp-log-file "/usr/local/erbpnet.score"
+ "Name of file to store score information for erbpnet."
+ :type 'file
+ :group 'erbpnet)
+
+(if nil
+ (eval-and-compile (setq byte-compile-warnings nil)))
+
+(eval-when-compile
+ (require 'cl))
+
+;;;; Mode definitions for interactive mode
+
+(defun erbp-mode ()
+ "Major mode for running erbpnet."
+ (interactive)
+ (text-mode)
+ (make-local-variable 'scroll-step)
+ (setq scroll-step 2)
+ (use-local-map erbpeon-mode-map)
+ (setq major-mode 'erbp-mode)
+ (setq mode-name "Erbpeon"))
+
+(defun erbp-parse (arg)
+ "Function called when return is pressed in interactive mode to parse line."
+ (interactive "*p")
+ (beginning-of-line)
+ (setq beg (+ (point) 1))
+ (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 (erbp-vparse erbp-ignore erbp-verblist line) -1)
+ (erbp-mprinc "I don't understand that.\n")))
+ (goto-char (point-max))
+ (erbp-mprinc "\n"))
+ (erbp-messages))
+
+(defun erbp-messages ()
+ (if erbp-dead
+ (text-mode)
+ (if (eq erbpeon-mode 'erbpeon)
+ (progn
+ (if (not (= erbp-room erbp-current-room))
+ (progn
+ (erbp-describe-room erbp-current-room)
+ (setq erbp-room erbp-current-room)))
+ (erbp-fix-screen)
+ (erbp-mprinc ">")))))
+
+
+;;;###autoload
+(defun erbpnet ()
+ "Switch to *erbpeon* buffer and start game."
+ (interactive)
+ (switch-to-buffer "*erbpeon*")
+ (erbp-mode)
+ (setq erbp-dead nil)
+ (setq erbp-room 0)
+ (erbp-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 erbp-describe-room (erbp-room)
+ (if (and (not (member (abs erbp-room) erbp-light-rooms))
+ (not (member obj-lamp erbp-inventory)))
+ (erbp-mprincl "It is pitch dark. You are likely to be eaten by a grue.")
+ (erbp-mprincl (cadr (nth (abs erbp-room) erbp-rooms)))
+ (if (and (and (or (member erbp-room erbp-visited)
+ (string= erbp-mode "erbp-superb")) (> erbp-room 0))
+ (not (string= erbp-mode "long")))
+ nil
+ (erbp-mprinc (car (nth (abs erbp-room) erbp-rooms)))
+ (erbp-mprinc "\n"))
+ (if (not (string= erbp-mode "long"))
+ (if (not (member (abs erbp-room) erbp-visited))
+ (setq erbp-visited (append (list (abs erbp-room)) erbp-visited))))
+ (dolist (xobjs (nth erbp-current-room erbp-room-objects))
+ (if (= xobjs obj-special)
+ (erbp-special-object)
+ (if (>= xobjs 0)
+ (erbp-mprincl (car (nth xobjs erbp-objects)))
+ (if (not (and (= xobjs obj-bus) erbp-inbus))
+ (progn
+ (erbp-mprincl (car (nth (abs xobjs) erbp-perm-objects)))))))
+ (if (and (= xobjs obj-jar) erbp-jar)
+ (progn
+ (erbp-mprincl "The jar contains:")
+ (dolist (x erbp-jar)
+ (erbp-mprinc " ")
+ (erbp-mprincl (car (nth x erbp-objects)))))))
+ (if (and (member obj-bus (nth erbp-current-room erbp-room-objects)) erbp-inbus)
+ (erbp-mprincl "You are on the bus."))))
+
+;;; There is a special object in the erbp-room. This object's description,
+;;; or lack thereof, depends on certain conditions.
+
+(defun erbp-special-object ()
+ (if (= erbp-current-room computer-room)
+ (if erbp-computer
+ (erbp-mprincl
+"The panel lights are flashing in a seemingly organized pattern.")
+ (erbp-mprincl "The panel lights are steady and motionless.")))
+
+ (if (and (= erbp-current-room red-room)
+ (not (member obj-towel (nth red-room erbp-room-objects))))
+ (erbp-mprincl "There is a hole in the floor here."))
+
+ (if (and (= erbp-current-room marine-life-area) erbp-black)
+ (erbp-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 (= erbp-current-room fourth-vermont-intersection) erbp-hole)
+ (progn
+ (if (not erbp-inbus)
+ (progn
+ (erbp-mprincl"You fall into a hole in the ground.")
+ (setq erbp-current-room vermont-station)
+ (erbp-describe-room vermont-station))
+ (progn
+ (erbp-mprincl
+"The bus falls down a hole in the ground and explodes.")
+ (erbp-die "burning")))))
+
+ (if (> erbp-current-room endgame-computer-room)
+ (progn
+ (if (not erbp-correct-answer)
+ (erbp-endgame-question)
+ (erbp-mprincl "Your question is:")
+ (erbp-mprincl erbp-endgame-question))))
+
+ (if (= erbp-current-room sauna)
+ (progn
+ (erbp-mprincl (nth erbp-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 (= erbp-sauna-level 3)
+ (progn
+ (if (or (member obj-rms erbp-inventory)
+ (member obj-rms (nth erbp-current-room erbp-room-objects)))
+ (progn
+ (erbp-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 erbp-inventory)
+ (progn
+ (erbp-remove-obj-from-inven obj-rms)
+ (setq erbp-inventory (append erbp-inventory
+ (list obj-diamond))))
+ (erbp-remove-obj-from-room erbp-current-room obj-rms)
+ (erbp-replace erbp-room-objects erbp-current-room
+ (append (nth erbp-current-room erbp-room-objects)
+ (list obj-diamond))))))
+ (if (or (member obj-floppy erbp-inventory)
+ (member obj-floppy (nth erbp-current-room erbp-room-objects)))
+ (progn
+ (erbp-mprincl
+"You notice your floppy disk beginning to melt. As you grab for it, the
+disk bursts into flames, and disintegrates.")
+ (erbp-remove-obj-from-inven obj-floppy)
+ (erbp-remove-obj-from-room erbp-current-room obj-floppy))))))))
+
+
+(defun erbp-die (murderer)
+ (erbp-mprinc "\n")
+ (if murderer
+ (erbp-mprincl "You are dead."))
+ (erbp-do-logfile 'erbp-die murderer)
+ (erbp-score nil)
+ (setq erbp-dead t))
+
+(defun erbp-quit (args)
+ (erbp-die nil))
+
+;;; Print every object in player's inventory. Special case for the jar,
+;;; as we must also print what is in it.
+
+(defun erbp-inven (args)
+ (erbp-mprinc "You currently have:")
+ (erbp-mprinc "\n")
+ (dolist (curobj erbp-inventory)
+ (if curobj
+ (progn
+ (erbp-mprincl (cadr (nth curobj erbp-objects)))
+ (if (and (= curobj obj-jar) erbp-jar)
+ (progn
+ (erbp-mprincl "The jar contains:")
+ (dolist (x erbp-jar)
+ (erbp-mprinc " ")
+ (erbp-mprincl (cadr (nth x erbp-objects))))))))))
+
+(defun erbp-shake (obj)
+ (let (objnum)
+ (when (setq objnum (erbp-objnum-from-args-std obj))
+ (if (member objnum erbp-inventory)
+ (progn
+;;; If shaking anything will do anything, put here.
+ (erbp-mprinc "Shaking ")
+ (erbp-mprinc (downcase (cadr (nth objnum erbp-objects))))
+ (erbp-mprinc " seems to have no effect.")
+ (erbp-mprinc "\n")
+ )
+ (if (and (not (member objnum (nth erbp-current-room erbp-room-silents)))
+ (not (member objnum (nth erbp-current-room erbp-room-objects))))
+ (erbp-mprincl "I don't see that here.")
+;;; Shaking trees can be deadly
+ (if (= objnum obj-tree)
+ (progn
+ (erbp-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.")
+ (erbp-die "a coconut"))
+ (if (= objnum obj-bear)
+ (progn
+ (erbp-mprinc
+"As you go up to the bear, it removes your head and places it on the ground.")
+ (erbp-die "a bear"))
+ (if (< objnum 0)
+ (erbp-mprincl "You cannot shake that.")
+ (erbp-mprincl "You don't have that.")))))))))
+
+
+(defun erbp-drop (obj)
+ (if erbp-inbus
+ (erbp-mprincl "You can't drop anything while on the bus.")
+ (let (objnum ptr)
+ (when (setq objnum (erbp-objnum-from-args-std obj))
+ (if (not (setq ptr (member objnum erbp-inventory)))
+ (erbp-mprincl "You don't have that.")
+ (progn
+ (erbp-remove-obj-from-inven objnum)
+ (erbp-replace erbp-room-objects erbp-current-room
+ (append (nth erbp-current-room erbp-room-objects)
+ (list objnum)))
+ (erbp-mprincl "Done.")
+ (if (member objnum (list obj-food obj-weight obj-jar))
+ (erbp-drop-check objnum))))))))
+
+;;; Dropping certain things causes things to happen.
+
+(defun erbp-drop-check (objnum)
+ (if (and (= objnum obj-food) (= erbp-room bear-hangout)
+ (member obj-bear (nth bear-hangout erbp-room-objects)))
+ (progn
+ (erbp-mprincl
+"The bear takes the food and runs away with it. He left something behind.")
+ (erbp-remove-obj-from-room erbp-current-room obj-bear)
+ (erbp-remove-obj-from-room erbp-current-room obj-food)
+ (erbp-replace erbp-room-objects erbp-current-room
+ (append (nth erbp-current-room erbp-room-objects)
+ (list obj-key)))))
+
+ (if (and (= objnum obj-jar) (member obj-nitric erbp-jar)
+ (member obj-glycerine erbp-jar))
+ (progn
+ (erbp-mprincl
+ "As the jar impacts the ground it explodes into many pieces.")
+ (setq erbp-jar nil)
+ (erbp-remove-obj-from-room erbp-current-room obj-jar)
+ (if (= erbp-current-room fourth-vermont-intersection)
+ (progn
+ (setq erbp-hole t)
+ (setq erbp-current-room vermont-station)
+ (erbp-mprincl
+"The explosion causes a hole to open up in the ground, which you fall
+through.")))))
+
+ (if (and (= objnum obj-weight) (= erbp-current-room maze-button-room))
+ (erbp-mprincl "A passageway opens.")))
+
+;;; Give long description of current erbp-room, or an object.
+
+(defun erbp-examine (obj)
+ (let (objnum)
+ (setq objnum (erbp-objnum-from-args obj))
+ (if (eq objnum obj-special)
+ (erbp-describe-room (* erbp-current-room -1))
+ (if (and (eq objnum obj-computer)
+ (member obj-pc (nth erbp-current-room erbp-room-silents)))
+ (erbp-examine '("pc"))
+ (if (eq objnum nil)
+ (erbp-mprincl "I don't know what that is.")
+ (if (and (not (member objnum
+ (nth erbp-current-room erbp-room-objects)))
+ (not (and (member obj-jar erbp-inventory)
+ (member objnum erbp-jar)))
+ (not (member objnum
+ (nth erbp-current-room erbp-room-silents)))
+ (not (member objnum erbp-inventory)))
+ (erbp-mprincl "I don't see that here.")
+ (if (>= objnum 0)
+ (if (and (= objnum obj-bone)
+ (= erbp-current-room marine-life-area) erbp-black)
+ (erbp-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 erbp-physobj-desc)
+ (erbp-mprincl (nth objnum erbp-physobj-desc))
+ (erbp-mprincl "I see nothing special about that.")))
+ (if (nth (abs objnum) erbp-permobj-desc)
+ (progn
+ (erbp-mprincl (nth (abs objnum) erbp-permobj-desc)))
+ (erbp-mprincl "I see nothing special about that.")))))))))
+
+(defun erbp-take (obj)
+ (setq obj (erbp-firstword obj))
+ (if (not obj)
+ (erbp-mprincl "You must supply an object.")
+ (if (string= obj "all")
+ (let (gotsome)
+ (if erbp-inbus
+ (erbp-mprincl "You can't take anything while on the bus.")
+ (setq gotsome nil)
+ (dolist (x (nth erbp-current-room erbp-room-objects))
+ (if (and (>= x 0) (not (= x obj-special)))
+ (progn
+ (setq gotsome t)
+ (erbp-mprinc (cadr (nth x erbp-objects)))
+ (erbp-mprinc ": ")
+ (erbp-take-object x))))
+ (if (not gotsome)
+ (erbp-mprincl "Nothing to take."))))
+ (let (objnum)
+ (setq objnum (cdr (assq (intern obj) erbp-objnames)))
+ (if (eq objnum nil)
+ (progn
+ (erbp-mprinc "I don't know what that is.")
+ (erbp-mprinc "\n"))
+ (if (and erbp-inbus (not (and (member objnum erbp-jar)
+ (member obj-jar erbp-inventory))))
+ (erbp-mprincl "You can't take anything while on the bus.")
+ (erbp-take-object objnum)))))))
+
+(defun erbp-take-object (objnum)
+ (if (and (member objnum erbp-jar) (member obj-jar erbp-inventory))
+ (let (newjar)
+ (erbp-mprincl "You remove it from the jar.")
+ (setq newjar nil)
+ (dolist (x erbp-jar)
+ (if (not (= x objnum))
+ (setq newjar (append newjar (list x)))))
+ (setq erbp-jar newjar)
+ (setq erbp-inventory (append erbp-inventory (list objnum))))
+ (if (not (member objnum (nth erbp-current-room erbp-room-objects)))
+ (if (not (member objnum (nth erbp-current-room erbp-room-silents)))
+ (erbp-mprinc "I do not see that here.")
+ (erbp-try-take objnum))
+ (if (>= objnum 0)
+ (progn
+ (if (and (car erbp-inventory)
+ (> (+ (erbp-inven-weight) (nth objnum erbp-object-lbs)) 11))
+ (erbp-mprinc "Your load would be too heavy.")
+ (setq erbp-inventory (append erbp-inventory (list objnum)))
+ (erbp-remove-obj-from-room erbp-current-room objnum)
+ (erbp-mprinc "Taken. ")
+ (if (and (= objnum obj-towel) (= erbp-current-room red-room))
+ (erbp-mprinc
+ "Taking the towel reveals a hole in the floor."))))
+ (erbp-try-take objnum)))
+ (erbp-mprinc "\n")))
+
+(defun erbp-inven-weight ()
+ (let (total)
+ (setq total 0)
+ (dolist (x erbp-jar)
+ (setq total (+ total (nth x erbp-object-lbs))))
+ (dolist (x erbp-inventory)
+ (setq total (+ total (nth x erbp-object-lbs)))) total))
+
+;;; We try to take an object that is untakable. Print a message
+;;; depending on what it is.
+
+(defun erbp-try-take (obj)
+ (erbp-mprinc "You cannot take that."))
+
+(defun erbp-dig (args)
+ (if erbp-inbus
+ (erbp-mprincl "Digging here reveals nothing.")
+ (if (not (member 0 erbp-inventory))
+ (erbp-mprincl "You have nothing with which to dig.")
+ (if (not (nth erbp-current-room erbp-diggables))
+ (erbp-mprincl "Digging here reveals nothing.")
+ (erbp-mprincl "I think you found something.")
+ (erbp-replace erbp-room-objects erbp-current-room
+ (append (nth erbp-current-room erbp-room-objects)
+ (nth erbp-current-room erbp-diggables)))
+ (erbp-replace erbp-diggables erbp-current-room nil)))))
+
+(defun erbp-climb (obj)
+ (let (objnum)
+ (setq objnum (erbp-objnum-from-args obj))
+ (cond ((not objnum)
+ (erbp-mprincl "I don't know what that object is."))
+ ((and (not (eq objnum obj-special))
+ (not (member objnum (nth erbp-current-room erbp-room-objects)))
+ (not (member objnum (nth erbp-current-room erbp-room-silents)))
+ (not (and (member objnum erbp-jar) (member obj-jar erbp-inventory)))
+ (not (member objnum erbp-inventory)))
+ (erbp-mprincl "I don't see that here."))
+ ((and (eq objnum obj-special)
+ (not (member obj-tree (nth erbp-current-room erbp-room-silents))))
+ (erbp-mprincl "There is nothing here to climb."))
+ ((and (not (eq objnum obj-tree)) (not (eq objnum obj-special)))
+ (erbp-mprincl "You can't climb that."))
+ (t
+ (erbp-mprincl
+ "You manage to get about two feet up the tree and fall back down. You
+notice that the tree is very unsteady.")))))
+
+(defun erbp-eat (obj)
+ (let (objnum)
+ (when (setq objnum (erbp-objnum-from-args-std obj))
+ (if (not (member objnum erbp-inventory))
+ (erbp-mprincl "You don't have that.")
+ (if (not (= objnum obj-food))
+ (progn
+ (erbp-mprinc "You forcefully shove ")
+ (erbp-mprinc (downcase (cadr (nth objnum erbp-objects))))
+ (erbp-mprincl " down your throat, and start choking.")
+ (erbp-die "choking"))
+ (erbp-mprincl "That tasted horrible.")
+ (erbp-remove-obj-from-inven obj-food))))))
+
+(defun erbp-put (args)
+ (let (newargs objnum objnum2 obj)
+ (setq newargs (erbp-firstwordl args))
+ (if (not newargs)
+ (erbp-mprincl "You must supply an object")
+ (setq obj (intern (car newargs)))
+ (setq objnum (cdr (assq obj erbp-objnames)))
+ (if (not objnum)
+ (erbp-mprincl "I don't know what that object is.")
+ (if (not (member objnum erbp-inventory))
+ (erbp-mprincl "You don't have that.")
+ (setq newargs (erbp-firstwordl (cdr newargs)))
+ (setq newargs (erbp-firstwordl (cdr newargs)))
+ (if (not newargs)
+ (erbp-mprincl "You must supply an indirect object.")
+ (setq objnum2 (cdr (assq (intern (car newargs)) erbp-objnames)))
+ (if (and (eq objnum2 obj-computer) (= erbp-current-room pc-area))
+ (setq objnum2 obj-pc))
+ (if (not objnum2)
+ (erbp-mprincl "I don't know what that indirect object is.")
+ (if (and (not (member objnum2
+ (nth erbp-current-room erbp-room-objects)))
+ (not (member objnum2
+ (nth erbp-current-room erbp-room-silents)))
+ (not (member objnum2 erbp-inventory)))
+ (erbp-mprincl "That indirect object is not here.")
+ (erbp-put-objs objnum objnum2)))))))))
+
+(defun erbp-put-objs (obj1 obj2)
+ (if (and (= obj2 obj-drop) (not erbp-nomail))
+ (setq obj2 obj-chute))
+
+ (if (= obj2 obj-disposal) (setq obj2 obj-chute))
+
+ (if (and (= obj1 obj-cpu) (= obj2 obj-computer))
+ (progn
+ (erbp-remove-obj-from-inven obj-cpu)
+ (setq erbp-computer t)
+ (erbp-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))
+ (erbp-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)))
+ (erbp-mprincl "That will not fit in the jar.")
+ (erbp-remove-obj-from-inven obj1)
+ (setq erbp-jar (append erbp-jar (list obj1)))
+ (erbp-mprincl "Done."))
+ (if (= obj2 obj-chute) ;; Put something in chute
+ (progn
+ (erbp-remove-obj-from-inven obj1)
+ (erbp-mprincl
+"You hear it slide down the chute and off into the distance.")
+ (erbp-put-objs-in-treas (list obj1)))
+ (if (= obj2 obj-box) ;; Put key in key box
+ (if (= obj1 obj-key)
+ (progn
+ (erbp-mprincl
+"As you drop the key, the box begins to shake. Finally it explodes
+with a bang. The key seems to have vanished!")
+ (erbp-remove-obj-from-inven obj1)
+ (erbp-replace erbp-room-objects computer-room (append
+ (nth computer-room
+ erbp-room-objects)
+ (list obj1)))
+ (erbp-remove-obj-from-room erbp-current-room obj-box)
+ (setq erbp-key-level (1+ erbp-key-level)))
+ (erbp-mprincl "You can't put that in the key box!"))
+
+ (if (and (= obj1 obj-floppy) (= obj2 obj-pc))
+ (progn
+ (setq erbp-floppy t)
+ (erbp-remove-obj-from-inven obj1)
+ (erbp-mprincl "Done."))
+
+ (if (= obj2 obj-urinal) ;; Put object in urinal
+ (progn
+ (erbp-remove-obj-from-inven obj1)
+ (erbp-replace erbp-room-objects urinal (append
+ (nth urinal erbp-room-objects)
+ (list obj1)))
+ (erbp-mprincl
+ "You hear it plop down in some water below."))
+ (if (= obj2 obj-mail)
+ (erbp-mprincl "The mail chute is locked.")
+ (if (member obj1 erbp-inventory)
+ (erbp-mprincl
+"I don't know how to combine those objects. Perhaps you should
+just try dropping it.")
+ (erbp-mprincl"You can't put that there.")))))))))))
+
+(defun erbp-type (args)
+ (if (not (= erbp-current-room computer-room))
+ (erbp-mprincl "There is nothing here on which you could type.")
+ (if (not erbp-computer)
+ (erbp-mprincl
+"You type on the keyboard, but your characters do not even echo.")
+ (erbp-unix-interface))))
+
+;;; Various movement directions
+
+(defun erbp-n (args)
+ (erbp-move north))
+
+(defun erbp-s (args)
+ (erbp-move south))
+
+(defun erbp-e (args)
+ (erbp-move east))
+
+(defun erbp-w (args)
+ (erbp-move west))
+
+(defun erbp-ne (args)
+ (erbp-move northeast))
+
+(defun erbp-se (args)
+ (erbp-move southeast))
+
+(defun erbp-nw (args)
+ (erbp-move northwest))
+
+(defun erbp-sw (args)
+ (erbp-move southwest))
+
+(defun erbp-up (args)
+ (erbp-move up))
+
+(defun erbp-down (args)
+ (erbp-move down))
+
+(defun erbp-in (args)
+ (erbp-move in))
+
+(defun erbp-out (args)
+ (erbp-move out))
+
+(defun erbp-go (args)
+ (if (or (not (car args))
+ (eq (erbp-doverb erbp-ignore erbp-verblist (car args)
+ (cdr (cdr args))) -1))
+ (erbp-mprinc "I don't understand where you want me to go.\n")))
+
+;;; Uses the erbpeon-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 erbp-move (dir)
+ (if (and (not (member erbp-current-room erbp-light-rooms))
+ (not (member obj-lamp erbp-inventory)))
+ (progn
+ (erbp-mprinc
+"You trip over a grue and fall into a pit and break every bone in your
+body.")
+ (erbp-die "a grue"))
+ (let (newroom)
+ (setq newroom (nth dir (nth erbp-current-room erbpeon-map)))
+ (if (eq newroom -1)
+ (erbp-mprinc "You can't go that way.\n")
+ (if (eq newroom 255)
+ (erbp-special-move dir)
+ (setq erbp-room -1)
+ (setq erbp-lastdir dir)
+ (if erbp-inbus
+ (progn
+ (if (or (< newroom 58) (> newroom 83))
+ (erbp-mprincl "The bus cannot go this way.")
+ (erbp-mprincl
+ "The bus lurches ahead and comes to a screeching halt.")
+ (erbp-remove-obj-from-room erbp-current-room obj-bus)
+ (setq erbp-current-room newroom)
+ (erbp-replace erbp-room-objects newroom
+ (append (nth newroom erbp-room-objects)
+ (list obj-bus)))))
+ (setq erbp-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 erbp-special-move (dir)
+ (if (= erbp-current-room building-front)
+ (if (not (member obj-key erbp-inventory))
+ (erbp-mprincl "You don't have a key that can open this door.")
+ (setq erbp-current-room old-building-hallway))
+ (if (= erbp-current-room north-end-of-cave-passage)
+ (let (combo)
+ (erbp-mprincl
+"You must type a 3 digit combination code to enter this room.")
+ (erbp-mprinc "Enter it here: ")
+ (setq combo (erbp-read-line))
+ (if (not erbp-batch-mode)
+ (erbp-mprinc "\n"))
+ (if (string= combo erbp-combination)
+ (setq erbp-current-room gamma-computing-center)
+ (erbp-mprincl "Sorry, that combination is incorrect."))))
+
+ (if (= erbp-current-room bear-hangout)
+ (if (member obj-bear (nth bear-hangout erbp-room-objects))
+ (progn
+ (erbp-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.
+")
+ (erbp-die "a bear"))
+ (erbp-mprincl "You can't go that way.")))
+
+ (if (= erbp-current-room vermont-station)
+ (progn
+ (erbp-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.")
+ (erbp-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 erbp-current-room museum-station)))
+
+ (if (= erbp-current-room old-building-hallway)
+ (if (and (member obj-key erbp-inventory)
+ (> erbp-key-level 0))
+ (setq erbp-current-room meadow)
+ (erbp-mprincl "You don't have a key that can open this door.")))
+
+ (if (and (= erbp-current-room maze-button-room) (= dir northwest))
+ (if (member obj-weight (nth maze-button-room erbp-room-objects))
+ (setq erbp-current-room 18)
+ (erbp-mprincl "You can't go that way.")))
+
+ (if (and (= erbp-current-room maze-button-room) (= dir up))
+ (if (member obj-weight (nth maze-button-room erbp-room-objects))
+ (erbp-mprincl "You can't go that way.")
+ (setq erbp-current-room weight-room)))
+
+ (if (= erbp-current-room classroom)
+ (erbp-mprincl "The door is locked."))
+
+ (if (or (= erbp-current-room lakefront-north)
+ (= erbp-current-room lakefront-south))
+ (erbp-swim nil))
+
+ (if (= erbp-current-room reception-area)
+ (if (not (= erbp-sauna-level 3))
+ (setq erbp-current-room health-club-front)
+ (erbp-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.")
+ (erbp-die "burning")))
+
+ (if (= erbp-current-room red-room)
+ (if (not (member obj-towel (nth red-room erbp-room-objects)))
+ (setq erbp-current-room long-n-s-hallway)
+ (erbp-mprincl "You can't go that way.")))
+
+ (if (and (> dir down) (> erbp-current-room gamma-computing-center)
+ (< erbp-current-room museum-lobby))
+ (if (not (member obj-bus (nth erbp-current-room erbp-room-objects)))
+ (erbp-mprincl "You can't go that way.")
+ (if (= dir in)
+ (if erbp-inbus
+ (erbp-mprincl
+ "You are already in the bus!")
+ (if (member obj-license erbp-inventory)
+ (progn
+ (erbp-mprincl
+ "You board the bus and get in the driver's seat.")
+ (setq erbp-nomail t)
+ (setq erbp-inbus t))
+ (erbp-mprincl "You are not licensed for this type of vehicle.")))
+ (if (not erbp-inbus)
+ (erbp-mprincl "You are already off the bus!")
+ (erbp-mprincl "You hop off the bus.")
+ (setq erbp-inbus nil))))
+ (if (= erbp-current-room fifth-oaktree-intersection)
+ (if (not erbp-inbus)
+ (progn
+ (erbp-mprincl "You fall down the cliff and land on your head.")
+ (erbp-die "a cliff"))
+ (erbp-mprincl
+"The bus flies off the cliff, and plunges to the bottom, where it explodes.")
+ (erbp-die "a bus accident")))
+ (if (= erbp-current-room main-maple-intersection)
+ (progn
+ (if (not erbp-inbus)
+ (erbp-mprincl "The gate will not open.")
+ (erbp-mprincl
+"As the bus approaches, the gate opens and you drive through.")
+ (erbp-remove-obj-from-room main-maple-intersection obj-bus)
+ (erbp-replace erbp-room-objects museum-entrance
+ (append (nth museum-entrance erbp-room-objects)
+ (list obj-bus)))
+ (setq erbp-current-room museum-entrance)))))
+ (if (= erbp-current-room cave-entrance)
+ (progn
+ (erbp-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 erbp-current-room misty-room)))))
+
+(defun erbp-long (args)
+ (setq erbp-mode "long"))
+
+(defun erbp-turn (obj)
+ (let (objnum direction)
+ (when (setq objnum (erbp-objnum-from-args-std obj))
+ (if (not (or (member objnum (nth erbp-current-room erbp-room-objects))
+ (member objnum (nth erbp-current-room erbp-room-silents))))
+ (erbp-mprincl "I don't see that here.")
+ (if (not (= objnum obj-dial))
+ (erbp-mprincl "You can't turn that.")
+ (setq direction (erbp-firstword (cdr obj)))
+ (if (or (not direction)
+ (not (or (string= direction "clockwise")
+ (string= direction "counterclockwise"))))
+ (erbp-mprincl "You must indicate clockwise or counterclockwise.")
+ (if (string= direction "clockwise")
+ (setq erbp-sauna-level (+ erbp-sauna-level 1))
+ (setq erbp-sauna-level (- erbp-sauna-level 1)))
+
+ (if (< erbp-sauna-level 0)
+ (progn
+ (erbp-mprincl
+ "The dial will not turn further in that direction.")
+ (setq erbp-sauna-level 0))
+ (erbp-sauna-heat))))))))
+
+(defun erbp-sauna-heat ()
+ (if (= erbp-sauna-level 0)
+ (erbp-mprincl
+ "The temperature has returned to normal room temperature."))
+ (if (= erbp-sauna-level 1)
+ (erbp-mprincl "It is now luke warm in here. You are perspiring."))
+ (if (= erbp-sauna-level 2)
+ (erbp-mprincl "It is pretty hot in here. It is still very comfortable."))
+ (if (= erbp-sauna-level 3)
+ (progn
+ (erbp-mprincl
+"It is now very hot. There is something very refreshing about this.")
+ (if (or (member obj-rms erbp-inventory)
+ (member obj-rms (nth erbp-current-room erbp-room-objects)))
+ (progn
+ (erbp-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 erbp-inventory)
+ (progn
+ (erbp-remove-obj-from-inven obj-rms)
+ (setq erbp-inventory (append erbp-inventory
+ (list obj-diamond))))
+ (erbp-remove-obj-from-room erbp-current-room obj-rms)
+ (erbp-replace erbp-room-objects erbp-current-room
+ (append (nth erbp-current-room erbp-room-objects)
+ (list obj-diamond))))))
+ (if (or (member obj-floppy erbp-inventory)
+ (member obj-floppy (nth erbp-current-room erbp-room-objects)))
+ (progn
+ (erbp-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 erbp-inventory)
+ (erbp-remove-obj-from-inven obj-floppy)
+ (erbp-remove-obj-from-room erbp-current-room obj-floppy))))))
+
+ (if (= erbp-sauna-level 4)
+ (progn
+ (erbp-mprincl
+"As the dial clicks into place, you immediately burst into flames.")
+ (erbp-die "burning"))))
+
+(defun erbp-press (obj)
+ (let (objnum)
+ (when (setq objnum (erbp-objnum-from-args-std obj))
+ (if (not (or (member objnum (nth erbp-current-room erbp-room-objects))
+ (member objnum (nth erbp-current-room erbp-room-silents))))
+ (erbp-mprincl "I don't see that here.")
+ (if (not (member objnum (list obj-button obj-switch)))
+ (progn
+ (erbp-mprinc "You can't ")
+ (erbp-mprinc (car line-list))
+ (erbp-mprincl " that."))
+ (if (= objnum obj-button)
+ (erbp-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 erbp-black
+ (progn
+ (erbp-mprincl "The button is now in the off position.")
+ (setq erbp-black nil))
+ (erbp-mprincl "The button is now in the on position.")
+ (setq erbp-black t))))))))
+
+(defun erbp-swim (args)
+ (if (not (member erbp-current-room (list lakefront-north lakefront-south)))
+ (erbp-mprincl "I see no water!")
+ (if (not (member obj-life erbp-inventory))
+ (progn
+ (erbp-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.")
+ (erbp-die "drowning"))
+ (if (= erbp-current-room lakefront-north)
+ (setq erbp-current-room lakefront-south)
+ (setq erbp-current-room lakefront-north)))))
+
+
+(defun erbp-score (args)
+ (if (not erbp-endgame)
+ (let (total)
+ (setq total (erbp-reg-score))
+ (erbp-mprinc "You have scored ")
+ (erbp-mprinc total)
+ (erbp-mprincl " out of a possible 90 points.") total)
+ (erbp-mprinc "You have scored ")
+ (erbp-mprinc (erbp-endgame-score))
+ (erbp-mprincl " endgame points out of a possible 110.")
+ (if (= (erbp-endgame-score) 110)
+ (erbp-mprincl
+"\n\nCongratulations. You have won. The wizard password is 'moby'"))))
+
+(defun erbp-help (args)
+ (erbp-mprincl
+"Welcome to erbpnet (2.01), by Ron Schnell (ronnie@driver-aces.com).
+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 erbpnet
+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 erbp-flush (args)
+ (if (not (= erbp-current-room bathroom))
+ (erbp-mprincl "I see nothing to flush.")
+ (erbp-mprincl "Whoooosh!!")
+ (erbp-put-objs-in-treas (nth urinal erbp-room-objects))
+ (erbp-replace erbp-room-objects urinal nil)))
+
+(defun erbp-piss (args)
+ (if (not (= erbp-current-room bathroom))
+ (erbp-mprincl "You can't do that here, don't even bother trying.")
+ (if (not erbp-gottago)
+ (erbp-mprincl "I'm afraid you don't have to go now.")
+ (erbp-mprincl "That was refreshing.")
+ (setq erbp-gottago nil)
+ (erbp-replace erbp-room-objects urinal (append
+ (nth urinal erbp-room-objects)
+ (list obj-URINE))))))
+
+
+(defun erbp-sleep (args)
+ (if (not (= erbp-current-room bedroom))
+ (erbp-mprincl
+"You try to go to sleep while standing up here, but can't seem to do it.")
+ (setq erbp-gottago t)
+ (erbp-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 erbp-break (obj)
+ (let (objnum)
+ (if (not (member obj-axe erbp-inventory))
+ (erbp-mprincl "You have nothing you can use to break things.")
+ (when (setq objnum (erbp-objnum-from-args-std obj))
+ (if (member objnum erbp-inventory)
+ (progn
+ (erbp-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.")
+ (erbp-die "an axe"))
+ (if (not (or (member objnum (nth erbp-current-room erbp-room-objects))
+ (member objnum
+ (nth erbp-current-room erbp-room-silents))))
+ (erbp-mprincl "I don't see that here.")
+ (if (= objnum obj-cable)
+ (progn
+ (erbp-mprincl
+"As you break the ethernet cable, everything starts to blur. You collapse
+for a moment, then straighten yourself up.
+")
+ (erbp-replace erbp-room-objects gamma-computing-center
+ (append
+ (nth gamma-computing-center erbp-room-objects)
+ erbp-inventory))
+ (if (member obj-key erbp-inventory)
+ (progn
+ (setq erbp-inventory (list obj-key))
+ (erbp-remove-obj-from-room
+ gamma-computing-center obj-key))
+ (setq erbp-inventory nil))
+ (setq erbp-current-room computer-room)
+ (setq erbp-ethernet nil)
+ (erbp-mprincl "Connection closed.")
+ (erbp-unix-interface))
+ (if (< objnum 0)
+ (progn
+ (erbp-mprincl "Your axe shatters into a million pieces.")
+ (erbp-remove-obj-from-inven obj-axe))
+ (erbp-mprincl "Your axe breaks it into a million pieces.")
+ (erbp-remove-obj-from-room erbp-current-room objnum)))))))))
+
+(defun erbp-drive (args)
+ (if (not erbp-inbus)
+ (erbp-mprincl "You cannot drive when you aren't in a vehicle.")
+ (erbp-mprincl "To drive while you are in the bus, just give a direction.")))
+
+(defun erbp-superb (args)
+ (setq erbp-mode 'erbp-superb))
+
+(defun erbp-reg-score ()
+ (let (total)
+ (setq total 0)
+ (dolist (x (nth treasure-room erbp-room-objects))
+ (setq total (+ total (nth x erbp-object-pts))))
+ (if (member obj-URINE (nth treasure-room erbp-room-objects))
+ (setq total 0)) total))
+
+(defun erbp-endgame-score ()
+ (let (total)
+ (setq total 0)
+ (dolist (x (nth endgame-treasure-room erbp-room-objects))
+ (setq total (+ total (nth x erbp-object-pts)))) total))
+
+(defun erbp-answer (args)
+ (if (not erbp-correct-answer)
+ (erbp-mprincl "I don't believe anyone asked you anything.")
+ (setq args (car args))
+ (if (not args)
+ (erbp-mprincl "You must give the answer on the same line.")
+ (if (erbp-members args erbp-correct-answer)
+ (progn
+ (erbp-mprincl "Correct.")
+ (if (= erbp-lastdir 0)
+ (setq erbp-current-room (1+ erbp-current-room))
+ (setq erbp-current-room (- erbp-current-room 1)))
+ (setq erbp-correct-answer nil))
+ (erbp-mprincl "That answer is incorrect.")))))
+
+(defun erbp-endgame-question ()
+(if (not erbp-endgame-questions)
+ (progn
+ (erbp-mprincl "Your question is:")
+ (erbp-mprincl "No more questions, just do 'answer foo'.")
+ (setq erbp-correct-answer '("foo")))
+ (let (which i newques)
+ (setq i 0)
+ (setq newques nil)
+ (setq which (random (length erbp-endgame-questions)))
+ (erbp-mprincl "Your question is:")
+ (erbp-mprincl (setq erbp-endgame-question (car
+ (nth which
+ erbp-endgame-questions))))
+ (setq erbp-correct-answer (cdr (nth which erbp-endgame-questions)))
+ (while (< i which)
+ (setq newques (append newques (list (nth i erbp-endgame-questions))))
+ (setq i (1+ i)))
+ (setq i (1+ which))
+ (while (< i (length erbp-endgame-questions))
+ (setq newques (append newques (list (nth i erbp-endgame-questions))))
+ (setq i (1+ i)))
+ (setq erbp-endgame-questions newques))))
+
+(defun erbp-power (args)
+ (if (not (= erbp-current-room pc-area))
+ (erbp-mprincl "That operation is not applicable here.")
+ (if (not erbp-floppy)
+ (erbp-dos-no-disk)
+ (erbp-dos-interface))))
+
+(defun erbp-feed (args)
+ (let (objnum)
+ (when (setq objnum (erbp-objnum-from-args-std args))
+ (if (and (= objnum obj-bear)
+ (member obj-bear (nth erbp-current-room erbp-room-objects)))
+ (progn
+ (if (not (member obj-food erbp-inventory))
+ (erbp-mprincl "You have nothing with which to feed it.")
+ (erbp-drop '("food"))))
+ (if (not (or (member objnum (nth erbp-current-room erbp-room-objects))
+ (member objnum erbp-inventory)
+ (member objnum (nth erbp-current-room erbp-room-silents))))
+ (erbp-mprincl "I don't see that here.")
+ (erbp-mprincl "You cannot feed that."))))))
+
+
+;;;;
+;;;; This section defines various utility functions used
+;;;; by erbpnet.
+;;;;
+
+
+;;; 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 erbp-doverb (erbp-ignore erbp-verblist verb rest)
+ (if (not verb)
+ nil
+ (if (member (intern verb) erbp-ignore)
+ (if (not (car rest)) -1
+ (erbp-doverb erbp-ignore erbp-verblist (car rest) (cdr rest)))
+ (if (not (cdr (assq (intern verb) erbp-verblist))) -1
+ (setq erbp-numcmds (1+ erbp-numcmds))
+ (eval (list (cdr (assq (intern verb) erbp-verblist)) (quote rest)))))))
+
+
+;;; Function to take a string and change it into a list of lowercase words.
+
+(defun erbp-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 erbp-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 erbp-replace (list n number)
+ (rplaca (nthcdr n list) number))
+
+
+;;; Get the first non-ignored word from a list.
+
+(defun erbp-firstword (list)
+ (if (not (car list))
+ nil
+ (while (and list (member (intern (car list)) erbp-ignore))
+ (setq list (cdr list)))
+ (car list)))
+
+(defun erbp-firstwordl (list)
+ (if (not (car list))
+ nil
+ (while (and list (member (intern (car list)) erbp-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 erbp-vparse (erbp-ignore erbp-verblist line)
+ (erbp-mprinc "\n")
+ (setq line-list (erbp-listify-string (concat line " ")))
+ (erbp-doverb erbp-ignore erbp-verblist (car line-list) (cdr line-list)))
+
+(defun erbp-parse2 (erbp-ignore erbp-verblist line)
+ (erbp-mprinc "\n")
+ (setq line-list (erbp-listify-string2 (concat line " ")))
+ (erbp-doverb erbp-ignore erbp-verblist (car line-list) (cdr line-list)))
+
+;;; Read a line, in window mode
+
+(defun erbp-read-line ()
+ (let (line)
+ (setq line (read-string ""))
+ (erbp-mprinc line) line))
+
+;;; Insert something into the window buffer
+
+(defun erbp-minsert (string)
+ (if (stringp string)
+ (insert string)
+ (insert (prin1-to-string string))))
+
+;;; Print something out, in window mode
+
+(defun erbp-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 erbp-fix-screen ()
+ (interactive)
+ (forward-line (- 0 (- (window-height) 2 )))
+ (set-window-start (selected-window) (point))
+ (end-of-buffer))
+
+;;; Insert something into the buffer, followed by newline.
+
+(defun erbp-minsertl (string)
+ (erbp-minsert string)
+ (erbp-minsert "\n"))
+
+;;; Print something, followed by a newline.
+
+(defun erbp-mprincl (string)
+ (erbp-mprinc string)
+ (erbp-mprinc "\n"))
+
+;;; Function which will get an object number given the list of
+;;; words in the command, except for the verb.
+
+(defun erbp-objnum-from-args (obj)
+ (let (objnum)
+ (setq obj (erbp-firstword obj))
+ (if (not obj)
+ obj-special
+ (setq objnum (cdr (assq (intern obj) erbp-objnames))))))
+
+(defun erbp-objnum-from-args-std (obj)
+ (let (result)
+ (if (eq (setq result (erbp-objnum-from-args obj)) obj-special)
+ (erbp-mprincl "You must supply an object."))
+ (if (eq result nil)
+ (erbp-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 erbp-space-to-hyphen (string)
+ (let (space)
+ (if (setq space (string-match "[ /]" string))
+ (progn
+ (setq string (concat (substring string 0 space) "-"
+ (substring string (1+ space))))
+ (erbp-space-to-hyphen string))
+ string)))
+
+;;; Given a unix style pathname, build a list of path components (recursive)
+
+(defun erbp-get-path (dirstring startlist)
+ (let (slash pos)
+ (if (= (length dirstring) 0)
+ startlist
+ (if (string= (substring dirstring 0 1) "/")
+ (erbp-get-path (substring dirstring 1) (append startlist (list "/")))
+ (if (not (setq slash (string-match "/" dirstring)))
+ (append startlist (list dirstring))
+ (erbp-get-path (substring dirstring (1+ slash))
+ (append startlist
+ (list (substring dirstring 0 slash)))))))))
+
+
+;;; Is a string a member of a string list?
+
+(defun erbp-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 erbp-put-objs-in-treas (objlist)
+ (let (oscore newscore)
+ (setq oscore (erbp-reg-score))
+ (erbp-replace erbp-room-objects 0 (append (nth 0 erbp-room-objects) objlist))
+ (setq newscore (erbp-reg-score))
+ (if (not (= oscore newscore))
+ (erbp-score nil))))
+
+;;; Load an encrypted file, and eval it.
+
+(defun erbp-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
+ (erbp-rot13)
+ (error (yank)))
+ (eval-current-buffer)
+ (kill-buffer (current-buffer)))
+ (switch-to-buffer old-buffer)
+ result))
+
+;;; Functions to remove an object either from a room, or from inventory.
+
+(defun erbp-remove-obj-from-room (erbp-room objnum)
+ (let (newroom)
+ (setq newroom nil)
+ (dolist (x (nth erbp-room erbp-room-objects))
+ (if (not (= x objnum))
+ (setq newroom (append newroom (list x)))))
+ (rplaca (nthcdr erbp-room erbp-room-objects) newroom)))
+
+(defun erbp-remove-obj-from-inven (objnum)
+ (let (new-inven)
+ (setq new-inven nil)
+ (dolist (x erbp-inventory)
+ (if (not (= x objnum))
+ (setq new-inven (append new-inven (list x)))))
+ (setq erbp-inventory new-inven)))
+
+
+(let ((i 0) (lower "abcdefghijklmnopqrstuvwxyz") upper)
+ (setq erbp-translate-table (make-vector 256 0))
+ (while (< i 256)
+ (aset erbp-translate-table i i)
+ (setq i (1+ i)))
+ (setq lower (concat lower lower))
+ (setq upper (upcase lower))
+ (setq i 0)
+ (while (< i 26)
+ (aset erbp-translate-table (+ ?a i) (aref lower (+ i 13)))
+ (aset erbp-translate-table (+ ?A i) (aref upper (+ i 13)))
+ (setq i (1+ i))))
+
+(defun erbp-rot13 ()
+ (let (str len (i 0))
+ (setq str (buffer-substring (point-min) (point-max)))
+ (setq len (length str))
+ (while (< i len)
+ (aset str i (aref erbp-translate-table (aref str i)))
+ (setq i (1+ i)))
+ (erase-buffer)
+ (insert str)))
+
+;;;;
+;;;; This section defines the globals that are used in erbpnet.
+;;;;
+;;;; IMPORTANT
+;;;; All globals which can change must be saved from 'save-game. Add
+;;;; all new globals to bottom of file.
+
+(setq erbp-visited '(27))
+(setq erbp-current-room 1)
+(setq erbp-exitf nil)
+(setq erbp-badcd nil)
+(defvar erbpeon-mode-map nil)
+(setq erbpeon-mode-map (make-sparse-keymap))
+(define-key erbpeon-mode-map "\r" 'erbp-parse)
+(defvar erbpeon-batch-map (make-keymap))
+(if (string= (substring emacs-version 0 2) "18")
+ (let (n)
+ (setq n 32)
+ (while (< 0 (setq n (- n 1)))
+ (aset erbpeon-batch-map n 'erbpeon-nil)))
+ (let (n)
+ (setq n 32)
+ (while (< 0 (setq n (- n 1)))
+ (aset (car (cdr erbpeon-batch-map)) n 'erbpeon-nil))))
+(define-key erbpeon-batch-map "\r" 'exit-minibuffer)
+(define-key erbpeon-batch-map "\n" 'exit-minibuffer)
+(setq erbp-computer nil)
+(setq erbp-floppy nil)
+(setq erbp-key-level 0)
+(setq erbp-hole nil)
+(setq erbp-correct-answer nil)
+(setq erbp-lastdir 0)
+(setq erbp-numsaves 0)
+(setq erbp-jar nil)
+(setq erbp-dead nil)
+(setq room 0)
+(setq erbp-numcmds 0)
+(setq erbp-wizard nil)
+(setq erbp-endgame-question nil)
+(setq erbp-logged-in nil)
+(setq erbpeon-mode 'erbpeon)
+(setq erbp-unix-verbs '((ls . erbp-ls) (ftp . erbp-ftp) (echo . erbp-echo)
+ (exit . erbp-uexit) (cd . erbp-cd) (pwd . erbp-pwd)
+ (rlogin . erbp-rlogin) (uncompress . erbp-uncompress)
+ (cat . erbp-cat) (zippy . erbp-zippy)))
+
+(setq erbp-dos-verbs '((dir . erbp-dos-dir) (type . erbp-dos-type)
+ (exit . erbp-dos-exit) (command . erbp-dos-spawn)
+ (b: . erbp-dos-invd) (c: . erbp-dos-invd)
+ (a: . erbp-dos-nil)))
+
+
+(setq erbp-batch-mode nil)
+
+(setq erbp-cdpath "/usr/toukmond")
+(setq erbp-cdroom -10)
+(setq erbp-uncompressed nil)
+(setq erbp-ethernet t)
+(setq erbp-restricted
+ '(erbp-room-objects erbpeon-map erbp-rooms
+ erbp-room-silents erbp-combination))
+(setq erbp-ftptype 'ascii)
+(setq erbp-endgame nil)
+(setq erbp-gottago t)
+(setq erbp-black nil)
+
+(setq erbp-rooms '(
+ (
+"You are in the treasure room. A door leads out to the north."
+ "Treasure room"
+ )
+ (
+"You are at a dead end of a dirt road. The road goes to the east.
+In the distance you can see that it will eventually fork off. The
+trees here are very tall royal palms, and they are spaced equidistant
+from each other."
+ "Dead end"
+ )
+ (
+"You are on the continuation of a dirt road. There are more trees on
+both sides of you. The road continues to the east and west."
+ "E/W Dirt road"
+ )
+ (
+"You are at a fork of two passages, one to the northeast, and one to the
+southeast. The ground here seems very soft. You can also go back west."
+ "Fork"
+ )
+ (
+"You are on a northeast/southwest road."
+ "NE/SW road"
+ )
+ (
+"You are at the end of the road. There is a building in front of you
+to the northeast, and the road leads back to the southwest."
+ "Building front"
+ )
+ (
+"You are on a southeast/northwest road."
+ "SE/NW road"
+ )
+ (
+"You are standing at the end of a road. A passage leads back to the
+northwest."
+ "Bear hangout"
+ )
+ (
+"You are in the hallway of an old building. There are rooms to the east
+and west, and doors leading out to the north and south."
+ "Old Building hallway"
+ )
+ (
+"You are in a mailroom. There are many bins where the mail is usually
+kept. The exit is to the west."
+ "Mailroom"
+ )
+ (
+"You are in a computer room. It seems like most of the equipment has
+been removed. There is a VAX 11/780 in front of you, however, with
+one of the cabinets wide open. A sign on the front of the machine
+says: This VAX is named 'pokey'. To type on the console, use the
+'type' command. The exit is to the east."
+ "Computer room"
+ )
+ (
+"You are in a meadow in the back of an old building. A small path leads
+to the west, and a door leads to the south."
+ "Meadow"
+ )
+ (
+"You are in a round, stone room with a door to the east. There
+is a sign on the wall that reads: 'receiving room'."
+ "Receiving room"
+ )
+ (
+"You are at the south end of a hallway that leads to the north. There
+are rooms to the east and west."
+ "Northbound Hallway"
+ )
+ (
+"You are in a sauna. There is nothing in the room except for a dial
+on the wall. A door leads out to west."
+ "Sauna"
+ )
+ (
+"You are at the end of a north/south hallway. You can go back to the south,
+or off to a room to the east."
+ "End of N/S Hallway"
+ )
+ (
+"You are in an old weight room. All of the equipment is either destroyed
+or completely broken. There is a door out to the west, and there is a ladder
+leading down a hole in the floor."
+ "Weight room" ;16
+ )
+ (
+"You are in a maze of twisty little passages, all alike.
+There is a button on the ground here."
+ "Maze button room"
+ )
+ (
+"You are in a maze of little twisty passages, all alike."
+ "Maze"
+ )
+ (
+"You are in a maze of thirsty little passages, all alike."
+ "Maze" ;19
+ )
+ (
+"You are in a maze of twenty little passages, all alike."
+ "Maze"
+ )
+ (
+"You are in a daze of twisty little passages, all alike."
+ "Maze" ;21
+ )
+ (
+"You are in a maze of twisty little cabbages, all alike."
+ "Maze" ;22
+ )
+ (
+"You are in a reception area for a health and fitness center. The place
+appears to have been recently ransacked, and nothing is left. There is
+a door out to the south, and a crawlspace to the southeast."
+ "Reception area"
+ )
+ (
+"You are outside a large building to the north which used to be a health
+and fitness center. A road leads to the south."
+ "Health Club front"
+ )
+ (
+"You are at the north side of a lake. On the other side you can see
+a road which leads to a cave. The water appears very deep."
+ "Lakefront North"
+ )
+ (
+"You are at the south side of a lake. A road goes to the south."
+ "Lakefront South"
+ )
+ (
+"You are in a well-hidden area off to the side of a road. Back to the
+northeast through the brush you can see the bear hangout."
+ "Hidden area"
+ )
+ (
+"The entrance to a cave is to the south. To the north, a road leads
+towards a deep lake. On the ground nearby there is a chute, with a sign
+that says 'put treasures here for points'."
+ "Cave Entrance" ;28
+ )
+ (
+"You are in a misty, humid room carved into a mountain.
+To the north is the remains of a rockslide. To the east, a small
+passage leads away into the darkness." ;29
+ "Misty Room"
+ )
+ (
+"You are in an east/west passageway. The walls here are made of
+multicolored rock and are quite beautiful."
+ "Cave E/W passage" ;30
+ )
+ (
+"You are at the junction of two passages. One goes north/south, and
+the other goes west."
+ "N/S/W Junction" ;31
+ )
+ (
+"You are at the north end of a north/south passageway. There are stairs
+leading down from here. There is also a door leading west."
+ "North end of cave passage" ;32
+ )
+ (
+"You are at the south end of a north/south passageway. There is a hole
+in the floor here, into which you could probably fit."
+ "South end of cave passage" ;33
+ )
+ (
+"You are in what appears to be a worker's bedroom. There is a queen-
+sized bed in the middle of the room, and a painting hanging on the
+wall. A door leads to another room to the south, and stairways
+lead up and down."
+ "Bedroom" ;34
+ )
+ (
+"You are in a bathroom built for workers in the cave. There is a
+urinal hanging on the wall, and some exposed pipes on the opposite
+wall where a sink used to be. To the north is a bedroom."
+ "Bathroom" ;35
+ )
+ (
+"This is a marker for the urinal. User will not see this, but it
+is a room that can contain objects."
+ "Urinal" ;36
+ )
+ (
+"You are at the northeast end of a northeast/southwest passageway.
+Stairs lead up out of sight."
+ "NE end of NE/SW cave passage" ;37
+ )
+ (
+"You are at the junction of northeast/southwest and east/west passages."
+ "NE/SW-E/W junction" ;38
+ )
+ (
+"You are at the southwest end of a northeast/southwest passageway."
+ "SW end of NE/SW cave passage" ;39
+ )
+ (
+"You are at the east end of an E/W passage. There are stairs leading up
+to a room above."
+ "East end of E/W cave passage" ;40
+ )
+ (
+"You are at the west end of an E/W passage. There is a hole on the ground
+which leads down out of sight."
+ "West end of E/W cave passage" ;41
+ )
+ (
+"You are in a room which is bare, except for a horseshoe shaped boulder
+in the center. Stairs lead down from here." ;42
+ "Horseshoe boulder room"
+ )
+ (
+"You are in a room which is completely empty. Doors lead out to the north
+and east."
+ "Empty room" ;43
+ )
+ (
+"You are in an empty room. Interestingly enough, the stones in this
+room are painted blue. Doors lead out to the east and south." ;44
+ "Blue room"
+ )
+ (
+"You are in an empty room. Interestingly enough, the stones in this
+room are painted yellow. Doors lead out to the south and west." ;45
+ "Yellow room"
+ )
+ (
+"You are in an empty room. Interestingly enough, the stones in this room
+are painted red. Doors lead out to the west and north."
+ "Red room" ;46
+ )
+ (
+"You are in the middle of a long north/south hallway." ;47
+ "Long n/s hallway"
+ )
+ (
+"You are 3/4 of the way towards the north end of a long north/south hallway."
+ "3/4 north" ;48
+ )
+ (
+"You are at the north end of a long north/south hallway. There are stairs
+leading upwards."
+ "North end of long hallway" ;49
+ )
+ (
+"You are 3/4 of the way towards the south end of a long north/south hallway."
+ "3/4 south" ;50
+ )
+ (
+"You are at the south end of a long north/south hallway. There is a hole
+to the south."
+ "South end of long hallway" ;51
+ )
+ (
+"You are at a landing in a stairwell which continues up and down."
+ "Stair landing" ;52
+ )
+ (
+"You are at the continuation of an up/down staircase."
+ "Up/down staircase" ;53
+ )
+ (
+"You are at the top of a staircase leading down. A crawlway leads off
+to the northeast."
+ "Top of staircase." ;54
+ )
+ (
+"You are in a crawlway that leads northeast or southwest."
+ "NE crawlway" ;55
+ )
+ (
+"You are in a small crawlspace. There is a hole in the ground here, and
+a small passage back to the southwest."
+ "Small crawlspace" ;56
+ )
+ (
+"You are in the Gamma Computing Center. An IBM 3090/600s is whirring
+away in here. There is an ethernet cable coming out of one of the units,
+and going through the ceiling. There is no console here on which you
+could type."
+ "Gamma computing center" ;57
+ )
+ (
+"You are near the remains of a post office. There is a mail drop on the
+face of the building, but you cannot see where it leads. A path leads
+back to the east, and a road leads to the north."
+ "Post office" ;58
+ )
+ (
+"You are at the intersection of Main Street and Maple Ave. Main street
+runs north and south, and Maple Ave runs east off into the distance.
+If you look north and east you can see many intersections, but all of
+the buildings that used to stand here are gone. Nothing remains except
+street signs.
+There is a road to the northwest leading to a gate that guards a building."
+ "Main-Maple intersection" ;59
+ )
+ (
+"You are at the intersection of Main Street and the west end of Oaktree Ave."
+ "Main-Oaktree intersection" ;60
+ )
+ (
+"You are at the intersection of Main Street and the west end of Vermont Ave."
+ "Main-Vermont intersection" ;61
+ )
+ (
+"You are at the north end of Main Street at the west end of Sycamore Ave." ;62
+ "Main-Sycamore intersection"
+ )
+ (
+"You are at the south end of First Street at Maple Ave." ;63
+ "First-Maple intersection"
+ )
+ (
+"You are at the intersection of First Street and Oaktree Ave." ;64
+ "First-Oaktree intersection"
+ )
+ (
+"You are at the intersection of First Street and Vermont Ave." ;65
+ "First-Vermont intersection"
+ )
+ (
+"You are at the north end of First Street at Sycamore Ave." ;66
+ "First-Sycamore intersection"
+ )
+ (
+"You are at the south end of Second Street at Maple Ave." ;67
+ "Second-Maple intersection"
+ )
+ (
+"You are at the intersection of Second Street and Oaktree Ave." ;68
+ "Second-Oaktree intersection"
+ )
+ (
+"You are at the intersection of Second Street and Vermont Ave." ;69
+ "Second-Vermont intersection"
+ )
+ (
+"You are at the north end of Second Street at Sycamore Ave." ;70
+ "Second-Sycamore intersection"
+ )
+ (
+"You are at the south end of Third Street at Maple Ave." ;71
+ "Third-Maple intersection"
+ )
+ (
+"You are at the intersection of Third Street and Oaktree Ave." ;72
+ "Third-Oaktree intersection"
+ )
+ (
+"You are at the intersection of Third Street and Vermont Ave." ;73
+ "Third-Vermont intersection"
+ )
+ (
+"You are at the north end of Third Street at Sycamore Ave." ;74
+ "Third-Sycamore intersection"
+ )
+ (
+"You are at the south end of Fourth Street at Maple Ave." ;75
+ "Fourth-Maple intersection"
+ )
+ (
+"You are at the intersection of Fourth Street and Oaktree Ave." ;76
+ "Fourth-Oaktree intersection"
+ )
+ (
+"You are at the intersection of Fourth Street and Vermont Ave." ;77
+ "Fourth-Vermont intersection"
+ )
+ (
+"You are at the north end of Fourth Street at Sycamore Ave." ;78
+ "Fourth-Sycamore intersection"
+ )
+ (
+"You are at the south end of Fifth Street at the east end of Maple Ave." ;79
+ "Fifth-Maple intersection"
+ )
+ (
+"You are at the intersection of Fifth Street and the east end of Oaktree Ave.
+There is a cliff off to the east."
+ "Fifth-Oaktree intersection" ;80
+ )
+ (
+"You are at the intersection of Fifth Street and the east end of Vermont Ave."
+ "Fifth-Vermont intersection" ;81
+ )
+ (
+"You are at the north end of Fifth Street and the east end of Sycamore Ave."
+ "Fifth-Sycamore intersection" ;82
+ )
+ (
+"You are in front of the Museum of Natural History. A door leads into
+the building to the north, and a road leads to the southeast."
+ "Museum entrance" ;83
+ )
+ (
+"You are in the main lobby for the Museum of Natural History. In the center
+of the room is the huge skeleton of a dinosaur. Doors lead out to the
+south and east."
+ "Museum lobby" ;84
+ )
+ (
+"You are in the geological display. All of the objects that used to
+be on display are missing. There are rooms to the east, west, and
+north."
+ "Geological display" ;85
+ )
+ (
+"You are in the marine life area. The room is filled with fish tanks,
+which are filled with dead fish that have apparently died due to
+starvation. Doors lead out to the south and east."
+ "Marine life area" ;86
+ )
+ (
+"You are in some sort of maintenance room for the museum. There is a
+switch on the wall labeled 'BL'. There are doors to the west and north."
+ "Maintenance room" ;87
+ )
+ (
+"You are in a classroom where school children were taught about natural
+history. On the blackboard is written, 'No children allowed downstairs.'
+There is a door to the east with an 'exit' sign on it. There is another
+door to the west."
+ "Classroom" ;88
+ )
+ (
+"You are at the Vermont St. subway station. A train is sitting here waiting."
+ "Vermont station" ;89
+ )
+ (
+"You are at the Museum subway stop. A passage leads off to the north."
+ "Museum station" ;90
+ )
+ (
+"You are in a north/south tunnel."
+ "N/S tunnel" ;91
+ )
+ (
+"You are at the north end of a north/south tunnel. Stairs lead up and
+down from here. There is a garbage disposal here."
+ "North end of N/S tunnel" ;92
+ )
+ (
+"You are at the top of some stairs near the subway station. There is
+a door to the west."
+ "Top of subway stairs" ;93
+ )
+ (
+"You are at the bottom of some stairs near the subway station. There is
+a room to the northeast."
+ "Bottom of subway stairs" ;94
+ )
+ (
+"You are in another computer room. There is a computer in here larger
+than you have ever seen. It has no manufacturers name on it, but it
+does have a sign that says: This machine's name is 'endgame'. The
+exit is to the southwest. There is no console here on which you could
+type."
+ "Endgame computer room" ;95
+ )
+ (
+"You are in a north/south hallway."
+ "Endgame N/S hallway" ;96
+ )
+ (
+"You have reached a question room. You must answer a question correctly in
+order to get by. Use the 'answer' command to answer the question."
+ "Question room 1" ;97
+ )
+ (
+"You are in a north/south hallway."
+ "Endgame N/S hallway" ;98
+ )
+ (
+"You are in a second question room."
+ "Question room 2" ;99
+ )
+ (
+"You are in a north/south hallway."
+ "Endgame N/S hallway" ;100
+ )
+ (
+"You are in a third question room."
+ "Question room 3" ;101
+ )
+ (
+"You are in the endgame treasure room. A door leads out to the north, and
+a hallway leads to the south."
+ "Endgame treasure room" ;102
+ )
+ (
+"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
+ )
+))
+
+(setq erbp-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 erbp-verblist '((die . erbp-die) (ne . erbp-ne) (north . erbp-n)
+ (south . erbp-s) (east . erbp-e) (west . erbp-w)
+ (u . erbp-up) (d . erbp-down) (i . erbp-inven)
+ (inventory . erbp-inven) (look . erbp-examine) (n . erbp-n)
+ (s . erbp-s) (e . erbp-e) (w . erbp-w) (se . erbp-se)
+ (nw . erbp-nw) (sw . erbp-sw) (up . erbp-up)
+ (down . erbp-down) (in . erbp-in) (out . erbp-out)
+ (go . erbp-go) (drop . erbp-drop) (southeast . erbp-se)
+ (southwest . erbp-sw) (northeast . erbp-ne)
+ (northwest . erbp-nw) (save . erbp-save-game)
+ (restore . erbp-restore) (long . erbp-long) (dig . erbp-dig)
+ (shake . erbp-shake) (wave . erbp-shake)
+ (examine . erbp-examine) (describe . erbp-examine)
+ (climb . erbp-climb) (eat . erbp-eat) (put . erbp-put)
+ (type . erbp-type) (insert . erbp-put)
+ (score . erbp-score) (help . erbp-help) (quit . erbp-quit)
+ (read . erbp-examine) (verbose . erbp-long)
+ (urinate . erbp-piss) (piss . erbp-piss)
+ (flush . erbp-flush) (sleep . erbp-sleep) (lie . erbp-sleep)
+ (x . erbp-examine) (break . erbp-break) (drive . erbp-drive)
+ (board . erbp-in) (enter . erbp-in) (turn . erbp-turn)
+ (press . erbp-press) (push . erbp-press) (swim . erbp-swim)
+ (on . erbp-in) (off . erbp-out) (chop . erbp-break)
+ (switch . erbp-press) (cut . erbp-break) (exit . erbp-out)
+ (leave . erbp-out) (reset . erbp-power) (flick . erbp-press)
+ (superb . erbp-superb) (answer . erbp-answer)
+ (throw . erbp-drop) (l . erbp-examine) (take . erbp-take)
+ (get . erbp-take) (feed . erbp-feed)))
+
+(setq erbp-inbus nil)
+(setq erbp-nomail nil)
+(setq erbp-ignore '(the to at))
+(setq erbp-mode 'moby)
+(setq erbp-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 erbpeon-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 erbp-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 erbp-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 'erbp-describe-room.
+
+(setq erbp-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) ;; smal-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 erbp-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 erbp-inventory '(1))
+
+;;; Descriptions of objects, as they appear in the room description, and
+;;; the inventory.
+
+(setq erbp-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 erbp-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 erbp-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 erbp-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
+;;; erbp-room-objects
+
+(setq erbp-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 erbp-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 a plain glass jar."
+nil
+nil
+nil
+nil
+nil
+ )
+)
+
+;;; These are the descriptions the user gets when non-regular objects
+;;; are examined.
+
+(setq erbp-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 erbp-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 erbp-room-shorts nil)
+(dolist (x erbp-rooms)
+ (setq erbp-room-shorts
+ (append erbp-room-shorts (list (downcase
+ (erbp-space-to-hyphen
+ (cadr x)))))))
+
+(setq erbp-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 erbp-room-shorts)
+ (eval (list 'defconst (intern x) a))
+ (setq a (+ a 1))))
+
+
+
+;;;;
+;;;; This section defines the UNIX emulation functions for erbpnet.
+;;;;
+
+(defun erbp-unix-parse (args)
+ (interactive "*p")
+ (beginning-of-line)
+ (let (beg esign)
+ (setq beg (+ (point) 2))
+ (end-of-line)
+ (if (and (not (= beg (point)))
+ (string= "$" (buffer-substring (- beg 2) (- beg 1))))
+ (progn
+ (setq line (downcase (buffer-substring beg (point))))
+ (princ line)
+ (if (eq (erbp-parse2 nil erbp-unix-verbs line) -1)
+ (progn
+ (if (setq esign (string-match "=" line))
+ (erbp-doassign line esign)
+ (erbp-mprinc (car line-list))
+ (erbp-mprincl ": not found.")))))
+ (goto-char (point-max))
+ (erbp-mprinc "\n"))
+ (if (eq erbpeon-mode 'unix)
+ (progn
+ (erbp-fix-screen)
+ (erbp-mprinc "$ ")))))
+
+(defun erbp-doassign (line esign)
+ (if (not erbp-wizard)
+ (let (passwd)
+ (erbp-mprinc "Enter wizard password: ")
+ (setq passwd (erbp-read-line))
+ (if (not erbp-batch-mode)
+ (erbp-mprinc "\n"))
+ (if (string= passwd "moby")
+ (progn
+ (setq erbp-wizard t)
+ (erbp-doassign line esign))
+ (erbp-mprincl "Incorrect.")))
+
+ (let (varname epoint afterq i value)
+ (setq varname (substring line 0 esign))
+ (if (not (setq epoint (string-match ")" line)))
+ (if (string= (substring line (1+ esign) (+ esign 2))
+ "\"")
+ (progn
+ (setq afterq (substring line (+ esign 2)))
+ (setq epoint (+
+ (string-match "\"" afterq)
+ (+ esign 3))))
+
+ (if (not (setq epoint (string-match " " line)))
+ (setq epoint (length line))))
+ (setq epoint (1+ epoint))
+ (while (and
+ (not (= epoint (length line)))
+ (setq i (string-match ")" (substring line epoint))))
+ (setq epoint (+ epoint i 1))))
+ (setq value (substring line (1+ esign) epoint))
+ (erbp-eval varname value))))
+
+(defun erbp-eval (varname value)
+ (let (eval-error)
+ (switch-to-buffer (get-buffer-create "*erbpeon-eval*"))
+ (erase-buffer)
+ (insert "(setq ")
+ (insert varname)
+ (insert " ")
+ (insert value)
+ (insert ")")
+ (setq eval-error nil)
+ (condition-case nil
+ (eval-current-buffer)
+ (error (setq eval-error t)))
+ (kill-buffer (current-buffer))
+ (switch-to-buffer "*erbpeon*")
+ (if eval-error
+ (erbp-mprincl "Invalid syntax."))))
+
+
+(defun erbp-unix-interface ()
+ (erbp-login)
+ (if erbp-logged-in
+ (progn
+ (setq erbpeon-mode 'unix)
+ (define-key erbpeon-mode-map "\r" 'erbp-unix-parse)
+ (erbp-mprinc "$ "))))
+
+(defun erbp-login ()
+ (let (tries username password)
+ (setq tries 4)
+ (while (and (not erbp-logged-in) (> (setq tries (- tries 1)) 0))
+ (erbp-mprinc "\n\nUNIX System V, Release 2.2 (pokey)\n\nlogin: ")
+ (setq username (erbp-read-line))
+ (if (not erbp-batch-mode)
+ (erbp-mprinc "\n"))
+ (erbp-mprinc "password: ")
+ (setq password (erbp-read-line))
+ (if (not erbp-batch-mode)
+ (erbp-mprinc "\n"))
+ (if (or (not (string= username "toukmond"))
+ (not (string= password "robert")))
+ (erbp-mprincl "login incorrect")
+ (setq erbp-logged-in t)
+ (erbp-mprincl "
+Welcome to Unix\n
+Please clean up your directories. The filesystem is getting full.
+Our tcp/ip link to gamma is a little flaky, but seems to work.
+The current version of ftp can only send files from your home
+directory, and deletes them after they are sent! Be careful.
+
+Note: Restricted bourne shell in use.\n")))
+ (setq erbpeon-mode 'erbpeon)))
+
+(defun erbp-ls (args)
+ (if (car args)
+ (let (ocdpath ocdroom)
+ (setq ocdpath erbp-cdpath)
+ (setq ocdroom erbp-cdroom)
+ (if (not (eq (erbp-cd args) -2))
+ (erbp-ls nil))
+ (setq erbp-cdpath ocdpath)
+ (setq erbp-cdroom ocdroom))
+ (if (= erbp-cdroom -10)
+ (erbp-ls-inven))
+ (if (= erbp-cdroom -2)
+ (erbp-ls-rooms))
+ (if (= erbp-cdroom -3)
+ (erbp-ls-root))
+ (if (= erbp-cdroom -4)
+ (erbp-ls-usr))
+ (if (> erbp-cdroom 0)
+ (erbp-ls-room))))
+
+(defun erbp-ls-root ()
+ (erbp-mprincl "total 4
+drwxr-xr-x 3 root staff 512 Jan 1 1970 .
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 ..
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 usr
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 rooms"))
+
+(defun erbp-ls-usr ()
+ (erbp-mprincl "total 4
+drwxr-xr-x 3 root staff 512 Jan 1 1970 .
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 ..
+drwxr-xr-x 3 toukmond restricted 512 Jan 1 1970 toukmond"))
+
+(defun erbp-ls-rooms ()
+ (erbp-mprincl "total 16
+drwxr-xr-x 3 root staff 512 Jan 1 1970 .
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 ..")
+ (dolist (x erbp-visited)
+ (erbp-mprinc
+"drwxr-xr-x 3 root staff 512 Jan 1 1970 ")
+ (erbp-mprincl (nth x erbp-room-shorts))))
+
+(defun erbp-ls-room ()
+ (erbp-mprincl "total 4
+drwxr-xr-x 3 root staff 512 Jan 1 1970 .
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 ..
+-rwxr-xr-x 3 root staff 2048 Jan 1 1970 description")
+ (dolist (x (nth erbp-cdroom erbp-room-objects))
+ (if (and (>= x 0) (not (= x 255)))
+ (progn
+ (erbp-mprinc "-rwxr-xr-x 1 toukmond restricted 0 Jan 1 1970 ")
+ (erbp-mprincl (nth x erbp-objfiles))))))
+
+(defun erbp-ls-inven ()
+ (erbp-mprinc "total 467
+drwxr-xr-x 3 toukmond restricted 512 Jan 1 1970 .
+drwxr-xr-x 3 root staff 2048 Jan 1 1970 ..")
+ (dolist (x erbp-unix-verbs)
+ (if (not (eq (car x) 'IMPOSSIBLE))
+ (progn
+ (erbp-mprinc"
+-rwxr-xr-x 1 toukmond restricted 10423 Jan 1 1970 ")
+ (erbp-mprinc (car x)))))
+ (erbp-mprinc "\n")
+ (if (not erbp-uncompressed)
+ (erbp-mprincl
+"-rwxr-xr-x 1 toukmond restricted 0 Jan 1 1970 paper.o.Z"))
+ (dolist (x erbp-inventory)
+ (erbp-mprinc
+"-rwxr-xr-x 1 toukmond restricted 0 Jan 1 1970 ")
+ (erbp-mprincl (nth x erbp-objfiles))))
+
+(defun erbp-echo (args)
+ (let (nomore var)
+ (setq nomore nil)
+ (dolist (x args)
+ (if (not nomore)
+ (progn
+ (if (not (string= (substring x 0 1) "$"))
+ (progn
+ (erbp-mprinc x)
+ (erbp-mprinc " "))
+ (setq var (intern (substring x 1)))
+ (if (not (boundp var))
+ (erbp-mprinc " ")
+ (if (member var erbp-restricted)
+ (progn
+ (erbp-mprinc var)
+ (erbp-mprinc ": Permission denied")
+ (setq nomore t))
+ (eval (list 'erbp-mprinc var))
+ (erbp-mprinc " ")))))))
+ (erbp-mprinc "\n")))
+
+
+(defun erbp-ftp (args)
+ (let (host username passwd ident newlist)
+ (if (not (car args))
+ (erbp-mprincl "ftp: hostname required on command line.")
+ (setq host (intern (car args)))
+ (if (not (member host '(gamma erbp-endgame)))
+ (erbp-mprincl "ftp: Unknown host.")
+ (if (eq host 'erbp-endgame)
+ (erbp-mprincl "ftp: connection to endgame not allowed")
+ (if (not erbp-ethernet)
+ (erbp-mprincl "ftp: host not responding.")
+ (erbp-mprincl "Connected to gamma. FTP ver 0.9 00:00:00 01/01/70")
+ (erbp-mprinc "Username: ")
+ (setq username (erbp-read-line))
+ (if (string= username "toukmond")
+ (if erbp-batch-mode
+ (erbp-mprincl "toukmond ftp access not allowed.")
+ (erbp-mprincl "\ntoukmond ftp access not allowed."))
+ (if (string= username "anonymous")
+ (if erbp-batch-mode
+ (erbp-mprincl
+ "Guest login okay, send your user ident as password.")
+ (erbp-mprincl
+ "\nGuest login okay, send your user ident as password."))
+ (if erbp-batch-mode
+ (erbp-mprinc "Password required for ")
+ (erbp-mprinc "\nPassword required for "))
+ (erbp-mprincl username))
+ (erbp-mprinc "Password: ")
+ (setq ident (erbp-read-line))
+ (if (not (string= username "anonymous"))
+ (if erbp-batch-mode
+ (erbp-mprincl "Login failed.")
+ (erbp-mprincl "\nLogin failed."))
+ (if erbp-batch-mode
+ (erbp-mprincl
+ "Guest login okay, user access restrictions apply.")
+ (erbp-mprincl
+ "\nGuest login okay, user access restrictions apply."))
+ (erbp-ftp-commands)
+ (setq newlist
+'("What password did you use during anonymous ftp to gamma?"))
+ (setq newlist (append newlist (list ident)))
+ (rplaca (nthcdr 1 erbp-endgame-questions) newlist)))))))))
+
+(defun erbp-ftp-commands ()
+ (setq erbp-exitf nil)
+ (let (line)
+ (while (not erbp-exitf)
+ (erbp-mprinc "ftp> ")
+ (setq line (erbp-read-line))
+ (if
+ (eq
+ (erbp-parse2 nil
+ '((type . erbp-ftptype) (binary . erbp-bin) (bin . erbp-bin)
+ (send . erbp-send) (put . erbp-send) (quit . erbp-ftpquit)
+ (help . erbp-ftphelp)(ascii . erbp-fascii)
+ ) line)
+ -1)
+ (erbp-mprincl "No such command. Try help.")))
+ (setq erbp-ftptype 'ascii)))
+
+(defun erbp-ftptype (args)
+ (if (not (car args))
+ (erbp-mprincl "Usage: type [binary | ascii]")
+ (setq args (intern (car args)))
+ (if (eq args 'binary)
+ (erbp-bin nil)
+ (if (eq args 'ascii)
+ (erbp-fascii 'nil)
+ (erbp-mprincl "Unknown type.")))))
+
+(defun erbp-bin (args)
+ (erbp-mprincl "Type set to binary.")
+ (setq erbp-ftptype 'binary))
+
+(defun erbp-fascii (args)
+ (erbp-mprincl "Type set to ascii.")
+ (setq erbp-ftptype 'ascii))
+
+(defun erbp-ftpquit (args)
+ (setq erbp-exitf t))
+
+(defun erbp-send (args)
+ (if (not (car args))
+ (erbp-mprincl "Usage: send <filename>")
+ (setq args (car args))
+ (let (counter foo)
+ (setq foo nil)
+ (setq counter 0)
+
+;;; User can send commands! Stupid user.
+
+
+ (if (assq (intern args) erbp-unix-verbs)
+ (progn
+ (rplaca (assq (intern args) erbp-unix-verbs) 'IMPOSSIBLE)
+ (erbp-mprinc "Sending ")
+ (erbp-mprinc erbp-ftptype)
+ (erbp-mprinc " file for ")
+ (erbp-mprincl args)
+ (erbp-mprincl "Transfer complete."))
+
+ (dolist (x erbp-objfiles)
+ (if (string= args x)
+ (progn
+ (if (not (member counter erbp-inventory))
+ (progn
+ (erbp-mprincl "No such file.")
+ (setq foo t))
+ (erbp-mprinc "Sending ")
+ (erbp-mprinc erbp-ftptype)
+ (erbp-mprinc " file for ")
+ (erbp-mprinc (downcase (cadr (nth counter erbp-objects))))
+ (erbp-mprincl ", (0 bytes)")
+ (if (not (eq erbp-ftptype 'binary))
+ (progn
+ (if (not (member obj-protoplasm
+ (nth receiving-room
+ erbp-room-objects)))
+ (erbp-replace erbp-room-objects receiving-room
+ (append (nth receiving-room
+ erbp-room-objects)
+ (list obj-protoplasm))))
+ (erbp-remove-obj-from-inven counter))
+ (erbp-remove-obj-from-inven counter)
+ (erbp-replace erbp-room-objects receiving-room
+ (append (nth receiving-room erbp-room-objects)
+ (list counter))))
+ (setq foo t)
+ (erbp-mprincl "Transfer complete."))))
+ (setq counter (+ 1 counter)))
+ (if (not foo)
+ (erbp-mprincl "No such file."))))))
+
+(defun erbp-ftphelp (args)
+ (erbp-mprincl
+ "Possible commands are:\nsend quit type ascii binary help"))
+
+(defun erbp-uexit (args)
+ (setq erbpeon-mode 'erbpeon)
+ (erbp-mprincl "\nYou step back from the console.")
+ (define-key erbpeon-mode-map "\r" 'erbp-parse)
+ (if (not erbp-batch-mode)
+ (erbp-messages)))
+
+(defun erbp-pwd (args)
+ (erbp-mprincl erbp-cdpath))
+
+(defun erbp-uncompress (args)
+ (if (not (car args))
+ (erbp-mprincl "Usage: uncompress <filename>")
+ (setq args (car args))
+ (if (or erbp-uncompressed
+ (and (not (string= args "paper.o"))
+ (not (string= args "paper.o.z"))))
+ (erbp-mprincl "Uncompress command failed.")
+ (setq erbp-uncompressed t)
+ (setq erbp-inventory (append erbp-inventory (list obj-paper))))))
+
+(defun erbp-rlogin (args)
+ (let (passwd)
+ (if (not (car args))
+ (erbp-mprincl "Usage: rlogin <hostname>")
+ (setq args (car args))
+ (if (string= args "endgame")
+ (erbp-rlogin-endgame)
+ (if (not (string= args "gamma"))
+ (if (string= args "pokey")
+ (erbp-mprincl "Can't rlogin back to localhost")
+ (erbp-mprincl "No such host."))
+ (if (not erbp-ethernet)
+ (erbp-mprincl "Host not responding.")
+ (erbp-mprinc "Password: ")
+ (setq passwd (erbp-read-line))
+ (if (not (string= passwd "worms"))
+ (erbp-mprincl "\nlogin incorrect")
+ (erbp-mprinc
+"\nYou begin to feel strange for a moment, and you lose your items."
+)
+ (erbp-replace erbp-room-objects computer-room
+ (append (nth computer-room erbp-room-objects)
+ erbp-inventory))
+ (setq erbp-inventory nil)
+ (setq erbp-current-room receiving-room)
+ (erbp-uexit nil))))))))
+
+(defun erbp-cd (args)
+ (let (tcdpath tcdroom path-elements room-check)
+ (if (not (car args))
+ (erbp-mprincl "Usage: cd <path>")
+ (setq tcdpath erbp-cdpath)
+ (setq tcdroom erbp-cdroom)
+ (setq erbp-badcd nil)
+ (condition-case nil
+ (setq path-elements (erbp-get-path (car args) nil))
+ (error (erbp-mprincl "Invalid path")
+ (setq erbp-badcd t)))
+ (dolist (pe path-elements)
+ (unless erbp-badcd
+ (if (not (string= pe "."))
+ (if (string= pe "..")
+ (progn
+ (if (> tcdroom 0) ;In a room
+ (progn
+ (setq tcdpath "/rooms")
+ (setq tcdroom -2))
+ ;In /rooms,/usr,root
+ (if (or
+ (= tcdroom -2) (= tcdroom -4)
+ (= tcdroom -3))
+ (progn
+ (setq tcdpath "/")
+ (setq tcdroom -3))
+ (if (= tcdroom -10) ;In /usr/toukmond
+ (progn
+ (setq tcdpath "/usr")
+ (setq tcdroom -4))))))
+ (if (string= pe "/")
+ (progn
+ (setq tcdpath "/")
+ (setq tcdroom -3))
+ (if (= tcdroom -4)
+ (if (string= pe "toukmond")
+ (progn
+ (setq tcdpath "/usr/toukmond")
+ (setq tcdroom -10))
+ (erbp-nosuchdir))
+ (if (= tcdroom -10)
+ (erbp-nosuchdir)
+ (if (> tcdroom 0)
+ (erbp-nosuchdir)
+ (if (= tcdroom -3)
+ (progn
+ (if (string= pe "rooms")
+ (progn
+ (setq tcdpath "/rooms")
+ (setq tcdroom -2))
+ (if (string= pe "usr")
+ (progn
+ (setq tcdpath "/usr")
+ (setq tcdroom -4))
+ (erbp-nosuchdir))))
+ (if (= tcdroom -2)
+ (progn
+ (dolist (x erbp-visited)
+ (setq room-check
+ (nth x
+ erbp-room-shorts))
+ (if (string= room-check pe)
+ (progn
+ (setq tcdpath
+ (concat "/rooms/" room-check))
+ (setq tcdroom x))))
+ (if (= tcdroom -2)
+ (erbp-nosuchdir)))))))))))))
+ (if (not erbp-badcd)
+ (progn
+ (setq erbp-cdpath tcdpath)
+ (setq erbp-cdroom tcdroom)
+ 0)
+ -2))))
+
+(defun erbp-nosuchdir ()
+ (erbp-mprincl "No such directory.")
+ (setq erbp-badcd t))
+
+(defun erbp-cat (args)
+ (let (doto checklist)
+ (if (not (setq args (car args)))
+ (erbp-mprincl "Usage: cat <ascii-file-name>")
+ (if (string-match "/" args)
+ (erbp-mprincl "cat: only files in current directory allowed.")
+ (if (and (> erbp-cdroom 0) (string= args "description"))
+ (erbp-mprincl (car (nth erbp-cdroom erbp-rooms)))
+ (if (setq doto (string-match "\\.o" args))
+ (progn
+ (if (= erbp-cdroom -10)
+ (setq checklist erbp-inventory)
+ (setq checklist (nth erbp-cdroom erbp-room-objects)))
+ (if (not (member (cdr
+ (assq (intern
+ (substring args 0 doto))
+ erbp-objnames))
+ checklist))
+ (erbp-mprincl "File not found.")
+ (erbp-mprincl "Ascii files only.")))
+ (if (assq (intern args) erbp-unix-verbs)
+ (erbp-mprincl "Ascii files only.")
+ (erbp-mprincl "File not found."))))))))
+
+(defun erbp-zippy (args)
+ (erbp-mprincl (yow)))
+
+(defun erbp-rlogin-endgame ()
+ (if (not (= (erbp-score nil) 90))
+ (erbp-mprincl
+ "You have not achieved enough points to connect to endgame.")
+ (erbp-mprincl"\nWelcome to the endgame. You are a truly noble adventurer.")
+ (setq erbp-current-room treasure-room)
+ (setq erbp-endgame t)
+ (erbp-replace erbp-room-objects endgame-treasure-room (list obj-bill))
+ (erbp-uexit nil)))
+
+
+(random t)
+(setq tloc (+ 60 (random 18)))
+(erbp-replace erbp-room-objects tloc
+ (append (nth tloc erbp-room-objects) (list 18)))
+
+(setq tcomb (+ 100 (random 899)))
+(setq erbp-combination (prin1-to-string tcomb))
+
+;;;;
+;;;; This section defines the DOS emulation functions for erbpnet
+;;;;
+
+(defun erbp-dos-parse (args)
+ (interactive "*p")
+ (beginning-of-line)
+ (let (beg)
+ (setq beg (+ (point) 3))
+ (end-of-line)
+ (if (not (= beg (point)))
+ (let (line)
+ (setq line (downcase (buffer-substring beg (point))))
+ (princ line)
+ (if (eq (erbp-parse2 nil erbp-dos-verbs line) -1)
+ (progn
+ (sleep-for 1)
+ (erbp-mprincl "Bad command or file name"))))
+ (goto-char (point-max))
+ (erbp-mprinc "\n"))
+ (if (eq erbpeon-mode 'dos)
+ (progn
+ (erbp-fix-screen)
+ (erbp-dos-prompt)))))
+
+(defun erbp-dos-interface ()
+ (erbp-dos-boot-msg)
+ (setq erbpeon-mode 'dos)
+ (define-key erbpeon-mode-map "\r" 'erbp-dos-parse)
+ (erbp-dos-prompt))
+
+(defun erbp-dos-type (args)
+ (sleep-for 2)
+ (if (setq args (car args))
+ (if (string= args "foo.txt")
+ (erbp-dos-show-combination)
+ (if (string= args "command.com")
+ (erbp-mprincl "Cannot type binary files")
+ (erbp-mprinc "File not found - ")
+ (erbp-mprincl (upcase args))))
+ (erbp-mprincl "Must supply file name")))
+
+(defun erbp-dos-invd (args)
+ (sleep-for 1)
+ (erbp-mprincl "Invalid drive specification"))
+
+(defun erbp-dos-dir (args)
+ (sleep-for 1)
+ (if (or (not (setq args (car args))) (string= args "\\"))
+ (erbp-mprincl "
+ Volume in drive A is FOO
+ Volume Serial Number is 1A16-08C9
+ Directory of A:\\
+
+COMMAND COM 47845 04-09-91 2:00a
+FOO TXT 40 01-20-93 1:01a
+ 2 file(s) 47845 bytes
+ 1065280 bytes free
+")
+ (erbp-mprincl "
+ Volume in drive A is FOO
+ Volume Serial Number is 1A16-08C9
+ Directory of A:\\
+
+File not found")))
+
+
+(defun erbp-dos-prompt ()
+ (erbp-mprinc "A> "))
+
+(defun erbp-dos-boot-msg ()
+ (sleep-for 3)
+ (erbp-mprinc "Current time is ")
+ (erbp-mprincl (substring (current-time-string) 12 20))
+ (erbp-mprinc "Enter new time: ")
+ (erbp-read-line)
+ (if (not erbp-batch-mode)
+ (erbp-mprinc "\n")))
+
+(defun erbp-dos-spawn (args)
+ (sleep-for 1)
+ (erbp-mprincl "Cannot spawn subshell"))
+
+(defun erbp-dos-exit (args)
+ (setq erbpeon-mode 'erbpeon)
+ (erbp-mprincl "\nYou power down the machine and step back.")
+ (define-key erbpeon-mode-map "\r" 'erbp-parse)
+ (if (not erbp-batch-mode)
+ (erbp-messages)))
+
+(defun erbp-dos-no-disk ()
+ (sleep-for 3)
+ (erbp-mprincl "Boot sector not found"))
+
+
+(defun erbp-dos-show-combination ()
+ (sleep-for 2)
+ (erbp-mprinc "\nThe combination is ")
+ (erbp-mprinc erbp-combination)
+ (erbp-mprinc ".\n"))
+
+(defun erbp-dos-nil (args))
+
+
+;;;;
+;;;; This section defines the save and restore game functions for erbpnet.
+;;;;
+
+(defun erbp-save-game (filename)
+ (if (not (setq filename (car filename)))
+ (erbp-mprincl "You must supply a filename for the save.")
+ (if (file-exists-p filename)
+ (delete-file filename))
+ (setq erbp-numsaves (1+ erbp-numsaves))
+ (erbp-make-save-buffer)
+ (erbp-save-val "erbp-current-room")
+ (erbp-save-val "erbp-computer")
+ (erbp-save-val "erbp-combination")
+ (erbp-save-val "erbp-visited")
+ (erbp-save-val "erbp-diggables")
+ (erbp-save-val "erbp-key-level")
+ (erbp-save-val "erbp-floppy")
+ (erbp-save-val "erbp-numsaves")
+ (erbp-save-val "erbp-numcmds")
+ (erbp-save-val "erbp-logged-in")
+ (erbp-save-val "erbpeon-mode")
+ (erbp-save-val "erbp-jar")
+ (erbp-save-val "erbp-lastdir")
+ (erbp-save-val "erbp-black")
+ (erbp-save-val "erbp-nomail")
+ (erbp-save-val "erbp-unix-verbs")
+ (erbp-save-val "erbp-hole")
+ (erbp-save-val "erbp-uncompressed")
+ (erbp-save-val "erbp-ethernet")
+ (erbp-save-val "erbp-sauna-level")
+ (erbp-save-val "erbp-room-objects")
+ (erbp-save-val "erbp-room-silents")
+ (erbp-save-val "erbp-inventory")
+ (erbp-save-val "erbp-endgame-questions")
+ (erbp-save-val "erbp-endgame")
+ (erbp-save-val "erbp-cdroom")
+ (erbp-save-val "erbp-cdpath")
+ (erbp-save-val "erbp-correct-answer")
+ (erbp-save-val "erbp-inbus")
+ (if (erbp-compile-save-out filename)
+ (erbp-mprincl "Error saving to file.")
+ (erbp-do-logfile 'save nil)
+ (switch-to-buffer "*erbpeon*")
+ (princ "")
+ (erbp-mprincl "Done."))))
+
+(defun erbp-make-save-buffer ()
+ (switch-to-buffer (get-buffer-create "*save-erbpeon*"))
+ (erase-buffer))
+
+(defun erbp-compile-save-out (filename)
+ (let (ferror)
+ (setq ferror nil)
+ (condition-case nil
+ (erbp-rot13)
+ (error (setq ferror t)))
+ (if (not ferror)
+ (progn
+ (goto-char (point-min))))
+ (condition-case nil
+ (write-region 1 (point-max) filename nil 1)
+ (error (setq ferror t)))
+ (kill-buffer (current-buffer))
+ ferror))
+
+
+(defun erbp-save-val (varname)
+ (let (value)
+ (setq varname (intern varname))
+ (setq value (eval varname))
+ (erbp-minsert "(setq ")
+ (erbp-minsert varname)
+ (erbp-minsert " ")
+ (if (or (listp value)
+ (symbolp value))
+ (erbp-minsert "'"))
+ (if (stringp value)
+ (erbp-minsert "\""))
+ (erbp-minsert value)
+ (if (stringp value)
+ (erbp-minsert "\""))
+ (erbp-minsertl ")")))
+
+
+(defun erbp-restore (args)
+ (let (file)
+ (if (not (setq file (car args)))
+ (erbp-mprincl "You must supply a filename.")
+ (if (not (erbp-load-d file))
+ (erbp-mprincl "Could not load restore file.")
+ (erbp-mprincl "Done.")
+ (setq room 0)))))
+
+
+(defun erbp-do-logfile (type how)
+ (let (ferror newscore)
+ (setq ferror nil)
+ (switch-to-buffer (get-buffer-create "*score*"))
+ (erase-buffer)
+ (condition-case nil
+ (insert-file-contents erbp-log-file)
+ (error (setq ferror t)))
+ (unless ferror
+ (goto-char (point-max))
+ (erbp-minsert (current-time-string))
+ (erbp-minsert " ")
+ (erbp-minsert (user-login-name))
+ (erbp-minsert " ")
+ (if (eq type 'save)
+ (erbp-minsert "saved ")
+ (if (= (erbp-endgame-score) 110)
+ (erbp-minsert "won ")
+ (if (not how)
+ (erbp-minsert "quit ")
+ (erbp-minsert "killed by ")
+ (erbp-minsert how)
+ (erbp-minsert " "))))
+ (erbp-minsert "at ")
+ (erbp-minsert (cadr (nth (abs room) erbp-rooms)))
+ (erbp-minsert ". score: ")
+ (if (> (erbp-endgame-score) 0)
+ (erbp-minsert (setq newscore (+ 90 (erbp-endgame-score))))
+ (erbp-minsert (setq newscore (erbp-reg-score))))
+ (erbp-minsert " saves: ")
+ (erbp-minsert erbp-numsaves)
+ (erbp-minsert " commands: ")
+ (erbp-minsert erbp-numcmds)
+ (erbp-minsert "\n")
+ (write-region 1 (point-max) erbp-log-file nil 1))
+ (kill-buffer (current-buffer))))
+
+
+;;;;
+;;;; These are functions, and function re-definitions so that erbpeon can
+;;;; be run in batch mode.
+
+
+(defun erbp-batch-mprinc (arg)
+ (if (stringp arg)
+ (send-string-to-terminal arg)
+ (send-string-to-terminal (prin1-to-string arg))))
+
+
+(defun erbp-batch-mprincl (arg)
+ (if (stringp arg)
+ (progn
+ (send-string-to-terminal arg)
+ (send-string-to-terminal "\n"))
+ (send-string-to-terminal (prin1-to-string arg))
+ (send-string-to-terminal "\n")))
+
+(defun erbp-batch-parse (erbp-ignore erbp-verblist line)
+ (setq line-list (erbp-listify-string (concat line " ")))
+ (erbp-doverb erbp-ignore erbp-verblist (car line-list) (cdr line-list)))
+
+(defun erbp-batch-parse2 (erbp-ignore erbp-verblist line)
+ (setq line-list (erbp-listify-string2 (concat line " ")))
+ (erbp-doverb erbp-ignore erbp-verblist (car line-list) (cdr line-list)))
+
+(defun erbp-batch-read-line ()
+ (read-from-minibuffer "" nil erbpeon-batch-map))
+
+
+(defun erbp-batch-loop ()
+ (setq erbp-dead nil)
+ (setq room 0)
+ (while (not erbp-dead)
+ (if (eq erbpeon-mode 'erbpeon)
+ (progn
+ (if (not (= room erbp-current-room))
+ (progn
+ (erbp-describe-room erbp-current-room)
+ (setq room erbp-current-room)))
+ (erbp-mprinc ">")
+ (setq line (downcase (erbp-read-line)))
+ (if (eq (erbp-vparse erbp-ignore erbp-verblist line) -1)
+ (erbp-mprinc "I don't understand that.\n"))))))
+
+(defun erbp-batch-dos-interface ()
+ (erbp-dos-boot-msg)
+ (setq erbpeon-mode 'dos)
+ (while (eq erbpeon-mode 'dos)
+ (erbp-dos-prompt)
+ (setq line (downcase (erbp-read-line)))
+ (if (eq (erbp-parse2 nil erbp-dos-verbs line) -1)
+ (progn
+ (sleep-for 1)
+ (erbp-mprincl "Bad command or file name"))))
+ (goto-char (point-max))
+ (erbp-mprinc "\n"))
+
+(defun erbp-batch-unix-interface ()
+ (erbp-login)
+ (if erbp-logged-in
+ (progn
+ (setq erbpeon-mode 'unix)
+ (while (eq erbpeon-mode 'unix)
+ (erbp-mprinc "$ ")
+ (setq line (downcase (erbp-read-line)))
+ (if (eq (erbp-parse2 nil erbp-unix-verbs line) -1)
+ (let (esign)
+ (if (setq esign (string-match "=" line))
+ (erbp-doassign line esign)
+ (erbp-mprinc (car line-list))
+ (erbp-mprincl ": not found.")))))
+ (goto-char (point-max))
+ (erbp-mprinc "\n"))))
+
+(defun erbpeon-nil (arg)
+ "noop"
+ (interactive "*p")
+ nil)
+
+(defun erbp-batch-erbpeon ()
+ (load "erbp-batch")
+ (setq erbp-visited '(27))
+ (erbp-mprinc "\n")
+ (erbp-batch-loop))
+
+(unless (not noninteractive)
+ (fset 'erbp-mprinc 'erbp-batch-mprinc)
+ (fset 'erbp-mprincl 'erbp-batch-mprincl)
+ (fset 'erbp-vparse 'erbp-batch-parse)
+ (fset 'erbp-parse2 'erbp-batch-parse2)
+ (fset 'erbp-read-line 'erbp-batch-read-line)
+ (fset 'erbp-dos-interface 'erbp-batch-dos-interface)
+ (fset 'erbp-unix-interface 'erbp-batch-unix-interface)
+ (erbp-mprinc "\n")
+ (setq erbp-batch-mode t)
+ (erbp-batch-loop))
+
+(provide 'erbpnet)
+
+;;; erbpnet.el ends here