+ (<-wait player player-loc
+ 'get-container-commands
+ #:verb verb)
+ 'commands))
+
+ ;; All the co-occupants of the room (not including ourself)
+ (define co-occupants
+ (remove
+ (lambda (x) (equal? x (actor-id player)))
+ (message-ref
+ (<-wait player player-loc 'get-occupants)
+ 'occupants)))
+
+ ;; @@: There's a race condition here if someone leaves the room
+ ;; during this, heh...
+ ;; I'm not sure it can be solved, but "lag" on the race can be
+ ;; reduced maybe?
+
+ ;; Get all the co-occupants' commands
+ (define co-occupant-commands
+ (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
+ (define our-commands
+ (filter
+ (lambda (cmd)
+ (equal? (command-verbs cmd) verb))
+ (val-or-run
+ (slot-ref player 'self-commands))))
+
+ ;; Append our inventory's relevant command handlers
+ (define inv-items
+ (gameobj-occupants player))
+ (define inv-item-commands
+ (fold
+ (lambda (inv-item prev)
+ (let* ((result (<-wait player inv-item
+ 'get-contained-commands
+ #:verb verb))
+ (commands (message-ref result 'commands))
+ (goes-by (message-ref result 'goes-by)))
+ (append
+ (map (lambda (command)
+ (list command goes-by inv-item))
+ commands)
+ prev)))
+ '()
+ inv-items))
+
+ ;; Now return a big ol sorted list of ((actor-id . command))
+ (append
+ (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
+ (actor-id player) '()) ; nor does player
+ (sort-commands-multi-actors inv-item-commands)))
+
+(define (sort-commands-append-actor commands actor-id goes-by)
+ (sort-commands-multi-actors
+ (map (lambda (command) (list command goes-by actor-id)) commands)))
+
+(define (sort-commands-multi-actors actors-and-commands)
+ (sort
+ actors-and-commands
+ (lambda (x y)
+ (> (command-priority (car x))
+ (command-priority (car y))))))
+