In the beginning there was darkness
This commit is contained in:
commit
3a03af4b12
|
@ -0,0 +1 @@
|
|||
{:lint-as {mount.core/defstate clojure.core/def}}
|
|
@ -0,0 +1,11 @@
|
|||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
charset = utf-8
|
|
@ -0,0 +1,8 @@
|
|||
*~
|
||||
*.jar
|
||||
*.class
|
||||
.nrepl-port
|
||||
.cpcache/
|
||||
.cache/
|
||||
target/
|
||||
classes/
|
|
@ -0,0 +1,16 @@
|
|||
{:paths ["src" "resources" "classes"]
|
||||
:deps {org.clojure/clojure {:mvn/version "1.10.1"}
|
||||
org.clojure/data.xml {:mvn/version "0.0.8"}
|
||||
|
||||
cljfx/cljfx {:git/url "https://github.com/cljfx/cljfx"
|
||||
:sha "551150a8e9610ad007ead919c9456d1d34233706"}
|
||||
tile-soup/tile-soup {;;:mvn/version "0.4.0"
|
||||
:git/url "https://github.com/zilti/tile-soup"
|
||||
:sha "fbe0abf9e05ed3a8553796f0713725bff18be856"}
|
||||
datascript/datascript {:mvn/version "1.0.1"}
|
||||
metosin/malli {:git/url "https://github.com/metosin/malli"
|
||||
:sha "872be6a5ba8896649d82947e383c99118598d67e"}
|
||||
mount/mount {:mvn/version "0.1.16"}
|
||||
tolitius/mount-up {:mvn/version "0.1.3"}}
|
||||
:aliases {:outdated {:extra-deps {olical/depot {:mvn/version "2.0.1"}}
|
||||
:main-opts ["-m" "depot.outdated.main" "-a" "outdated" "--write"]}}}
|
|
@ -0,0 +1,9 @@
|
|||
#+AUTHOR: Daniel Ziltener
|
||||
#+TITLE: RPG Engine Planning
|
||||
|
||||
* Needed features
|
||||
** Multi-layer tiling
|
||||
** Smooth scrolling in all directions
|
||||
** Smooth tile-wise character movement
|
||||
** Dialog system
|
||||
** Inventory system
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.4" tiledversion="1.4.2" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="4">
|
||||
<tileset firstgid="1" source="test.tsx"/>
|
||||
<layer id="1" name="Kachelebene 1" width="10" height="10">
|
||||
<data encoding="csv">
|
||||
2,3,2147483651,2147483650,0,0,0,0,0,0,
|
||||
1,1,1,1,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<tileset version="1.4" tiledversion="1.4.2" name="test" tilewidth="16" tileheight="16" tilecount="4" columns="0">
|
||||
<grid orientation="orthogonal" width="1" height="1"/>
|
||||
<tile id="0">
|
||||
<image width="16" height="16" source="../../../tmp/parts-334.png"/>
|
||||
</tile>
|
||||
<tile id="1">
|
||||
<image width="16" height="16" source="../../../tmp/parts-350.png"/>
|
||||
</tile>
|
||||
<tile id="2">
|
||||
<image width="16" height="16" source="../../../tmp/parts-351.png"/>
|
||||
</tile>
|
||||
<tile id="3">
|
||||
<image width="16" height="16" source="../../../tmp/parts-352.png"/>
|
||||
</tile>
|
||||
</tileset>
|
|
@ -0,0 +1,9 @@
|
|||
{:name :tile
|
||||
:validator
|
||||
[:map
|
||||
[:tile/x int?]
|
||||
[:tile/y int?]
|
||||
[:tile/z int?]
|
||||
[:tile/width int?]
|
||||
[:tile/height int?]
|
||||
[:tile/src string?]]}
|
|
@ -0,0 +1,14 @@
|
|||
{:name :tileset
|
||||
:validator
|
||||
[:map
|
||||
[:tileset/name keyword?]
|
||||
[:tiles/width integer?]
|
||||
[:tiles/height integer?]
|
||||
[:tiles/count integer?]
|
||||
[:tiles
|
||||
[:sequential
|
||||
[:map
|
||||
[:tile/id integer?]
|
||||
[:tile/width integer?]
|
||||
[:tile/height integer?]
|
||||
[:tile/src string?]]]]]}
|
|
@ -0,0 +1,4 @@
|
|||
(ns ch.lyrion.rpg-engine.core
|
||||
(:require [cljfx.api :as fx]
|
||||
[datascript.core :as d]))
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
(ns ch.lyrion.rpg-engine.tilemap
|
||||
(:require [clojure.java.io :as io]
|
||||
[tile-soup.core :as ts]
|
||||
[ch.lyrion.rpg-engine.validation :as validation]
|
||||
[mount.core :refer [defstate]]))
|
||||
|
||||
(defn- load-raw-tileset [filename]
|
||||
(->> filename
|
||||
io/resource
|
||||
slurp
|
||||
(ts/parse :tile-soup.tileset/tileset)))
|
||||
|
||||
(defn- tileset-basemap [{:keys [attrs]}]
|
||||
{:tileset/name (-> attrs :name keyword)
|
||||
:tiles/width (:tilewidth attrs)
|
||||
:tiles/height (:tileheight attrs)
|
||||
:tiles/count (:tilecount attrs)})
|
||||
|
||||
(defn- tileset-tiles [tileset-map [tile & tiles]]
|
||||
(case (:tag tile)
|
||||
:tile (recur (update tileset-map :tiles conj
|
||||
{:tile/id (-> tile :attrs :id)
|
||||
:tile/width (-> tile :content first :attrs :width)
|
||||
:tile/height (-> tile :content first :attrs :height)
|
||||
:tile/src (-> tile :content first :attrs :source)})
|
||||
tiles)
|
||||
nil tileset-map
|
||||
(recur tileset-map tiles)))
|
||||
|
||||
(defn- load-tileset* [filename]
|
||||
{:post [(validation/validate :tileset %)]}
|
||||
(let [raw-tileset (load-raw-tileset filename)]
|
||||
(-> raw-tileset
|
||||
tileset-basemap
|
||||
(tileset-tiles (:content raw-tileset)))))
|
||||
|
||||
(defstate tilesets
|
||||
:start (atom {}))
|
||||
|
||||
(defn load-tileset [filename]
|
||||
(let [tileset (load-tileset* filename)]
|
||||
(swap! tilesets assoc (:tileset/name tileset) tileset)
|
||||
tileset))
|
||||
|
||||
;; Map
|
||||
(defn- load-raw-tilemap [filename]
|
||||
(->> filename
|
||||
io/resource
|
||||
slurp
|
||||
ts/parse))
|
||||
|
||||
(defn- tilemap-basemap [{:keys [attrs]}]
|
||||
{:map/width (:width attrs)
|
||||
:map/height (:height attrs)
|
||||
:tiles/width (:tilewidth attrs)
|
||||
:tiles/height (:tileheight attrs)})
|
||||
|
||||
(defn- tilemap-layer [tilemap-map [entry & entries]]
|
||||
(case (:tag entry)
|
||||
:tileset (recur (update tilemap-map :map/tilesets conj
|
||||
{:tileset/start-index (-> entry :attrs :firstgid)
|
||||
:tileset/name (:tileset/name (load-tileset (-> entry :attrs :source)))})
|
||||
entries)
|
||||
:layer (recur (update tilemap-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)})
|
||||
entries)
|
||||
nil tilemap-map))
|
||||
|
||||
(defn load-tilemap* [filename]
|
||||
(let [raw-tilemap (load-raw-tilemap filename)]
|
||||
(-> raw-tilemap
|
||||
tilemap-basemap
|
||||
(tilemap-layer (:content raw-tilemap)))))
|
|
@ -0,0 +1,21 @@
|
|||
(ns ch.lyrion.rpg-engine.util
|
||||
(:require [clojure.java.io :as io])
|
||||
(:import (java.nio.file FileSystems
|
||||
Files
|
||||
Paths)
|
||||
(java.net URI)
|
||||
(java.util Collections)))
|
||||
|
||||
(defn load-filelist-in-dir [dir]
|
||||
(let [val-uri (->> dir
|
||||
io/resource
|
||||
.toString
|
||||
(new URI))
|
||||
val-dir (if (= (.getScheme val-uri) "jar")
|
||||
(-> val-uri
|
||||
(FileSystems/newFileSystem (Collections/emptyMap))
|
||||
(.getPath dir))
|
||||
(Paths/get val-uri))]
|
||||
(->> (Files/list val-dir)
|
||||
.toArray
|
||||
(map str))))
|
|
@ -0,0 +1,29 @@
|
|||
(ns ch.lyrion.rpg-engine.validation
|
||||
(:require [clojure.edn :as edn]
|
||||
[ch.lyrion.rpg-engine.util :as util]
|
||||
[mount.core :refer [defstate]]
|
||||
[malli.core :as m]))
|
||||
|
||||
(defn load-validation-file [path]
|
||||
(let [valfile (-> path slurp edn/read-string)]
|
||||
{(:name valfile) (:validator valfile)}))
|
||||
|
||||
(defn load-validation-files []
|
||||
(let [files (util/load-filelist-in-dir "validators")]
|
||||
(reduce #(merge %1 (load-validation-file %2))
|
||||
{} files)))
|
||||
|
||||
(defstate registry
|
||||
:start (merge
|
||||
(m/class-schemas)
|
||||
(m/comparator-schemas)
|
||||
(m/base-schemas)
|
||||
(m/default-schemas)
|
||||
(m/predicate-schemas)
|
||||
(load-validation-files)))
|
||||
|
||||
(defn validate [spec value]
|
||||
(m/validate spec value {:registry registry}))
|
||||
|
||||
(defn validator [spec]
|
||||
(m/validator spec {:registry registry}))
|
Loading…
Reference in New Issue