From: Christopher Allan Webber Date: Mon, 30 Jan 2017 17:57:59 +0000 (-0600) Subject: Traversal checks, plus flavortext X-Git-Tag: fosdem-2017~31 X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=1c10b6fdd8662522b6a2103f7ad59c588acfa2dc;p=mudsync.git Traversal checks, plus flavortext --- diff --git a/mudsync/room.scm b/mudsync/room.scm index 69385f6..8f1e0a3 100644 --- a/mudsync/room.scm +++ b/mudsync/room.scm @@ -47,13 +47,13 @@ (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)) @@ -109,25 +109,45 @@ ;; 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) @@ -179,9 +199,9 @@ (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))