X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fgameobj.scm;h=cb844d1e65ab01a983ba81da808bd194c2e08993;hp=c34e89bb5540a90308686c64ec7e3fc6caf58b98;hb=36042544b6defa138f348f093f895722a472e1ba;hpb=10ff4122c37899d011ded00c5ebe1333f2477a34 diff --git a/mudsync/gameobj.scm b/mudsync/gameobj.scm index c34e89b..cb844d1 100644 --- a/mudsync/gameobj.scm +++ b/mudsync/gameobj.scm @@ -55,7 +55,8 @@ (goes-by (wrap-apply gameobj-act-goes-by)) (visible-name (wrap-apply gameobj-visible-name)) (self-destruct (wrap-apply gameobj-act-self-destruct)) - (tell (wrap-apply gameobj-tell-no-op)))) + (tell (wrap-apply gameobj-tell-no-op)) + (assist-replace (wrap-apply gameobj-act-assist-replace)))) ;;; *all* game components that talk to players should somehow ;;; derive from this class. @@ -109,11 +110,37 @@ #:val (slot-ref actor slot)))) +(define (gameobj-replace-step-occupants actor replace-reply) + (define occupants + (message-ref replace-reply 'occupants #f)) + ;; Snarf all the occupants! + (when occupants + (for-each + (lambda (occupant) + (<-wait actor occupant 'set-loc! + #:loc (actor-id actor))) + occupants))) + +(define gameobj-replace-steps* + (list gameobj-replace-step-occupants)) + +(define (run-replacement actor message replace-steps) + (define replaces (message-ref message 'replaces #f)) + (when replaces + (let ((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. Does nothing." - #f) + "Your most basic game object init procedure. +Assists in its replacement of occupants if necessary and nothing else." + (run-replacement actor message gameobj-replace-steps*)) (define (gameobj-goes-by gameobj) "Find the name we go by. Defaults to #:name if nothing else provided." @@ -263,3 +290,20 @@ By default, this is whether or not the generally-visible flag is set." ;; Unless an actor has a tell message, we just ignore it (define gameobj-tell-no-op (const 'no-op)) + +(define (gameobj-replace-data-occupants actor) + "The general purpose list of replacement data" + (list #:occupants (hash-map->list (lambda (occupant _) occupant) + (slot-ref actor 'occupants)))) + +(define (gameobj-replace-data* actor) + ;; For now, just call gameobj-replace-data-occupants. + ;; But there may be more in the future! + (gameobj-replace-data-occupants actor)) + +;; So sad that objects must assist in their replacement ;_; +;; But that's life in a live hacked game! +(define (gameobj-act-assist-replace actor message) + "Vanilla method for assisting in self-replacement for live hacking" + (apply <-reply actor message + (gameobj-replace-data* actor)))