From 71d62e596e614ae16937f56a4f245de07fc10d4e Mon Sep 17 00:00:00 2001 From: David Thompson Date: Wed, 22 May 2024 09:29:44 -0400 Subject: [PATCH] Kill player when gate closes on them. --- assets/sounds/die.wav | Bin 0 -> 25964 bytes game.scm | 59 +++++++++++++++++++++-------------- modules/game/actors.scm | 67 +++++++++++++++++++++++++++++++--------- 3 files changed, 88 insertions(+), 38 deletions(-) create mode 100644 assets/sounds/die.wav diff --git a/assets/sounds/die.wav b/assets/sounds/die.wav new file mode 100644 index 0000000000000000000000000000000000000000..fdaefa6dc7d95de5d725260fcc3a7efcb11bfffa GIT binary patch literal 25964 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 Xa98fB`{Ma)`bOtEuE3s%HtFjhKIJr; literal 0 HcmV?d00001 diff --git a/game.scm b/game.scm index d3de151..9268b20 100644 --- a/game.scm +++ b/game.scm @@ -68,6 +68,7 @@ (define audio:no (load-sound-effect "no")) (define audio:exit (load-sound-effect "exit")) (define audio:pickup (load-sound-effect "pickup")) +(define audio:die (load-sound-effect "die")) ;; Game state (define *state* #f) @@ -198,29 +199,41 @@ (define (move-player dir) (define (do-move) (with-goblins - ($ (level-player *level*) 'move dir) - ($ (level-actor *level*) 'tick) - (define result - (match ($ (level-player *level*) 'event) - (('bump) - (media-play audio:bump) - #f) - (('push) - (media-play audio:push) - #f) - (('exit) - (media-play audio:exit) - 'next-level) - (('gem) - (media-play audio:pickup) - ;; TODO: Maybe show a little achievement popup when all gems - ;; are collected? - (set! *gems* (cons *level-idx* *gems*)) - #f) - (_ #f))) - (update-objects!) - result)) - (save-snapshot!) + (let ((player (level-player *level*))) + (if ($ player 'alive?) + (begin + ($ player 'move dir) + ($ (level-actor *level*) 'tick) + ;; TODO: Need a better way to receive events to play sounds + ;; and emit particles and stuff so any actor can trigger + ;; events. + (let ((result + (match ($ player 'event) + (('bump) + (media-play audio:bump) + #f) + (('push) + (media-play audio:push) + #f) + (('exit) + (media-play audio:exit) + 'next-level) + (('die) + (media-play audio:die) + #f) + (('gem) + (media-play audio:pickup) + ;; TODO: Maybe show a little achievement popup when all gems + ;; are collected? + (set! *gems* (cons *level-idx* *gems*)) + #f) + (_ #f)))) + (update-objects!) + (save-snapshot!) + result)) + (begin + (media-play audio:no) + #f))))) (when (eq? (do-move) 'next-level) (next-level!))) diff --git a/modules/game/actors.scm b/modules/game/actors.scm index 2c0af90..4fecf32 100644 --- a/modules/game/actors.scm +++ b/modules/game/actors.scm @@ -39,6 +39,7 @@ (('type) 'exit) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) #f) @@ -54,6 +55,7 @@ (('type) 'wall) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) @@ -80,6 +82,7 @@ (('type) 'block) (('position) ($ position)) (('tick grid-info) ($ pushed? #f)) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) @@ -123,6 +126,7 @@ (('type) 'emitter) (('position) position) (('tick grid-info) ($ timer (+ ($ timer) 1))) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) @@ -155,6 +159,7 @@ (('type) 'switch) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) ($ on? #t)) (('exit obj grid-info) @@ -181,6 +186,7 @@ (('type) 'switch) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) #f) @@ -210,6 +216,7 @@ (('type) 'gem) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) #f) @@ -227,6 +234,7 @@ (('type) 'gate) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('activate) ($ open? #t)) @@ -245,6 +253,7 @@ (('type) 'emitter) (('position) position) (('tick grid-info) #f) + (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) ($ state)) @@ -268,6 +277,7 @@ (define (^player bcom x y) (define position (spawn ^cell (vector x y 2))) (define velocity (spawn ^cell #(0 0))) + (define alive? (spawn ^cell #t)) (define event (spawn ^cell)) (match-lambda* (('type) 'player) @@ -281,18 +291,39 @@ ('down #(0 1)) (_ (error "invalid direction" dir))))) (('tick grid-info) - ($ event #f) + ;; Search for objects that were fine to step onto last turn, but + ;; have become deadly this turn. If (match ($ position) (#(x y z) + ($ event #f) (match ($ velocity) (#(dx dy) ($ position (vector (+ x dx) (+ y dy) z)) ($ velocity #(0 0))))))) + (('post-tick grid-info) + (match ($ position) + (#(x y z) + (let lp ((objs ($ grid-info 'occupants x y))) + (match objs + ;; All is well. Move by current velocity. + (() + (match ($ velocity) + (#(dx dy) + ($ position (vector (+ x dx) (+ y dy) z)) + ($ velocity #(0 0))))) + ((obj . rest) + (match ($ obj 'type) + ('gate + ;; Ouch, a gate closed on the player! + (unless ($ obj 'open?) + ($ alive? #f) + ($ event '(die)))) + (_ (lp rest))))))))) (('enter obj grid-info) #f) (('exit obj grid-info) #f) (('wire-state) #f) (('update-wire-state grid-info) #f) - (('alive?) #t) + (('alive?) ($ alive?)) (('describe) `(player ,($ position))) (('collide other offset grid-info) (define (reverse-move) @@ -451,28 +482,34 @@ (unless (equal? other-pos other-prev-pos) (collide other other-pos other-prev-pos))) (lp rest)))))))))))) - (define (tick) - ;; Tick each object and check for collisions. + (define (iter-objects proc) ($ objects (let lp ((objs ($ objects))) (match objs (() '()) ((obj . rest) - (let ((prev-pos ($ obj 'position))) - ($ obj 'tick grid-info) - ;; Only check collisions for movable objects. - (let ((desired-pos ($ obj 'position))) - (unless (equal? prev-pos desired-pos) - (collide obj desired-pos prev-pos))) - ;; Cull dead objects. - (if ($ obj 'alive?) - (cons obj (lp rest)) - (lp rest))))))) + (proc obj) + ;; Cull dead objects. + (if ($ obj 'alive?) + (cons obj (lp rest)) + (lp rest))))))) + (define (tick) + ;; Tick each object and check for collisions. + (iter-objects + (lambda (obj) + (let ((prev-pos ($ obj 'position))) + ($ obj 'tick grid-info) + ;; Only check collisions for movable objects. + (let ((desired-pos ($ obj 'position))) + (unless (equal? prev-pos desired-pos) + (collide obj desired-pos prev-pos)))))) ;; Advance Wirewold simulation. (refresh-wire-grid) (for-each (lambda (obj) ($ obj 'update-wire-state grid-info)) - ($ objects))) + ($ objects)) + ;; Run post-tick hooks. + (iter-objects (lambda (obj) ($ obj 'post-tick grid-info)))) (match-lambda* (('tick) (tick))