bloatrunner/game/level.scm

97 lines
2.7 KiB
Scheme
Raw Normal View History

2024-05-19 18:48:18 +02:00
(define-module (game level)
#:use-module (ice-9 match)
#:use-module (ice-9 pretty-print)
2024-05-19 19:00:40 +02:00
#:use-module (ice-9 textual-ports)
2024-05-19 18:48:18 +02:00
#: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 <level>
(%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)
2024-05-19 19:00:40 +02:00
(filter (lambda (line) (not (string-null? line)))
(map
(lambda (line)
(string-trim-right
(car (string-split line #\-))
#\space))
(string-split content #\newline))))
2024-05-19 18:48:18 +02:00
(define (parse-lines lines)
(fold append
'()
(map
(lambda (line)
(map parse-tile (string->list line)))
lines)))
(define (parse-level content)
2024-05-19 19:00:40 +02:00
(let* ((lines (content->lines content))
2024-05-19 18:48:18 +02:00
(width (string-length (car lines)))
(height (length lines))
(tiles (list->vector
(parse-lines lines)))
(entities '()))
(%make-level width height tiles #f #f entities)))
2024-05-19 19:00:40 +02:00
(define (parse-level-file filename)
(parse-level (call-with-input-file filename get-string-all)))
2024-05-19 18:48:18 +02:00
(test-begin "level")
2024-05-19 19:00:40 +02:00
2024-05-19 18:48:18 +02:00
(test-assert (level? (parse-level "WWWWW\nWP GW\nWWWWW\n")))
2024-05-19 19:00:40 +02:00
(test-equal (level-width (parse-level "WWWWW\nWP GW\nWWWWW\n")) 5)
(test-equal (level-height (parse-level "WWWWW\nWP GW\nWWWWW\n")) 3)
2024-05-19 18:48:18 +02:00
(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))
2024-05-19 19:00:40 +02:00
(test-equal (content->lines "WWWWW\nWP GW\nWWWWW\n") '("WWWWW" "WP GW" "WWWWW"))
2024-05-19 18:48:18 +02:00
(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)
2024-05-19 19:00:40 +02:00
(test-equal (level-width (parse-level-file "assets/levels/level-1.map")) 40)
(test-equal (level-height (parse-level-file "assets/levels/level-1.map")) 24)
2024-05-19 18:48:18 +02:00
(test-end "level")