aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2025-06-28 06:20:20 +0100
committerGene Pasquet <dev@etenil.net>2025-06-28 06:20:20 +0100
commit114a81a7761e098ea34e2a4c27a0ec6e384c720d (patch)
treec212e1addcfffeac04ed5881d2003293cf3f5dd2
parent0c5d45bec2d061991c627b66ad6acad05fbdddeb (diff)
A little bit of progess
-rw-r--r--src/tilemap.scm52
1 files changed, 47 insertions, 5 deletions
diff --git a/src/tilemap.scm b/src/tilemap.scm
index 49c98e2..52d1057 100644
--- a/src/tilemap.scm
+++ b/src/tilemap.scm
@@ -4,6 +4,8 @@
(chicken io)
(chicken base)
(chicken string)
+ (chicken process-context)
+ (chicken pathname)
(chicken pretty-print)
(srfi 1)
expat
@@ -15,6 +17,7 @@
spacing
tilecount
columns
+ image-source
image)
(defstruct layer
@@ -37,6 +40,7 @@
height
tilewidth
tileheight
+ tileset-source
tileset
layers
objects)
@@ -58,6 +62,31 @@
(maybe-string->number (cdr pair))))
string-alist))
+(define (parse-tileset string-tileset)
+ (let ((parser (expat:make-parser))
+ (tags '())
+ (tileset (make-tileset 0 0 0 0 0 "")))
+ (expat:set-start-handler! parser
+ (lambda (tag attrs)
+ (let ((symbol-attrs (string-alist->alist attrs)))
+ (cond ((string=? tag "tileset")
+ (set! tileset (alist->tileset symbol-attrs)))
+ ((string=? tag "image")
+ (tileset-image-source-set! tileset (alist-ref 'source symbol-attrs)))))
+ (set! tags (cons tag tags))))
+ (expat:set-end-handler! parser (lambda (tag)
+ (set! tags (cdr tags))))
+ (expat:set-character-data-handler! parser (lambda (line) #f))
+ (expat:parse parser string-tileset)
+ tileset))
+
+(define (load-tileset file-name)
+ (call-with-input-file file-name
+ (lambda (port)
+ (parse-tileset (read-string #f port))
+ ;; Load up the image from SDL.
+ )))
+
(define (parse-tilemap string-tilemap)
(let ((parser (expat:make-parser))
(tags '())
@@ -72,7 +101,7 @@
(tilemap-tilewidth-set! tilemap (alist-ref 'tilewidth symbol-attrs))
(tilemap-tileheight-set! tilemap (alist-ref 'tileheight symbol-attrs)))
((string=? tag "tileset")
- (tilemap-tileset-set! tilemap (alist->tileset symbol-attrs)))
+ (tilemap-tileset-source-set! tilemap (alist-ref 'source symbol-attrs)))
((string=? tag "layer")
(set! layer (alist->layer attrs)))
((string=? tag "object")
@@ -99,13 +128,21 @@
(define (load-tilemap file-name)
(call-with-input-file file-name
(lambda (port)
- (parse-tilemap (read-string port))
- ;; TODO: Open and parse the tileset
+ (let ((tilemap (parse-tilemap (read-string #f port))))
+ (tilemap-tileset-set! tilemap (load-tileset (tilemap-tileset-source tilemap))))
+
)))
(when #f
(let ((txt "<?xml version='1.0' encoding='UTF-8'?>
+<tileset version='1.10' tiledversion='1.11.2' name='monochrome_transparent' tilewidth='16' tileheight='16' spacing='1' tilecount='1078' columns='49'>
+ <image source='monochrome-transparent.png' width='832' height='373'/>
+</tileset>
+"))
+ (tileset-image (parse-tileset txt)))
+
+ (let ((txt "<?xml version='1.0' encoding='UTF-8'?>
<map version='1.10' tiledversion='1.11.0' orientation='orthogonal' renderorder='right-down' width='40' height='30' tilewidth='16' tileheight='16' infinite='0' nextlayerid='8' nextobjectid='5'>
<tileset firstgid='1' source='monochrome_transparent.tsx'/>
<layer id='3' name='ground' width='40' height='30'>
@@ -125,9 +162,14 @@
</objectgroup>
</map>
"))
- (tileset-source (tilemap-tileset (parse-tilemap txt))))
-
+ (tilemap-tileset (parse-tilemap txt)))
+
+ (load-tilemap "assets/level-0.tmx")
+
+ (current-directory)
)
+
+
) ;; End tilemap module