#lang r7rs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Constants ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; All configuration constants for the Pac-Man game. Prevents magic numbers ;; throughout the codebase and makes the game easily configurable. (define-library (pacman-project constants) (import (scheme base)) (export ;; Window window-width-px window-height-px ;; Maze grid cell-size-px maze-offset-y maze-wall-shrink ;; Cell types cell-type-coin cell-type-wall cell-type-empty cell-type-key cell-type-door ;; Coin rendering coin-inset coin-size ;; Sprites sprite-scale-pacman sprite-scale-key sprite-scale-key-ui sprite-scale-ghost ;; Movement pacman-speed-ms ghost-speed-ms ;; Ghost house ghost-house-door-row ghost-house-door-col-left ghost-house-door-col-right ghost-house-exit-row ghost-house-exit-col ;; Ghost start positions blinky-start-row blinky-start-col pinky-start-row pinky-start-col inky-start-row inky-start-col clyde-start-row clyde-start-col ;; Ghost scatter corners blinky-scatter-row blinky-scatter-col pinky-scatter-row pinky-scatter-col inky-scatter-row inky-scatter-col clyde-scatter-row clyde-scatter-col ;; Ghost house exit delays (ms) pinky-exit-delay inky-exit-delay clyde-exit-delay ;; Ghost mode durations (ms) scatter-duration-1 chase-duration-1 scatter-duration-2 chase-duration-2 scatter-duration-3 ;; Ghost AI clyde-shy-distance pinky-look-ahead ;; Animation animation-interval-ms ;; Score points-per-coin ;; Time limit start-time-seconds ms-per-second time-bonus-per-coin ;; Key placement max-placement-attempts ;; Rotation angles rotation-right rotation-left rotation-up rotation-down ;; Colors color-background color-wall color-door color-coin color-text color-title color-header-bg color-game-over color-pause-bg color-pause-text ;; UI layout header-height header-title-size header-title-x header-title-y score-label-size score-label-x score-label-y score-value-size score-value-x score-value-y key-ui-x key-ui-y sidebar-x sidebar-width time-label-size time-label-x time-label-y time-value-size time-value-x time-value-y game-over-text-size game-over-text-x game-over-text-y pause-text-size pause-text-x pause-text-y) (begin ;; Window dimensions (define window-width-px 1000) (define window-height-px 830) ;; Maze grid configuration (define cell-size-px 24) (define maze-offset-y 97) (define maze-wall-shrink 6) ;; Cell type encoding for the maze grid (define cell-type-coin 0) (define cell-type-wall 1) (define cell-type-empty 2) (define cell-type-key 3) (define cell-type-door 4) ;; Coin rendering (define coin-inset 9) (define coin-size 6) ;; Sprite scale factors (define sprite-scale-pacman 1.5) (define sprite-scale-key 1.5) (define sprite-scale-key-ui 3) (define sprite-scale-ghost 1.5) ;; Movement speed: time between automatic movement ticks (define pacman-speed-ms 200) (define ghost-speed-ms 220) ;; Ghost house position (door and exit point above door) (define ghost-house-door-row 12) (define ghost-house-door-col-left 13) (define ghost-house-door-col-right 14) (define ghost-house-exit-row 11) (define ghost-house-exit-col 14) ;; Ghost start positions (define blinky-start-row 11) (define blinky-start-col 14) (define pinky-start-row 14) (define pinky-start-col 13) (define inky-start-row 14) (define inky-start-col 11) (define clyde-start-row 14) (define clyde-start-col 16) ;; Ghost scatter target corners (define blinky-scatter-row 0) (define blinky-scatter-col 27) (define pinky-scatter-row 0) (define pinky-scatter-col 0) (define inky-scatter-row 30) (define inky-scatter-col 27) (define clyde-scatter-row 30) (define clyde-scatter-col 0) ;; Ghost house exit delays (ms) — staggered release (define pinky-exit-delay 2000) (define inky-exit-delay 5000) (define clyde-exit-delay 8000) ;; Ghost mode durations (ms) — scatter/chase alternation (define scatter-duration-1 7000) (define chase-duration-1 20000) (define scatter-duration-2 7000) (define chase-duration-2 20000) (define scatter-duration-3 5000) ;; Ghost AI parameters (define clyde-shy-distance 8) (define pinky-look-ahead 2) ;; Animation timing (define animation-interval-ms 100) ;; Score configuration (define points-per-coin 10) ;; Time limit configuration (define start-time-seconds 60) (define ms-per-second 1000) (define time-bonus-per-coin 1) ;; Key placement (define max-placement-attempts 1000) ;; Rotation angles (degrees) (define rotation-right 0) (define rotation-left 180) (define rotation-up 90) (define rotation-down -90) ;; Colors — arcade-style palette (standard Racket color names only) (define color-background "black") (define color-wall "medium blue") (define color-door "hot pink") (define color-coin "gold") (define color-text "white") (define color-title "yellow") (define color-header-bg "dark slate gray") (define color-game-over "red") (define color-pause-bg "black") (define color-pause-text "red") ;; UI layout — header bar at the top (define header-height 90) (define header-title-size 36) (define header-title-x 250) (define header-title-y 25) ;; Score display (left side of header) (define score-label-size 20) (define score-label-x 20) (define score-label-y 25) (define score-value-size 32) (define score-value-x 20) (define score-value-y 50) ;; Key UI indicator position (define key-ui-x 600) (define key-ui-y 30) ;; Sidebar (right of maze) (define sidebar-x 672) (define sidebar-width 4) ;; Time display (right sidebar area) (define time-label-size 20) (define time-label-x 700) (define time-label-y 200) (define time-value-size 40) (define time-value-x 710) (define time-value-y 240) ;; Game over overlay (define game-over-text-size 48) (define game-over-text-x 180) (define game-over-text-y 380) ;; Pause overlay (define pause-text-size 48) (define pause-text-x 200) (define pause-text-y 400)))