added dynamic linking approach to exits. live hacking rooms works! :D :D
[mudsync.git] / mudsync / player.scm
index 00b28edde4cbeab67239e2266dd462d06469c9d6..6e4be5738b2f289ed93decb95a258f2df22f0073 100644 (file)
@@ -39,7 +39,8 @@
   (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)))