From a24d737bc7850757d97a988df6eca3ef78d5fbc6 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Wed, 22 May 2024 21:53:17 -0400 Subject: [PATCH] Allow any actor to push an event to the UI. --- assets/sounds/electric-switch-off.wav | Bin 0 -> 7572 bytes assets/sounds/electric-switch-on.wav | Bin 0 -> 23754 bytes game.scm | 80 +++++++++++----------- modules/game/actors.scm | 93 ++++++++++++++++---------- 4 files changed, 99 insertions(+), 74 deletions(-) create mode 100644 assets/sounds/electric-switch-off.wav create mode 100644 assets/sounds/electric-switch-on.wav diff --git a/assets/sounds/electric-switch-off.wav b/assets/sounds/electric-switch-off.wav new file mode 100644 index 0000000000000000000000000000000000000000..1cedccbb1a50aaff376cc7204b677f21929cc1d7 GIT binary patch literal 7572 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/electric-switch-on.wav b/assets/sounds/electric-switch-on.wav new file mode 100644 index 0000000000000000000000000000000000000000..8066cf13095ffdb045eec3f346a8b740452935a3 GIT binary patch literal 23754 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 ($ grid-info 'wireworld-neighbor-count x y) 1) ($ on? #t) ($ timer 2) (match (first-non-player-occupant grid-info target-x target-y) (#f (pk "no switch target!")) - (target ($ target 'activate)))))) + (target + ($ grid-info 'append-event `(electric-switch-on ,x ,y)) + ($ target 'activate)))))) (('alive?) #t) (('describe) `(electric-switch ,position ,($ on?))) (('collide other offset grid-info) #f))) @@ -238,13 +246,15 @@ (if ($ electron?) (begin ($ state 'electron-head) - ($ electron? #f)) + ($ electron? #f) + ($ grid-info 'append-event `(receive-electron ,x ,y))) (let ((neighbors ($ grid-info 'wireworld-neighbor-count x y))) (if (<= 1 neighbors 2) (begin ($ state 'electron-head) ;; Forward an electron head to the receiver. - ($ (find-receiver grid-info) 'give-electron)) + ($ (find-receiver grid-info) 'give-electron) + ($ grid-info 'append-event `(send-electron ,x ,y))) ($ state 'copper))))))) (('give-electron) ($ electron? #t)) (('alive?) #t) @@ -267,7 +277,8 @@ (('describe) `(gem ,position)) (('collide other offset grid-info) (when (eq? ($ other 'type) 'player) - ($ picked-up? #t))))) + ($ picked-up? #t) + ($ grid-info 'append-event `(pickup ,x ,y)))))) (define (^ghost-gem bcom x y) (define position (vector x y 1)) @@ -294,6 +305,7 @@ (('post-tick grid-info) #f) (('enter obj grid-info) #f) (('exit obj grid-info) #f) + ;; TODO: Send grid-info (('activate) ($ open? #t)) (('deactivate) ($ open? #f)) (('wire-state grid-info) #f) @@ -419,7 +431,6 @@ (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) (('position) ($ position)) @@ -434,7 +445,6 @@ (('tick grid-info) (match ($ position) (#(x y z) - ($ event #f) (match ($ velocity) (#(dx dy) ($ position (vector (+ x dx) (+ y dy) z)) @@ -453,7 +463,7 @@ ;; Ouch, a gate closed on the player! (unless ($ obj 'open?) ($ alive? #f) - ($ event '(die)))) + ($ grid-info 'append-event `(player-death ,x ,y)))) (_ (lp rest))))))))) (('enter obj grid-info) #f) (('exit obj grid-info) #f) @@ -461,35 +471,44 @@ (('alive?) ($ alive?)) (('describe) `(player ,($ position), ($ alive?))) (('collide other offset grid-info) - (define (reverse-move) - (match ($ position) - (#(x y z) + (match ($ position) + (#(x y z) + (define (reverse-move) (match offset (#(dx dy) - ($ position (vector (- x dx) (- y dy) z))))))) - (match ($ other 'type) - ('exit ($ event '(exit))) - ('block - (if ($ other 'pushed?) - ($ event '(push)) - (begin - (reverse-move) - ($ event '(bump))))) - ('switch ($ event '(switch))) - ('gem ($ event '(gem))) - ('ghost-gem #t) - ('gate - (unless ($ other 'open?) - (reverse-move) - ($ event '(bump)))) - (_ - (reverse-move) - ($ event '(bump))))) - (('event) ($ event)))) + ($ position (vector (- x dx) (- y dy) z))))) + (match ($ other 'type) + ('exit + ($ grid-info 'append-event `(exit ,x ,y))) + ('block + (if ($ other 'pushed?) + ($ grid-info 'append-event `(push ,x ,y)) + (begin + (reverse-move) + ($ grid-info 'append-event `(bump ,x ,y))))) + ((or 'gem 'switch 'ghost-gem) #t) + ('gate + (unless ($ other 'open?) + (reverse-move) + ($ grid-info 'append-event `(bump ,x ,y)))) + (_ + (reverse-move) + ($ grid-info 'append-event `(bump ,x ,y))))))))) + +(define (^event-log bcom) + (define events (spawn ^cell '())) + (match-lambda* + (('append event) + ($ events (cons event ($ events)))) + (('flush) + (let ((result (reverse ($ events)))) + ($ events '()) + result)))) (define (^level bcom width height) (define player (spawn ^cell)) (define objects (spawn ^cell '())) + (define event-log (spawn ^event-log)) ;; Spatial partition (define (for-each-coord proc) @@ -569,7 +588,9 @@ (('wireworld-neighbor-count x y) (neighbor-count x y)) (('wireworld-neighbor-grid x y) - (neighbor-grid x y)))) + (neighbor-grid x y)) + (('append-event event) + ($ event-log 'append event)))) (define grid-info (spawn ^grid-info)) (define (delq item lst) @@ -667,4 +688,6 @@ (match ($ obj 'position) (#(x y _) (let ((cell (grid-ref grid x y))) - ($ cell (cons obj ($ cell))))))))) + ($ cell (cons obj ($ cell))))))) + (('flush-events) + ($ event-log 'flush))))