(module downstroke/engine * (import scheme (chicken base) (chicken keyword) (prefix sdl2 "sdl2:") (prefix sdl2-ttf "ttf:") (prefix sdl2-image "img:") defstruct downstroke/world downstroke/input downstroke/assets downstroke/renderer) ;; ── Game struct ──────────────────────────────────────────────────────────── ;; defstruct auto-generates make-game, which we'll wrap with default values (defstruct game title width height window renderer input ;; input-state record input-config ;; input-config record assets ;; asset registry (hash-table from assets.scm) frame-delay preload-hook ;; (lambda (game) ...) create-hook ;; (lambda (game) ...) update-hook ;; (lambda (game dt) ...) render-hook ;; (lambda (game) ...) — post-render overlay scene) ;; current scene struct; #f until create: runs ;; Store the auto-generated constructor as make-game* (define make-game* make-game) ;; ── Public constructor wrapper ───────────────────────────────────────────── ;; Wraps the auto-generated make-game (renamed to make-game*) with default values (define (make-game #!key (title "Downstroke Game") (width 640) (height 480) (frame-delay 16) (input-config *default-input-config*) (preload #f) (create #f) (update #f) (render #f)) (make-game* title: title width: width height: height window: #f renderer: #f scene: #f input: (create-input-state input-config) input-config: input-config assets: (make-asset-registry) frame-delay: frame-delay preload-hook: preload create-hook: create update-hook: update render-hook: render)) ;; ── Convenience accessors ────────────────────────────────────────────────── ;; game-camera: derived from the current scene (only valid after create: runs) (define (game-camera game) (scene-camera (game-scene game))) ;; game-asset: retrieve an asset by key (define (game-asset game key) (asset-ref (game-assets game) key)) ;; game-asset-set!: store an asset by key (define (game-asset-set! game key value) (asset-set! (game-assets game) key value)) ;; ── game-run! ────────────────────────────────────────────────────────────── ;; Stub — implemented in Task 4 (define (game-run! game) (error "game-run! not yet implemented")) ) ;; end module