Add start of tiled map compilation for levels.

This commit is contained in:
David Thompson 2024-05-19 17:30:36 -04:00
parent ebd57bae3a
commit 3a3f4e31a1
12 changed files with 664 additions and 15 deletions

View file

@ -26,8 +26,10 @@
(dom media)
(dom window)
(game actors)
(game levels level-1)
(game tileset)
(goblins core)
(hoot bytevectors)
(hoot ffi)
(hoot hashtables)
(ice-9 match)
@ -52,7 +54,14 @@
320 240
(inexact->exact tile-width)
(inexact->exact tile-height)))
(define audio:bump (make-audio "assets/sounds/bump.wav"))
(define* (load-sound-effect name #:key (volume 0.5))
(let ((audio (make-audio (string-append "assets/sounds/" name ".wav"))))
(set-media-volume! audio volume)
audio))
(define audio:bump (load-sound-effect "bump"))
(define audio:push (load-sound-effect "push"))
(define audio:undo (load-sound-effect "undo"))
(define audio:no (load-sound-effect "no"))
;; Game state
(define *actormap* (make-whactormap))
@ -64,6 +73,8 @@
(define *level* #f)
;; Latest representation of all actors in level
(define *grid* #f)
;; Background tile layer.
(define *background* #f)
(define *snapshots* '())
(define (clear-snapshots!)
@ -72,10 +83,11 @@
(set! *snapshots* (cons (copy-whactormap *actormap*) *snapshots*)))
(define (rollback-snapshot!)
(match *snapshots*
(() #f)
(() (media-play audio:no))
((snapshot . older-snapshots)
(set! *actormap* snapshot)
(set! *snapshots* older-snapshots))))
(set! *snapshots* older-snapshots)
(media-play audio:undo))))
(define (update-grid!)
(set! *grid* ($ *level* 'describe)))
@ -84,7 +96,10 @@
(set! *actormap* (make-whactormap))
(clear-snapshots!)
(with-goblins
(set! *level* (spawn ^level level-width level-height))
(call-with-values load-level-1
(lambda (background level)
(set! *background* background)
(set! *level* level)))
(update-grid!)))
;; Update loop
@ -92,7 +107,8 @@
(save-snapshot!)
(with-goblins
(match ($ *level* 'move-player dir)
(#f (media-play audio:bump))
('bump (media-play audio:bump))
('push (media-play audio:push))
(_ #f))
(update-grid!)))
@ -154,7 +170,19 @@
(('block type) (draw-block type x y))
(('clock-emitter) (draw-clock-emitter x y))))))
(define (draw-background)
(let* ((bv *background*)
(len (bytevector-length bv)))
(let lp ((i 0))
(when (< i len)
(let ((x (bytevector-ieee-single-native-ref bv i))
(y (bytevector-ieee-single-native-ref bv (+ i 4)))
(idx (bytevector-s16-native-ref bv (+ i 8))))
(draw-tile context tileset idx x y)
(lp (+ i 10)))))))
(define (draw-level)
(draw-background)
(let ((grid *grid*))
(let y-loop ((y 0))
(when (< y level-height)
@ -166,8 +194,6 @@
(define (draw prev-time)
(clear-rect context 0.0 0.0 *canvas-width* *canvas-height*)
(set-fill-color! context "#cbdbfc")
(fill-rect context 0.0 0.0 *canvas-width* *canvas-height*)
(set-transform! context 1.0 0.0 0.0 1.0 0.0 0.0)
(set-scale! context *canvas-scale* *canvas-scale*)
(draw-level)