- (define (save-data)
- (let ((time (get-frame-time)))
- (cond ((not (= time ,time-symbol))
- (set! ,time-symbol time)
- (set! ,data-symbol ,(cons 'list (map (lambda (x) `(cons ',(car x) ,(car x))) publish)))))))
- (define (get-data)
- ,data-symbol)
- (define (filter-mobs type fun)
- #t)
- (define (map-mobs fun type)
- (let ((mobs (filter (lambda (m) (and (eq? (m 'get-type) type) (not (eq? (m 'get-mob-id) ,mob-id-symbol)))) (get-active-mobs))))
- (map (lambda (m) (fun (m 'get-data))) mobs)))
- (case option
- ((get-mob-id)
- ,mob-id-symbol)
- ((get-type)
- ,type-symbol)
- ((get-data)
- (save-data)
- ,data-symbol)
- (else
- (save-data)
- (catch #t
- (lambda () ,@body)
- (lambda (key . args) #f))))))))
+ (define* (translate x y #:optional (z 0))
+ (cond ((3d-mode?)
+ (translate-mob x y z))
+ (else
+ (set! ,mob-id-z-index (+ ,mob-id-z-index z))
+ (translate-mob x y))))
+ (let* ,attr
+ ,@(map
+ (lambda (a)
+ `(let ((val (assoc-ref ,data-symbol ',(car a))))
+ (cond (val (set! ,(car a) val)))))
+ attr)
+ (catch #t
+ (lambda* () ,@body)
+ (lambda (key . args) #f))
+ (list ,mob-id-z-index (list ,@(map (lambda (a) `(cons ',(car a) ,(car a))) attr))))))))
+
+(define-macro (define-mob mob-head . body)
+ (let* ((name (car mob-head))
+ (attr (cdr mob-head))
+ (make-fun-symbol (gensym))
+ (mob-fun-symbol (gensym))
+ (params-symbol (gensym)))
+ `(define (,name . ,params-symbol)
+ (define ,make-fun-symbol
+ (lambda* ,(if (null? attr) '() `(#:key ,@attr))
+ (the-mob ,name (list ,@(map (lambda (a) `(cons ',(car a) ,(car a))) attr)))))
+ (define ,mob-fun-symbol
+ (define-mob-function ,attr ,@body))
+ (cond ((or (null? ,params-symbol) (keyword? (car ,params-symbol)))
+ (apply ,make-fun-symbol ,params-symbol))
+ (else
+ (apply ,mob-fun-symbol ,params-symbol))))))