In the beginning there was darkness

This commit is contained in:
Daniel Ziltener 2020-09-12 14:09:28 +02:00
commit 3a03af4b12
14 changed files with 233 additions and 0 deletions

1
.clj-kondo/config.edn Normal file
View File

@ -0,0 +1 @@
{:lint-as {mount.core/defstate clojure.core/def}}

11
.editorconfig Normal file
View File

@ -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

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
*~
*.jar
*.class
.nrepl-port
.cpcache/
.cache/
target/
classes/

0
README.md Normal file
View File

16
deps.edn Normal file
View File

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

9
planning.org Normal file
View File

@ -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

18
resources/test.tmx Normal file
View File

@ -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>

16
resources/test.tsx Normal file
View File

@ -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>

View File

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

View File

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

View File

@ -0,0 +1,4 @@
(ns ch.lyrion.rpg-engine.core
(:require [cljfx.api :as fx]
[datascript.core :as d]))

View File

@ -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)))))

View File

@ -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))))

View File

@ -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}))