-;; (defaction go-n () (run-action 'go-to dir-n))\r
-;; (defaction go-ne () (run-action 'go-to dir-ne))\r
-;; (defaction go-e () (run-action 'go-to dir-e))\r
-;; (defaction go-se () (run-action 'go-to dir-se))\r
-;; (defaction go-s () (run-action 'go-to dir-s))\r
-;; (defaction go-sw () (run-action 'go-to dir-sw))\r
-;; (defaction go-w () (run-action 'go-to dir-w))\r
-;; (defaction go-nw () (run-action 'go-to dir-nw))\r
-;; (defaction go-u () (run-action 'go-to dir-u))\r
-;; (defaction go-d () (run-action 'go-to dir-d))\r
-;; (defaction go-in () (run-action 'go-to dir-in))\r
-;; (defaction go-out () (run-action 'go-to dir-out))\r
+(defgeneric go-to-dispatch (dest)\r
+ (:documentation "Dispatches between different kinds of goable objects"))\r
+\r
+(defmethod go-to-dispatch ((dest room))\r
+ (go-to-room dest))\r
+\r
+(defmethod go-to-dispatch ((dest door))\r
+ ;(format t "go-to-dispatch: ~a~%" dest)\r
+ (unless (has dest :door) (return-from go-to-dispatch (call-next-method)))\r
+ (if (has dest :closed) (format nil "~a is closed." (the-name dest :capital t))\r
+ (run-action 'pass (list dest))))\r
+\r
+(defaction pass (obj)\r
+ "Something's wrong happened.")\r
+\r
+(defmethod pass ((obj door))\r
+ (go-to-dispatch (read-property obj 'destination))\r
+ (run-action-after obj))\r