1 8 admins '(#13) / players '(#13) / guests '() / init 0 / destroy 0 / boot ;; this method is called at every restart of the server ... just once. (method () (if (private-ok? caller) (begin (set connected '()) (foreach (i guests) (i:destroy)) (if (not (#13:is-password-set?)) (#13:set-password "trauma")) (set guests '())) (raise E_PERM "only #0 can call 'boot'"))) / list-admins (method () admins) / add-admin (method (new-wiz) (if (not (write-ok? caller)) (raise E_PERM "only administrators can call add-admin") (begin (setparents new-wiz (tolist $admin)) (set admins ($utils:set-add new-wiz admins))))) / remove-admin (method (ex-wiz) (if (not (write-ok? caller)) (raise E_PERM "only administrators can call remove-admin") (begin (setparents ex-wiz (tolist $coder)) (set admins ($utils:set-remove ex-wiz admins))))) / intersize (method () (+ "Interlude code is now " (before "\n" (run-script "intersize")) " lines\n")) / create-guest (method () (var i (begin (set i ($guest:copy)) (set guests ($utils:set-add i guests)) i))) / remove-guest (method () (set guests ($utils:set-remove caller guests))) / remove-player (method () (set players ($utils:set-remove caller players))) / connect ;; whenever a socket hits the MU*, this gets called and the socket connects ;; to #0. this has to figure out where to reconnect it to. (method () (var i (begin (set i (create-guest)) (set connected ($utils:set-add i connected)) (reconnect #0 i) (i:welcome)))) / reconnect-me ;; reconnects the caller to the object in the first parameter. (method (to-obj pass-string) (if (to-obj:accept-connect caller pass-string) (begin (reconnect caller to-obj) (to-obj:welcome)) (raise E_PERM (+ "object " (tostr to-obj) " rejects a connection from " (tostr caller))))) / remove-connection (method () (set connected ($utils:set-remove caller connected))) / list-connected (method () connected) / log-message (method (msg) (if (write-ok? caller) (log msg))) / call-me-out (method (addr) (if (not (search caller connected)) (connect-out caller addr))) / parse ;; sometimes output gets sent before the server has reconnected to a ;; guest... the danger of multi-threading. (method (unused) (echo "Sorry ... waiting for reconnect.\n")) / list-players (method () players) / find-player (method (instring) (or (foreach (p players) (if (p:name-match instring) (return p))) (foreach (p guests) (if (p:name-match instring) (return p))))) / find-connected-player (method (instring) (foreach (c connected) (if (p:name-match instring) (return p)))) / guest-to-player (method (pname ppass) (if (caller:has-parent? $guest) (if (find-player pname) (player:tell (+ "Sorry, the name " pname " is already in use.\n")) (begin (player:tell (+ "Creating player " pname " with password " ppass "\n")) (set guests ($utils:set-remove caller guests)) (set players ($utils:set-add caller players)) (setparents caller (tolist $builder)) (caller:set-password ppass) (call (caller:get-location) announce (+ (caller:get-name) " creates a new player: " pname "\n")) (caller:set-name pname) (player:tell "Creation successful.\n") (player:welcome))) (player:tell "Sorry, only a guest can create a new player.\n"))) / recycle-this ;; when an object wants to delete itself, it should call ($system:recycle-this) (method () (begin (setparents caller (tolist $recycler)) ($recycler:add-recycled caller) (caller:~wipe-clean))) / force-recycle ;; kind of the hammer of god destroying offending objects. (method (obj) (if (write-ok? player) (begin (setparents obj (tolist $recycler)) ($recycler:add-recycled obj) (obj:~wipe-clean)))) / addparent (method (new-p) (if (new-p : accept-child caller) (setparents caller (cons new-p (caller:list-parents))) (raise E_PERM (+ (tostr new-p) " doesn't accept child " (tostr caller))))) / rmparent (method (new-p) (setparents caller ($utils : set-remove new-p (caller:list-parents)))) / set-parents (method (obj new-p) (if (and (obj:write-ok? caller) (new-p:read-ok? caller)) (setparents obj (tolist new-p)) (raise E_PERM (+ "cannot parent " (tostr obj) " to " (tostr new-p))))) / force-shutdown (method () (if (write-ok? caller) (shutdown))) / connect-me-to (method (to passwd) (if (to:accept-connection caller passwd) (begin (reconnect caller to) (set connected ($utils:set-add to ($utils:set-remove caller connected))) (to:welcome)) (begin (player:tell (+ (to:get-name) " didn't accept connection.\n")) 0))) / / /+++++++++ end of object #0 ... no lines after this ++++++++++ public ;; whether the object is readable to all 1 / owners ;; generally, the owner of an object is usually allowed to change it. ;; #13 is the generic wizard parent. '( #13 ) / ~write-ok? (method (who) (or (= who this) (= who #0) (search who owners) (search who (#0:list-admins)))) / write-ok? (method (who) (~write-ok? who)) / ~read-ok? (method (who) (or public (write-ok? who))) / read-ok? (method (who) (~read-ok? who)) / private-ok? (method (who) (= caller this)) / publish (method () (set public 1)) / unpublish (method () (set public 0)) / public? (method () public) / ~wipe-clean ;; once an object is parented to the recycler, this method is used to ;; remove all vestiges of what it once was: variables and commands. ;; notice, you can't use this method on any core object. (method () (if (~write-ok? caller) (if (< (tonum this) 17) (raise E_PERM "cannot wipe a core object clean") (var s (begin (purge-cmds) (foreach (i (vars)) (rmvar i))))))) / init (method () (if (not (or (search caller (parents)) (write-ok? caller))) (raise E_PERM "cannot call 'init' on that object") (begin (set owners (tolist player)) this))) / copy (method () (if (not (read-ok? caller)) (raise E_PERM "cannot copy objects that you can't read") (var i (begin (set i (or ($recycler:get-free this) (clone))) (call i init) i)))) / destroy (method () (if (write-ok? caller) ($system:recycle-this) (raise E_PERM "cannot destroy objects that you can't write to"))) / add-parent (method (new-parent) (if (write-ok? caller) (#0:addparent new-parent) (raise E_PERM "cannot change parents on that object"))) / add-command (method (regex sym) (if (write-ok? caller) (addcmd regex sym))) / remove-command (method (instring) (if (write-ok? caller) (rmcmd instring))) / accept-child (method (child) (or (read-ok? caller) (search player owners) (search player (#0:admins)))) / remove-parent (method (the-parent) (if (or (write-ok? caller) (= caller the-parent)) (#0:rmparent the-parent) (raise E_PERM))) / set-variable ;; asks 'this' to add a variable whose name is passed in as the first ;; parameter, and value in the second. (method (sym val) (if (not (write-ok? caller)) (raise E_PERM "cannot set a variable on that object") (sets sym val))) / rm-variable ;; asks 'this' to permanently remove a variable (method (sym) (if (not (write-ok? caller)) (raise E_PERM "cannot write to that object") (rmvar sym))) / list-variables (method () (if (not (read-ok? caller)) (raise E_PERM "cannot read this object") (vars))) / list-owners (method () owners) / list-parents (method () (parents)) / list-method (method (symname) (if (read-ok? player) (ignore E_VAR_NOT_FOUND (if (and (= (typeof (typeof (eval symname))) 'SYMBOL) (= (typeof (eval symname)) 'ERROR)) (+ (tostr this) " doesn't have that variable") (format (eval symname) 78))) "You don't have permission to view that.")) / add-owner (method (new-owner) (if (not (write-ok? caller)) (raise E_PERM "cannot write to this object") (set owners ($utils : set-add new-owner owners)))) / remove-owner (method (old-owner) (if (not (write-ok? caller)) (raise E_PERM "cannot write to this object") (set owners ($utils : set-remove old-owner owners)))) / dump-to-string (method () (+ (+ "Object ID: " (tostr this) "\n") (+ "Parents: " (tostr (parents)) "\n") (if (not (read-ok? caller)) "The rest of the object is not available\n" (+ "Vars: " (tostr (vars)) "\n" "Commands: " (tostr (commands)) "\n")))) / ~show-this (method () (begin (player:tell (+ "Object " (tostr this) ":\n")) (player:tell (+ "Parents: " (after "'(" (before ")" (tostr (parents)))) "\n")) (if (not (~read-ok? caller)) (player:tell "The rest of the object is not available\n") (begin (player:tell "Variables:\n") (foreach (v (vars)) (player:tell (+ " " (tostr v) "\n"))) (player:tell "Commands:\n") (foreach (c (commands)) (player:tell (+ " \"" (tostr (index 2 c)) "\" --> " (tostr (car c)) "\n"))) (player:tell "------ end of object ------\n"))))) / has-parent? (method (anc) (foreach (parent (parents)) (if (= parent anc) (return 1)))) / descends-from? ;; returns whether 'this' descends from the argument given as a parent (method (anc) (foreach (parent (parents)) (if (or (= parent anc) (parent:descends-from? anc)) (return 1)))) / E_INVALID_REGEXP 10 / E_OVERRIDE 11 / E_TYPE 12 / E_INCOMPATIBLE_TYPES 13 / E_RANGE 14 / E_VAR_NOT_FOUND 15 / E_TOO_MANY_ARGUMENTS 16 / E_TOO_FEW_ARGUMENTS 17 / E_INVALID_FUNCTION 18 / E_DIV_BY_ZERO 19 / E_SYSTEM_ONLY 20 / E_INVALID_OBJECT 21 / E_PARSE_ERROR 22 / E_INVALID_PAIR 23 / E_UNINITIALIZED 24 / E_CMD_NOT_FOUND 25 / E_NOT_CONNECTED 26 / E_BAD_SEPARATOR 27 / E_CANNOT_PASS 28 / E_PERM 29 / E_BAD_FILE 30 / E_NO_MATCH 31 / E_SEMAPHORE 32 / $root #1 / $system #0 / $located #2 / $exit #3 / $thing #4 / $container #5 / $area #6 / $room #7 / $connected #8 / $guest #9 / $player #10 / $builder #11 / $coder #12 / $admin #13 / $utils #14 / $recycler #15 / $editor #16 / / /+++++++++ end of object #1 ... no lines after this ++++++++++ 1 name "Generic Located, Described Object" / aliases '() / description "You see nothing special." / location #7 / x-coordinate ;; the user is, of course, free to use these as ;; polar values. 1 / y-coordinate 1 / init (method () (if (not (read-ok? caller)) (raise E_PERM) (begin (set home player) (set owners (tolist player)) (go-home)))) / go-home (method () (if (or (write-ok? caller) (= caller location) (= player (location:get-owner))) (begin (location:announce (+ name " goes home.\n")) (move-to home) (home:announce (+ name " has arrived.\n"))) (raise E_PERM (+ (tostr caller) " cannot force " (tostr this) " to move")))) / tell ;; default behavior is to ignore things you are told (method (instring) 0) / destroy (method () (begin (location:announce (+ name " disappears\n")) (location:remove this) (pass))) / get-name (method () name) / set-name (method (newname) (if (write-ok? caller) (set name newname) (raise E_PERM "cannot write to this object"))) / set-description (method (newdesc) (if (write-ok? caller) (set description newdesc) (raise E_PERM "cannot write to this object"))) / get-location (method () location) / get-description (method () description) / contained-by? (method (container) (or (= container location) (contained-by? (container:get-location)))) / full-name-match (method (instring) (if (or (= name instring) (= (tostr this) instring) (and (= player this) (= instring "me")) (and (= (player:get-location) this) (= instring "here")) (foreach (nm aliases) (if (= nm instring) (return this)))) this)) / partial-name-match (method (instring) (var loc (if (and (set loc (search instring name)) (or (= loc 1) (= " " (range (- loc 1) (- loc 1) name)))) this))) / name-match (method (instring) (or (full-name-match instring) (if (partial-name-match instring) (begin (foreach (c (location:get-contents)) (if (c:full-name-match instring) (return '()))) this)))) / alias-list (method () (if (= (player:get-location) this) (cons "here" (cons name aliases)) (if (= player this) (cons "me" (cons name aliases)) (cons name aliases)))) / add-alias (method (new-alias) (if (write-ok? caller) (if (= (typeof new-alias) 'STRING) (set aliases ($utils:set-add new-alias aliases)) (player:tell "Aliases must be STRING to be added\n")) (raise E_PERM "cannot write to this object"))) / rm-alias (method (old-alias) (if (write-ok? caller) (if (= (typeof old-alias) 'STRING) (if (search old-alias aliases) (begin (set aliases ($utils:set-remove old-alias aliases)) old-alias))) (raise E_PERM "cannot write to this object"))) / move-to ;; used to move an object from one location to another. ;; either returns the object number of the destination or a false value. (method (dest) (ignore E_VAR_NOT_FOUND (if (dest:accept-move) (if (not (= location dest)) (begin (location:remove this) (set location dest))) '()))) / std-match (method (mname) (set mname ($utils:strip-spaces mname) (or (and (reg-split "^#[0-9]+$" mname) (compile mname)) (name-match mname) (location:match-content mname) (location:name-match mname) (foreach (conick core-nicks) (if (= conick mname) (return (toobj (- (search conick core-nicks) 1))))) ($system:find-player mname)))) / try-command ;; allows objects to try to do some command on this (method (instring) (foreach (i (matchcmd instring)) (if ((car i) (index 2 i)) (return 1)))) / look-at (method () (player:tell-line (get-description))) / / /+++++++++ end of object #2 ... no lines after this ++++++++++ 2 name "generic exit" / arrive-msg " has arrived." / oleave-msg " has left." / leave-msg "You leave." / destination #17 / link (method (dest) (if (dest:accept-exit this) (set destination dest) (raise E_PERM "cannot change this exit"))) / tell-leave (method (obj-to) (begin (obj-to:tell (+ leave-msg "\n")) obj-to)) / tell-oleave (method (obj-to) (begin (location:announce (+ (obj:get-name) oleave-msg "\n")) obj-to)) / tell-arrive (method (obj-to) (begin (destination:announce-but (+ (obj:get-name) arrive-msg "\n") obj-to) obj-to)) / activate (method (obj) (if (or (= location (obj:get-location)) (obj:write-ok? player)) (if (obj:move-to destination) (begin (tell-leave obj) (tell-oleave obj) (destination:look-at) (tell-arrive obj) 1) (obj:tell "You can't go that way\n")))) / / /+++++++++ end of object #3 ... no lines after this ++++++++++ 2 home #7 / name "thing" / init (method () (begin (set home (player:get-home)) (move-to player) (pass))) / / /+++++++++ end of object #4 ... no lines after this ++++++++++ 4 name "generic container" / contents '() / init (method () (begin (set contents '()) (pass))) / destroy (method () (begin (foreach (i contents) (i:go-home)) (pass))) / accept-move ;; whenever an object tries to move into this, it asks this if it's ok by ;; using the 'accept-move' method ;; for now, this is a move-free-for-all ... ;; make sure that an object will always accept something it owns. (method () (begin (set contents ($utils:set-add caller contents)) 1)) / std-match (method (mname) (set mname ($utils:strip-spaces mname) (or (foreach (c contents) (if (c:name-match mname) (return c))) (pass mname)))) / accept-exit (method (exit) 1) / remove (method (obj) (if (or (write-ok? caller) (= obj caller)) (set contents ($utils:set-remove obj contents)) (raise E_PERM (+ "cannot remove " (tostr obj) " from " (tostr this))))) / get-contents (method () contents) / non-exit-contents ;; have to give it contents as a parameter (method (c) (if c (if (call (car c) descends-from? $exit) (non-exit-contents (cdr c)) (cons (car c) (non-exit-contents (cdr c)))) '())) / list-exits ;; have to give it the contents as a parameter (method (c) (if c (if (call (car c ) descends-from? $exit) (cons (car c) (list-exits (cdr c))) (list-exits (cdr c))) '())) / get-exits-string (method () (var ex (var es (if (set ex (list-exits contents)) (set es "Exits: " (foreach (e ex) (set es (+ es " " (e:get-name) " "))) es) "No obvious exits\n")))) / get-visible-contents (method () (non-exit-contents (get-contents))) / get-contents-string (method () (var c (begin (set c (get-visible-contents)) (if c (if (> (length c) 1) (+ (get-rest-contents (cdr c)) "and " (call (car c) get-name)) (call (car c) get-name)) "")))) / get-rest-contents (method (clist) (if clist (+ (get-rest-contents (cdr clist)) (call (car clist) get-name) ", ") "")) / match-exit-content (method (instring) (foreach (c contents) (if (and (c:descends-from? $exit) (c:name-match instring)) (return c)))) / match-non-exit (method (instring) (foreach (c contents) (if (and (not (c:descends-from? $exit)) (c:name-match instring)) (return c)))) / get-internal-description (method () (get-description)) / match-content (method (instring) (foreach (c contents) (if (c:name-match instring) (return c)))) / announce (method (instring) (ignore E_VAR_NOT_FOUND (begin (foreach (c contents) (c:tell instring)) instring))) / announce-but (method (instring except) (ignore E_VAR_NOT_FOUND (foreach (c contents) (if (not (= c except)) (c:tell instring))))) / try-command-in ;; this is called when an object is trying to find a command inside of a room. ;; it searches the command list on this, then asks the contents to respond, ;; and finally it checks for exits with the right name. (method (instring) (or (foreach (c (matchcmd instring)) (if ((car c) (index 2 c)) (return 1))) (foreach (c contents) (if (and (not (= c caller)) (c:try-command instring)) (return 1))) (var exit (if (set exit (match-exit-content instring)) (call exit activate caller) 0)))) / look-at (method () (begin (player:tell-line name) (player:tell-line (get-internal-description)) (if (player:tell (get-contents-string)) (player:tell "\n") "No contents to tell"))) / / /+++++++++ end of object #5 ... no lines after this ++++++++++ 5 name "generic area" / move-to ;; can't move an area, silly. (method (dest) '()) / / /+++++++++ end of object #6 ... no lines after this ++++++++++ 6 name "generic room" / description "You see the inside of an undescribed room" / / /+++++++++ end of object #7 ... no lines after this ++++++++++ 1 parse (method (instring) (echo instring)) / tell (method (instring) (ignore E_NOT_CONNECTED (or (echo instring) ""))) / tell-line (method (instring) (tell (+ instring "\n"))) / quit ;; the quit method must also be on EVERY connectable object (method () (begin (#0:remove-connection) (echo "*** DISCONNECTING ***\n") (location:announce (+ (tostr this) " has disconnected\n")) (disconnect))) / get-address (method () (if (read-ok? caller) (address) "")) / accept-connect ;; default is no reconnection. (method (from-obj password-string) 0) / welcome ;; right now, the DB is set up so this will get called on any object ;; after it has been reconnected to. (method () (echo (+ "Connecting to " (tostr this) "\n"))) / / /+++++++++ end of object #8 ... no lines after this ++++++++++ 8 5 init (method () (begin (set contents '()) (set home #17) (set name (+ "guest_" (tostr this))) (go-home))) / name "generic guest" / core-nicks '("$system" "$root" "$located" "$exit" "$thing" "$container" "$area" "$room" "$connected" "$guest" "$player" "$builder" "$coder" "$admin" "$utils" "$recycler" "$editor") / destroy (method () (if (write-ok? caller) (begin (if (has-parent? $guest) (#0:remove-guest)) (pass)) (raise E_PERM "cannot destroy this object"))) / announce (method (instring) (tell instring)) / get-home (method () home) / get-description (method () (if contents (var desc (set desc (+ (pass) "\nCarrying:") (foreach (con contents) (set desc (+ desc "\n" (con:get-name)))))) (pass))) / look-at (method () (player:tell-line (get-description))) / say-method (method (inline) (if (write-ok? player) (location:announce (+ name " says, \"" (index 2 inline) "\"\n")))) / pose-method (method (inline) (if (write-ok? player) (location:announce (+ name " " (index 2 inline) "\n")))) / welcome (method () (if (write-ok? caller) (begin (tell (+ "Welcome to Interlude.\n" "Connecting you to " name ".\n" "Have an interesting time.\n\n")) (location:announce-but (+ name " has connected\n") this) (tell (+ (location:get-name) "\n" (location:get-internal-description) "\n" (location:get-contents-string) "\n"))))) / parse (method (instring) (if (write-ok? player) (if (search $editor (parents)) (edit-parse instring) (if (not (or (not instring) (foreach (i (matchcmd instring)) (if ((car i) (index 2 i)) (return 1))) (foreach (i contents) (if (i:try-command instring) (return 1))) (location:try-command-in instring) (var pair (and (set pair (reg-split "#[0-9]+" instring) (call (compile (index 2 pair)) try-command instring)))))) (echo "I don't understand that\n"))))) / quit (method () (if (write-ok? player) (begin (#0:remove-guest) (disconnect) (#0:remove-connection) (location:announce (+ name " has disconnected.\n")) (destroy)))) / quit-command (method (unused) (if (write-ok? player) (quit))) / inventory-command (method (unused) (if (read-ok? caller) (tell (if contents (var cntstring (set cntstring "You are carrying:\n" (foreach (cnt contents) (set cntstring (+ cntstring (cnt:get-name) "\n"))))) "You are not carrying anything\n")))) / look-cmd (method (inline) (if (= player this) (if (index 4 inline) ;; empty string "" is logically false (var match (if (set match (std-match (index 4 inline))) (match:look-at) (tell "I don't see that here\n"))) (location:look-at)))) / help-command (method (inline) (if (index 2 inline) (ignore E_BAD_FILE (tell (or (filetext (+ "help/" (index 2 inline))) "There is no help available on that topic.\n"))) (tell (filetext "help/help")))) / who-command (method (ignored) (if (write-ok? player) (foreach (c (#0:list-connected)) (tell (+ (c:get-name) " " (call (c:get-location) get-name) " " (c:get-address) "\n"))))) / home-command (method (unused) (if (or (search player (location:list-owners)) (write-ok? player)) (begin (go-home) (location:look-at)))) / editor-alias "$$" / send-whisper-method (method (sym) (if (write-ok? caller) (whisper-to whispering-to (eval sym)))) / whisper-method (method (to msg) (if (write-ok? player) (if (= msg editor-alias) (begin (tell-line ">> Editing the text of the message to whisper...") (set whispering-to to) (enter-edit 'whisper-txt 'send-whisper-method '())) (whisper-to to msg)))) / whisper-to (method (to msg) (if (write-ok? player) (if (search "\n" msg) (begin (tell-line (+ "You whisper your message to " (to:get-name))) (if (to:tell-line (+ name " whispers to you:")) (tell-line (+ " " (implode "\n " (explode "\n" msg)))) (tell-line (+ (to:get-name) " isn't awake, though.")))) (begin (tell-line (+ "You whisper, \"" msg "\" to " (to:get-name))) (if (to:tell-line (+ name " whispers, \"" msg "\" to you.")) name (tell-line (+ (to:get-name) " isn't awake, though."))))))) / whisper-to-command (method (inline) (if (write-ok? player) (var w-to (if (= (index 4 inline) "to") ;; then it's Moo syntax (if (set w-to (std-match (index 5 inline))) (whisper-method w-to (index 3 inline)) (tell (+ "I don't see " (index 5 inline) " here\n"))) (if (set w-to (std-match (index 3 inline))) (whisper-method w-to (index 5 inline)) (tell (+ "I don't see " (index 3 inline) " here\n"))))))) / whisper-syntax (method (unused) (if (write-ok? player) (tell "Syntax: whisper <msg> to <player>\n"))) / connect-syntax (method (unused) (if (write-ok? player) (tell "Syntax: connect <player name> <password>\n"))) / connect-command (method (inline) (if (write-ok? player) (var play-to (if (search " " (index 4 inline)) (connect-syntax inline) (if (set play-to (#0:find-player (index 3 inline))) (if (#0:connect-me-to play-to (index 4 inline)) (quit) 1) (tell "Can't locate that player\n")))))) / move-to (method (dest) (if (or (write-ok? caller) (caller:descends-from? $exit) (= player this)) (pass dest))) / get-cmd (method (inline) (if (= player this) (var match (if (set match (location:match-non-exit (index 2 inline))) (if (match:move-to this) (begin (location:announce-but (+ name " gets " (match:get-name) "\n") this) (tell (+ "You get " (match:get-name) "\n"))) (tell "You can't get that!\n")) (get-syntax))))) / get-syntax (method (unused) (if (= this player) (tell "I don't see that here\n"))) / drop-syntax (method (unused) (if (= player this) (tell "You are not carrying that.\n"))) / drop-cmd (method (inline) (if (= player this) (var match (if (set match (match-content (index 2 inline))) (if (match:move-to location) (begin (location:announce-but (+ name " drops " (match:get-name) "\n") this) (tell (+ "You drop " (match:get-name) "\n"))) (tell "You can't drop that here!\n")) (drop-syntax inline))))) / create-syntax (method (unused) (if (write-ok? player) (tell "Syntax: create <player name> <password>\n"))) / create-command (method (inline) (if (write-ok? player) (if (search " " (index 3 inline)) (create-syntax inline) (#0:guest-to-player (index 2 inline) (index 3 inline))))) / enter-edit (method (prop after-call starting-list) (begin (tell ">> type '.help' to get help on the editor\n") (#0:addparent $editor) (set editing-list starting-list) (set edit-insert-at 1) (set edit-save-prop prop) (set edit-after-call after-call))) / leave-edit (method () (#0:rmparent $editor)) / quit-save (method (saved-to) (tell (+ ">> quitting editor, saving to property " (tostr saved-to) "\n"))) / / '("say" REST) say-method '("\"" REST) say-method '("pose" REST) pose-method '(":" REST) pose-method '("quit") quit-command '("@quit") quit-command '("QUIT") quit-command '("l" (or "ook" "") (or " at " "") REST) look-cmd '("help" REST) help-command '("who" REST) who-command '("@who" REST) who-command '("WHO" REST) who-command '("home" REST) home-command '("HOME" REST) home-command '("wh" (or "isper" " ") (or (before "=") (before " to ") WORD) (or "=" "to" "") REST) whisper-to-command '("wh" (or "isper" "")) whisper-syntax '("con" (or "nect" " ") WORD REST) connect-command '("con" (or "nect" "")) connect-syntax '("create" WORD REST) create-command '("create") create-syntax '("i" (or "nventory" "")) inventory-command '("get" REST) get-cmd '("drop") drop-syntax '("drop" REST) drop-cmd /+++++++++ end of object #9 ... no lines after this ++++++++++ 9 name "generic player" / password "no-login" / destroy (method () (if (write-ok? caller) (begin (#0:remove-player) (pass)) (raise E_PERM "cannot destroy this object"))) / set-password (method (newpass) (if (write-ok? caller) (set password (crypt newpass)) (raise E_PERM "cannot destroy this object"))) / password-cmd (method (cmdline) (if (not (= player this)) (player:tell "Only an player can change its own password.\n") (if (not (= (crypt (index 3 cmdline)) password)) (tell "Syntax: @password <oldpassword> <newpassword>\n") (begin (set-password (index 4 cmdline)) (tell "Password changed\n"))))) / quit (method () (begin (disconnect) (#0:remove-connection) (location:announce (+ name " has disconnected.\n")) (leave-edit))) / accept-connection (method (from passwd) (and (= (crypt passwd) password) (not (= this from)))) / describe-syntax (method (ignored) (if (= player this) (tell "Syntax: @describe <object> as <description>\n"))) / describe-cmd (method (inline) (if (= PLAYER THIS) (if (set DESCRIBE-ONTO (STD-MATCH (index 3 INLINE))) (begin (set DESCRIPTION-TXT (index 5 INLINE)) (if (= DESCRIPTION-TXT EDITOR-ALIAS) (begin (TELL-line ">> Editing description-txt") (ENTER-EDIT 'DESCRIPTION-TXT 'DESCRIBE-METHOD (explode "\n" (DESCRIBE-ONTO:GET-DESCRIPTION)))) (DESCRIBE-METHOD (quote DESCRIPTION-TXT)))) (TELL "I don't see that here\n")) (DESCRIBE-SYNTAX INLINE))) / describe-method (method (SYM) (if (= player this) (ignore E_PERM (if (DESCRIBE-ONTO:SET-DESCRIPTION (eval SYM)) (TELL "Description changed\n") (TELL "You cannot change that object\n"))))) / paste-cmd (method (inline) (if (= player this) (begin (tell-line ">> Editing a message to paste.") (enter-edit 'paste-txt 'paste-method '())))) / paste-method (method (sym) (if (= player this) (begin (location:announce (+ "-------- " name " pastes: ---------------\n")) (location:announce (+ (eval sym) "\n")) (location:announce "------------------------------------------\n")))) / / '("@pass" (or "word" " ") WORD WORD) password-cmd '("@setpass" (or "word" " ") WORD WORD) password-cmd '("pass" (or "word" " ") WORD WORD) password-cmd '("@desc" (or "ribe" "")) describe-syntax '("@paste") paste-cmd '("@desc" (or "ribe" " ") (or (before "=") (before " as ") WORD) (or "=" "as" "") REST) describe-cmd /+++++++++ end of object #10 ... no lines after this ++++++++++ 10 name "Generic builder" / clone-object-cmd (method (inline) (if (= player this) (ignore E_PERM (var ob (if (set ob (std-match (index 2 inline))) (if (set ob (ob:copy)) (tell (+ "Successfully cloned to make object " (tostr ob) ": " (ob:get-name) "\n")) (tell "That object refuses to be cloned\n")) (tell "I don't see that here!\n")))))) / clone-syntax (method (ignored) (if (= player this) (tell-line "Syntax: @clone <object>"))) / exit-syntax (method (inline) (if (= player this) (tell-line "Syntax: @exit <name> to <destination>"))) / exit-cmd (method (inline) (if (= player this) (var new-exit (if (set new-exit ($exit:copy)) (begin (new-exit:set-name (index 2 inline)) (if (new-exit:move-to location) (var dest (if (set dest (std-match (index 4 inline))) (ignore E_PERM (if (new-exit:link dest) (tell "Exit created, linked\n") (begin (new-exit:destroy) (tell "You can't link an exit to there\n")))) (begin (new-exit:destroy) (tell "I don't see that destination\n")))) (begin (new-exit:destroy) (tell "This room doesn't allow the new exit\n")))) (tell "You cannot create a new exit\n"))))) / dig-syntax (method (inline) (if (= player this) (tell-line "Syntax: @dig <roomname>"))) / dig-cmd (method (inline) (if (= player this) (var new-room (if (= (typeof (set new-room ($room:copy))) 'OBJECT) (tell (+ "Room " (tostr new-room) " dug, named " (new-room:set-name (index 2 inline)) "\n")) (tell "Sorry, you can't create a new room\n"))))) / rename-syntax (method (ignored) (if (= player this) (tell-line "Syntax: @rename <object> to <name>"))) / rename-cmd (method (inline) (if (= player this) (var match (if (set match (std-match (index 2 inline))) (ignore E_PERM (if (match:set-name (index 4 inline)) (tell "Name changed\n") (tell "You cannot change that object\n"))) (tell "I don't see that here\n"))) (rename-syntax inline))) / set-name (method (newname) (if (std-match newname) (begin (player:tell-line "That name is already in use.") '()) (pass newname))) / alias-syntax (method (ignored) (if (= player this) (tell-line "Syntax: @alias <object> to <name>"))) / alias-cmd (method (inline) (if (= player this) (var match (if (set match (std-match (index (if (= (index 3 inline) "=") 4 2) inline))) (ignore E_PERM (if (match:add-alias (index (if (= (index 3 inline) "=") 2 4) inline)) (tell "Alias added\n") (tell "You cannot change that object\n"))) (tell "I don't see that here\n"))) (alias-syntax inline))) / rmalias-syntax (method (ignored) (if (= player this) (tell-line "Syntax: @rmalias <name> on <object>"))) / rmalias-cmd (method (inline) (if (= player this) (var match (if (set match (std-match (index (if (= (index 3 inline) "=") 2 4) inline))) (ignore E_PERM (if (match:rm-alias (index (if (= (index 3 inline) "=") 4 2) inline)) (tell-line "Alias removed") (tell-line "You cannot change that object"))) (tell-line "I don't see that here"))) (rmalias-syntax inline))) / recycle-syntax (method (ignored) (if (= player this) (tell-line "Syntax: @recycle <object>"))) / recycle-cmd (method (inline) (if (= player this) (var match (if (set match (std-match (index 2 inline))) (handle E_PERM (method (en es) (tell-line "You cannot recycle that object")) (begin (match:destroy) (tell-line "Object recycled"))) (tell-line "I don't see that here"))))) / list-helper (method (objname pname) (var on (if (set on (std-match objname)) (tell-line (on:list-method (tosym pname))) (tell "I don't see that here\n")))) / list-command (method (inline) (if (write-ok? caller) (if (= (index 3 inline) "=") (list-helper (index 2 inline) (index 4 inline)) (if (= (index 3 inline) "on") (list-helper (index 4 inline) (index 2 inline)) (ignore E_VAR_NOT_FOUND (if (eval (set inline (tosym (index 4 inline)))) (tell (list-method inline)) (tell "That variable does not exist on you.\n"))))))) / list-syntax (method (unused) (if (= player this) (tell "Syntax: @list <variable name> [on <object>]\n"))) / show-syntax (method (unused) (if (= player this) (tell "Syntax: @show <object>\n"))) / show-command (method (inline) (if (= player this) (var match (if (set match (std-match (index 2 inline))) (match:~show-this) (tell "I don't see that here.\n"))))) / / '("@clone" SOME) clone-object-cmd '("@clone") clone-syntax '("@rename") rename-syntax '("@name") rename-syntax '("@rename" (or (before "=") (before " as ") (before " to ") WORD) (or "=" "as" "to" "") REST) rename-cmd '("@name" (or (before "=") (before " as ") (before " to ") WORD) (or "=" "as" "to" "") REST) rename-cmd '("@addalias") alias-syntax '("@addalias" (or (before "=") (before " to ") WORD) (or "=" "to" "") SOME) alias-cmd '("@alias") alias-syntax '("@alias" (or (before "=") (before " to ") WORD) (or "=" "to" "") SOME) alias-cmd '("@rmalias" (or (before "=") (before " on ") (before " from ") WORD) (or "=" "on" "from" "") SOME) rmalias-cmd '("@rmalias") rmalias-syntax '("@recycle") recycle-syntax '("@recycle" SOME) recycle-cmd '("@dig") dig-syntax '("@dig" SOME) dig-cmd '("@exit") exit-syntax '("@exit" (or (before "=") (before " to ")) (or "=" "to") SOME) exit-cmd '("@list") list-syntax '("@list" (or (before "=") (before " on ") "") (or "=" "on" "") SOME) list-command '("@show") show-syntax '("@show" REST) show-command /+++++++++ end of object #11 ... no lines after this ++++++++++ 11 name "Generic Coder" / eval-command (method (inline) (if (= player this) (player:tell (+ "--> " (tostr ((compile (+ "(method () " (index 3 inline) "]\n")))) "\n")))) / program-syntax (method (inline) (if (= player this) (tell "Syntax: @program <variable name> on <object>\n"))) / start-program (method (objname pname) (if (= player this) (if (set compile-onto (std-match objname)) (var prop (set prop (+ pname "-txt") (tell (+ ">> Programming " prop " from scratch\n")) (enter-edit (tosym prop) 'compile-program '()) 1)) (tell "I don't see that here\n")))) / program-cmd (method (inline) (if (= player this) (if (= (index 4 inline) "on") (start-program (index 5 inline) (index 3 inline)) (if (= (index 4 inline) "=") (start-program (index 3 inline) (index 5 inline)) (program-syntax inline))))) / compile-program (method (saved-to) (if (write-ok? caller) (begin (tell (+ ">> compiling '" (tostr saved-to) "' into variable '" (before "-TXT" (tostr saved-to)) "' :\n")) (var temp (if (set temp (compile (eval saved-to))) (if (compile-onto:set-variable (tosym (before "-TXT" (tostr saved-to))) temp) (begin (tell ">> compilation successful\n") (rmvar saved-to)) (tell (+ ">> unable to compile onto object " (tostr compile-onto) "\n>> still in editor: .xit to abort edit\n")))))))) / edit-syntax (method (inline) (if (= player this) (tell-line "Syntax: @edit <variable name> on <object>"))) / start-edit (method (objname pname) (if (= player this) (if (set compile-onto (std-match objname)) (var prop (set prop (+ pname "-txt") (tell (+ ">> Editing existing version of " prop " at line one:\n")) (enter-edit (tosym prop) 'compile-program (explode "\n" (compile-onto:list-method (tosym pname)))) 1)) (tell "I don't see that here\n")))) / edit-cmd (method (inline) (if (= player this) (if (= (index 3 inline) "on") (start-edit (index 4 inline) (index 2 inline)) (if (= (index 3 inline) "=") (start-edit (index 2 inline) (index 4 inline)) (edit-syntax inline))))) / mutate-syntax (method (unused) (if (= player this) (tell "Syntax: @mutate <object> to <object>\n"))) / mutate-cmd (method (inline) (if (= player this) (var match (var match2 (if (set match (std-match (index 2 inline))) (if (set match2 (std-match (index 4 inline))) (ignore E_PERM (if (#0:set-parents match match2) (tell "Object has been mutated\n") (tell (+ "You cannot mutate " (index 2 inline) " to " (index 4 inline) "\n")))) (tell (+ "I don't see " (index 4 inline) " here\n"))) (tell (+ "I don't see " (index 2 inline) " here\n"))))) (mutate-syntax))) / addcommand-syntax (method (in) (if (= player this) (tell "Syntax: @addcommand <symbol> on <object> with <template>\n"))) / addcommand-creator (method (inline) (if (= player this) (var obj (if (set obj (std-match (index 4 inline))) (var cmd-list (if (= (typeof (set cmd-list (compile (index 6 inline)))) 'LIST) (if (obj:add-command cmd-list (tosym (index 2 inline))) (tell "Command added\n") (tell "Unable to add command\n")) (tell "Command must be in the form of a list\n"))) (tell (+ "I don't see " (index 4 inline) " here.\n")))))) / rmcommand-syntax (method (unused) (if (= player this) (tell "Syntax: @rmcommand on <object> matching <line>\n"))) / rmcommand-cmd (method (inline) (if (= player this) (var obj (if (set obj (std-match (index 3 inline))) (if (obj:remove-command (index 5 inline)) (tell "Command removed\n") (tell "That line does not match a command you can remove\n")) (tell "I can't find that object here\n"))))) / rmvariable-syntax (method (unused) (if (= player this) (tell "Syntax: @rmvariable <symbol> from <object>\n"))) / rmvariable-cmd (method (inline) (if (= player this) (if (= (index 4 inline) "=") (rmvar-helper (index 3 inline) (index 5 inline)) (rmvar-helper (index 5 inline) (index 3 inline))))) / rmvar-helper (method (obj prop) (if (set obj (std-match obj)) (if (obj:rm-variable (tosym prop)) (tell "Variable removed\n") (tell "You cannot remove that variable\n")) (tell "I can't find that object\n"))) / / '("@prog" (or "ram" "")) program-syntax '("@prog" (or "ram" "") (or (before "=") (before " on ") "") (or "=" "on" "") SOME) program-cmd '("@edit") edit-syntax '("@edit" (or (before "=") (before " on ") "") (or "=" "on" "") SOME) edit-cmd '("eval" (or "uate" "") REST) eval-command '(";" "" SOME) eval-command '("@list") mutate-syntax '("@mutate" (or (before "=") (before " to ")) (or "=" "to") REST) mutate-cmd '("@rmvar" (or "iable" "") (or (before "=") (before " from ")) (or "=" " from ") SOME) rmvariable-cmd '("@rmvar" (or "iable" "")) rmvariable-syntax '("@addcommand") addcommand-syntax '("@addcommand" WORD " on " (before " with ") "with" SOME) addcommand-creator '("@rmcommand" " on " (before "matching") "matching" SOME) rmcommand-cmd '("@rmcommand") rmcommand-syntax /+++++++++ end of object #12 ... no lines after this ++++++++++ 12 name "admin" / owners '(#13) / location #17 / home #17 / password "" / is-password-set? (method () (and password 1)) / description "This is the generic administrator. its default password is 'trauma'" / destroy (method () (if (write-ok? caller) (begin (#0:remove-admin) (pass)) (raise E_PERM "cannot destroy this object"))) / shutdown-method (method (unused) (if (= player this) (#0:force-shutdown))) / wiz-player (method (inline) (if (= player this) (if (not (foreach (pl (#0:list-players)) (if (pl:name-match (index 3 inline)) (begin (#0:add-admin pl) (return (player:tell "Administrator added.\n")))))) (player:tell "Cannot find that player...\n")))) / / '("@wiz" (or "ard" "") SOME) wiz-player '("shutdown") shutdown-method /+++++++++ end of object #13 ... no lines after this ++++++++++ 1 set-add (method (elem inlist) (if (not (search elem inlist)) (insert elem inlist 1) inlist)) / set-remove (method (elem inlist) (var i (begin (set i (search elem inlist)) (if (not i) inlist (+ (before i inlist) (after i inlist)))))) / strip-surrounding (method (char instring) (begin (while (= (search char instring) 1) (set instring (after 1 instring))) (while (= (range (length instring) (length instring) instring) char) (set instring (range 1 (- (length instring) (length char)) instring))) instring)) / strip-spaces (method (instring) (strip-surrounding " " instring)) / accept-child (method (inchild) (search inchild list-connected)) / ext-range (method (p q s) (if (and (<= p q) (<= 1 p) (<= q (length s))) (range p q s) "")) / spaces (method (nums) (if (> nums 0) (if (< nums 40) (range 1 nums " ") (+ (spaces (- nums 40)) " ")) "")) / list-to-string (method (inlist) (implode "\n" inlist)) / maximum (method (num1 num2) (if (> num1 num2) num1 num2)) / minimum (method (num1 num2) (if (< num1 num2) num1 num2)) / square (method (innum) (* innum innum)) / pro-search (method (pronoun wlist) (var in-quote (begin (set in-quote 0) (dotimes (word (length wlist)) (var tempstring (begin (set tempstring (index word wlist)) (while (search "\"" tempstring) (begin (set tempstring (after "\"" tempstring)) (set in-quote (not in-quote)))) (if (and (not in-quote) (= pronoun tempstring)) (return word))))) 0))) / move-to (method (dest) '()) / / /+++++++++ end of object #14 ... no lines after this ++++++++++ 14 free-pile '() / add-recycled ;; this is used to register the object with the recyclery so it can be given ;; out later. (method (obj) (set free-pile (set-add obj free-pile))) / add-parent (method (p) (if (and (= caller $recycler) (not (= this $recycler))) (#0:addparent p) (raise E_PERM "cannot change that object's parents"))) / get-free ;; this checks to see if there are any available recycled object to re-use (method (parent) (if (not free-pile) 0 (var i (begin (set i (car free-pile)) (set free-pile (cdr free-pile)) (i:add-parent parent) (i:remove-parent this) i)))) / / /+++++++++ end of object #15 ... no lines after this ++++++++++ 14 editing-list '() / edit-insert-at 1 / accept-child (method (inchild) (search inchild (#0:list-connected))) / edit-parse (method (inline) (if (write-ok? player) (if (not (and (or (= 1 (search ":" inline)) (= 1 (search "\"" inline)) (= 1 (search "." inline)) (= 1 (search ";" inline))) (foreach (c (matchcmd inline)) (if ((car c) (index 2 c)) (return 1))))) (begin (set editing-list (insert inline editing-list edit-insert-at)) (set edit-insert-at (+ edit-insert-at 1)))))) / edit-insert-cmd (method (inline) (if (write-ok? caller) (if (index 4 inline) (tell ">> Syntax: .insert <line-number>\n") (var linenum (if (or (< (set linenum (tonum (index 3 inline))) 1) (> linenum (+ 1 (length editing-list)))) (tell (+ ">> line " (tostr inline) " is out of range\n")) (tell-line (+ ">> Inserting at line " (tostr (set edit-insert-at linenum))))))))) / edit-list-cmd (method (inline) (if (read-ok? caller) (if (index 5 inline) (tell-line ">> Syntax: .list [<line-number>] [<line-number>]") (var start-at (var end-at (if (index 3 inline) (set start-at (tonum (index 3 inline))) (set start-at 1)) (if (index 4 inline) (set end-at (tonum (index 4 inline))) (if (index 3 inline) (set end-at start-at) (set end-at (length editing-list)))) (list-range start-at end-at)))))) / list-range (method (starting ending) (handle E_RANGE (method (n s) (tell ">> Line(s) out of range\n")) (begin (tell ">> Listing...\n") (foreach (line (range starting ending editing-list)) (tell (+ line "\n"))) (tell ">> Listing completed\n")))) / edit-delete-cmd (method (inline) (if (write-ok? caller) (if (index 5 inline) (tell ">> Syntax: .delete [<line-number>] [<line-number>]\n") (var start-at (var end-at (if (index 3 inline) (set start-at (tonum (index 3 inline))) (set start-at 1)) (if (index 4 inline) (set end-at (tonum (index 4 inline))) (if (index 3 inline) (set end-at start-at) (set end-at (length editing-list)))) (delete-range start-at end-at)))))) / delete-range (method (start-at end-at) (handle E_RANGE (method (n s) (tell ">> Line(s) out of range\n")) (if (or (< start-at 1) (> end-at (length editing-list)) (> start-at end-at)) (tell ">> Invalid lines to delete\n") (begin (tell (+ ">> Deleting lines " (tostr start-at) " through " (tostr end-at) "\n")) (set editing-list (+ (before start-at editing-list) (after end-at editing-list))) (if (> edit-insert-at end-at) (set edit-insert-at (- edit-insert-at (- (+ end-at 1) start-at))) (if (> edit-insert-at (- start-at 1)) (set edit-insert-at start-at) start-at)))))) / edit-quit-cmd (method (ignored) (begin (set (eval 'edit-save-prop) (implode "\n" editing-list)) (edit-after-call edit-save-prop) (leave-edit))) / edit-exit-cmd (method (ignored) (begin (tell ">> Leaving editor without saving\n") (leave-edit))) / edit-help-cmd (method (ignored) (help-command '("help" "editor"))) / handler (method (errnum errstring) (tell-line (+ ">> editor error: " errstring ">> still in editor: .x to exit without compiling"))) / / '(".d" (or "elete" "") (or NUMBER "") (or NUMBER "") REST) edit-delete-cmd '(".i" (or "nsert" "") (or NUMBER "") (or "" REST)) edit-insert-cmd '(".l" (or "ist" "") (or NUMBER "") (or NUMBER "") REST) edit-list-cmd '(".q" (or "uit" "")) edit-quit-cmd '(".x" (or "it" "")) edit-exit-cmd '(".exit") edit-exit-cmd '(".h" (or "elp" "")) edit-help-cmd '(".") edit-help-cmd /+++++++++ end of object #16 ... no lines after this ++++++++++ 7 contents '(#18 #13) / name "starter room" / public 1 / description "Not much to see here. 'out' will take you to the other room." / / /+++++++++ end of object #17 ... no lines after this ++++++++++ 3 name "out" / description "looks like the way out." / arrive-msg " comes in from the main room." / oleave-msg " goes out." / location #17 / destination #19 / / /+++++++++ end of object #18 ... no lines after this ++++++++++ 7 contents '(#20 #22) / name "the other room" / public 1 / description "This is the other room in the core db. 'in' will take you back." / / /++++++++++++ end of object #19 +++++++++++++++++++ 3 name "in" / description "looks like the way in." / leave-msg "You flee to the safety of the main room." / oleave-msg " has left for the main room." / arrive-msg " has arrived through the 'out' door" / location #19 / destination #17 / / /+++++++++++ end of object #20 ++++++++++++++++++ 14 name "coordinate type" / instantiate (method (xcoord ycoord) (class this (tolist xcoord ycoord))) / distance ;; this allows you to do things like (call {#21 '(1 2)} distance {#21 '(9 4)}) ;; ... it looks more elegant when the values are saved to symbols, since you ;; can then say (coordinate:distance other-coordinate) (method (this-val to-coord) (if (and (= (typeof (typeof to-coord)) 'OBJECT) (= (typeof to-coord) this)) (to-coord:distance-private (index 1 this-val) (index 2 this-val)) (raise E_PERM "Invalid attempt to find distance to non-coordinate value"))) / distance-private ;; this is the private implementation of 'distance' ... the end-user should ;; never call it. (method (this-val to-x to-y) (if (= caller this) (square-root (+ (square (- to-x (index 1 this-val))) (square (- to-y (index 2 this-val))))) (raise E_PERM "distance-private is a private method to this object"))) / / /+++++++++++++++++++++++ end of object 21 ++++++++++++++++++++++++++++++++ 8 4 name "waldo" / description "it's an odd little device with a keyboard, high-resolution monitor, and a pair of heavily-instrumented powergloves. A little post-it next to the monitor reads:\n TO ACTIVATE, TYPE 'call lambda'\n TO DISCONNECT, TYPE 'hang up waldo'\n TO CONTROL, TYPE 'waldo <cmd>'\n TO LIST SITES, TYPE 'sites'" / location #19 / addresses '(("lambda" "13.2.116.36 8888" "connect guest\n") ("media" "18.85.0.48 8888" "connect guest\n") ("jayshouse" "129.10.10.59 1709" "connect guest\n")) / find-address (method (instr) (foreach (addr addresses) (if (= (car addr) instr) (return addr)))) / call-out (method (inline) (var addr (if (set addr (find-address (index 2 inline))) (if (#0:call-me-out (index 2 addr)) (begin (location:announce (+ name "'s screen flashes the 'Connection established' message\n")) (echo (index 3 addr))) (location:announce (+ name "'s screen flashes the 'Could not connect' message\n"))) (location:announce (+ name "'s screen flashes 'Invalid destination'\n"))))) / parse (method (inline) (location:announce (+ name ":> " inline "\n"))) / list-sites (method (unused) (begin (location:announce (+ name "'s screen prints 'call <sitename>' to connect\n")) (foreach (addr addresses) (location:announce (+ (index 1 addr) "\n"))))) / tell (method (instring) 0) / command-waldo (method (inline) (if (echo (+ (index 3 inline) "\n")) (location:announce (+ (player:get-name) " types on " name "'s keyboard: " (index 3 inline) "\n")) (location:announce (+ (player:get-name) " vainly taps on " name "'s unconnected keyboard\n")))) / hang-up-waldo (method (inline) (if (name-match (index 3 inline)) (begin (quit) (location:announce (+ (player:get-name) " hangs up " name "\n"))))) / / '("call" SOME) call-out '("wal" (or "do" "") REST) command-waldo '("hang" "up" SOME) hang-up-waldo '("sites") list-sites /+++++++++++++++++++++++++ end of object #22 ++++++++++++++++++++++++++++++