X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fplayer.scm;h=bfa7ca88b0e8911810a43246cbe59ad905ba0845;hp=a07c141fd080456615777b21ae85407df0acd937;hb=106536778bbd8ad0cc850cb3ef7dcc5e2499eee2;hpb=cd40c01c4ac301e7d991e4df4d17d2c693d11d05 diff --git a/mudsync/player.scm b/mudsync/player.scm index a07c141..bfa7ca8 100644 --- a/mudsync/player.scm +++ b/mudsync/player.scm @@ -21,7 +21,7 @@ #:use-module (mudsync gameobj) #:use-module (mudsync game-master) #:use-module (mudsync parser) - #:use-module (8sync systems actors) + #:use-module (8sync actors) #:use-module (8sync agenda) #:use-module (ice-9 control) #:use-module (ice-9 format) @@ -35,48 +35,40 @@ ;;; Players ;;; ======= -(define player-actions - (build-actions - (init (wrap-apply player-init)) - (handle-input (wrap-apply player-handle-input)) - (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 - gameobj-actions)) - -(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))) + (empty-command "i" 'cmd-inventory) + (empty-command "help" 'cmd-help))) (define-class () (username #:init-keyword #:username #:getter player-username) - (self-commands #:init-value player-self-commands) + (self-commands #:init-value (wrap player-self-commands)) - (message-handler - #:init-value - (wrap-apply player-dispatcher))) + (actions #:allocation #:each-subclass + #:init-thunk + (build-actions + (init player-init) + (handle-input player-handle-input) + (tell player-tell) + (disconnect-self-destruct player-disconnect-self-destruct) + (cmd-inventory player-cmd-inventory) + (cmd-help player-cmd-help)))) ;;; player message handlers -(define-mhandler (player-init player message) +(define (player-init player message) ;; Look around the room we're in - (<- player (gameobj-loc player) 'look-room)) + (<- (gameobj-loc player) 'look-room)) -(define-mhandler (player-handle-input player message input) +(define* (player-handle-input player message #:key input) (define split-input (split-verb-and-rest input)) (define input-verb (car split-input)) (define input-rest (cdr split-input)) @@ -89,32 +81,31 @@ (match winner ((cmd-action winner-id message-args) - (apply <- player winner-id cmd-action message-args)) + (apply <- winner-id cmd-action message-args)) (#f - (<- player (gameobj-gm player) 'write-home - #:text "Huh?\n")))) + (<- (gameobj-gm player) 'write-home + #:text "Sorry, I didn't understand that? (type \"help\" for common commands)\n")))) -(define-mhandler (player-tell player message text) - (<- player (gameobj-gm player) 'write-home +(define* (player-tell player message #:key text) + (<- (gameobj-gm player) 'write-home #:text text)) -(define-mhandler (player-disconnect-self-destruct player message) +(define (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 + (<- 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) +(define (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)) + (mbody-val (<-wait inv-item 'get-name))) (gameobj-occupants player))) (define text-to-show (if (eq? inv-names '()) @@ -124,7 +115,28 @@ (map (lambda (item-name) (string-append " * " item-name "\n")) inv-names)))) - (<- player (actor-id player) 'tell #:text text-to-show)) + (<- (actor-id player) 'tell #:text text-to-show)) + +(define (player-cmd-help player message) + (<- (actor-id player) 'tell + #:text '((strong "** Mudsync Help **")(br) + (p "You're playing Mudsync, a multiplayer text-adventure. " + "Type different commands to interact with your surroundings " + "and other players.") + (p "Some common commands:" + (ul (li (strong "say ") " -- " + "Chat with other players in the same room. " + "(Also aliased to the " (b "\"") " character.)") + (li (strong "look") " -- " + "Look around the room you're in.") + (li (strong "look [at] ") " -- " + "Examine a particular object.") + (li (strong "go ") " -- " + "Move to another room in direction."))) + (p "Different objects can be interacted with in different ways. " + "For example, if there's a bell in the same room as you, " + "you might try typing " (em "ring bell") + " and see what happens.")))) ;;; Command handling @@ -144,19 +156,18 @@ ;; Ask the room for its commands (define room-commands ;; TODO: Map room id and sort - (message-ref - (<-wait player player-loc - 'get-container-commands - #:verb verb) - 'commands)) + (mbody-receive (_ #:key commands) + (<-wait player-loc 'get-container-commands + #:verb verb) + commands)) ;; All the co-occupants of the room (not including ourself) (define co-occupants (remove (lambda (x) (equal? x (actor-id player))) - (message-ref - (<-wait player player-loc 'get-occupants) - 'occupants))) + (mbody-receive (_ #:key occupants) + (<-wait player-loc 'get-occupants) + occupants))) ;; @@: There's a race condition here if someone leaves the room ;; during this, heh... @@ -167,10 +178,9 @@ (define co-occupant-commands (fold (lambda (co-occupant prev) - (let* ((result (<-wait player co-occupant 'get-commands - #:verb verb)) - (commands (message-ref result 'commands)) - (goes-by (message-ref result 'goes-by))) + (mbody-receive (_ #:key commands goes-by) + (<-wait co-occupant 'get-commands + #:verb verb) (append (map (lambda (command) (list command goes-by co-occupant)) @@ -193,11 +203,9 @@ (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))) + (mbody-receive (_ #:key commands goes-by) + (<-wait inv-item 'get-contained-commands + #:verb verb) (append (map (lambda (command) (list command goes-by inv-item))