X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=mudsync%2Froom.scm;h=ed4eafe46eec597ae393d46c3b07ab35a61fd801;hb=c2a2f4b942731c1ee6be479cc372c89aab88013a;hp=8f1e0a330d9ab2323ba495b9ac2b0185f5111eb6;hpb=1c10b6fdd8662522b6a2103f7ad59c588acfa2dc;p=mudsync.git diff --git a/mudsync/room.scm b/mudsync/room.scm index 8f1e0a3..ed4eafe 100644 --- a/mudsync/room.scm +++ b/mudsync/room.scm @@ -1,5 +1,5 @@ ;;; Mudsync --- Live hackable MUD -;;; Copyright © 2016 Christopher Allan Webber +;;; Copyright © 2016 Christine Lemmer-Webber ;;; ;;; This file is part of Mudsync. ;;; @@ -32,7 +32,8 @@ ;;; ===== (define-class () - (to #:init-keyword #:to) + (to #:init-keyword #:to + #:init-value #f) ;; Name of the room (@@: Should this be names?) (name #:getter exit-name #:init-keyword #:name) @@ -60,6 +61,10 @@ ;;; Rooms ;;; ===== +(define (exit-shorthand name) + (lambda (room message) + (room-cmd-go room message #:direct-obj name))) + ;; TODO: Subclass from container? (define-class () ;; A list of @@ -75,7 +80,18 @@ ("go" ((empty-command cmd-go-where) (loose-direct-command cmd-go))) (("say" "\"" "'") ((greedy-command cmd-say))) - (("emote" "/me") ((greedy-command cmd-emote))))) + (("emote" "/me") ((greedy-command cmd-emote))) + ;; movement aliases + (("n" "north") ((empty-command go-north))) + (("ne" "northeast") ((empty-command go-northeast))) + (("e" "east") ((empty-command go-east))) + (("se" "southeast") ((empty-command go-southeast))) + (("s" "south") ((empty-command go-south))) + (("sw" "southwest") ((empty-command go-southwest))) + (("w" "west") ((empty-command go-west))) + (("nw" "northwest") ((empty-command go-northwest))) + (("u" "up") ((empty-command go-up))) + (("d" "down") ((empty-command go-down))))) (container-sub-commands #:allocation #:each-subclass @@ -96,13 +112,40 @@ (cmd-look-room room-look-room) (cmd-look-at-from-room room-look-dont-see-it) (cmd-say room-cmd-say) - (cmd-emote room-cmd-emote)))) + (cmd-emote room-cmd-emote) + ;; movement aliases + (go-north (exit-shorthand "north")) + (go-northeast (exit-shorthand "northeast")) + (go-east (exit-shorthand "east")) + (go-southeast (exit-shorthand "southeast")) + (go-south (exit-shorthand "south")) + (go-southwest (exit-shorthand "southwest")) + (go-west (exit-shorthand "west")) + (go-northwest (exit-shorthand "northwest")) + (go-up (exit-shorthand "up")) + (go-down (exit-shorthand "down"))))) + +(define common-exit-aliases + '(("n" . "north") + ("ne" . "northeast") + ("e" . "east") + ("se" . "southeast") + ("s" . "south") + ("sw" . "southwest") + ("w" . "west") + ("nw" . "northwest") + ("u" . "up") + ("d" . "down"))) + +(define (dealias-exit-name exit-name) + (or (assoc-ref common-exit-aliases exit-name) + exit-name)) (define* (room-cmd-go room message #:key direct-obj) (define exit (find (lambda (exit) - (equal? (exit-name exit) direct-obj)) + (equal? (exit-name exit) (dealias-exit-name direct-obj))) (room-exits room))) (define to-address (if exit ;; Get the exit, but resolve it dynamically @@ -118,34 +161,41 @@ (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))))))) + (cond + ;; The exit itself objects to moving + ((not can-traverse?) + (<- 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))) + ;; to-address points nowhere, or exit not set. + ((not exit) + (<- player 'tell + #:text '((i "Yikes!") " Something weird is going on. " + "It seems like this exit leads nowhere, " + "in a programming bug kind of way. " + "Maybe tell an administrator?"))) + ;; looks like we can go, so let's go! + (else + ;; 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)))))) (else (<- player 'tell #:text "You don't see any way to go there.\n")))) @@ -161,7 +211,7 @@ ;; Get the room text (define room-text `((strong "=> " ,(slot-ref room 'name) " <=") - (p ,(slot-ref room 'desc)))) + (p ,(gameobj-desc room)))) ;; Get a list of other things the player would see in the room (define occupant-names-all