- (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)
- (,fun-name 123)))))))
-
-(define-macro (define-mob-function head . body)
- (let ((fun-name (car head)) (attr (map (lambda (a) (if (list? a) a (list a #f))) (cdr head)))
- (data-symbol (gensym))
- (body-fun
- `(catch #t
- (lambda* () ,@body)
- (lambda (key . args) #f))))
- `(define (,fun-name ,data-symbol)
- (let ,attr
- ,@(map
- (lambda (a)
- `(let ((val (assoc-ref ,data-symbol ',(car a))))
- (cond (val (set! ,(car a) val)))))
- attr)
- ,body-fun
- (list ,@(map (lambda (a) `(cons ',(car a) ,(car a))) attr))))))
+ (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))))))))