X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Froom.scm;h=8f1e0a330d9ab2323ba495b9ac2b0185f5111eb6;hp=3d860496e2fc4113e410f9c45483bb06f999057c;hb=1c10b6fdd8662522b6a2103f7ad59c588acfa2dc;hpb=72bb4674c8058ada141da9f62a866e06381a8228 diff --git a/mudsync/room.scm b/mudsync/room.scm index 3d86049..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)) @@ -67,17 +67,22 @@ #:init-keyword #:exits #:getter room-exits) - (container-commands + (container-dom-commands #:allocation #:each-subclass #:init-thunk (build-commands - ("look" ((loose-direct-command cmd-look-at) - (empty-command cmd-look-room))) + (("l" "look") ((empty-command cmd-look-room))) ("go" ((empty-command cmd-go-where) (loose-direct-command cmd-go))) (("say" "\"" "'") ((greedy-command cmd-say))) (("emote" "/me") ((greedy-command cmd-emote))))) + (container-sub-commands + #:allocation #:each-subclass + #:init-thunk + (build-commands + (("l" "look") ((loose-direct-command cmd-look-at-from-room))))) + (actions #:allocation #:each-subclass #:init-thunk (build-actions @@ -89,7 +94,7 @@ ;; in this case the command is the same version as the normal ;; look-room version (cmd-look-room room-look-room) - (cmd-look-at room-look-at) + (cmd-look-at-from-room room-look-dont-see-it) (cmd-say room-cmd-say) (cmd-emote room-cmd-emote)))) @@ -104,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) @@ -174,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)) @@ -193,25 +218,10 @@ (slot-ref room 'occupants))) #f))) -(define %formless-desc - "You don't see anything special.") - -(define* (room-look-at room message #:key direct-obj) - "Look at a specific object in the room." - (define matching-object - (room-find-thing-called room direct-obj)) - - (cond - (matching-object - (let ((obj-desc - (mbody-val (<-wait matching-object 'get-desc - #:whos-looking (message-from message))))) - (if obj-desc - (<- (message-from message) 'tell #:text obj-desc) - (<- (message-from message) 'tell #:text %formless-desc)))) - (else - (<- (message-from message) 'tell - #:text "You don't see that here, so you can't look at it.\n")))) +(define* (room-look-dont-see-it room message #:key direct-obj) + "In general, if we get to this point, we didn't find something to look at." + (<- (message-from message) 'tell + #:text "You don't see that here, so you can't look at it.\n")) (define* (room-tell-room room text #:key exclude wait)