X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fgameobj.scm;h=5f702efce85937c9d92ac4297353379364b5dd83;hp=c34e89bb5540a90308686c64ec7e3fc6caf58b98;hb=50cd2aba8f13ec7aecb58a683aa55ae665cf83ab;hpb=10ff4122c37899d011ded00c5ebe1333f2477a34 diff --git a/mudsync/gameobj.scm b/mudsync/gameobj.scm index c34e89b..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 ;;; ======= @@ -55,7 +57,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 +112,38 @@ #: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! + (display "replacing occupant\n") + (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 (pk 'replace (message-ref message 'replace #f))) + (when replaces + (let ((replace-reply + (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. Does nothing." - #f) + "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) "Find the name we go by. Defaults to #:name if nothing else provided." @@ -263,3 +293,38 @@ 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))) + + +;;; 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)))