gameobj-occupants
gameobj-actions
- gameobj-self-destruct))
+ gameobj-self-destruct
+
+ dyn-ref))
;;; Gameobj
;;; =======
(define occupants
(message-ref replace-reply 'occupants #f))
;; Snarf all the occupants!
+ (display "replacing occupant\n")
(when occupants
(for-each
(lambda (occupant)
(list gameobj-replace-step-occupants))
(define (run-replacement actor message replace-steps)
- (define replaces (message-ref message 'replaces #f))
+ (define replaces (pk 'replace (message-ref message 'replace #f)))
(when replaces
(let ((replace-reply
- (<-wait actor replaces 'assist-replace)))
+ (pk 'replace-reply (<-wait actor replaces 'assist-replace))))
(for-each
(lambda (replace-step)
(replace-step actor replace-reply))
replace-steps))))
-
;; @@: This could be kind of a messy way of doing gameobj-init
;; stuff. If only we had generic methods :(
(define-mhandler (gameobj-init actor message)
"Your most basic game object init procedure.
Assists in its replacement of occupants if necessary and nothing else."
+ (display "gameobj init!\n")
(run-replacement actor message gameobj-replace-steps*))
(define (gameobj-goes-by gameobj)
"Vanilla method for assisting in self-replacement for live hacking"
(apply <-reply actor message
(gameobj-replace-data* actor)))
+
+\f
+;;; Utilities every gameobj has
+;;; ---------------------------
+
+(define (dyn-ref gameobj special-symbol)
+ "Dynamically look up a special object from the gm"
+ (match special-symbol
+ ;; if it's a symbol, look it up dynamically
+ ((? symbol? _)
+ (message-ref
+ (<-wait gameobj (slot-ref gameobj 'gm) 'lookup-special
+ #:symbol special-symbol)
+ 'val))
+ ;; if it's false, return nothing
+ ((#f #f))
+ ;; otherwise it's probably an address, return it as-is
+ (_ special-symbol)))