X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fplayer.scm;h=172b81072b4e85e98fcf8536f91be5a9a1dccae3;hp=3d1ec7288baf6c83387046b4612436546e1105c3;hb=095dde9158621c8bb3d690feaa0d525a76342eb9;hpb=a07b01054f0c8bd8dc2bc4e278ed6a00e339bc79 diff --git a/mudsync/player.scm b/mudsync/player.scm index 3d1ec72..172b810 100644 --- a/mudsync/player.scm +++ b/mudsync/player.scm @@ -39,7 +39,9 @@ (build-actions (init (wrap-apply player-init)) (handle-input (wrap-apply player-handle-input)) - (tell (wrap-apply player-tell)))) + (tell (wrap-apply player-tell)) + (disconnect-self-destruct (wrap-apply player-disconnect-self-destruct)) + (cmd-inventory (wrap-apply player-cmd-inventory)))) (define player-actions* (append player-actions @@ -48,17 +50,22 @@ (define player-dispatcher (simple-dispatcher player-actions*)) +(define player-self-commands + (list + (empty-command "inventory" 'cmd-inventory) + ;; aliases... + ;; @@: Should use an "alias" system for common aliases? + (empty-command "inv" 'cmd-inventory) + (empty-command "i" 'cmd-inventory))) + (define-class () (username #:init-keyword #:username #:getter player-username) - (self-commands - #:init-value '() - #:getter player-self-commands) + (self-commands #:init-value player-self-commands) (message-handler #:init-value - ;; @@: We're gonna need action inheritance real awful soon, huh? (wrap-apply player-dispatcher))) @@ -91,6 +98,34 @@ (<- player (gameobj-gm player) 'write-home #:text text)) +(define-mhandler (player-disconnect-self-destruct player message) + "Action routine for being told to disconnect and self destruct." + (define loc (gameobj-loc player)) + (when loc + (<- player loc 'tell-room + #:exclude (actor-id player) + #:text (format #f "~a disappears in a puff of entropy!\n" + (slot-ref player 'name)))) + (gameobj-self-destruct player)) + +(define-mhandler (player-cmd-inventory player message) + "Display the inventory for the player" + (define inv-names + (map + (lambda (inv-item) + (message-ref (<-wait player inv-item 'get-name) + 'val)) + (gameobj-occupants player))) + (define text-to-show + (if (eq? inv-names '()) + "You aren't carrying anything.\n" + (apply string-append + "You are carrying:\n" + (map (lambda (item-name) + (string-append " * " item-name "\n")) + inv-names)))) + (<- player (actor-id player) 'tell #:text text-to-show)) + ;;; Command handling ;;; ================ @@ -130,8 +165,6 @@ ;; Get all the co-occupants' commands (define co-occupant-commands - ;; TODO: Switch this to a fold. Ignore a result if it - ;; returns false for in the command response (fold (lambda (co-occupant prev) (let* ((result (<-wait player co-occupant 'get-commands @@ -148,9 +181,30 @@ ;; Append our own command handlers (define our-commands - (player-self-commands player)) - - ;; TODO: Append our inventory's relevant command handlers + (filter + (lambda (cmd) + (equal? (command-verbs cmd) verb)) + (val-or-run + (slot-ref player 'self-commands)))) + + ;; Append our inventory's relevant command handlers + (define inv-items + (gameobj-occupants player)) + (define inv-item-commands + (fold + (lambda (inv-item prev) + (let* ((result (<-wait player inv-item + 'get-contained-commands + #:verb verb)) + (commands (message-ref result 'commands)) + (goes-by (message-ref result 'goes-by))) + (append + (map (lambda (command) + (list command goes-by inv-item)) + commands) + prev))) + '() + inv-items)) ;; Now return a big ol sorted list of ((actor-id . command)) (append @@ -158,7 +212,8 @@ player-loc '()) ; room doesn't go by anything (sort-commands-multi-actors co-occupant-commands) (sort-commands-append-actor our-commands - (actor-id player) '()))) ; nor does player + (actor-id player) '()) ; nor does player + (sort-commands-multi-actors inv-item-commands))) (define (sort-commands-append-actor commands actor-id goes-by) (sort-commands-multi-actors @@ -175,7 +230,7 @@ (define (find-command-winner sorted-candidates line) "Find a command winner from a sorted list of candidates" ;; A cache of results from matchers we've already seen - ;; TODO: fill this in + ;; TODO: fill in this cache. This is a *critical* optimization! (define matcher-cache '()) (call/ec (lambda (return)