diff --git a/pacman-project/adt/level.rkt b/pacman-project/adt/level.rkt index 06b1cb3..db47af4 100644 --- a/pacman-project/adt/level.rkt +++ b/pacman-project/adt/level.rkt @@ -33,7 +33,9 @@ (timer (make-timer)) (paused? #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. (set! key (make-key maze)) @@ -77,7 +79,8 @@ (define (eat-coin! row col) ((maze 'cell-set!) row col cell-type-empty) ((score 'increase!)) - ((timer 'increase!))) + ((timer 'increase!)) + (on-coins-changed!)) ;; ;; Key logic @@ -87,7 +90,8 @@ ;; Picks up the key and clears the cell. (define (pick-up-key! row col) ((maze 'cell-set!) row col cell-type-empty) - ((key 'take!))) + ((key 'take!)) + (on-coins-changed!)) ;; ;; Teleportation logic @@ -130,7 +134,8 @@ ;; Door: open it if key has been taken. (((maze 'door?) next-row next-col) (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. (else @@ -201,6 +206,16 @@ ;; 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) (cond ((eq? msg 'maze) maze) ((eq? msg 'pacman) pacman) @@ -210,6 +225,8 @@ ((eq? msg 'paused?) paused?) ((eq? msg 'key-press!) key-press!) ((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)))) dispatch-level))))