Traversal checks, plus flavortext
authorChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 30 Jan 2017 17:57:59 +0000 (11:57 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 30 Jan 2017 17:57:59 +0000 (11:57 -0600)
mudsync/room.scm

index 69385f6e2583b5d2c02f5e9c7038ce2fa63fda36..8f1e0a330d9ab2323ba495b9ac2b0185f5111eb6 100644 (file)
   (traverse-check #:init-value (const #t)
                   #:init-keyword #:traverse-check))
 
-(define* (exit-can-traverse? exit actor
-                             #:optional (target-actor (actor-id actor)))
-  ((slot-ref exit 'traverse-check) exit actor target-actor))
+;; @@: Should we make whos-exiting optional?  Would there ever be any
+;;   reason?
+(define* (exit-can-traverse? exit room whos-exiting)
+  ((slot-ref exit 'traverse-check) exit room whos-exiting))
 
-(define* (exit-is-visible? exit actor
-                           #:optional (target-actor (actor-id actor)))
-  ((slot-ref exit 'traverse-check) exit actor target-actor))
+(define* (exit-is-visible? exit room whos-exiting)
+  ((slot-ref exit 'visible-check) exit room whos-exiting))
 
 
 \f
                          ;; in case it's a special
                          (dyn-ref room (slot-ref exit 'to))
                          #f))
+  (define player (message-from message))
   (define player-name
-    (mbody-val (<-wait (message-from message) 'get-name)))
+    (mbody-val (<-wait player 'get-name)))
   (cond
    (exit
-    ;; Set the player's new location
-    (<-wait (message-from message) 'set-loc!
-            #:loc to-address)
-    ;; Tell everyone else the person walked away
-    (room-tell-room
-     room
-     (format #f "~a wanders ~a.\n"
-             player-name direct-obj))
-    (<- to-address 'announce-entrance
-        #:who-entered (message-from message))
-    ;; Have the new room update the player to the new location
-    (<- to-address 'look-room
-        #:to-id (message-from message)))
+    (call-with-values (lambda ()
+                        (exit-can-traverse? exit room player))
+      (lambda* (can-traverse? #:optional player-flavortext
+                              room-flavortext)
+        (if can-traverse?
+            ;; looks like we can go, so let's go!
+            (begin
+              ;; Set the player's new location
+              (<-wait player 'set-loc!
+                      #:loc to-address)
+              (when player-flavortext
+                (<-wait player 'tell
+                        #:text player-flavortext))
+              ;; Tell everyone else the person walked away
+              (room-tell-room
+               room (or room-flavortext
+                        (format #f "~a wanders ~a.\n"
+                                player-name direct-obj)))
+              (<- to-address 'announce-entrance
+                  #:who-entered player)
+              ;; Have the new room update the player to the new location
+              (<- to-address 'look-room
+                  #:to-id player))
+            ;; Otherwise, if we can't go...
+            (begin
+              (<- player 'tell
+                  #:text (or player-flavortext
+                             `("You try to go " ,direct-obj " but something "
+                               "seems to block you.")))
+              (when room-flavortext
+                (room-tell-room room room-flavortext
+                                #:exclude player)))))))
    (else
-    (<- (message-from message) 'tell
+    (<- player 'tell
         #:text "You don't see any way to go there.\n"))))
 
 (define (room-cmd-go-where room message)
 
 
 (define* (room-look-room room message
-                            ;; Either send it to the #:to-id of the message,
-                            ;; or to the sender of the message
-                            #:key (to-id (message-from message)))
+                         ;; Either send it to the #:to-id of the message,
+                         ;; or to the sender of the message
+                         #:key (to-id (message-from message)))
   "Command: Player asks to look around the room"
   (room-player-looks-around room to-id))