Optimize(Level): Add change notification callbacks for draw invalidation

Level now fires callbacks when game state changes that require redrawing:
- on-coins-changed!: fired when a coin is eaten or key is picked up
- on-maze-changed!: fired when a door is removed

Exposes set-on-coins-changed! and set-on-maze-changed! messages so the
game ADT can wire these to the draw ADT's dirty flags.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
joren
2026-03-23 11:21:26 +01:00
parent 5b43b3c8d5
commit 55f1c2a382

View File

@@ -33,7 +33,9 @@
(timer (make-timer)) (timer (make-timer))
(paused? #f) (paused? #f)
(queued-direction #f) (queued-direction #f)
(movement-timer 0)) (movement-timer 0)
(on-coins-changed! (lambda () #f))
(on-maze-changed! (lambda () #f)))
;; Initialize key after maze is created. ;; Initialize key after maze is created.
(set! key (make-key maze)) (set! key (make-key maze))
@@ -77,7 +79,8 @@
(define (eat-coin! row col) (define (eat-coin! row col)
((maze 'cell-set!) row col cell-type-empty) ((maze 'cell-set!) row col cell-type-empty)
((score 'increase!)) ((score 'increase!))
((timer 'increase!))) ((timer 'increase!))
(on-coins-changed!))
;; ;;
;; Key logic ;; Key logic
@@ -87,7 +90,8 @@
;; Picks up the key and clears the cell. ;; Picks up the key and clears the cell.
(define (pick-up-key! row col) (define (pick-up-key! row col)
((maze 'cell-set!) row col cell-type-empty) ((maze 'cell-set!) row col cell-type-empty)
((key 'take!))) ((key 'take!))
(on-coins-changed!))
;; ;;
;; Teleportation logic ;; Teleportation logic
@@ -130,7 +134,8 @@
;; Door: open it if key has been taken. ;; Door: open it if key has been taken.
(((maze 'door?) next-row next-col) (((maze 'door?) next-row next-col)
(when (key 'taken?) (when (key 'taken?)
((maze 'remove-door!) next-row next-col))) ((maze 'remove-door!) next-row next-col)
(on-maze-changed!)))
;; Normal movement: only if not a wall. ;; Normal movement: only if not a wall.
(else (else
@@ -201,6 +206,16 @@
;; Dispatch ;; Dispatch
;; ;;
;; set-on-coins-changed! :: (-> /) -> /
;; Registers a callback for when coins change (eaten or key picked up).
(define (set-on-coins-changed! callback)
(set! on-coins-changed! callback))
;; set-on-maze-changed! :: (-> /) -> /
;; Registers a callback for when the maze changes (door removed).
(define (set-on-maze-changed! callback)
(set! on-maze-changed! callback))
(define (dispatch-level msg) (define (dispatch-level msg)
(cond ((eq? msg 'maze) maze) (cond ((eq? msg 'maze) maze)
((eq? msg 'pacman) pacman) ((eq? msg 'pacman) pacman)
@@ -210,6 +225,8 @@
((eq? msg 'paused?) paused?) ((eq? msg 'paused?) paused?)
((eq? msg 'key-press!) key-press!) ((eq? msg 'key-press!) key-press!)
((eq? msg 'update!) update!) ((eq? msg 'update!) update!)
((eq? msg 'set-on-coins-changed!) set-on-coins-changed!)
((eq? msg 'set-on-maze-changed!) set-on-maze-changed!)
(else (error "Level ADT -- Unknown message:" msg)))) (else (error "Level ADT -- Unknown message:" msg))))
dispatch-level)))) dispatch-level))))