- ((cmd-take-from hackthena-cmd-take-from)))
-
-(define* (hackthena-cmd-take-from gameobj message
- #:key direct-obj indir-obj preposition
- (player (message-from message)))
- (define keyboard-goes-by
- (mbody-val (<-wait (dyn-ref gameobj 'grand-hallway:keyboard) 'goes-by)))
- (define disc-platter-goes-by
- (mbody-val (<-wait (dyn-ref gameobj 'grand-hallway:disc-platter) 'goes-by)))
-
- (cond ((member direct-obj keyboard-goes-by)
- (<- player 'tell
- #:text `("Are you kidding? Do you know how hard it is to find "
- "a Knight Keyboard? There's no way she's going "
- "to give that up.")))
- ((member direct-obj disc-platter-goes-by)
- 'TODO)
- (else
- (<- player 'tell
- #:text
- `("Hackthena doesn't appear to be holding " ,direct-obj
- ".")))))
-
+ ((cmd-take-from hackthena-take-from-proxy)))
+
+(define* (hackthena-take-from-proxy gameobj message
+ #:key direct-obj indir-obj preposition
+ (player (message-from message)))
+ (call/ec
+ (lambda (escape)
+ (for-each
+ (lambda (obj-sym)
+ (define obj-id (dyn-ref gameobj obj-sym))
+ (define goes-by
+ (mbody-val (<-wait obj-id 'goes-by)))
+ (when (ci-member direct-obj goes-by)
+ (<- obj-id 'cmd-take #:direct-obj direct-obj #:player player)
+ (escape)))
+ '(grand-hallway:keyboard
+ grand-hallway:disc-platter grand-hallway:hackthena-horns))
+
+ (<- player 'tell
+ #:text
+ `("Hackthena doesn't appear to be holding " ,direct-obj ".")))))