X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=inline;f=mudsync%2Fplayer.scm;h=78d9a01574efbed2f113f8e9f18fbd1d1e53cf63;hb=ef09bc5f6efa5a9883eea63b983052ba1ad20e3c;hp=42359bd47db3a116391a788ed8bb39964d787ace;hpb=d13325f5f6eba20c808636948432dcdff4e138f6;p=mudsync.git
diff --git a/mudsync/player.scm b/mudsync/player.scm
index 42359bd..78d9a01 100644
--- a/mudsync/player.scm
+++ b/mudsync/player.scm
@@ -17,11 +17,19 @@
;;; along with Mudsync. If not, see .
(define-module (mudsync player)
+ #:use-module (mudsync command)
#:use-module (mudsync gameobj)
- #:use-module (8sync systems actors)
+ #:use-module (mudsync game-master)
+ #:use-module (mudsync parser)
+ #:use-module (8sync actors)
#:use-module (8sync agenda)
+ #:use-module (8sync rmeta-slot)
+ #:use-module (ice-9 control)
#:use-module (ice-9 format)
+ #:use-module (ice-9 match)
#:use-module (oop goops)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
#:export ())
;;; Players
@@ -29,42 +37,222 @@
(define-class ()
(username #:init-keyword #:username
- #:accessor player-username)
- ;; Connection id
- (client #:accessor player-client)
+ #:getter player-username)
- (self-commands
- #:init-value '()
- #:accessor player-self-commands)
+ (self-commands #:allocation #:each-subclass
+ #:init-thunk
+ (build-commands
+ (("inventory" "inv" "i") ((empty-command cmd-inventory)))
+ ("help" ((empty-command cmd-help)))))
+
+ (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))))
- (message-handler
- #:init-value
- (make-action-dispatch
- (set-loc! (wrap-apply player-set-loc!))
- (init (wrap-apply player-init!)))))
;;; player message handlers
-(define-mhandler (player-set-loc! player message id)
- (format #t "DEBUG: Location set to ~s for player ~s\n"
- id (actor-id-actor player))
- (set! (gameobj-loc player) id))
-
-(define-mhandler (player-init! player message)
- (player-look-around player))
-
-;;; player methods
-
-(define (player-look-around player)
- (define room-name
- (message-ref
- (<-wait player (gameobj-loc player) 'get-name)
- 'val))
- (define room-desc
- (message-ref
- (<-wait player (gameobj-loc player) 'get-desc)
- 'val))
- (define message-text
- (format #f "**~a**\n~a\n" room-name room-desc))
-
- (<- player (gameobj-gm player) 'write-home #:text message-text))
+(define (player-init player message)
+ ;; Look around the room we're in
+ (<- (gameobj-loc player) 'look-room))
+
+
+(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))
+
+ (define command-candidates
+ (player-gather-command-handlers player input-verb))
+
+ (define winner
+ (find-command-winner command-candidates input-rest))
+
+ (match winner
+ ((cmd-action winner-id message-args)
+ (apply <- winner-id cmd-action message-args))
+ (#f
+ (<- (gameobj-gm player) 'write-home
+ #:text "Sorry, I didn't understand that? (type \"help\" for common commands)\n"))))
+
+(define* (player-tell player message #:key text)
+ (<- (gameobj-gm player) 'write-home
+ #:text text))
+
+(define (player-disconnect-self-destruct player message)
+ "Action routine for being told to disconnect and self destruct."
+ (define loc (gameobj-loc player))
+ (when loc
+ (<- 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 (player-cmd-inventory player message)
+ "Display the inventory for the player"
+ (define inv-names
+ (map
+ (lambda (inv-item)
+ (mbody-val (<-wait inv-item 'get-name)))
+ (gameobj-occupants player)))
+ (define text-to-show
+ (if (eq? inv-names '())
+ "You aren't carrying anything.\n"
+ `((p "You are carrying:")
+ (ul ,(map (lambda (item-name)
+ `(li ,item-name))
+ inv-names)))))
+ (<- (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]