(define-module (game level) #:use-module (game actors) #:use-module (goblins core) #:use-module (hoot bytevectors) #:use-module (ice-9 match) #:use-module (srfi srfi-9) #:export (make-level level? level-background level-actor)) ;; Client-side rendering info coupled with level actor that contains ;; game state. (define-record-type (%make-level background actor) level? (background level-background) (actor level-actor)) (define (make-level width height background objects) (let ((level* (spawn ^level width height))) ;; Parsed packed object data and spawn objects. (let ((len (bytevector-length objects))) (let lp ((i 0)) (when (< i len) (let ((x (bytevector-u8-ref objects i)) (y (bytevector-u8-ref objects (+ i 1))) (id (bytevector-u8-ref objects (+ i 2)))) (if (= id 3) ; player-spawn ($ level* 'warp-player x y) (let ((obj (match id (1 (spawn ^wall 'brick)) (2 (spawn ^wall 'copper)) (4 (spawn ^exit)) (5 (spawn ^block 'copper)) (6 (spawn ^clock-emitter 4)) (id (error "invalid level object" id))))) ($ level* 'set-object x y obj)))) (lp (+ i 3))))) (%make-level background level*)))