(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))))
(define player-actions*
(append player-actions
(define-class <player> (<gameobj>)
(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
(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"))))
(<- 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))
+
;;; Command handling
;;; ================
;; returns false for in the command response
(fold
(lambda (co-occupant prev)
- (display "pre-message\n")
(let* ((result (<-wait player co-occupant 'get-commands
#:verb verb))
(commands (message-ref result 'commands))
(goes-by (message-ref result 'goes-by)))
- (display "post-message\n")
(append
(map (lambda (command)
(list command goes-by co-occupant))
;; 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
(sort
actors-and-commands
(lambda (x y)
- (pk 'x x)
- (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)
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)))