added dynamic linking approach to exits. live hacking rooms works! :D :D
[mudsync.git] / mudsync / gameobj.scm
index cb844d1e65ab01a983ba81da808bd194c2e08993..5f702efce85937c9d92ac4297353379364b5dd83 100644 (file)
@@ -33,7 +33,9 @@
 
             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)
@@ -307,3 +310,21 @@ By default, this is whether or not the generally-visible flag is set."
   "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)))