From dffd74cb8ce2073bbc69c6a407ee53650c8895ce Mon Sep 17 00:00:00 2001 From: Peter Tillemans Date: Sun, 19 May 2024 18:48:18 +0200 Subject: [PATCH] level data and parser. --- .gitignore | 2 + assets/levels/level-1.map | 28 ++++++++++++ assets/levels/level1.tmx | 33 +++++++++++++++ assets/levels/tiles.tsx | 4 ++ assets/tiles.tsx | 4 ++ bloatrunner.tiled-project | 14 ++++++ bloatrunner.tiled-session | 46 ++++++++++++++++++++ game/level.scm | 89 +++++++++++++++++++++++++++++++++++++++ game/main.scm | 78 +++++++++++++++++++++++++++++++--- guix.scm | 10 ++--- 10 files changed, 296 insertions(+), 12 deletions(-) create mode 100644 assets/levels/level-1.map create mode 100644 assets/levels/level1.tmx create mode 100644 assets/levels/tiles.tsx create mode 100644 assets/tiles.tsx create mode 100644 bloatrunner.tiled-project create mode 100644 bloatrunner.tiled-session create mode 100644 game/level.scm 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 @@ + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,201,601,201,201,201,201,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,201,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,601,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,601,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,601,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,601,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,601,0,0,0,0,0,0, +201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201, +251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251 + + + 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))