X-Git-Url: https://jxself.org/git/?p=mudsync.git;a=blobdiff_plain;f=mudsync%2Fgameobj.scm;h=00858522281f2bc5257b6b13e51fe2c14aad469c;hp=e4146931bc7f7b2b830b7369ac58bae162f953be;hb=4d4af0656b0402e630eea9393420197152945e5b;hpb=8df43947a29393266da4df9e43f7656e56558fd6 diff --git a/mudsync/gameobj.scm b/mudsync/gameobj.scm index e414693..0085852 100644 --- a/mudsync/gameobj.scm +++ b/mudsync/gameobj.scm @@ -23,6 +23,7 @@ #:use-module (mudsync command) #:use-module (8sync actors) #:use-module (8sync agenda) + #:use-module (8sync rmeta-slot) #:use-module (srfi srfi-1) #:use-module (ice-9 format) #:use-module (ice-9 match) @@ -71,13 +72,16 @@ #:init-keyword #:desc) ;; Commands we can handle - (commands #:init-value '()) + (commands #:allocation #:each-subclass + #:init-thunk (build-commands)) ;; Commands we can handle by being something's container - (container-commands #:init-value '()) + (container-commands #:allocation #:each-subclass + #:init-thunk (build-commands)) ;; Commands we can handle by being contained by something else - (contained-commands #:init-value '()) + (contained-commands #:allocation #:each-subclass + #:init-thunk (build-commands)) ;; Most objects are generally visible by default (generally-visible #:init-value #t @@ -173,36 +177,30 @@ Assists in its replacement of occupants if necessary and nothing else." (val-or-proc) val-or-proc)) -(define (filter-commands commands verb) - (filter - (lambda (cmd) - (equal? (command-verbs cmd) - verb)) - commands)) +(define (get-candidate-commands actor rmeta-sym verb) + (class-rmeta-ref (class-of actor) rmeta-sym verb + #:dflt '())) (define* (gameobj-get-commands actor message #:key verb) "Get commands a co-occupant of the room might execute for VERB" - (define filtered-commands - (filter-commands (val-or-run (slot-ref actor 'commands)) - verb)) + (define candidate-commands + (get-candidate-commands actor 'commands verb)) (<-reply message - #:commands filtered-commands + #:commands candidate-commands #:goes-by (gameobj-goes-by actor))) (define* (gameobj-get-container-commands actor message #:key verb) "Get commands as the container / room of message's sender" - (define filtered-commands - (filter-commands (val-or-run (slot-ref actor 'container-commands)) - verb)) - (<-reply message #:commands filtered-commands)) + (define candidate-commands + (get-candidate-commands actor 'container-commands verb)) + (<-reply message #:commands candidate-commands)) (define* (gameobj-get-contained-commands actor message #:key verb) "Get commands as being contained (eg inventory) of commanding gameobj" - (define filtered-commands - (filter-commands (val-or-run (slot-ref actor 'contained-commands)) - verb)) + (define candidate-commands + (get-candidate-commands actor 'contained-commands verb)) (<-reply message - #:commands filtered-commands + #:commands candidate-commands #:goes-by (gameobj-goes-by actor))) (define* (gameobj-add-occupant! actor message #:key who)