"
+ (apply str (for [{:keys [matrix lit]} d20-faces]
+ (str "")))
+ "
"))
+
+;; Spell circle: twelve made-up runes, each three strokes between points of a 3x3 grid, around a ring.
+(def ^:private rune-points [[-4 -6] [4 -6] [-4 0] [4 0] [-4 6] [4 6] [0 -6] [0 6] [0 0]])
+
+(def ^:private runes
+ (apply str
+ (for [i (range 12)
+ s (range 3)
+ :let [th (/ (* 2 Math/PI i) 12)
+ cx (+ 100 (* 76 (Math/sin th)))
+ cy (- 100 (* 76 (Math/cos th)))
+ rot (fn [[x y]] [(+ cx (- (* x (Math/cos th)) (* y (Math/sin th))))
+ (+ cy (* x (Math/sin th)) (* y (Math/cos th)))])
+ [x1 y1] (rot (rune-points (mod (+ (* 5 i) (* 2 s)) 9)))
+ [x2 y2] (rot (rune-points (mod (+ (* 5 i) (* 2 s) 1 (* 3 s)) 9)))]]
+ (str "M" (n x1) " " (n y1) "L" (n x2) " " (n y2)))))
+
+(def ^:private hexagram
+ (let [pt #(let [a (/ (* 2 Math/PI %) 6)] (str (n (+ 100 (* 56 (Math/sin a)))) " " (n (- 100 (* 56 (Math/cos a))))))]
+ (str "M" (str/join "L" (map pt [0 2 4])) "Z"
+ "M" (str/join "L" (map pt [1 3 5])) "Z")))
+
+(defn- spell []
+ (str "