X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fplayer.scm;h=6e4be5738b2f289ed93decb95a258f2df22f0073;hp=63af65e77a8f84071f5780cfd486f6a5fb183717;hb=50cd2aba8f13ec7aecb58a683aa55ae665cf83ab;hpb=8a2341e98f75a5df295f49c08485eb6339dda19e diff --git a/mudsync/player.scm b/mudsync/player.scm index 63af65e..6e4be57 100644 --- a/mudsync/player.scm +++ b/mudsync/player.scm @@ -37,8 +37,10 @@ (define player-actions (build-actions - (init (wrap-apply player-init!)) - (handle-input (wrap-apply player-handle-input)))) + (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)))) (define player-actions* (append player-actions @@ -49,13 +51,11 @@ (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) + #:getter player-self-commands) (message-handler #:init-value @@ -65,45 +65,42 @@ ;;; player message handlers -(define-mhandler (player-init! player message) - (player-look-around player)) +(define-mhandler (player-init player message) + ;; Look around the room we're in + (<- player (gameobj-loc player) 'look-room)) (define-mhandler (player-handle-input player message input) (define split-input (split-verb-and-rest input)) - (define input-verb (pk 'input-verb (car split-input))) - (define input-rest (pk 'input-rest (cdr split-input))) + (define input-verb (car split-input)) + (define input-rest (cdr split-input)) (define command-candidates - (pk 'candidates - (player-gather-command-handlers player input-verb))) + (player-gather-command-handlers player input-verb)) (define winner - (pk 'winner (find-command-winner command-candidates input-rest))) + (find-command-winner command-candidates input-rest)) (match winner ((cmd-action winner-id message-args) - (apply send-message player (pk 'winner-id winner-id) (pk 'cmd-action cmd-action) (pk 'message-args message-args))) + (apply send-message player winner-id cmd-action message-args)) (#f (<- player (gameobj-gm player) 'write-home #:text "Huh?\n")))) +(define-mhandler (player-tell player message text) + (<- player (gameobj-gm player) 'write-home + #:text text)) -;;; 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-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)) ;;; Command handling @@ -146,14 +143,18 @@ (define co-occupant-commands ;; TODO: Switch this to a fold. Ignore a result if it ;; returns false for in the command response - (map - (lambda (co-occupant) - (let ((result (<-wait player co-occupant 'get-commands - #:verb verb))) - (list - (message-ref result 'commands) - (message-ref result 'goes-by) - co-occupant))) + (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))) + (append + (map (lambda (command) + (list command goes-by co-occupant)) + commands) + prev))) + '() co-occupants)) ;; Append our own command handlers @@ -164,7 +165,7 @@ ;; Now return a big ol sorted list of ((actor-id . command)) (append - (sort-commands-append-actor (pk 'room-commands room-commands) + (sort-commands-append-actor room-commands player-loc '()) ; room doesn't go by anything (sort-commands-multi-actors co-occupant-commands) (sort-commands-append-actor our-commands @@ -178,14 +179,14 @@ (sort actors-and-commands (lambda (x y) - (> (command-priority (car (pk 'x x))) - (command-priority (car (pk 'y y))))))) + (> (command-priority (car x)) + (command-priority (car y)))))) (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) @@ -201,7 +202,7 @@ actor-goes-by matched)) ; matched is kwargs if truthy (return (list (command-action command) - (pk 'earlier-actor-id actor-id) matched)) + actor-id matched)) #f)))) sorted-candidates) #f)))