2024-05-17 23:49:31 +02:00
|
|
|
(define-module (game main)
|
2024-05-21 17:52:30 +02:00
|
|
|
#:use-module (ice-9 pretty-print)
|
2024-05-20 14:40:57 +02:00
|
|
|
#:use-module (game model level)
|
2024-05-20 19:49:32 +02:00
|
|
|
#:use-module (game model hero)
|
2024-05-22 12:53:01 +02:00
|
|
|
#:use-module (game model other)
|
2024-05-23 21:46:50 +02:00
|
|
|
#:use-module (game model key)
|
2024-05-24 17:07:17 +02:00
|
|
|
#:use-module (game model food)
|
2024-05-20 14:40:57 +02:00
|
|
|
#:use-module (game render level)
|
2024-05-20 19:49:32 +02:00
|
|
|
#:use-module (game render hero)
|
2024-05-22 12:53:01 +02:00
|
|
|
#:use-module (game render other)
|
2024-05-23 21:46:50 +02:00
|
|
|
#:use-module (game render key)
|
2024-05-24 17:07:17 +02:00
|
|
|
#:use-module (game render food)
|
2024-05-23 21:46:50 +02:00
|
|
|
#:use-module (game util assets)
|
2024-05-17 23:49:31 +02:00
|
|
|
#:use-module (chickadee)
|
2024-05-19 18:48:18 +02:00
|
|
|
#:use-module (chickadee math rect)
|
2024-05-17 23:49:31 +02:00
|
|
|
#:use-module (chickadee math vector)
|
2024-05-19 18:48:18 +02:00
|
|
|
#:use-module (chickadee graphics color)
|
2024-05-17 23:49:31 +02:00
|
|
|
#:use-module (chickadee graphics sprite)
|
|
|
|
#:use-module (chickadee graphics texture)
|
2024-05-19 18:48:18 +02:00
|
|
|
#:use-module (chickadee graphics text)
|
|
|
|
#:use-module (chickadee graphics tile-map)
|
2024-05-17 23:49:31 +02:00
|
|
|
#:use-module (system repl coop-server)
|
2024-05-21 00:56:54 +02:00
|
|
|
#:use-module (srfi srfi-1)
|
2024-05-17 23:49:31 +02:00
|
|
|
#:export (launch-game))
|
|
|
|
|
2024-05-24 01:22:28 +02:00
|
|
|
(define levels #f)
|
2024-05-19 21:54:30 +02:00
|
|
|
(define level #f)
|
2024-05-17 23:49:31 +02:00
|
|
|
(define repl #f)
|
2024-05-20 19:49:32 +02:00
|
|
|
(define hero #f)
|
2024-05-22 12:53:01 +02:00
|
|
|
(define others #f)
|
2024-05-23 21:46:50 +02:00
|
|
|
(define keys #f)
|
2024-05-24 17:07:17 +02:00
|
|
|
(define foods #f)
|
|
|
|
(define calories 0.0)
|
2024-05-21 00:56:54 +02:00
|
|
|
(define inputs '())
|
2024-05-24 17:07:17 +02:00
|
|
|
(define state 'running)
|
2024-05-17 23:49:31 +02:00
|
|
|
|
|
|
|
(define (load)
|
2024-05-23 21:46:50 +02:00
|
|
|
(assets-load)
|
2024-05-20 14:40:57 +02:00
|
|
|
(render-level-load)
|
2024-05-24 01:22:28 +02:00
|
|
|
(set! levels (assets-map-levels level-parse-file))
|
|
|
|
(load-level)
|
|
|
|
(set! repl (spawn-coop-repl-server)))
|
|
|
|
|
|
|
|
(define (load-level)
|
|
|
|
(set! level (car levels))
|
|
|
|
(set! levels (cdr levels))
|
2024-05-20 14:40:57 +02:00
|
|
|
(render-level-set! level)
|
2024-05-21 12:48:43 +02:00
|
|
|
(set! hero (hero-load level))
|
2024-05-22 12:53:01 +02:00
|
|
|
(set! others (other-load-others level))
|
2024-05-23 21:46:50 +02:00
|
|
|
(set! keys (keys-load level))
|
2024-05-24 17:07:17 +02:00
|
|
|
(set! foods (food-load level)))
|
2024-05-23 21:46:50 +02:00
|
|
|
|
2024-05-19 18:48:18 +02:00
|
|
|
(define (update dt)
|
|
|
|
(poll-coop-repl-server repl)
|
2024-05-24 17:07:17 +02:00
|
|
|
(set! hero (hero-update hero level inputs keys (food-total-calories-eaten foods) dt))
|
2024-05-23 17:28:55 +02:00
|
|
|
(set! others (map (lambda (other) (other-update other level hero others dt)) others))
|
2024-05-23 21:46:50 +02:00
|
|
|
(set! keys (keys-update keys hero))
|
2024-05-24 17:07:17 +02:00
|
|
|
(set! foods (food-update foods hero))
|
|
|
|
(if (any (lambda (other) (hero-collides? hero (other-position other))) others)
|
|
|
|
(set! state 'lost))
|
2024-05-24 01:22:28 +02:00
|
|
|
(if (level-same-cell? (hero-position hero) (level-find-goal level))
|
|
|
|
(if (null? levels)
|
2024-05-24 17:07:17 +02:00
|
|
|
(set! status 'won)
|
2024-05-24 01:22:28 +02:00
|
|
|
(load-level)))
|
2024-05-21 17:52:30 +02:00
|
|
|
)
|
2024-05-19 21:54:30 +02:00
|
|
|
|
2024-05-24 01:22:28 +02:00
|
|
|
(define (render-level)
|
2024-05-20 14:40:57 +02:00
|
|
|
(render-level-draw level)
|
2024-05-22 12:53:01 +02:00
|
|
|
(for-each render-other others)
|
2024-05-23 21:46:50 +02:00
|
|
|
(render-keys keys (level-find-goal level))
|
2024-05-24 17:07:17 +02:00
|
|
|
(render-foods foods)
|
2024-05-24 01:22:28 +02:00
|
|
|
(render-hero hero))
|
|
|
|
|
|
|
|
(define (draw _alpha)
|
2024-05-24 17:07:17 +02:00
|
|
|
(case state
|
|
|
|
((won) (render-victory))
|
|
|
|
((lost) (render-defeat))
|
|
|
|
(else (render-level))))
|
2024-05-17 23:49:31 +02:00
|
|
|
|
2024-05-21 00:56:54 +02:00
|
|
|
(define (set-add set item)
|
2024-05-24 01:22:28 +02:00
|
|
|
(if (member item set)
|
|
|
|
set
|
|
|
|
(cons item set)))
|
2024-05-21 00:56:54 +02:00
|
|
|
|
2024-05-21 17:52:30 +02:00
|
|
|
(define (key-press key _modifiers _repeat?)
|
2024-05-21 00:56:54 +02:00
|
|
|
(set! inputs
|
|
|
|
(cond ((eq? key 'left) (set-add inputs 'left))
|
|
|
|
((eq? key 'right) (set-add inputs 'right))
|
|
|
|
((eq? key 'up) (set-add inputs 'up))
|
|
|
|
((eq? key 'down) (set-add inputs 'down ))
|
|
|
|
((eq? key 'space) (set-add inputs 'dig ))
|
2024-05-21 17:52:30 +02:00
|
|
|
(else inputs)))
|
|
|
|
)
|
2024-05-21 00:56:54 +02:00
|
|
|
|
|
|
|
|
2024-05-21 17:52:30 +02:00
|
|
|
(define (key-release key _modifiers)
|
2024-05-21 00:56:54 +02:00
|
|
|
(set! inputs
|
|
|
|
(cond ((eq? key 'left) (delete 'left inputs))
|
|
|
|
((eq? key 'right) (delete 'right inputs))
|
|
|
|
((eq? key 'up) (delete 'up inputs))
|
|
|
|
((eq? key 'down) (delete 'down inputs))
|
|
|
|
((eq? key 'space) (delete 'dig inputs))
|
|
|
|
(else inputs))))
|
|
|
|
|
2024-05-17 23:49:31 +02:00
|
|
|
(define (launch-game args)
|
2024-05-21 00:56:54 +02:00
|
|
|
(run-game
|
2024-05-21 21:45:48 +02:00
|
|
|
#:window-title "Bloatrunner"
|
2024-05-21 00:56:54 +02:00
|
|
|
#:load (lambda () (load))
|
|
|
|
#:update (lambda (dt) (update dt))
|
|
|
|
#:draw (lambda (alpha) (draw alpha))
|
2024-05-21 17:52:30 +02:00
|
|
|
#:key-press (lambda (key modifiers repeat?) (key-press key modifiers repeat?))
|
|
|
|
#:key-release (lambda (key modifiers) (key-release key modifiers))
|
2024-05-21 00:56:54 +02:00
|
|
|
))
|
2024-05-19 21:54:30 +02:00
|
|
|
|
|
|
|
|