- (pushnew mob mobs-to-kill))
-
- (set! kill-all-mobs
- (lambda ()
- (set! active-mobs '())
- (set! mobs-to-add '())
- (set! mobs-to-kill '())))
-
- (set! refresh-active-mobs
- (lambda ()
- (define (add active to-add)
- (cond ((null? to-add) active)
- (else
- (pushnew (car to-add) active)
- (add active (cdr to-add)))))
-
- (add active-mobs mobs-to-add)
- (set! mobs-to-add '())
- (set! active-mobs (reverse (lset-difference eq? active-mobs mobs-to-kill)))
- (set! mobs-to-kill '())))
-
- (set! action-mobs
- (lambda ()
- (map (lambda (m) (m #:action)) active-mobs)))
-
- (set! render-mobs
- (lambda ()
- (map (lambda (m) (m #:render)) active-mobs))))
-
-
-(define-macro (makemob name . methods)
- `(define* (,name . args)
- (let ((option (car args)))
- ,(lset-union eq?
- `(case option
- (:on (mob-on ',name))
- (:off (mob-off ',name)))
- (define (options m)
- (let ((option (car m)) (body (cadr m)))
- (cond ((null? m) '())
- (else (cons (list option `(apply ,body (cdr args))) (options (cddr m)))))))
- (options methods)))))
-
-(define-macro (makemob name . methods)
- (define (options m)
- (cond ((null? m) '((else #f)))
- (else
- (let ((option (caar m)) (body (cadar m)))
- (cons `((,option) (apply ,body (cdr args))) (options (cdr m)))))))
- (let ((m (options methods)))
- `(define (,name . args)
- (let ((option (car args)))
- (case option
- ((#:on) (mob-on ',name))
- ((#:off) (mob-off ',name))
- ,@m)))))
-
-
-(define mob-on #f)
-(define run-mobs #f)
-(define mob-off #f)
-(define refresh-running-mobs #f)
-(define quit-all-mobs #f)
-
-(let ((running-mobs '()) (mobs-to-add '()) (mobs-to-quit '()))
- (set! mob-on
- (lambda (mob)
- (push mob mobs-to-add)))
-
- (set! run-mobs
- (lambda* (option #:key args function)
- (define (run-mobs-rec mobs)
- (cond ((null? mobs) #f)
- (else
- (cond (function (function)))
- (catch #t (lambda () (apply (car mobs) (cons option args))) (lambda (key . args) #f))
- (or #t (run-mobs-rec (cdr mobs))))))
- (run-mobs-rec running-mobs)))