From 4d0fdbfc39f6033be8a6c599ed8bd376ca82f540 Mon Sep 17 00:00:00 2001 From: Daniel Ziltener Date: Sat, 12 Sep 2020 18:20:58 +0200 Subject: [PATCH] Map parsing implementation --- resources/validators/tilemap.edn | 26 ++++++++++++++++++++++++++ resources/validators/tileset.edn | 2 +- src/ch/lyrion/rpg-engine/tilemap.clj | 13 +++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 resources/validators/tilemap.edn diff --git a/resources/validators/tilemap.edn b/resources/validators/tilemap.edn new file mode 100644 index 0000000..99c997d --- /dev/null +++ b/resources/validators/tilemap.edn @@ -0,0 +1,26 @@ +{:name :tilemap + :validator + [:map {:closed true} + [:map/width number?] + [:map/height number?] + [:map/tilesets + [:sequential + [:map {:closed true} + [:tileset/start-index number?] + [:tileset/name keyword?]]]] + [:tiles/width number?] + [:tiles/height number?] + [:map/layers + [:sequential + [:map {:closed true} + [:layer/id number?] + [:layer/name string?] + [:layer/width number?] + [:layer/height number?] + [:layer/tiles + [:sequential + [:map {:closed true} + [:horizontal? boolean?] + [:vertical? boolean?] + [:diagonal? boolean?] + [:id number?]]]]]]]]} diff --git a/resources/validators/tileset.edn b/resources/validators/tileset.edn index 5f0dca8..0247877 100644 --- a/resources/validators/tileset.edn +++ b/resources/validators/tileset.edn @@ -1,6 +1,6 @@ {:name :tileset :validator - [:map + [:map {:closed true} [:tileset/name keyword?] [:tiles/width integer?] [:tiles/height integer?] diff --git a/src/ch/lyrion/rpg-engine/tilemap.clj b/src/ch/lyrion/rpg-engine/tilemap.clj index 1b75104..2c16317 100644 --- a/src/ch/lyrion/rpg-engine/tilemap.clj +++ b/src/ch/lyrion/rpg-engine/tilemap.clj @@ -61,17 +61,26 @@ {:tileset/start-index (-> entry :attrs :firstgid) :tileset/name (:tileset/name (load-tileset (-> entry :attrs :source)))}) entries) - :layer (recur (update tilemap-map :layers conj + :layer (recur (update tilemap-map :map/layers conj {:layer/id (-> entry :attrs :id) :layer/name (-> entry :attrs :name) :layer/width (-> entry :attrs :width) :layer/height (-> entry :attrs :height) - :layer/tiles (-> entry :content first :content first)}) + :layer/tiles (->> entry :content first :content first (map ts/tile-id->map))}) entries) nil tilemap-map)) (defn load-tilemap* [filename] + {:post [(validation/validate :tilemap %)]} (let [raw-tilemap (load-raw-tilemap filename)] (-> raw-tilemap tilemap-basemap (tilemap-layer (:content raw-tilemap))))) + +(defstate tilemap + :start (atom {})) + +(defn load-tilemap [filename] + (let [tilemap-map (load-tilemap* filename)] + (reset! tilemap tilemap-map) + tilemap-map))