Mercurial > emacs
changeset 4033:431bc7d22c70
Initial revision
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 08 Jul 1993 21:10:59 +0000 |
parents | ff35c9c97504 |
children | 9e585b42806d |
files | lisp/play/dunnet.el |
diffstat | 1 files changed, 3316 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/play/dunnet.el Thu Jul 08 21:10:59 1993 +0000 @@ -0,0 +1,3316 @@ +;;; dunnet.el --- Text adventure for Emacs + +;; Author: Ron Schnell <ronnie@media.mit.edu> +;; Created: 25 Jul 1992 +;; Version: 2.0 +;; Keywords: games +;; Copyright (C) 1992, 1993 Free Software Foundation, Inc. + +;; 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 2, 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, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; This game can be run in batch mode. To do this, use: +;; emacs -batch -l dunnet.el + +;;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +;;; The log file should be set for your system, and it must +;;; be writeable by all. + + + (setq log-file "/usr/local/dunscore") + + + +(if nil + (eval-and-compile (setq byte-compile-warnings nil))) + +(require 'cl) + +;;;; Mode definitions for interactive mode + +(defun dungeon-mode () + "Major mode for running dungeon" + (interactive) + (text-mode) + (use-local-map dungeon-mode-map) + (setq major-mode 'dungeon-mode) + (setq mode-name "Dungeon")) + +(defun dungeon-parse (arg) + "foo" + (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 (parse ignore verblist line) -1) + (mprinc "I don't understand that.\n"))) + (goto-char (point-max)) + (mprinc "\n")) + (dungeon-messages)) + +(defun dungeon-messages () + (if dead + (text-mode) + (if (eq dungeon-mode 'dungeon) + (progn + (if (not (= room current-room)) + (progn + (describe-room current-room) + (setq room current-room))) + (fix-screen) + (mprinc ">"))))) + + +;;;###autoload +(defun dunnet () + "Switch to *dungeon* buffer and start game." + (interactive) + (switch-to-buffer "*dungeon*") + (dungeon-mode) + (setq dead nil) + (setq room 0) + (dungeon-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 describe-room (room) + (if (and (not (member (abs room) light-rooms)) + (not (member obj-lamp inventory))) + (mprincl "It is pitch dark. You are likely to be eaten by a grue.") + (mprincl (cadr (nth (abs room) rooms))) + (if (and (and (or (member room visited) + (string= mode "superb")) (> room 0)) + (not (string= mode "long"))) + nil + (mprinc (car (nth (abs room) rooms))) + (mprinc "\n")) + (if (not (string= mode "long")) + (if (not (member (abs room) visited)) + (setq visited (append (list (abs room)) visited)))) + (dolist (xobjs (nth current-room room-objects)) + (if (= xobjs obj-special) + (special-object) + (if (>= xobjs 0) + (mprincl (car (nth xobjs objects))) + (if (not (and (= xobjs obj-bus) inbus)) + (progn + (mprincl (car (nth (abs xobjs) perm-objects))))))) + (if (and (= xobjs obj-jar) jar) + (progn + (mprincl "The jar contains:") + (dolist (x jar) + (mprinc " ") + (mprincl (car (nth x objects))))))) + (if (and (member obj-bus (nth current-room room-objects)) inbus) + (mprincl "You are on the bus.")))) + +;;; There is a special object in the room. This object's description, +;;; or lack thereof, depends on certain conditions. + +(defun special-object () + (if (= current-room computer-room) + (if computer + (mprincl +"The panel lights are flashing in a seemingly organized pattern.") + (mprincl "The panel lights are steady and motionless."))) + + (if (and (= current-room red-room) + (not (member obj-towel (nth red-room room-objects)))) + (mprincl "There is a hole in the floor here.")) + + (if (and (= current-room marine-life-area) black) + (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 (= current-room fourth-vermont-intersection) hole) + (progn + (mprincl"You fall into a hole in the ground.") + (setq current-room vermont-station) + (describe-room vermont-station))) + + (if (> current-room endgame-computer-room) + (progn + (if (not correct-answer) + (endgame-question) + (mprincl "Your question is:") + (mprincl endgame-question)))) + + (if (= current-room sauna) + (progn + (mprincl (nth 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 (and (= sauna-level 3) + (or (member obj-rms inventory) + (member obj-rms (nth current-room room-objects)))) + (progn + (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 inventory) + (progn + (remove-obj-from-inven obj-rms) + (setq inventory (append inventory (list obj-diamond)))) + (remove-obj-from-room current-room obj-rms) + (replace room-objects current-room + (append (nth current-room room-objects) + (list obj-diamond)))) + (if (member obj-floppy inventory) + (progn + (mprincl +"You notice your floppy disk beginning to melt. As you grab for it, the +disk bursts into flames, and disintegrates.") + (remove-obj-from-inven obj-floppy) + (remove-obj-from-room current-room obj-floppy))))))) +) + +(defun die (murderer) + (mprinc "\n") + (if murderer + (mprincl "You are dead.")) + (do-logfile 'die murderer) + (score nil) + (setq dead t)) + +(defun quit (args) + (die nil)) + +;;; Print every object in player's inventory. Special case for the jar, +;;; as we must also print what is in it. + +(defun inven (args) + (mprinc "You currently have:") + (mprinc "\n") + (dolist (curobj inventory) + (if curobj + (progn + (mprincl (cadr (nth curobj objects))) + (if (and (= curobj obj-jar) jar) + (progn + (mprincl "The jar contains:") + (dolist (x jar) + (mprinc " ") + (mprincl (cadr (nth x objects)))))))))) + +(defun shake (obj) + (let (objnum) + (when (setq objnum (objnum-from-args-std obj)) + (if (member objnum inventory) + (progn +;;; If shaking anything will do anything, put here. + (mprinc "Shaking ") + (mprinc (downcase (cadr (nth objnum objects)))) + (mprinc " seems to have no effect.") + (mprinc "\n") + ) + (if (and (not (member objnum (nth current-room room-silents))) + (not (member objnum (nth current-room room-objects)))) + (mprincl "I don't see that here.") +;;; Shaking trees can be deadly + (if (= objnum obj-tree) + (progn + (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.") + (die "a coconut")) + (if (= objnum obj-bear) + (progn + (mprinc +"As you go up to the bear, it removes your head and places it on the ground.") + (die "a bear")) + (if (< objnum 0) + (mprincl "You cannot shake that.") + (mprincl "You don't have that."))))))))) + + +(defun drop (obj) + (if inbus + (mprincl "You can't drop anything while on the bus.") + (let (objnum ptr) + (when (setq objnum (objnum-from-args-std obj)) + (if (not (setq ptr (member objnum inventory))) + (mprincl "You don't have that.") + (progn + (remove-obj-from-inven objnum) + (replace room-objects current-room + (append (nth current-room room-objects) + (list objnum))) + (mprincl "Done.") + (if (member objnum (list obj-food obj-weight obj-jar)) + (drop-check objnum)))))))) + +;;; Dropping certain things causes things to happen. + +(defun drop-check (objnum) + (if (and (= objnum obj-food) (= room bear-hangout) + (member obj-bear (nth bear-hangout room-objects))) + (progn + (mprincl +"The bear takes the food and runs away with it. He left something behind.") + (remove-obj-from-room current-room obj-bear) + (remove-obj-from-room current-room obj-food) + (replace room-objects current-room + (append (nth current-room room-objects) + (list obj-key))))) + + (if (and (= objnum obj-jar) (member obj-nitric jar) + (member obj-glycerine jar)) + (progn + (mprincl "As the jar impacts the ground it explodes into many pieces.") + (setq jar nil) + (remove-obj-from-room current-room obj-jar) + (if (= current-room fourth-vermont-intersection) + (progn + (setq hole t) + (setq current-room vermont-station) + (mprincl +"The explosion causes a hole to open up in the ground, which you fall +through."))))) + + (if (and (= objnum obj-weight) (= current-room maze-button-room)) + (mprincl "A passageway opens."))) + +;;; Give long description of current room, or an object. + +(defun examine (obj) + (let (objnum) + (setq objnum (objnum-from-args obj)) + (if (eq objnum obj-special) + (describe-room (* current-room -1)) + (if (and (eq objnum obj-computer) + (member obj-pc (nth current-room room-silents))) + (examine '("pc")) + (if (eq objnum nil) + (mprincl "I don't know what that is.") + (if (and (not (member objnum (nth current-room room-objects))) + (not (member objnum (nth current-room room-silents))) + (not (member objnum inventory))) + (mprincl "I don't see that here.") + (if (>= objnum 0) + (if (and (= objnum obj-bone) + (= current-room marine-life-area) black) + (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 physobj-desc) + (mprincl (nth objnum physobj-desc)) + (mprincl "I see nothing special about that."))) + (if (nth (abs objnum) permobj-desc) + (progn + (mprincl (nth (abs objnum) permobj-desc))) + (mprincl "I see nothing special about that."))))))))) + +(defun take (obj) + (if inbus + (mprincl "You can't take anything while on the bus.") + (setq obj (firstword obj)) + (if (not obj) + (mprincl "You must supply an object.") + (if (string= obj "all") + (let (gotsome) + (setq gotsome nil) + (dolist (x (nth current-room room-objects)) + (if (and (>= x 0) (not (= x obj-special))) + (progn + (setq gotsome t) + (mprinc (cadr (nth x objects))) + (mprinc ": ") + (take-object x)))) + (if (not gotsome) + (mprincl "Nothing to take."))) + (let (objnum) + (setq objnum (cdr (assq (intern obj) objnames))) + (if (eq objnum nil) + (progn + (mprinc "I don't know what that is.") + (mprinc "\n")) + (take-object objnum))))))) + +(defun take-object (objnum) + (if (and (member objnum jar) (member obj-jar inventory)) + (let (newjar) + (mprincl "You remove it from the jar.") + (setq newjar nil) + (dolist (x jar) + (if (not (= x objnum)) + (setq newjar (append newjar (list x))))) + (setq jar newjar) + (setq inventory (append inventory (list objnum)))) + (if (not (member objnum (nth current-room room-objects))) + (if (not (member objnum (nth current-room room-silents))) + (mprinc "I do not see that here.") + (try-take objnum)) + (if (>= objnum 0) + (progn + (if (and (car inventory) + (> (+ (inven-weight) (nth objnum object-lbs)) 11)) + (mprinc "Your load would be too heavy.") + (setq inventory (append inventory (list objnum))) + (remove-obj-from-room current-room objnum) + (mprinc "Taken. ") + (if (and (= objnum obj-towel) (= current-room red-room)) + (mprinc "Taking the towel reveals a hole in the floor.")))) + (try-take objnum))) + (mprinc "\n"))) + +(defun inven-weight () + (let (total) + (setq total 0) + (dolist (x jar) + (setq total (+ total (nth x object-lbs)))) + (dolist (x inventory) + (setq total (+ total (nth x object-lbs)))) total)) + +;;; We try to take an object that is untakable. Print a message +;;; depending on what it is. + +(defun try-take (obj) + (mprinc "You cannot take that.")) + +(defun dig (args) + (if inbus + (mprincl "You can't dig while on the bus.") + (if (not (member 0 inventory)) + (mprincl "You have nothing with which to dig.") + (if (not (nth current-room diggables)) + (mprincl "Digging here reveals nothing.") + (mprincl "I think you found something.") + (replace room-objects current-room + (append (nth current-room room-objects) + (nth current-room diggables))) + (replace diggables current-room nil))))) + +(defun climb (obj) + (let (objnum) + (setq objnum (objnum-from-args obj)) + (if (and (not (= objnum obj-special)) + (not (member objnum (nth current-room room-objects))) + (not (member objnum (nth current-room room-silents))) + (not (member objnum inventory))) + (mprincl "I don't see that here.") + (if (and (= objnum obj-special) + (not (member obj-tree (nth current-room room-silents)))) + (mprincl "There is nothing here to climb.") + (if (and (not (= objnum obj-tree)) (not (= objnum obj-special))) + (mprincl "You can't climb that.") + (mprincl +"You manage to get about two feet up the tree and fall back down. You +notice that the tree is very unsteady.")))))) + +(defun eat (obj) + (let (objnum) + (when (setq objnum (objnum-from-args-std obj)) + (if (not (member objnum inventory)) + (mprincl "You don't have that.") + (if (not (= objnum obj-food)) + (progn + (mprinc "You forcefully shove ") + (mprinc (downcase (cadr (nth objnum objects)))) + (mprincl " down your throat, and start choking.") + (die "choking")) + (mprincl "That tasted horrible.") + (remove-obj-from-inven obj-food)))))) + +(defun dput (args) + (if inbus + (mprincl "You can't do that while on the bus") + (let (newargs objnum objnum2 obj) + (setq newargs (firstwordl args)) + (if (not newargs) + (mprincl "You must supply an object") + (setq obj (intern (car newargs))) + (setq objnum (cdr (assq obj objnames))) + (if (not objnum) + (mprincl "I don't know what that object is.") + (if (not (member objnum inventory)) + (mprincl "You don't have that.") + (setq newargs (firstwordl (cdr newargs))) + (setq newargs (firstwordl (cdr newargs))) + (if (not newargs) + (mprincl "You must supply an indirect object.") + (setq objnum2 (cdr (assq (intern (car newargs)) objnames))) + (if (and (eq objnum2 obj-computer) (= current-room pc-area)) + (setq objnum2 obj-pc)) + (if (not objnum2) + (mprincl "I don't know what that indirect object is.") + (if (and (not (member objnum2 (nth current-room room-objects))) + (not (member objnum2 (nth current-room room-silents))) + (not (member objnum2 inventory))) + (mprincl "That indirect object is not here.") + (put-objs objnum objnum2)))))))))) + +(defun put-objs (obj1 obj2) + (if (and (= obj2 obj-drop) (not nomail)) + (setq obj2 obj-chute)) + + (if (= obj2 obj-disposal) (setq obj2 obj-chute)) + + (if (and (= obj1 obj-cpu) (= obj2 obj-computer)) + (progn + (remove-obj-from-inven obj-cpu) + (setq computer t) + (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)) + (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))) + (mprincl "That will not fit in the jar.") + (remove-obj-from-inven obj1) + (setq jar (append jar (list obj1))) + (mprincl "Done.")) + (if (= obj2 obj-chute) ;; Put something in chute + (progn + (remove-obj-from-inven obj1) + (mprincl +"You hear it slide down the chute and off into the distance.") + (put-objs-in-treas (list obj1))) + (if (= obj2 obj-box) ;; Put key in key box + (if (= obj1 obj-key) + (progn + (mprincl +"As you drop the key, the box begins to shake. Finally it explodes +with a bang. The key seems to have vanished!") + (remove-obj-from-inven obj1) + (replace room-objects computer-room (append + (nth computer-room + room-objects) + (list obj1))) + (remove-obj-from-room current-room obj-box) + (setq key-level (1+ key-level))) + (mprincl "You can't put that in the key box!")) + + (if (and (= obj1 obj-floppy) (= obj2 obj-pc)) + (progn + (setq floppy t) + (remove-obj-from-inven obj1) + (mprincl "Done.")) + + (if (= obj2 obj-urinal) ;; Put object in urinal + (progn + (remove-obj-from-inven obj1) + (replace room-objects urinal (append + (nth urinal room-objects) + (list obj1))) + (mprincl + "You hear it plop down in some water below.")) + (if (= obj2 obj-mail) + (mprincl "The mail chute is locked.") + (if (member obj1 inventory) + (mprincl +"I don't know how to combine those objects. Perhaps you should +just try dropping it.") + (mprincl"You can't put that there."))))))))))) + +(defun type (args) + (if (not (= current-room computer-room)) + (mprincl "There is nothing here on which you could type.") + (if (not computer) + (mprincl +"You type on the keyboard, but your characters do not even echo.") + (unix-interface)))) + +;;; Various movement directions + +(defun n (args) + (move north)) + +(defun s (args) + (move south)) + +(defun e (args) + (move east)) + +(defun w (args) + (move west)) + +(defun ne (args) + (move northeast)) + +(defun se (args) + (move southeast)) + +(defun nw (args) + (move northwest)) + +(defun sw (args) + (move southwest)) + +(defun up (args) + (move up)) + +(defun down (args) + (move down)) + +(defun in (args) + (move in)) + +(defun out (args) + (move out)) + +(defun go (args) + (if (or (not (car args)) + (eq (doverb ignore verblist (car args) (cdr (cdr args))) -1)) + (mprinc "I don't understand where you want me to go.\n"))) + +;;; Uses the dungeon-map to figure out where we are going. If the +;;; requested direction yields 255, we know something special is +;;; supposed to happen, or perhaps you can't go that way unless +;;; certain conditions are met. + +(defun move (dir) + (if (and (not (member current-room light-rooms)) + (not (member obj-lamp inventory))) + (progn + (mprinc +"You trip over a grue and fall into a pit and break every bone in your +body.") + (die "a grue")) + (let (newroom) + (setq newroom (nth dir (nth current-room dungeon-map))) + (if (eq newroom -1) + (mprinc "You can't go that way.\n") + (if (eq newroom 255) + (special-move dir) + (setq room -1) + (setq lastdir dir) + (if inbus + (progn + (if (or (< newroom 58) (> newroom 83)) + (mprincl "The bus cannot go this way.") + (mprincl + "The bus lurches ahead and comes to a screeching halt.") + (remove-obj-from-room current-room obj-bus) + (setq current-room newroom) + (replace room-objects newroom + (append (nth newroom room-objects) + (list obj-bus))))) + (setq 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 special-move (dir) + (if (= current-room building-front) + (if (not (member obj-key inventory)) + (mprincl "You don't have a key that can open this door.") + (setq current-room old-building-hallway)) + (if (= current-room north-end-of-cave-passage) + (let (combo) + (mprincl +"You must type a 3 digit combination code to enter this room.") + (mprinc "Enter it here: ") + (setq combo (read-line)) + (if (not batch-mode) + (mprinc "\n")) + (if (string= combo combination) + (setq current-room gamma-computing-center) + (mprincl "Sorry, that combination is incorrect.")))) + + (if (= current-room bear-hangout) + (if (member obj-bear (nth bear-hangout room-objects)) + (progn + (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. +") + (die "a bear")) + (mprincl "You can't go that way."))) + + (if (= current-room vermont-station) + (progn + (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.") + (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 current-room museum-station))) + + (if (= current-room old-building-hallway) + (if (and (member obj-key inventory) + (> key-level 0)) + (setq current-room meadow) + (mprincl "You don't have a key that can open this door."))) + + (if (and (= current-room maze-button-room) (= dir northwest)) + (if (member obj-weight (nth maze-button-room room-objects)) + (setq current-room 18) + (mprincl "You can't go that way."))) + + (if (and (= current-room maze-button-room) (= dir up)) + (if (member obj-weight (nth maze-button-room room-objects)) + (mprincl "You can't go that way.") + (setq current-room weight-room))) + + (if (= current-room classroom) + (mprincl "The door is locked.")) + + (if (or (= current-room lakefront-north) (= current-room lakefront-south)) + (swim nil)) + + (if (= current-room reception-area) + (if (not (= sauna-level 3)) + (setq current-room health-club-front) + (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.") + (die "burning"))) + + (if (= current-room red-room) + (if (not (member obj-towel (nth red-room room-objects))) + (setq current-room long-n-s-hallway) + (mprincl "You can't go that way."))) + + (if (and (> dir down) (> current-room gamma-computing-center) + (< current-room museum-lobby)) + (if (not (member obj-bus (nth current-room room-objects))) + (mprincl "You can't go that way.") + (if (= dir in) + (if (member obj-license inventory) + (progn + (mprincl "You board the bus and get in the driver's seat.") + (setq nomail t) + (setq inbus t)) + (mprincl "You are not licensed for this type of vehicle.")) + (mprincl "You hop off the bus.") + (setq inbus nil))) + (if (= current-room fifth-oaktree-intersection) + (if (not inbus) + (progn + (mprincl "You fall down the cliff and land on your head.") + (die "a cliff")) + (mprincl +"The bus flies off the cliff, and plunges to the bottom, where it explodes.") + (die "a bus accident"))) + (if (= current-room main-maple-intersection) + (progn + (if (not inbus) + (mprincl "The gate will not open.") + (mprincl +"As the bus approaches, the gate opens and you drive through.") + (remove-obj-from-room main-maple-intersection obj-bus) + (replace room-objects museum-entrance + (append (nth museum-entrance room-objects) + (list obj-bus))) + (setq current-room museum-entrance))))) + (if (= current-room cave-entrance) + (progn + (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 current-room misty-room))))) + +(defun long (args) + (setq mode "long")) + +(defun turn (obj) + (let (objnum direction) + (when (setq objnum (objnum-from-args-std obj)) + (if (not (or (member objnum (nth current-room room-objects)) + (member objnum (nth current-room room-silents)))) + (mprincl "I don't see that here.") + (if (not (= objnum obj-dial)) + (mprincl "You can't turn that.") + (setq direction (firstword (cdr obj))) + (if (or (not direction) + (not (or (string= direction "clockwise") + (string= direction "counterclockwise")))) + (mprincl "You must indicate clockwise or counterclockwise.") + (if (string= direction "clockwise") + (setq sauna-level (+ sauna-level 1)) + (setq sauna-level (- sauna-level 1))) + + (if (< sauna-level 0) + (progn + (mprincl + "The dial will not turn further in that direction.") + (setq sauna-level 0)) + (sauna-heat)))))))) + +(defun sauna-heat () + (if (= sauna-level 0) + (mprincl "The termperature has returned to normal room termperature.")) + (if (= sauna-level 1) + (mprincl "It is now luke warm in here. You begin to sweat.")) + (if (= sauna-level 2) + (mprincl "It is pretty hot in here. It is still very comfortable.")) + (if (= sauna-level 3) + (progn + (mprincl +"It is now very hot. There is something very refreshing about this.") + (if (or (member obj-rms inventory) + (member obj-rms (nth current-room room-objects))) + (progn + (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 inventory) + (progn + (remove-obj-from-inven obj-rms) + (setq inventory (append inventory (list obj-diamond)))) + (remove-obj-from-room current-room obj-rms) + (replace room-objects current-room + (append (nth current-room room-objects) + (list obj-diamond)))))) + (if (or (member obj-floppy inventory) + (member obj-floppy (nth current-room room-objects))) + (progn + (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 inventory) + (remove-obj-from-inven obj-floppy) + (remove-obj-from-room current-room obj-floppy)))))) + + (if (= sauna-level 4) + (progn + (mprincl +"As the dial clicks into place, you immediately burst into flames.") + (die "burning")))) + +(defun press (obj) + (let (objnum) + (when (setq objnum (objnum-from-args-std obj)) + (if (not (or (member objnum (nth current-room room-objects)) + (member objnum (nth current-room room-silents)))) + (mprincl "I don't see that here.") + (if (not (member objnum (list obj-button obj-switch))) + (progn + (mprinc "You can't ") + (mprinc (car line-list)) + (mprincl " that.")) + (if (= objnum obj-button) + (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 black + (progn + (mprincl "The button is now in the off position.") + (setq black nil)) + (mprincl "The button is now in the on position.") + (setq black t)))))))) + +(defun swim (args) + (if (not (member current-room (list lakefront-north lakefront-south))) + (mprincl "I see no water!") + (if (not (member obj-life inventory)) + (progn + (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.") + (die "drowning")) + (if (= current-room lakefront-north) + (setq current-room lakefront-south) + (setq current-room lakefront-north))))) + + +(defun score (args) + (if (not endgame) + (let (total) + (setq total (reg-score)) + (mprinc "You have scored ") + (mprinc total) + (mprincl " out of a possible 90 points.") total) + (mprinc "You have scored ") + (mprinc (endgame-score)) + (mprincl " endgame points out of a possible 110.") + (if (= (endgame-score) 110) + (mprincl +"\n\nCongratulations. You have won. The wizard password is 'moby'")))) + +(defun help (args) + (mprincl +"Welcome to dunnet (2.0), by Ron Schnell (ronnie@media.mit.edu). +Here is some useful information (read carefully because there are one +or more clues in here): +- If you have a key that can open a door, you do not need to explicitly + open it. You may just use 'in' or walk in the direction of the door. + +- If you have a lamp, it is always lit. + +- You will not get any points until you manage to get treasures to a certain + place. Simply finding the treasures is not good enough. There is more + than one way to get a treasure to the special place. It is also + important that the objects get to the special place *unharmed* and + *untarnished*. You can tell if you have successfully transported the + object by looking at your score, as it changes immediately. Note that + an object can become harmed even after you have received points for it. + If this happens, your score will decrease, and in many cases you can never + get credit for it again. + +- You can save your game with the 'save' command, and use restore it + with the 'restore' command. + +- There are no limits on lengths of object names. + +- Directions are: north,south,east,west,northeast,southeast,northwest, + southwest,up,down,in,out. + +- These can be abbreviated: n,s,e,w,ne,se,nw,sw,u,d,in,out. + +- If you go down a hole in the floor without an aid such as a ladder, + you probably won't be able to get back up the way you came, if at all. + +- To run this game in batch mode (no emacs window), use: + emacs -batch -l dunnet.el + +If you have questions or comments, please contact ronnie@media.mit.edu.")) + +(defun flush (args) + (if (not (= current-room bathroom)) + (mprincl "I see nothing to flush.") + (mprincl "Whoooosh!!") + (put-objs-in-treas (nth urinal room-objects)) + (replace room-objects urinal nil))) + +(defun piss (args) + (if (not (= current-room bathroom)) + (mprincl "You can't do that here, don't even bother trying.") + (if (not gottago) + (mprincl "I'm afraid you don't have to go now.") + (mprincl "That was refreshing.") + (setq gottago nil) + (replace room-objects urinal (append (nth urinal room-objects) + (list obj-URINE)))))) + + +(defun dsleep (args) + (if (not (= current-room bedroom)) + (mprincl +"You try to go to sleep while standing up here, but can't seem to do it.") + (setq gottago t) + (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 break (obj) + (let (objnum) + (if (not (member obj-axe inventory)) + (mprincl "You have nothing you can use to break things.") + (when (setq objnum (objnum-from-args-std obj)) + (if (member objnum inventory) + (progn + (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.") + (die "an axe")) + (if (not (or (member objnum (nth current-room room-objects)) + (member objnum (nth current-room room-silents)))) + (mprincl "I don't see that here.") + (if (= objnum obj-cable) + (progn + (mprincl +"As you break the ethernet cable, everything starts to blur. You collapse +for a moment, then straighten yourself up. +") + (replace room-objects gamma-computing-center + (append (nth gamma-computing-center room-objects) + inventory)) + (if (member obj-key inventory) + (progn + (setq inventory (list obj-key)) + (remove-obj-from-room gamma-computing-center obj-key)) + (setq inventory nil)) + (setq current-room computer-room) + (setq ethernet nil) + (mprincl "Connection closed.") + (unix-interface)) + (if (< objnum 0) + (progn + (mprincl "Your axe shatters into a million pieces.") + (remove-obj-from-inven obj-axe)) + (mprincl "Your axe breaks it into a million pieces.") + (remove-obj-from-room current-room objnum))))))))) + +(defun drive (args) + (if (not inbus) + (mprincl "You cannot drive when you aren't in a vehicle.") + (mprincl "To drive while you are in the bus, just give a direction."))) + +(defun superb (args) + (setq mode 'superb)) + +(defun reg-score () + (let (total) + (setq total 0) + (dolist (x (nth treasure-room room-objects)) + (setq total (+ total (nth x object-pts)))) + (if (member obj-URINE (nth treasure-room room-objects)) + (setq total 0)) total)) + +(defun endgame-score () + (let (total) + (setq total 0) + (dolist (x (nth endgame-treasure-room room-objects)) + (setq total (+ total (nth x object-pts)))) total)) + +(defun answer (args) + (if (not correct-answer) + (mprincl "I don't believe anyone asked you anything.") + (setq args (car args)) + (if (not args) + (mprincl "You must give the answer on the same line.") + (if (members args correct-answer) + (progn + (mprincl "Correct.") + (if (= lastdir 0) + (setq current-room (1+ current-room)) + (setq current-room (- current-room 1))) + (setq correct-answer nil)) + (mprincl "That answer is incorrect."))))) + +(defun endgame-question () +(if (not endgame-questions) + (progn + (mprincl "Your question is:") + (mprincl "No more questions, just do 'answer foo'.") + (setq correct-answer '("foo"))) + (let (which i newques) + (setq i 0) + (setq newques nil) + (setq which (% (abs (random)) (length endgame-questions))) + (mprincl "Your question is:") + (mprincl (setq endgame-question (car (nth which endgame-questions)))) + (setq correct-answer (cdr (nth which endgame-questions))) + (while (< i which) + (setq newques (append newques (list (nth i endgame-questions)))) + (setq i (1+ i))) + (setq i (1+ which)) + (while (< i (length endgame-questions)) + (setq newques (append newques (list (nth i endgame-questions)))) + (setq i (1+ i))) + (setq endgame-questions newques)))) + +(defun dun-power (args) + (if (not (= current-room pc-area)) + (mprincl "That operation is not applicable here.") + (if (not floppy) + (dos-no-disk) + (dos-interface)))) + +(defun touka (args) + (setq current-room computer-room) + (setq logged-in t) + (setq computer t)) + +(defun dun-feed (args) + (let (objnum) + (when (setq objnum (objnum-from-args-std args)) + (if (and (= objnum obj-bear) + (member obj-bear (nth current-room room-objects))) + (progn + (if (not (member obj-food inventory)) + (mprincl "You have nothing with which to feed it.") + (drop '("food")))) + (if (not (or (member objnum (nth current-room room-objects)) + (member objnum inventory) + (member objnum (nth current-room room-silents)))) + (mprincl "I don't see that here.") + (mprincl "You cannot feed that.")))))) + + +;;;; +;;;; This section defines various utility functions used +;;;; by dunnet. +;;;; + + +;;; Function which takes a verb and a list of other words. Calls proper +;;; function associated with the verb, and passes along the other words. + +(defun doverb (ignore verblist verb rest) + (if (not verb) + nil + (if (member (intern verb) ignore) + (if (not (car rest)) -1 + (doverb ignore verblist (car rest) (cdr rest))) + (if (not (cdr (assq (intern verb) verblist))) -1 + (setq numcmds (1+ numcmds)) + (eval (list (cdr (assq (intern verb) verblist)) (quote rest))))))) + + +;;; Function to take a string and change it into a list of lowercase words. + +(defun 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 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 replace (list n number) + (rplaca (nthcdr n list) number)) + + +;;; Get the first non-ignored word from a list. + +(defun firstword (list) + (if (not (car list)) + nil + (while (and list (member (intern (car list)) ignore)) + (setq list (cdr list))) + (car list))) + +(defun firstwordl (list) + (if (not (car list)) + nil + (while (and list (member (intern (car list)) 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 parse (ignore verblist line) + (mprinc "\n") + (setq line-list (listify-string (concat line " "))) + (doverb ignore verblist (car line-list) (cdr line-list))) + +(defun parse2 (ignore verblist line) + (mprinc "\n") + (setq line-list (listify-string2 (concat line " "))) + (doverb ignore verblist (car line-list) (cdr line-list))) + +;;; Read a line, in window mode + +(defun read-line () + (let (line) + (setq line (read-string "")) + (mprinc line) line)) + +;;; Insert something into the window buffer + +(defun minsert (string) + (if (stringp string) + (insert string) + (insert (prin1-to-string string)))) + +;;; Print something out, in window mode + +(defun 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 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 minsertl (string) + (minsert string) + (minsert "\n")) + +;;; Print something, followed by a newline. + +(defun mprincl (string) + (mprinc string) + (mprinc "\n")) + +;;; Function which will get an object number given the list of +;;; words in the command, except for the verb. + +(defun objnum-from-args (obj) + (let (objnum) + (setq obj (firstword obj)) + (if (not obj) + obj-special + (setq objnum (cdr (assq (intern obj) objnames)))))) + +(defun objnum-from-args-std (obj) + (let (result) + (if (eq (setq result (objnum-from-args obj)) obj-special) + (mprincl "You must supply an object.")) + (if (eq result nil) + (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 space-to-hyphen (string) + (let (space) + (if (setq space (string-match "[ /]" string)) + (progn + (setq string (concat (substring string 0 space) "-" + (substring string (1+ space)))) + (space-to-hyphen string)) + string))) + +;;; Given a unix style pathname, build a list of path components (recursive) + +(defun get-path (dirstring startlist) + (let (slash pos) + (if (= (length dirstring) 0) + startlist + (if (string= (substring dirstring 0 1) "/") + (get-path (substring dirstring 1) (append startlist (list "/"))) + (if (not (setq slash (string-match "/" dirstring))) + (append startlist (list dirstring)) + (get-path (substring dirstring (1+ slash)) + (append startlist + (list (substring dirstring 0 slash))))))))) + + +;;; Is a string a member of a string list? + +(defun 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 put-objs-in-treas (objlist) + (let (oscore newscore) + (setq oscore (reg-score)) + (replace room-objects 0 (append (nth 0 room-objects) objlist)) + (setq newscore (reg-score)) + (if (not (= oscore newscore)) + (score nil)))) + +;;; Load an encrypted file, and eval it. + +(defun load-d (filename) + (let (old-buffer result) + (setq result t) + (setq old-buffer (current-buffer)) + (switch-to-buffer (get-buffer-create "*loadc*")) + (erase-buffer) + (condition-case nil + (insert-file-contents filename) + (error (setq result nil))) + (unless (not result) + (condition-case nil + (dun-rot13) + (error (yank))) + (eval-current-buffer) + (kill-buffer (current-buffer)) + (switch-to-buffer old-buffer)) + result)) + +;;; Rotate the globals file, and save it for later loading. + +(defun compile-globals () + (let + (switch-to-buffer (get-buffer-create "*compd*")) + (erase-buffer) + (insert-file-contents "dun-globals.el") + (dun-rot13) + (goto-char (point-min)) + (write-region 1 (point-max) "dun-globals.dat") + (kill-buffer (current-buffer)))) + +;;; Functions to remove an object either from a room, or from inventory. + +(defun remove-obj-from-room (room objnum) + (let (newroom) + (setq newroom nil) + (dolist (x (nth room room-objects)) + (if (not (= x objnum)) + (setq newroom (append newroom (list x))))) + (rplaca (nthcdr room room-objects) newroom))) + +(defun remove-obj-from-inven (objnum) + (let (new-inven) + (setq new-inven nil) + (dolist (x inventory) + (if (not (= x objnum)) + (setq new-inven (append new-inven (list x))))) + (setq inventory new-inven))) + +;;; Find the global data file. + +(defun get-glob-dat () + (let (result) + (setq result nil) + (dolist (x load-path) + (if (file-exists-p (concat x "/dun-globals.dat")) + (setq result (concat x "/dun-globals.dat")))) + result)) + +;;; rotate current buffer 13 characters + +(let ((i 0) (lower "abcdefghijklmnopqrstuvwxyz") upper) + (setq translate-table (make-vector 256 0)) + (while (< i 256) + (aset translate-table i i) + (setq i (1+ i))) + (setq lower (concat lower lower)) + (setq upper (upcase lower)) + (setq i 0) + (while (< i 26) + (aset translate-table (+ ?a i) (aref lower (+ i 13))) + (aset translate-table (+ ?A i) (aref upper (+ i 13))) + (setq i (1+ i)))) + +(defun dun-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 translate-table (aref str i))) + (setq i (1+ i))) + (erase-buffer) + (insert str))) + +;;;; +;;;; This section defines the globals that are used in dunnet. +;;;; +;;;; IMPORTANT +;;;; All globals which can change must be saved from 'save-game. Add +;;;; all new globals to bottom of file. + +(setq visited '(27)) +(setq current-room 1) +(setq exitf nil) +(setq badcd nil) +(defvar dungeon-mode-map nil) +(setq dungeon-mode-map (make-sparse-keymap)) +(define-key dungeon-mode-map "\r" 'dungeon-parse) +(defvar dungeon-batch-map (make-keymap)) +(if (string= (substring emacs-version 0 2) "18") + (let (n) + (setq n 32) + (while (< 0 (setq n (- n 1))) + (aset dungeon-batch-map n 'dungeon-nil))) + (let (n) + (setq n 32) + (while (< 0 (setq n (- n 1))) + (aset (car (cdr dungeon-batch-map)) n 'dungeon-nil)))) +(define-key dungeon-batch-map "\r" 'exit-minibuffer) +(define-key dungeon-batch-map "\n" 'exit-minibuffer) +(setq computer nil) +(setq floppy nil) +(setq door1 'locked) +(setq key-level 0) +(setq hole nil) +(setq correct-answer nil) +(setq lastdir 0) +(setq numsaves 0) +(setq jar nil) +(setq numcmds 0) +(setq wizard nil) +(setq endgame-question nil) +(setq logged-in nil) +(setq dungeon-mode 'dungeon) +(setq unix-verbs '((ls . ls) (ftp . ftp) (echo . echo) (exit . uexit) + (cd . dunnet-cd) (pwd . dunnet-pwd) (rlogin . rlogin) + (uncompress . uncompress) (cat . cat) (zippy . zippy))) + +(setq dos-verbs '((dir . dos-dir) (type . dos-type) (exit . dos-exit) + (command . dos-spawn) (b: . dos-invd) (c: . dos-invd) + (a: . dos-nil))) + + +(setq batch-mode nil) + +(setq cdpath "/usr/toukmond") +(setq cdroom -10) +(setq uncompressed nil) +(setq ethernet t) +(setq restricted '(room-objects dungeon-map rooms room-silents combination)) +(setq path "/usr/toukmond") +(setq ftptype 'ascii) +(setq endgame nil) +(setq gottago t) +(setq black nil) + +(setq 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 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 verblist '((die . die) (ne . ne) (north . n) (south . s) (east . e) + (west . w) (u . up) (d . down) (i . inven) + (inventory . inven) (look . examine) (n . n) (s . s) (e . e) + (w . w) (se . se) (nw . nw) (sw . sw) (up . up) + (down . down) (in . in) (out . out) (go . go) (drop . drop) + (southeast . se) (southwest . sw) (northeast . ne) + (northwest . nw) (save . save-game) (restore . restore) + (long . long) (dig . dig) (shake . shake) (wave . shake) + (examine . examine) (describe . examine) (climb . climb) + (eat . eat) (put . dput) (type . type) (insert . dput) + (score . score) (help . help) (quit . quit) (read . examine) + (verbose . long) (urinate . piss) (piss . piss) + (flush . flush) (sleep . dsleep) (lie . dsleep) (x . examine) + (break . break) (drive . drive) (board . in) (enter . in) + (turn . turn) (press . press) (push . press) (swim . swim) + (on . in) (off . out) (chop . break) (switch . press) + (cut . break) (exit . out) (leave . out) (reset . dun-power) + (flick . press) (superb . superb) (answer . answer) + (throw . drop) (l . examine) (take . take) (get . take) + (feed . dun-feed))) + +(setq inbus nil) +(setq nomail nil) +(setq ignore '(the to at)) +(setq mode 'moby) +(setq sauna-level 0) + +(defconst north 0) +(defconst south 1) +(defconst east 2) +(defconst west 3) +(defconst northeast 4) +(defconst southeast 5) +(defconst northwest 6) +(defconst southwest 7) +(defconst up 8) +(defconst down 9) +(defconst in 10) +(defconst out 11) + +(setq dungeon-map '( +; no so ea we ne se nw sw up do in ot + ( 96 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;0 + ( -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;1 + ( -1 -1 3 1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;2 + ( -1 -1 -1 2 4 6 -1 -1 -1 -1 -1 -1 ) ;3 + ( -1 -1 -1 -1 5 -1 -1 3 -1 -1 -1 -1 ) ;4 + ( -1 -1 -1 -1 255 -1 -1 4 -1 -1 255 -1 ) ;5 + ( -1 -1 -1 -1 -1 7 3 -1 -1 -1 -1 -1 ) ;6 + ( -1 -1 -1 -1 -1 255 6 27 -1 -1 -1 -1 ) ;7 + ( 255 5 9 10 -1 -1 -1 5 -1 -1 -1 5 ) ;8 + ( -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 ) ;9 + ( -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;10 + ( -1 8 -1 58 -1 -1 -1 -1 -1 -1 -1 -1 ) ;11 + ( -1 -1 13 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;12 + ( 15 -1 14 12 -1 -1 -1 -1 -1 -1 -1 -1 ) ;13 + ( -1 -1 -1 13 -1 -1 -1 -1 -1 -1 -1 -1 ) ;14 + ( -1 13 16 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;15 + ( -1 -1 -1 15 -1 -1 -1 -1 -1 17 16 -1 ) ;16 + ( -1 -1 17 17 17 17 255 17 255 17 -1 -1 ) ;17 + ( 18 18 18 18 18 -1 18 18 19 18 -1 -1 ) ;18 + ( -1 18 18 19 19 20 19 19 -1 18 -1 -1 ) ;19 + ( -1 -1 -1 18 -1 -1 -1 -1 -1 21 -1 -1 ) ;20 + ( -1 -1 -1 -1 -1 20 22 -1 -1 -1 -1 -1 ) ;21 + ( 18 18 18 18 16 18 23 18 18 18 18 18 ) ;22 + ( -1 255 -1 -1 -1 19 -1 -1 -1 -1 -1 -1 ) ;23 + ( 23 25 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;24 + ( 24 255 -1 -1 -1 -1 -1 -1 -1 -1 255 -1 ) ;25 + (255 28 -1 -1 -1 -1 -1 -1 -1 -1 255 -1 ) ;26 + ( -1 -1 -1 -1 7 -1 -1 -1 -1 -1 -1 -1 ) ;27 + ( 26 255 -1 -1 -1 -1 -1 -1 -1 -1 255 -1 ) ;28 + ( -1 -1 30 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;29 + ( -1 -1 31 29 -1 -1 -1 -1 -1 -1 -1 -1 ) ;30 + ( 32 33 -1 30 -1 -1 -1 -1 -1 -1 -1 -1 ) ;31 + ( -1 31 -1 255 -1 -1 -1 -1 -1 34 -1 -1 ) ;32 + ( 31 -1 -1 -1 -1 -1 -1 -1 -1 35 -1 -1 ) ;33 + ( -1 35 -1 -1 -1 -1 -1 -1 32 37 -1 -1 ) ;34 + ( 34 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;35 + ( -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;36 + ( -1 -1 -1 -1 -1 -1 -1 38 34 -1 -1 -1 ) ;37 + ( -1 -1 40 41 37 -1 -1 39 -1 -1 -1 -1 ) ;38 + ( -1 -1 -1 -1 38 -1 -1 -1 -1 -1 -1 -1 ) ;39 + ( -1 -1 -1 38 -1 -1 -1 -1 42 -1 -1 -1 ) ;40 + ( -1 -1 38 -1 -1 -1 -1 -1 -1 43 -1 -1 ) ;41 + ( -1 -1 -1 -1 -1 -1 -1 -1 -1 40 -1 -1 ) ;42 + ( 44 -1 46 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;43 + ( -1 43 45 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;44 + ( -1 46 -1 44 -1 -1 -1 -1 -1 -1 -1 -1 ) ;45 + ( 45 -1 -1 43 -1 -1 -1 -1 -1 255 -1 -1 ) ;46 + ( 48 50 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;47 + ( 49 47 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;48 + ( -1 48 -1 -1 -1 -1 -1 -1 52 -1 -1 -1 ) ;49 + ( 47 51 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;50 + ( 50 104 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;51 + ( -1 -1 -1 -1 -1 -1 -1 -1 53 49 -1 -1 ) ;52 + ( -1 -1 -1 -1 -1 -1 -1 -1 54 52 -1 -1 ) ;53 + ( -1 -1 -1 -1 55 -1 -1 -1 -1 53 -1 -1 ) ;54 + ( -1 -1 -1 -1 56 -1 -1 54 -1 -1 -1 54 ) ;55 + ( -1 -1 -1 -1 -1 -1 -1 55 -1 31 -1 -1 ) ;56 + ( -1 -1 32 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;57 + ( 59 -1 11 -1 -1 -1 -1 -1 -1 -1 255 255) ;58 + ( 60 58 63 -1 -1 -1 255 -1 -1 -1 255 255) ;59 + ( 61 59 64 -1 -1 -1 -1 -1 -1 -1 255 255) ;60 + ( 62 60 65 -1 -1 -1 -1 -1 -1 -1 255 255) ;61 + ( -1 61 66 -1 -1 -1 -1 -1 -1 -1 255 255) ;62 + ( 64 -1 67 59 -1 -1 -1 -1 -1 -1 255 255) ;63 + ( 65 63 68 60 -1 -1 -1 -1 -1 -1 255 255) ;64 + ( 66 64 69 61 -1 -1 -1 -1 -1 -1 255 255) ;65 + ( -1 65 70 62 -1 -1 -1 -1 -1 -1 255 255) ;66 + ( 68 -1 71 63 -1 -1 -1 -1 -1 -1 255 255) ;67 + ( 69 67 72 64 -1 -1 -1 -1 -1 -1 255 255) ;68 + ( 70 68 73 65 -1 -1 -1 -1 -1 -1 255 255) ;69 + ( -1 69 74 66 -1 -1 -1 -1 -1 -1 255 255) ;70 + ( 72 -1 75 67 -1 -1 -1 -1 -1 -1 255 255) ;71 + ( 73 71 76 68 -1 -1 -1 -1 -1 -1 255 255) ;72 + ( 74 72 77 69 -1 -1 -1 -1 -1 -1 255 255) ;73 + ( -1 73 78 70 -1 -1 -1 -1 -1 -1 255 255) ;74 + ( 76 -1 79 71 -1 -1 -1 -1 -1 -1 255 255) ;75 + ( 77 75 80 72 -1 -1 -1 -1 -1 -1 255 255) ;76 + ( 78 76 81 73 -1 -1 -1 -1 -1 -1 255 255) ;77 + ( -1 77 82 74 -1 -1 -1 -1 -1 -1 255 255) ;78 + ( 80 -1 -1 75 -1 -1 -1 -1 -1 -1 255 255) ;79 + ( 81 79 255 76 -1 -1 -1 -1 -1 -1 255 255) ;80 + ( 82 80 -1 77 -1 -1 -1 -1 -1 -1 255 255) ;81 + ( -1 81 -1 78 -1 -1 -1 -1 -1 -1 255 255) ;82 + ( 84 -1 -1 -1 -1 59 -1 -1 -1 -1 255 255) ;83 + ( -1 83 85 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;84 + ( 86 -1 87 84 -1 -1 -1 -1 -1 -1 -1 -1 ) ;85 + ( -1 85 88 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;86 + ( 88 -1 -1 85 -1 -1 -1 -1 -1 -1 -1 -1 ) ;87 + ( -1 87 255 86 -1 -1 -1 -1 -1 -1 -1 -1 ) ;88 + ( -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 255 -1 ) ;89 + ( 91 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;90 + ( 92 90 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;91 + ( -1 91 -1 -1 -1 -1 -1 -1 93 94 -1 -1 ) ;92 + ( -1 -1 -1 88 -1 -1 -1 -1 -1 92 -1 -1 ) ;93 + ( -1 -1 -1 -1 95 -1 -1 -1 92 -1 -1 -1 ) ;94 + ( -1 -1 -1 -1 -1 -1 -1 94 -1 -1 -1 -1 ) ;95 + ( 97 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;96 + ( -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;97 + ( 99 97 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;98 + ( -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;99 + ( 101 99 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;100 + ( -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;101 + ( 103 101 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;102 + ( -1 102 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;103 + ( 51 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ) ;104 + ) +; no so ea we ne se nw sw up do in ot +) + + +;;; How the user references *all* objects, permanent and regular. +(setq objnames '( + (shovel . 0) + (lamp . 1) + (cpu . 2) (board . 2) (card . 2) + (food . 3) + (key . 4) + (paper . 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) + (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) + (switch . -24) + (blackboard . -25) + (disposal . -26) (garbage . -26) + (ladder . -27) + (subway . -28) (train . -28) + (pc . -29) (drive . -29) +)) + +(dolist (x 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 'describe-room. + +(setq 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 room-silents (list nil + (list obj-tree) ;; dead-end + (list obj-tree) ;; 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 nil nil 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 inventory '(1)) + +;;; Descriptions of objects, as they appear in the room description, and +;;; the inventory. + +(setq 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 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 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 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 +;;; room-objects + +(setq 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 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 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 Presly. 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 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 scroll-step 2) +(setq room-shorts nil) +(dolist (x rooms) + (setq room-shorts + (append room-shorts (list (downcase (space-to-hyphen + (cadr x))))))) + +(setq 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 room-shorts) + (eval (list 'defconst (intern x) a)) + (setq a (+ a 1)))) + + + +;;;; +;;;; This section defines the UNIX emulation functions for dunnet. +;;;; + +(defun 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 (parse2 nil unix-verbs line) -1) + (progn + (if (setq esign (string-match "=" line)) + (doassign line esign) + (mprinc (car line-list)) + (mprincl ": not found."))))) + (goto-char (point-max)) + (mprinc "\n")) + (if (eq dungeon-mode 'unix) + (progn + (fix-screen) + (mprinc "$ "))))) + +(defun doassign (line esign) + (if (not wizard) + (let (passwd) + (mprinc "Enter wizard password: ") + (setq passwd (read-line)) + (if (not batch-mode) + (mprinc "\n")) + (if (string= passwd "moby") + (progn + (setq wizard t) + (doassign line esign)) + (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)) + (dungeon-eval varname value)))) + +(defun dungeon-eval (varname value) + (let (eval-error) + (switch-to-buffer (get-buffer-create "*dungeon-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 "*dungeon*") + (if eval-error + (mprincl "Invalid syntax.")))) + + +(defun unix-interface () + (login) + (if logged-in + (progn + (setq dungeon-mode 'unix) + (define-key dungeon-mode-map "\r" 'unix-parse) + (mprinc "$ ")))) + + + +(defun login () + (let (tries username password) + (setq tries 4) + (while (and (not logged-in) (> (setq tries (- tries 1)) 0)) + (mprinc "\n\nUNIX System V, Release 2.2 (pokey)\n\nlogin: ") + (setq username (read-line)) + (if (not batch-mode) + (mprinc "\n")) + (mprinc "password: ") + (setq password (read-line)) + (if (not batch-mode) + (mprinc "\n")) + (if (or (not (string= username "toukmond")) + (not (string= password "robert"))) + (mprincl "login incorrect") + (setq logged-in t) + (mprincl " +Welcome to Unix\n +Please clean up your directories. The filesystem is getting full. +Our tcp/ip link to gamma is a little flakey, but seems to work. +The current version of ftp can only send files from the current +directory, and deletes them after they are sent! Be careful. + +Note: Restricted bourne shell in use.\n"))) + (setq dungeon-mode 'dungeon))) + +(defun ls (args) + (if (car args) + (let (ocdpath ocdroom) + (setq ocdpath cdpath) + (setq ocdroom cdroom) + (if (not (eq (dunnet-cd args) -2)) + (ls nil)) + (setq cdpath ocdpath) + (setq cdroom ocdroom)) + (if (= cdroom -10) + (ls-inven)) + (if (= cdroom -2) + (ls-rooms)) + (if (= cdroom -3) + (ls-root)) + (if (= cdroom -4) + (ls-usr)) + (if (> cdroom 0) + (ls-room)))) + +(defun ls-root () + (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 ls-usr () + (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 ls-rooms () + (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 visited) + (mprinc +"drwxr-xr-x 3 root staff 512 Jan 1 1970 ") + (mprincl (nth x room-shorts)))) + +(defun ls-room () + (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 cdroom room-objects)) + (if (and (>= x 0) (not (= x 255))) + (progn + (mprinc "-rwxr-xr-x 1 toukmond restricted 0 Jan 1 1970 ") + (mprincl (nth x objfiles)))))) + +(defun ls-inven () + (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 unix-verbs) + (if (not (eq (car x) 'IMPOSSIBLE)) + (progn + (mprinc" +-rwxr-xr-x 1 toukmond restricted 10423 Jan 1 1970 ") + (mprinc (car x))))) + (mprinc "\n") + (if (not uncompressed) + (mprincl +"-rwxr-xr-x 1 toukmond restricted 0 Jan 1 1970 paper.o.Z")) + (dolist (x inventory) + (mprinc +"-rwxr-xr-x 1 toukmond restricted 0 Jan 1 1970 ") + (mprincl (nth x objfiles)))) + +(defun echo (args) + (let (nomore var) + (setq nomore nil) + (dolist (x args) + (if (not nomore) + (progn + (if (not (string= (substring x 0 1) "$")) + (progn + (mprinc x) + (mprinc " ")) + (setq var (intern (substring x 1))) + (if (not (boundp var)) + (mprinc " ") + (if (member var restricted) + (progn + (mprinc var) + (mprinc ": Permission denied") + (setq nomore t)) + (eval (list 'mprinc var)) + (mprinc " "))))))) + (mprinc "\n"))) + + +(defun ftp (args) + (let (host username passwd ident newlist) + (if (not (car args)) + (mprincl "ftp: hostname required on command line.") + (setq host (intern (car args))) + (if (not (member host '(gamma endgame))) + (mprincl "ftp: Unknown host.") + (if (eq host 'endgame) + (mprincl "ftp: connection to endgame not allowed") + (if (not ethernet) + (mprincl "ftp: host not responding.") + (mprincl "Connected to gamma. FTP ver 0.9 00:00:00 01/01/70") + (mprinc "Username: ") + (setq username (read-line)) + (if (string= username "toukmond") + (if batch-mode + (mprincl "toukmond ftp access not allowed.") + (mprincl "\ntoukmond ftp access not allowed.")) + (if (string= username "anonymous") + (if batch-mode + (mprincl + "Guest login okay, send your user ident as password.") + (mprincl + "\nGuest login okay, send your user ident as password.")) + (if batch-mode + (mprinc "Password required for ") + (mprinc "\nPassword required for ")) + (mprincl username)) + (mprinc "Password: ") + (setq ident (read-line)) + (if (not (string= username "anonymous")) + (if batch-mode + (mprincl "Login failed.") + (mprincl "\nLogin failed.")) + (if batch-mode + (mprincl "Guest login okay, user access restrictions apply.") + (mprincl "\nGuest login okay, user access restrictions apply.")) + (ftp-commands) + (setq newlist +'("What password did you use during anonymous ftp to gamma?")) + (setq newlist (append newlist (list ident))) + (rplaca (nthcdr 1 endgame-questions) newlist))))))))) + +(defun ftp-commands () + (setq exitf nil) + (let (line) + (while (not exitf) + (mprinc "ftp> ") + (setq line (read-line)) + (if + (eq + (parse2 nil + '((type . ftptype) (binary . bin) (bin . bin) (send . send) + (put . send) (quit . ftpquit) (help . ftphelp) + (ascii . fascii) + ) line) + -1) + (mprincl "No such command. Try help."))) + (setq ftptype 'ascii))) + +(defun ftptype (args) + (if (not (car args)) + (mprincl "Usage: type [binary | ascii]") + (setq args (intern (car args))) + (if (eq args 'binary) + (bin nil) + (if (eq args 'ascii) + (fascii 'nil) + (mprincl "Unknown type."))))) + +(defun bin (args) + (mprincl "Type set to binary.") + (setq ftptype 'binary)) + +(defun fascii (args) + (mprincl "Type set to ascii.") + (setq ftptype 'ascii)) + +(defun ftpquit (args) + (setq exitf t)) + +(defun send (args) + (if (not (car args)) + (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) unix-verbs) + (progn + (rplaca (assq (intern args) unix-verbs) 'IMPOSSIBLE) + (mprinc "Sending ") + (mprinc ftptype) + (mprinc " file for ") + (mprincl args) + (mprincl "Transfer complete.")) + + (dolist (x objfiles) + (if (string= args x) + (progn + (if (not (member counter inventory)) + (progn + (mprincl "No such file.") + (setq foo t)) + (mprinc "Sending ") + (mprinc ftptype) + (mprinc " file for ") + (mprinc (downcase (cadr (nth counter objects)))) + (mprincl ", (0 bytes)") + (if (not (eq ftptype 'binary)) + (progn + (if (not (member obj-protoplasm + (nth receiving-room room-objects))) + (replace room-objects receiving-room + (append (nth receiving-room room-objects) + (list obj-protoplasm)))) + (remove-obj-from-inven counter)) + (remove-obj-from-inven counter) + (replace room-objects receiving-room + (append (nth receiving-room room-objects) + (list counter)))) + (setq foo t) + (mprincl "Transfer complete.")))) + (setq counter (+ 1 counter))) + (if (not foo) + (mprincl "No such file.")))))) + +(defun ftphelp (args) + (mprincl + "Possible commands are:\nsend quit type ascii binary help")) + +(defun uexit (args) + (setq dungeon-mode 'dungeon) + (mprincl "\nYou step back from the console.") + (define-key dungeon-mode-map "\r" 'dungeon-parse) + (if (not batch-mode) + (dungeon-messages))) + +(defun dunnet-pwd (args) + (mprincl cdpath)) + +(defun uncompress (args) + (if (not (car args)) + (mprincl "Usage: uncompress <filename>") + (setq args (car args)) + (if (or uncompressed + (and (not (string= args "paper.o")) + (not (string= args "paper.o.z")))) + (mprincl "Uncompress command failed.") + (setq uncompressed t) + (setq inventory (append inventory (list obj-paper)))))) + +(defun rlogin (args) + (let (passwd) + (if (not (car args)) + (mprincl "Usage: rlogin <hostname>") + (setq args (car args)) + (if (string= args "endgame") + (rlogin-endgame) + (if (not (string= args "gamma")) + (mprincl "No such host.") + (if (not ethernet) + (mprincl "Host not responding.") + (mprinc "Password: ") + (setq passwd (read-line)) + (if (not (string= passwd "worms")) + (mprincl "\nlogin incorrect") + (mprinc +"\nYou begin to feel strange for a moment, and you lose your items." +) + (replace room-objects computer-room + (append (nth computer-room room-objects) inventory)) + (setq inventory nil) + (setq current-room receiving-room) + (uexit nil)))))))) + +(defun dunnet-cd (args) + (let (tcdpath tcdroom path-elemants room-check) + (if (not (car args)) + (mprincl "Usage: cd <path>") + (setq tcdpath cdpath) + (setq tcdroom cdroom) + (setq badcd nil) + (condition-case nil + (setq path-elements (get-path (car args) nil)) + (error (mprincl "Invalid path.") + (setq badcd t))) + (dolist (pe path-elements) + (unless 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)) + (nosuchdir)) + (if (= tcdroom -10) + (nosuchdir) + (if (> tcdroom 0) + (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)) + (nosuchdir)))) + (if (= tcdroom -2) + (progn + (dolist (x visited) + (setq room-check + (nth x room-shorts)) + (if (string= room-check pe) + (progn + (setq tcdpath + (concat "/rooms/" room-check)) + (setq tcdroom x)))) + (if (= tcdroom -2) + (nosuchdir))))))))))))) + (if (not badcd) + (progn + (setq cdpath tcdpath) + (setq cdroom tcdroom) + 0) + -2)))) + +(defun nosuchdir () + (mprincl "No such directory.") + (setq badcd t)) + +(defun cat (args) + (let (doto checklist) + (if (not (setq args (car args))) + (mprincl "Usage: cat <ascii-file-name>") + (if (string-match "/" args) + (mprincl "cat: only files in current directory allowed.") + (if (and (> cdroom 0) (string= args "description")) + (mprincl (car (nth cdroom rooms))) + (if (setq doto (string-match "\\.o" args)) + (progn + (if (= cdroom -10) + (setq checklist inventory) + (setq checklist (nth cdroom room-objects))) + (if (not (member (cdr + (assq (intern + (substring args 0 doto)) objnames)) + checklist)) + (mprincl "File not found.") + (mprincl "Ascii files only."))) + (if (assq (intern args) unix-verbs) + (mprincl "Ascii files only.") + (mprincl "File not found.")))))))) + +(defun zippy (args) + (mprincl (yow))) + +(defun rlogin-endgame () + (if (not (= (score nil) 90)) + (mprincl "You have not achieved enough points to connect to endgame.") + (mprincl"\nWelcome to the endgame. You are a truly noble adventurer.") + (setq current-room treasure-room) + (setq endgame t) + (replace room-objects endgame-treasure-room (list obj-bill)) + (uexit nil))) + + +(random t) +(setq tloc (+ 60 (% (abs (random)) 18))) +(replace room-objects tloc (append (nth tloc room-objects) (list 18))) +(setq tcomb (+ 100 (% (abs (random)) 899))) +(setq combination (prin1-to-string tcomb)) + +;;;; +;;;; This section defines the DOS emulation functions for dunnet +;;;; + +(defun 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 (parse2 nil dos-verbs line) -1) + (progn + (sleep-for 1) + (mprincl "Bad command or file name")))) + (goto-char (point-max)) + (mprinc "\n")) + (if (eq dungeon-mode 'dos) + (progn + (fix-screen) + (dos-prompt))))) + +(defun dos-interface () + (dos-boot-msg) + (setq dungeon-mode 'dos) + (define-key dungeon-mode-map "\r" 'dos-parse) + (dos-prompt)) + +(defun dos-type (args) + (sleep-for 2) + (if (setq args (car args)) + (if (string= args "foo.txt") + (dos-show-combination) + (if (string= args "command.com") + (mprincl "Cannot type binary files") + (mprinc "File not found - ") + (mprincl (upcase args)))) + (mprincl "Must supply file name"))) + +(defun dos-invd (args) + (sleep-for 1) + (mprincl "Invalid drive specification")) + +(defun dos-dir (args) + (sleep-for 1) + (if (or (not (setq args (car args))) (string= args "\\")) + (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 +") + (mprincl " + Volume in drive A is FOO + Volume Serial Number is 1A16-08C9 + Directory of A:\\ + +File not found"))) + + +(defun dos-prompt () + (mprinc "A> ")) + +(defun dos-boot-msg () + (sleep-for 3) + (mprinc "Current time is ") + (mprincl (substring (current-time-string) 12 20)) + (mprinc "Enter new time: ") + (read-line) + (if (not batch-mode) + (mprinc "\n"))) + +(defun dos-spawn (args) + (sleep-for 1) + (mprincl "Cannot spawn subshell")) + +(defun dos-exit (args) + (setq dungeon-mode 'dungeon) + (mprincl "\nYou power down the machine and step back.") + (define-key dungeon-mode-map "\r" 'dungeon-parse) + (if (not batch-mode) + (dungeon-messages))) + +(defun dos-no-disk () + (sleep-for 3) + (mprincl "Boot sector not found")) + + +(defun dos-show-combination () + (sleep-for 2) + (mprinc "\nThe combination is ") + (mprinc combination) + (mprinc ".\n")) + +(defun dos-nil (args)) + + +;;;; +;;;; This section defines the save and restore game functions for dunnet. +;;;; + +(defun save-game (filename) + (if (not (setq filename (car filename))) + (mprincl "You must supply a filename for the save.") + (if (file-exists-p filename) + (delete-file filename)) + (setq numsaves (1+ numsaves)) + (make-save-buffer) + (save-val "current-room") + (save-val "computer") + (save-val "door1") + (save-val "combination") + (save-val "visited") + (save-val "diggables") + (save-val "key-level") + (save-val "floppy") + (save-val "numsaves") + (save-val "numcmds") + (save-val "logged-in") + (save-val "dungeon-mode") + (save-val "jar") + (save-val "lastdir") + (save-val "black") + (save-val "nomail") + (save-val "unix-verbs") + (save-val "hole") + (save-val "uncompressed") + (save-val "ethernet") + (save-val "sauna-level") + (save-val "room-objects") + (save-val "room-silents") + (save-val "inventory") + (save-val "endgame-question") + (save-val "endgame") + (save-val "endgame-questions") + (save-val "cdroom") + (save-val "cdpath") + (save-val "correct-answer") + (save-val "inbus") + (if (compile-save-out filename) + (mprincl "Error saving to file.") + (do-logfile 'save nil) + (switch-to-buffer "*dungeon*") + (princ "") + (mprincl "Done.")))) + +(defun make-save-buffer () + (switch-to-buffer (get-buffer-create "*save-dungeon*")) + (erase-buffer)) + +(defun compile-save-out (filename) + (let (ferror) + (setq ferror nil) + (condition-case nil + (dun-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 save-val (varname) + (let (value) + (setq varname (intern varname)) + (setq value (eval varname)) + (minsert "(setq ") + (minsert varname) + (minsert " ") + (if (or (listp value) + (symbolp value)) + (minsert "'")) + (if (stringp value) + (minsert "\"")) + (minsert value) + (if (stringp value) + (minsert "\"")) + (minsertl ")"))) + + +(defun restore (args) + (let (file) + (if (not (setq file (car args))) + (mprincl "You must supply a filename.") + (if (not (load-d file)) + (mprincl "Could not load restore file.") + (mprincl "Done.") + (setq room 0))))) + + +(defun 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 log-file) + (error (setq ferror t))) + (unless ferror + (goto-char (point-max)) + (minsert (current-time-string)) + (minsert " ") + (minsert (user-login-name)) + (minsert " ") + (if (eq type 'save) + (minsert "saved ") + (if (= (endgame-score) 110) + (minsert "won ") + (if (not how) + (minsert "quit ") + (minsert "killed by ") + (minsert how) + (minsert " ")))) + (minsert "at ") + (minsert (cadr (nth (abs room) rooms))) + (minsert ". score: ") + (if (> (endgame-score) 0) + (minsert (setq newscore (+ 90 (endgame-score)))) + (minsert (setq newscore (reg-score)))) + (minsert " saves: ") + (minsert numsaves) + (minsert " commands: ") + (minsert numcmds) + (minsert "\n") + (write-region 1 (point-max) log-file nil 1)) + (kill-buffer (current-buffer)))) + + +;;;; +;;;; These are functions, and function re-definitions so that dungeon can +;;;; be run in batch mode. + + +(defun batch-mprinc (arg) + (if (stringp arg) + (send-string-to-terminal arg) + (send-string-to-terminal (prin1-to-string arg)))) + + +(defun 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 batch-parse (ignore verblist line) + (setq line-list (listify-string (concat line " "))) + (doverb ignore verblist (car line-list) (cdr line-list))) + +(defun batch-parse2 (ignore verblist line) + (setq line-list (listify-string2 (concat line " "))) + (doverb ignore verblist (car line-list) (cdr line-list))) + +(defun batch-read-line () + (read-from-minibuffer "" nil dungeon-batch-map)) + + +(defun dungeon-batch-loop () + (setq dead nil) + (setq room 0) + (while (not dead) + (if (eq dungeon-mode 'dungeon) + (progn + (if (not (= room current-room)) + (progn + (describe-room current-room) + (setq room current-room))) + (mprinc ">") + (setq line (downcase (read-line))) + (if (eq (parse ignore verblist line) -1) + (mprinc "I don't understand that.\n")))))) + +(defun batch-dos-interface () + (dos-boot-msg) + (setq dungeon-mode 'dos) + (while (eq dungeon-mode 'dos) + (dos-prompt) + (setq line (downcase (read-line))) + (if (eq (parse2 nil dos-verbs line) -1) + (progn + (sleep-for 1) + (mprincl "Bad command or file name")))) + (goto-char (point-max)) + (mprinc "\n")) + +(defun batch-unix-interface () + (login) + (if logged-in + (progn + (setq dungeon-mode 'unix) + (while (eq dungeon-mode 'unix) + (mprinc "$ ") + (setq line (downcase (read-line))) + (if (eq (parse2 nil unix-verbs line) -1) + (let (esign) + (if (setq esign (string-match "=" line)) + (doassign line esign) + (mprinc (car line-list)) + (mprincl ": not found."))))) + (goto-char (point-max)) + (mprinc "\n")))) + +(defun dungeon-nil (arg) + "noop" + (interactive "*p")) + +(defun batch-dungeon () + (load "dun-batch") + (setq visited '(27)) + (mprinc "\n") + (dungeon-batch-loop)) + +(unless (not noninteractive) + (fset 'mprinc 'batch-mprinc) + (fset 'mprincl 'batch-mprincl) + (fset 'parse 'batch-parse) + (fset 'parse2 'batch-parse2) + (fset 'read-line 'batch-read-line) + (fset 'dos-interface 'batch-dos-interface) + (fset 'unix-interface 'batch-unix-interface) + (mprinc "\n") + (setq batch-mode t) + (dungeon-batch-loop)) +