distinguish container-sub-commands and container-dom-commands
[mudsync.git] / mudsync / player.scm
index 45cb9743c635c82a100e115078ebaa8cfb4aa26e..78d9a01574efbed2f113f8e9f18fbd1d1e53cf63 100644 (file)
   #: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 (<player>
-            player-self-commands))
+  #:export (<player>))
 
 ;;; Players
 ;;; =======
 
-(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 "help" 'cmd-help)))
-
 (define-class <player> (<gameobj>)
   (username #:init-keyword #:username
             #:getter player-username)
 
-  (self-commands #:init-value (wrap 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-value
+           #:init-thunk
            (build-actions
             (init player-init)
             (handle-input player-handle-input)
@@ -84,8 +79,7 @@
      (apply <- winner-id cmd-action message-args))
     (#f
      (<- (gameobj-gm player) 'write-home
-         ;; #:text "? (type \"help\" for common commands)\n"
-         #:text "?\n"))))
+         #: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
   (define text-to-show
     (if (eq? inv-names '())
         "You aren't carrying anything.\n"
-        (apply string-append
-               "You are carrying:\n"
-               (map (lambda (item-name)
-                      (string-append "  * " item-name "\n"))
-                    inv-names))))
+        `((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)
                  #:player-id (actor-id player)))))
 
   ;; Ask the room for its commands
-  (define room-commands
+  (define room-dom-commands
+    ;; TODO: Map room id and sort
+    (mbody-receive (_ #:key commands)
+        (<-wait player-loc 'get-container-dom-commands
+                #:verb verb)
+      commands))
+
+  (define room-sub-commands
     ;; TODO: Map room id and sort
     (mbody-receive (_ #:key commands)
-        (<-wait player-loc 'get-container-commands
+        (<-wait player-loc 'get-container-sub-commands
                 #:verb verb)
       commands))
 
   (define co-occupants
     (remove
      (lambda (x) (equal? x (actor-id player)))
-     (mbody-receive (_ #:key occupants)
-         (<-wait player-loc 'get-occupants)
-       occupants)))
+     (mbody-val (<-wait player-loc 'get-occupants))))
 
   ;; @@: There's a race condition here if someone leaves the room
   ;;   during this, heh...
 
   ;; Append our own command handlers
   (define our-commands
-    (filter
-     (lambda (cmd)
-       (equal? (command-verbs cmd) verb))
-     (val-or-run
-      (slot-ref player 'self-commands))))
+    (class-rmeta-ref (class-of player) 'self-commands verb
+                     #:dflt '()))
 
   ;; Append our inventory's relevant command handlers
   (define inv-items
 
   ;; Now return a big ol sorted list of ((actor-id . command))
   (append
-   (sort-commands-append-actor room-commands
+   (sort-commands-append-actor room-dom-commands
                                player-loc '()) ; room doesn't go by anything
    (sort-commands-multi-actors co-occupant-commands)
    (sort-commands-append-actor our-commands
                                (actor-id player) '()) ; nor does player
-   (sort-commands-multi-actors inv-item-commands)))
+   (sort-commands-multi-actors inv-item-commands)
+   (sort-commands-append-actor room-sub-commands
+                               player-loc '())))
 
 (define (sort-commands-append-actor commands actor-id goes-by)
   (sort-commands-multi-actors