gameobj-loc
gameobj-gm
gameobj-name
- gameobj-name-f))
+ gameobj-name-f
+ gameobj-actions))
+
+;;; Gameobj
+;;; =======
+
+
+;;; Actions supported by all gameobj
+(define gameobj-actions
+ (build-actions
+ (get-commands (wrap-apply gameobj-get-commands))
+ (get-container-commands (wrap-apply gameobj-get-container-commands))
+ (get-children (wrap-apply gameobj-get-children))
+ (add-occupant! (wrap-apply gameobj-add-child!))
+ (remove-occupant! (wrap-apply gameobj-remove-child!))
+ (set-loc! (wrap-apply gameobj-set-loc!))))
;;; *all* game components that talk to players should somehow
;;; derive from this class.
;; location id
(loc #:init-value #f
#:accessor gameobj-loc)
+
+ ;; Uses a hash table like a set (values ignored)
+ (occupants #:init-thunk make-hash-table
+ #:accessor gameobj-occupants)
+
;; game master id
(gm #:init-keyword #:gm
#:getter gameobj-gm)
(name #:init-keyword #:name
#:accessor gameobj-name)
+ (desc #:init-value ""
+ #:init-keyword #:desc)
+
;; how to print our name
(name-f #:init-keyword #:name-f
#:getter gameobj-name-f
(commands #:init-value '())
;; Commands we can handle by being something's container
- (contain-commands #:init-value '()))
+ (container-commands #:init-value '())
+ (message-handler
+ #:init-value
+ (simple-dispatcher gameobj-actions)))
+
+
+;;; gameobj message handlers
+;;; ========================
+
+(define-mhandler (gameobj-get-commands actor message verb)
+ (<-reply actor message #:commands (slot-ref actor 'commands)))
+
+(define-mhandler (gameobj-get-container-commands actor message verb)
+ (<-reply actor message #:commands (slot-ref actor 'container-commands)))
+
+(define-mhandler (gameobj-get-children actor message)
+ (define children
+ (hash-map->list (lambda (key val) key)
+ (gameobj-children actor)))
+
+ (<-reply actor message
+ #:children children))
+
+(define-mhandler (gameobj-set-loc! player message id)
+ (format #t "DEBUG: Location set to ~s for player ~s\n"
+ id (actor-id-actor player))
+ (set! (gameobj-loc player) id))
(define (gameobj-simple-name-f gameobj)
;;; Players
;;; =======
+(define player-actions
+ (build-actions
+ (init (wrap-apply player-init!))
+ (handle-input (wrap-apply player-handle-input))))
+
+(define player-actions*
+ (append player-actions
+ gameobj-actions))
+
(define-class <player> (<gameobj>)
(username #:init-keyword #:username
#:accessor player-username)
(message-handler
#:init-value
;; @@: We're gonna need action inheritance real awful soon, huh?
- (make-action-dispatch
- (set-loc! (wrap-apply player-set-loc!))
- (init (wrap-apply player-init!))
- (handle-input (wrap-apply player-handle-input)))))
+ (simple-dispatcher player-actions*)))
-;;; player message handlers
-(define-mhandler (player-set-loc! player message id)
- (format #t "DEBUG: Location set to ~s for player ~s\n"
- id (actor-id-actor player))
- (set! (gameobj-loc player) id))
+;;; player message handlers
(define-mhandler (player-init! player message)
(player-look-around player))
#: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