;;; Mudsync --- Live hackable MUD
-;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright © 2016 Christine Lemmer-Webber <cwebber@dustycloud.org>
;;;
;;; This file is part of Mudsync.
;;;
#: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)
(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