On start!, connects level's coin/maze change callbacks to the draw
ADT's mark-coins-dirty! and mark-maze-dirty! methods. This completes
the event chain: level state change -> dirty flag -> redraw next frame.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
Previously every frame: cleared+redrawed 868 cells for coins, cleared+
redrawed all UI text, emptied+recreated pause layer, and swapped key
sprites repeatedly.
Now uses dirty flags and cached values:
- Coins: only redrawn when coins-dirty? is set (on coin eat/key pickup)
- Maze: only redrawn when a door is removed
- UI: only redrawn when score or time string actually changes
- Key: sprite swap happens exactly once, not every frame
- Pause: layer only modified when paused? state transitions
Exposes mark-coins-dirty! and mark-maze-dirty! messages so the game
ADT can signal changes from the level.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pac-Man now moves automatically in its current direction every
pacman-speed-ms (200ms). Arrow keys queue a desired turn direction
instead of moving directly. Each movement tick:
1. Try the queued direction — if passable, turn and move that way
2. Otherwise keep moving in the current direction
3. Stop only when hitting a wall (no direction change)
New internal state:
- queued-direction: the direction the player wants to turn next
- movement-timer: accumulates delta-time, triggers move at interval
New helper:
- can-move?: checks if a direction is passable (no wall/locked door)
Changed behavior:
- key-press! now sets queued-direction instead of calling move-pacman!
- update! now drives movement via advance-pacman! on a timer
- move-pacman! no longer checks time-up? (advance-pacman! handles it)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a 200ms movement tick rate, controlling how fast Pac-Man moves
automatically through the maze.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The draw callback receives no delta-time, so animation was stuck at 0.
Split draw-pacman! into draw (position/rotation) and animate-pacman!
(sprite sequence advancement). Animation is now called from the game
loop which has the real delta-time.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New structure groups all ADT modules under adt/ directory, removing
redundant adt- prefix from filenames. Library names now read as
(pacman-project adt position) etc. All imports updated accordingly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Renamed files: constanten→constants, adt-positie→adt-position,
adt-doolhof→adt-maze, adt-sleutel→adt-key, adt-tijdslimiet→adt-timer,
adt-teken→adt-draw, adt-spel→adt-game. All message names, variables,
comments, and tests converted to English.
Also fixed counter location bug (time-label x/y were swapped).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tests for Positie, Doolhof, Pac-Man, Score, and Tijdslimiet ADTs
using check/check-eq?/run-test from (pp1 tests) library.
Centralized test runner in alle-testen.rkt with prefix imports.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Connects level (logic) with teken (graphics) via callbacks.
Follows snake-wpo adt-spel pattern exactly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All rendering (maze, coins, key, pacman, UI, pause) consolidated here.
Grid-to-pixel conversion happens exclusively in this ADT.
Follows snake-wpo pattern with callback registration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Combines game-logic, keyboard-handler, main-loop, and pause-menu into
single level ADT. Handles movement, collision, teleportation, coin/key
pickup, door opening, pause toggling, and time updates. No graphics.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pure logic ADT with verlaag!/verhoog! mutators, tijd-op? predicate,
and formatteer-tijd method. No graphics code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pure logic ADT with punten getter and verhoog! mutator.
Uses punten-per-muntje constant. No graphics code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pure logic ADT with positie, opgepakt? predicate, pak-op! mutator.
Random placement logic uses doolhof ADT. No graphics code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pure logic ADT with grid-based positie, richting, beweeg! method.
All sprite/animation code removed - drawing responsibility in adt-teken.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pure logic ADT with grid data, cell predicates (muur?, muntje?, etc.),
mutators (cel-set!, verwijder-deur!), and voor-elke-cel iterator.
All graphics code removed - drawing responsibility moved to adt-teken.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Constructor maak-positie returns dispatch closure with rij/kolom getters,
rij!/kolom! mutators, vergelijk? predicate, and beweeg method.
All coordinates are in grid units, not pixels.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All hardcoded values (cell sizes, offsets, sprite scales, timing, score,
UI positions, cell type codes) are now named constants in an R7RS library.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>