X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fgameobj.scm;h=5f702efce85937c9d92ac4297353379364b5dd83;hp=cb844d1e65ab01a983ba81da808bd194c2e08993;hb=50cd2aba8f13ec7aecb58a683aa55ae665cf83ab;hpb=36042544b6defa138f348f093f895722a472e1ba diff --git a/mudsync/gameobj.scm b/mudsync/gameobj.scm index cb844d1..5f702ef 100644 --- a/mudsync/gameobj.scm +++ b/mudsync/gameobj.scm @@ -33,7 +33,9 @@ gameobj-occupants gameobj-actions - gameobj-self-destruct)) + gameobj-self-destruct + + dyn-ref)) ;;; Gameobj ;;; ======= @@ -114,6 +116,7 @@ (define occupants (message-ref replace-reply 'occupants #f)) ;; Snarf all the occupants! + (display "replacing occupant\n") (when occupants (for-each (lambda (occupant) @@ -125,21 +128,21 @@ (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))) + + +;;; 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)))