aboutsummaryrefslogtreecommitdiff
path: root/engine.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-05 16:59:21 +0100
committerGene Pasquet <dev@etenil.net>2026-04-05 16:59:21 +0100
commit9e225caf11bece721f15c0ae68d22d6df53607ee (patch)
tree7dd72ee80f96be896d3d614e54695d3f3ffff7a3 /engine.scm
parent183b1792b4baa6a50ef839b0dbf2b7618bf25c95 (diff)
feat: add engine.scm — game struct, make-game constructor, convenience accessors
Diffstat (limited to 'engine.scm')
-rw-r--r--engine.scm78
1 files changed, 78 insertions, 0 deletions
diff --git a/engine.scm b/engine.scm
new file mode 100644
index 0000000..5526e6c
--- /dev/null
+++ b/engine.scm
@@ -0,0 +1,78 @@
+(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
+(define make-game-raw make-game)
+
+;; ── Public constructor wrapper ─────────────────────────────────────────────
+
+(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-raw
+ 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