prosperon/source/scripts/engine.scm

84 lines
2.4 KiB
Scheme

(define-macro (time expr)
`(let ((start (*s7* 'cpu-time)))
(let ((res (list ,expr)))
(list (car res)
(- (*s7* 'cpu-time) start)))))
(define-macro (funcinfo func info)
`(*function* (funclet ,func) ,info))
(define-macro (funcloc func)
`(format #f "~A:~A" (funcinfo ,func 'file) (funcinfo ,func 'line)))
(define-macro (funcsrc func)
`(funcinfo ,func 'source))
(define (objects->string . objs)
(apply string-append (map (lambda (obj) (object->string obj #t)) objs)))
(define-macro (glog data lvl)
(let ((file (*function* (outlet (curlet)) 'file))
(line (*function* (outlet (curlet)) 'line)))
`(log ,lvl ,data ,file ,line)))
(define-macro (flog data lvl)
`(log ,lvl ,data (funcinfo (*function*) 'file) (funcinfo (*function*) 'line)))
(define (loginfo . data) (glog (objects->string data) 0))
(define (logwarn . data) (glog (objects->string data) 1))
(define (logerr . data) (glog (objects->string data) 2))
(define (logcrit . data) (glog (objects->string data) 3))
(define (set_fps fps) (settings_cmd 0 (/ 1 fps)))
(define (set_update fps) (settings_cmd 1 (/ 1 fps)))
(define (set_phys fps) (settings_cmd 2 (/ 1 fps)))
(define (win_fulltoggle w) (win_cmd w 0))
(define (win_fullscreen w) (win_cmd w 1))
(define (win_unfullscreen w) (win_cmd w 2))
(define (win_title s) (win_cmd 0 3 s))
(define (load_level s) (gen_cmd 0 s))
(define (load_prefab s) (gen_cmd 1 s))
(define (quit) (sys_cmd 0))
(define (exit) (quit))
(define (sound_play sound) (sound_cmd sound 0))
(define (sound_pause sound) (sound_cmd sound 1))
(define (sound_stop sound) (sound_cmd sound 2))
(define (sound_restart sound) (sound_cmd sound 3))
(define-macro (update . expr)
(let ((f (gensym)))
`(begin
(define (,f) (begin . ,expr))
(register 0 ,f))))
(define-macro (while condition . body)
(let ((loop (gensym)))
`(let ,loop ()
(cond (,condition
(begin . ,body)
(,loop))))))
(define (clamp val min max)
(cond ((< val min) min)
((> val max) max)
(else val)))
(define (lerp s f dt)
(+ s (* (clamp dt 0 1) (- f s))))
(define (deg2rad deg)
(* deg 0.01745329252))
(define (body_angle! body angle) (set_body body 0 angle))
(define (body_pos! body x y) (set_body_pos body 0 x y))
(define (body_move! body x y) (set_body_pos body 1 x y))
(define-macro (collide . expr)
(let ((f (gensym)))
`(begin
(define (,f) (begin . ,expr))
(phys_cmd 0 ,f))))