foss-mmo/modules/game/level.scm

44 lines
1.6 KiB
Scheme
Raw Normal View History

(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 <level>
(%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
2024-05-20 13:34:59 -04:00
(begin
(pk 'spawn-player x y)
($ level* 'warp-player x y))
(let ((obj (match id
(1 (spawn ^wall 'brick))
(2 (spawn ^wall 'copper))
(4 (spawn ^exit))
(5 (spawn ^block 'copper))
2024-05-20 13:34:59 -04:00
(6 (spawn ^block 'crate))
(7 (spawn ^clock-emitter 4))
(id (error "invalid level object" id)))))
($ level* 'set-object x y obj))))
(lp (+ i 3)))))
(%make-level background level*)))