Map parsing implementation

This commit is contained in:
Daniel Ziltener 2020-09-12 18:20:58 +02:00
parent 3a03af4b12
commit 4d0fdbfc39
3 changed files with 38 additions and 3 deletions

View File

@ -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?]]]]]]]]}

View File

@ -1,6 +1,6 @@
{:name :tileset {:name :tileset
:validator :validator
[:map [:map {:closed true}
[:tileset/name keyword?] [:tileset/name keyword?]
[:tiles/width integer?] [:tiles/width integer?]
[:tiles/height integer?] [:tiles/height integer?]

View File

@ -61,17 +61,26 @@
{:tileset/start-index (-> entry :attrs :firstgid) {:tileset/start-index (-> entry :attrs :firstgid)
:tileset/name (:tileset/name (load-tileset (-> entry :attrs :source)))}) :tileset/name (:tileset/name (load-tileset (-> entry :attrs :source)))})
entries) entries)
:layer (recur (update tilemap-map :layers conj :layer (recur (update tilemap-map :map/layers conj
{:layer/id (-> entry :attrs :id) {:layer/id (-> entry :attrs :id)
:layer/name (-> entry :attrs :name) :layer/name (-> entry :attrs :name)
:layer/width (-> entry :attrs :width) :layer/width (-> entry :attrs :width)
:layer/height (-> entry :attrs :height) :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) entries)
nil tilemap-map)) nil tilemap-map))
(defn load-tilemap* [filename] (defn load-tilemap* [filename]
{:post [(validation/validate :tilemap %)]}
(let [raw-tilemap (load-raw-tilemap filename)] (let [raw-tilemap (load-raw-tilemap filename)]
(-> raw-tilemap (-> raw-tilemap
tilemap-basemap tilemap-basemap
(tilemap-layer (:content raw-tilemap))))) (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))