#:use-module (8sync agenda)
#:use-module (oop goops)
#:export (<room>
+ room-actions
+ room-actions*
+
<exit>))
;;; Rooms
(full-command "go" cmatch-just-verb always 'go-where)
(full-command "go" cmatch-direct-obj always 'go-exit)))
+
;; TODO: Subclass from container?
(define-class <room> (<gameobj>)
- (desc #:init-value ""
- #:init-keyword #:desc)
- ;; TODO: Switch this to be loc based
- ;; Uses a hash table like a set (values ignored)
- (occupants #:init-thunk make-hash-table)
;; A list of <exit>
(exits #:init-value '()
#:getter room-exits)
- ;; @@: Maybe eventually <room> will inherit from some more general
- ;; game object class
(contain-commands
#:init-value %room-contain-commands)
(message-handler
#:allocation #:each-subclass
- #:init-value
- (make-action-dispatch
- ;; desc == description
- (get-desc
- (simple-slot-getter 'desc))
- (get-name
- (simple-slot-getter 'name))
- ((register-occupant! actor message who)
- "Register an actor as being a occupant of this room"
- (hash-set! (slot-ref actor 'occupants) who #t))
- ((evict-occupant! actor message who)
- "De-register an occupant removed from the room"
- (hash-remove! (slot-ref actor 'occupants) who))
- (wire-exits! (wrap-apply room-wire-exits!)))))
+ ;; @@: Can remove this indirection once things settle
+ #:init-value (wrap-apply room-action-dispatch)))
+
+
+(define room-actions
+ (build-actions
+ ;; desc == description
+ (wire-exits! (wrap-apply room-wire-exits!))))
+
+(define room-actions*
+ (append room-actions gameobj-actions))
+
+(define room-action-dispatch
+ (simple-dispatcher room-actions*))
+
(define (room-wire-exits! room message)
"Actually hook up the rooms' exit addresses to the rooms they