diff --git a/.gitignore b/.gitignore
index 9148070..171cf85 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,5 @@
/config.status
/configure
/pre-inst-env
+/scripts/run-game
+/*.log
diff --git a/assets/levels/level-1.map b/assets/levels/level-1.map
new file mode 100644
index 0000000..580a930
--- /dev/null
+++ b/assets/levels/level-1.map
@@ -0,0 +1,28 @@
+-- simple map format
+-- all content after a '-' is ignored
+--
+----|----|----|----|----|----|----|----|
+WWWWGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
+W E H E W
+W H W
+W E BBBBBBBBBBBBBBBBBBBBBBBBBBBB E W
+W H W -
+W H W
+W H W
+W H W
+W H W
+W H W -
+W H W
+W H W
+W H W
+W H W
+W H W -
+W H W
+W P HBBBBBBB W
+W H W
+W H W
+W H W -
+W H W
+W H W
+WBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBW
+WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
\ No newline at end of file
diff --git a/assets/levels/level1.tmx b/assets/levels/level1.tmx
new file mode 100644
index 0000000..f34bc94
--- /dev/null
+++ b/assets/levels/level1.tmx
@@ -0,0 +1,33 @@
+
+
diff --git a/assets/levels/tiles.tsx b/assets/levels/tiles.tsx
new file mode 100644
index 0000000..d4e6373
--- /dev/null
+++ b/assets/levels/tiles.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/tiles.tsx b/assets/tiles.tsx
new file mode 100644
index 0000000..0e66d4d
--- /dev/null
+++ b/assets/tiles.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/bloatrunner.tiled-project b/bloatrunner.tiled-project
new file mode 100644
index 0000000..d0eb592
--- /dev/null
+++ b/bloatrunner.tiled-project
@@ -0,0 +1,14 @@
+{
+ "automappingRulesFile": "",
+ "commands": [
+ ],
+ "compatibilityVersion": 1100,
+ "extensionsPath": "extensions",
+ "folders": [
+ "."
+ ],
+ "properties": [
+ ],
+ "propertyTypes": [
+ ]
+}
diff --git a/bloatrunner.tiled-session b/bloatrunner.tiled-session
new file mode 100644
index 0000000..a6e2371
--- /dev/null
+++ b/bloatrunner.tiled-session
@@ -0,0 +1,46 @@
+{
+ "Map/SizeTest": {
+ "height": 4300,
+ "width": 2
+ },
+ "activeFile": "assets/levels/level1.tmx",
+ "expandedProjectPaths": [
+ "assets",
+ ".",
+ "assets/levels"
+ ],
+ "fileStates": {
+ "assets/levels/level1.tmx": {
+ "scale": 2.60953125,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 319.59762888449796,
+ "y": 200.03592599245556
+ }
+ },
+ "assets/levels/tiles.tsx": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ }
+ },
+ "last.imagePath": "/home/pti/guile/bloatrunner/assets/images",
+ "map.height": 25,
+ "map.lastUsedFormat": "tmx",
+ "map.tileHeight": 16,
+ "map.tileWidth": 16,
+ "map.width": 40,
+ "openFiles": [
+ "assets/levels/tiles.tsx",
+ "assets/levels/level1.tmx"
+ ],
+ "project": "bloatrunner.tiled-project",
+ "recentFiles": [
+ "assets/levels/tiles.tsx",
+ "assets/levels/level1.tmx"
+ ],
+ "tileset.lastUsedFormat": "tsx",
+ "tileset.tileSize": {
+ "height": 16,
+ "width": 16
+ }
+}
diff --git a/game/level.scm b/game/level.scm
new file mode 100644
index 0000000..52ab889
--- /dev/null
+++ b/game/level.scm
@@ -0,0 +1,89 @@
+(define-module (game level)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 pretty-print)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
+ #:use-module (srfi srfi-64)
+
+ #:export (make-level
+ level-width
+ level-height
+ level-tiles
+ level-entities
+ level-player
+ level-goal)
+
+ )
+
+(define-record-type
+ (%make-level width height tiles goal player entities)
+ level?
+ (width level-width)
+ (height level-height)
+ (tiles level-tiles)
+ (goal level-goal)
+ (player level-player)
+ (entities level-entities))
+
+(define (parse-tile c)
+ (case c
+ ((#\W) 'wall)
+ ((#\B) 'brick)
+ ((#\H) 'ladder)
+ ((#\P) 'player)
+ ((#\E) 'enemy)
+ ((#\G) 'goal)
+ (else 'empty)))
+
+(define (content->lines content)
+ (map
+ (lambda (line)
+ (string-trim-right
+ (car (string-split line #\-))
+ #\space))
+ (string-split content #\newline)))
+
+(define (parse-lines lines)
+ (fold append
+ '()
+ (map
+ (lambda (line)
+ (map parse-tile (string->list line)))
+ lines)))
+
+(define (parse-level content)
+ (let* ((lines (map
+ (lambda (line)
+ (string-trim-right
+ (car (string-split line #\-))
+ #\space))
+ (string-split content #\newline)))
+ (width (string-length (car lines)))
+ (height (length lines))
+ (tiles (list->vector
+ (parse-lines lines)))
+ (entities '()))
+ (%make-level width height tiles #f #f entities)))
+
+(test-begin "level")
+
+(test-assert (level? (parse-level "WWWWW\nWP GW\nWWWWW\n")))
+(test-assert (level-width (parse-level "WWWWW\nWP GW\nWWWWW\n")) 5)
+(test-assert (level-height (parse-level "WWWWW\nWP GW\nWWWWW\n")) 3)
+(test-equal (level-tiles (parse-level "W")) #(wall))
+(test-equal
+ (level-tiles (parse-level "WWWWW\nWP GW\nWWWWW\n"))
+ #(wall wall wall wall wall wall player empty goal wall wall wall wall wall wall))
+(test-equal
+ (level-tiles (parse-level "--- ignore this line\nWWWWW\nWP GW - must be ignored\nWWWWW\n"))
+ #(wall wall wall wall wall wall player empty goal wall wall wall wall wall wall))
+
+(test-equal (parse-tile #\W) 'wall)
+(test-equal (parse-tile #\B) 'brick)
+(test-equal (parse-tile #\H) 'ladder)
+(test-equal (parse-tile #\P) 'player)
+(test-equal (parse-tile #\E) 'enemy)
+(test-equal (parse-tile #\G) 'goal)
+(test-equal (parse-tile #\space) 'empty)
+
+(test-end "level")
diff --git a/game/main.scm b/game/main.scm
index d2ee993..a7f8d4f 100644
--- a/game/main.scm
+++ b/game/main.scm
@@ -12,27 +12,91 @@
(define-module (game main)
#:use-module (chickadee)
+ #:use-module (chickadee math rect)
#:use-module (chickadee math vector)
+ #:use-module (chickadee graphics color)
#:use-module (chickadee graphics sprite)
#:use-module (chickadee graphics texture)
+ #:use-module (chickadee graphics text)
+ #:use-module (chickadee graphics tile-map)
#:use-module (system repl coop-server)
#:export (launch-game))
-(define sprite-position (vec2 256.0 176.0))
+(define sprite-position (vec2 156.0 176.0))
(define sprite-texture #f)
+(define tile-atlas #f)
+(define hero-atlas #f)
+(define text-position (vec2 0.0 280.0))
+(define tile-index 0)
+(define tile-map #f)
(define repl #f)
+
(define (load)
(set! sprite-texture (load-image "assets/images/chickadee.png"))
+ (set! tile-atlas
+ (split-texture
+ (load-image "assets/images/simples_pimples.png"
+ #:transparent-color black)
+ 16 16))
+ (set! hero-atlas
+ (split-texture
+ (load-image "assets/images/lr_penguin2.png")
+ 32 32))
+
+ (set! tile-map (load-tile-map "assets/levels/level1.tmx"))
(set! repl (spawn-coop-repl-server)))
-(define (update _dt)
- (poll-coop-repl-server repl))
+(define (update dt)
+ (poll-coop-repl-server repl)
+ (set-vec2-y! sprite-position
+ (floor-remainder (+ (vec2-y sprite-position) (* 50.0 dt)) 400.0))
+ (set-vec2-x! text-position
+ (floor-remainder (+ (vec2-x text-position) (* 25.0 dt)) 640.0))
+
+ )
+
+(define (draw-tile i)
+ (let ((x (* 16 (remainder i 40)))
+ (y (* 16 (quotient i 40))))
+ (draw-sprite
+ (texture-atlas-ref tile-atlas (+ i 3000 ))
+ (vec2 x y)
+ #:scale (vec2 1.0 1.0)))
+ )
+
+(define (draw-hero i)
+ (let ((x (* 64 (remainder i 8)))
+ (y (* 32 (quotient i 8)))
+ (id (tile-id))
+ )
+ (draw-sprite
+ (texture-atlas-ref hero-atlas i)
+ (vec2 (+ x 16) y)
+ #:scale (vec2 1.0 1.0))
+ (draw-text (format #f "~2d" i) (vec2 x y) #:color white))
+ )
+
(define (draw _alpha)
- (draw-sprite sprite-texture sprite-position))
+ (draw-sprite sprite-texture sprite-position)
+ (draw-text "Hello, Chickadee!" text-position )
+ (let ((hero-position (vec2+ text-position (vec2 -8.0 16.0)))
+ (hero-index (+ 56 (remainder (inexact->exact (floor (vec2-x text-position))) 8))))
+ (draw-sprite
+ (texture-atlas-ref hero-atlas hero-index)
+ hero-position))
+
+ (draw-tile-map tile-map)
+
+ ;;(do ((i 0 (+ i 1)))
+ ;; ((>= i 1000))
+ ;; (draw-tile i))
+ (do ((i 0 (+ i 1)))
+ ((>= i 64))
+ (draw-hero i)))
(define (launch-game args)
- (run-game #:load load
- #:update update
- #:draw draw))
+ (run-game #:load (lambda () (load))
+ #:update (lambda (dt) (update dt))
+ #:draw (lambda (alpha) (draw alpha))))
diff --git a/guix.scm b/guix.scm
index 4399b8a..dd5b4ea 100644
--- a/guix.scm
+++ b/guix.scm
@@ -11,7 +11,7 @@
(gnu packages pkg-config))
(package
- (name "chickadee-game-template")
+ (name "bloatrunner")
(version "0.1.0-git")
(source (git-checkout (url (dirname (current-filename)))))
(build-system gnu-build-system)
@@ -23,7 +23,7 @@
(list guile-3.0))
(propagated-inputs
(list guile-chickadee))
- (synopsis "Chickadee game template")
- (description "This is an example package for a Chickadee game.")
- (home-page "https://dthompson.us/projects/chickadee.html")
- (license license:asl2.0))
+ (synopsis "Loderunner inspired game")
+ (description "Small game written for the 2024 lisp game jam.")
+ (home-page "https://www.snamellit.com/projects/bloatrunner.html")
+ (license license:gpl3))