X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgacela_mobs.scm;h=6b9d6997f42e402576435c6aaaf5f494d6639aa6;hb=f150638c6d3fe992a1557d36d3e1858e9a4f395c;hp=3f7fb74e627323130b94ff86b2758dcb001fab0a;hpb=23dc2e79bfa98af475cafe3754f85c94949a4e8c;p=gacela.git diff --git a/src/gacela_mobs.scm b/src/gacela_mobs.scm index 3f7fb74..6b9d699 100755 --- a/src/gacela_mobs.scm +++ b/src/gacela_mobs.scm @@ -17,33 +17,64 @@ ;;; Mobs Factory -(define add-mob #f) -(define kill-mob #f) +(define show-mob-hash #f) +(define hide-mob-hash #f) (define get-active-mobs #f) -(define reload-mobs? #f) -(define reload-mobs #f) +(define mobs-changed? #f) -(let ((active-mobs '(m1 m2)) (reload #f)) - (set! add-mob - (lambda (mob) - (pushnew (procedure-name mob) active-mobs) - (set! reload #t))) +(let ((active-mobs (make-hash-table)) (changed #f)) + (set! show-mob-hash + (lambda (key mob) + (hash-set! active-mobs key mob) + (set! changed #t))) - (set! kill-mob - (lambda (mob) - (set! active-mobs (lset-difference eq? active-mobs (list (procedure-name mob)))) - (set! reload #t))) + (set! hide-mob-hash + (lambda (key) + (hash-remove! key) + (set! changed #t))) (set! get-active-mobs - (lambda () active-mobs)) + (lambda* (#:optional (refreshed #t)) + (set! changed (not refreshed)) + (hash-map->list (lambda (k v) v) active-mobs))) - (set! reload-mobs? - (lambda () reload)) + (set! mobs-changed? + (lambda () changed))) - (set! reload-mobs - (lambda () - #f))) -(define-macro (get-mobs-function) - (let ((mobs (get-active-mobs))) - `(lambda () ,@(map (lambda (mob) `(,mob)) ,mobs)))) +(define-macro (show-mob mob) + `(show-mob-hash ',mob (lambda (option) (,mob option)))) + +(define-macro (hide-mob mob) + `(hide-mob-hash ',mob)) + +(define (process-mobs mobs) + (for-each (lambda (m) (m #:render)) 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) + (define (process-look look) + (cond ((null? look) (values '() '())) + (else + (let ((line (car look))) + (receive (lines images) (process-look (cdr look)) + (cond ((string? line) + (cons `(draw-texture ,line) lines) + (cons line images)) + (else + (cons line lines))) + (values 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)))))))