X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fgacela_mobs.scm;h=5e159075b945586567e7154096dd4386de42b53e;hb=023823491bfe1a64e136bcc2d47c6ec5803f23bf;hp=c9371784fef713383a137617b1297a596f1395ed;hpb=cbfc77bb602ebda15d2d95786a2c2bb4b5970a63;p=gacela.git diff --git a/src/gacela_mobs.scm b/src/gacela_mobs.scm index c937178..5e15907 100755 --- a/src/gacela_mobs.scm +++ b/src/gacela_mobs.scm @@ -48,33 +48,121 @@ (define-macro (hide-mob mob) `(hide-mob-hash ',mob)) -(define (process-mobs mobs) - (for-each (lambda (m) (m #:render)) mobs)) +(define (run-mob-actions mobs) + (for-each (lambda (m) (m 'run-actions)) mobs)) -(define-macro (define-mob mob-head . look) - (let ((name (car mob-head)) (attr (cdr mob-head))) +(define (render-mobs mobs) + (for-each (lambda (m) (m 'render)) mobs)) + + +;;; Actions and looks for mobs + +(define (get-attr list name default) + (let ((value (assoc-ref list name))) + (cond (value (car value)) + (else default)))) + +(define (attr-def attr) + (let ((name (car attr)) + (value (cadr attr))) + `(,name (get-attr attributes ',name ',value)))) + +(define (attr-save attr) + (let ((name (car attr))) + `(set! attributes (assoc-set! attributes ',name (list ,name))))) + +(define-macro (define-action action-head . code) + (let ((name (car action-head)) (attr (cdr action-head))) `(define ,name - (lambda-mob ,attr ,@look)))) + (lambda-action ,attr ,@code)))) -(define-macro (lambda-mob attr . look) +(define-macro (lambda-action attr . code) + `(lambda (attributes) + (let ,(map attr-def attr) + ,@code + ,(cons 'begin (map attr-save attr)) + attributes))) + +(define-macro (lambda-look attr . look) (define (process-look look) (cond ((null? look) (values '() '())) (else (let ((line (car look))) (receive (lines images) (process-look (cdr look)) (cond ((string? line) - (values (cons `(draw-texture ,line) lines) - (cons line images))) + (let ((var (gensym))) + (values (cons `(draw-texture ,var) lines) + (cons `(,var (load-texture ,line)) images)))) (else (values (cons line lines) images)))))))) (receive (look-lines look-images) (process-look look) - `(let ((attr ',attr)) - (lambda (option) - (case option - ((#:render) - (glPushMatrix) - ,@look-lines -; ,@(map (lambda (x) (if (string? x) `(draw-texture ,x) x)) look) - (glPopMatrix))))))) + `(let ,look-images + (lambda (attributes) + (let ,(map attr-def attr) + (glPushMatrix) + ,@look-lines + (glPopMatrix)))))) + + +;;; Making mobs + +(define-macro (define-mob mob-head . look) + (let ((name (car mob-head)) (attr (cdr mob-head))) + `(define ,name + (lambda-mob ,attr ,@look)))) + +(define-macro (lambda-mob attr . look) + `(let ((mob #f)) + (set! mob + (let ((attr ',attr) (actions '()) (looks '())) + (lambda (option . params) + (case option + ((get-attr) + attr) + ((set-attr) + (if (not (null? params)) (set! attr (car params)))) + ((get-actions) + actions) + ((set-actions) + (if (not (null? params)) (set! actions (car params)))) + ((get-looks) + looks) + ((set-looks) + (if (not (null? params)) (set! looks (car params)))) + ((run-actions) + (for-each + (lambda (action) + (set! attr ((cdr action) attr))) + actions)) + ((render) + (for-each + (lambda (look) + ((cdr look) attr)) + looks)))))) + (cond ((not (null? ',look)) + (mob 'set-looks + (list (cons + 'default-look + (lambda-look ,attr ,@look)))))) + mob)) + +(define (get-mob-attr mob var) + (let ((value (assoc-ref (mob 'get-attr) var))) + (if value (car value) #f))) + +(define (set-mob-attr! mob var value) + (mob 'set-attr (assoc-set! (mob 'get-attr) var (list value)))) + +(define (add-mob-action mob name action) + (mob 'set-actions (assoc-set! (mob 'get-actions) name action))) + +(define (quit-mob-action mob name) + (mob 'set-actions (assoc-remove! (mob 'get-actions) name))) + +(define (add-mob-look mob name look) + (mob 'set-looks (assoc-set! (mob 'get-looks) name look))) + +(define (quit-mob-look mob name) + (mob 'set-looks (assoc-remove! (mob 'get-looks) name)))