+
+(define-class <semi-edible-chatty-npc> (<chatty-npc>)
+ (commands
+ #:allocation #:each-subclass
+ #:init-thunk (build-commands
+ (("eat") ((direct-command cmd-eat)))))
+ (eat-catchphrase
+ #:init-keyword #:eat-catchphrase
+ #:accessor .eat-catchphrase
+ #:init-value "Should you really eat this?")
+ (actions #:allocation #:each-subclass
+ #:init-thunk
+ (build-actions
+ (cmd-eat cmd-eat-semi-edible-chatty-npc))))
+
+(define* (cmd-eat-semi-edible-chatty-npc actor message #:key direct-obj)
+ (<- (message-from message) 'tell
+ #:text (.eat-catchphrase actor)))
+
+(define-class <dancers> (<chatty-npc>)
+ (commands
+ #:allocation #:each-subclass
+ #:init-thunk (build-commands
+ (("dance") ((direct-command cmd-dance)))))
+ (actions #:allocation #:each-subclass
+ #:init-thunk
+ (build-actions
+ (cmd-dance cmd-dance-dancers))))
+
+(define* (cmd-dance-dancers actor message #:key direct-obj)
+ (define player (message-from message))
+ (define player-loc (mbody-val (<-wait player 'get-loc)))
+ (define player-name (mbody-val (<-wait player 'get-name)))
+ (<- (message-from message) 'tell
+ #:text '((p "You join in dancing with the dancers. You spin and
+get woozy... you feel wonderful... like you could dance forever...")
+ (p "You step out just in time, lest you be caught in
+the dancing for eternity!")))
+ (<- player-loc 'tell-room
+ #:text `((p ,player-name " begins dancing with the fairies and
+spins around and around... as if they might dance forever!")
+ (p "But " ,player-name " steps back just in time!
+Their eyes are cloudy and woozy, but they look happy..."))
+ #:exclude player))
+