Files
gitea-docker/desktop/src-common/advent/steam.clj
2015-11-22 13:33:01 -08:00

118 lines
3.8 KiB
Clojure

(ns advent.steam
(:require [play-clj.core :refer :all]
[clojure.edn :as edn])
(:import [java.nio ByteBuffer CharBuffer]
[java.io ByteArrayOutputStream]
[com.badlogic.gdx.graphics PixmapIO$PNG]
))
(def has-steam?
(try
(import '[com.codedisaster.steamworks SteamUserStats SteamUserStatsCallback SteamAPI SteamRemoteStorage])
true
(catch Exception e
false)))
(defmacro steamify [steam-version & [regular-version]]
(if has-steam?
steam-version
regular-version))
(defn init []
(steamify
(SteamAPI/init)))
(defn update []
(steamify
(when (SteamAPI/isSteamRunning)
(SteamAPI/runCallbacks))))
(defn achievement-fn [f achievement]
(steamify
(let [stats (atom nil)]
(reset! stats (SteamUserStats. (reify SteamUserStatsCallback
(onUserStatsReceived [_ _ _ _]
(f @stats achievement)
)
(onUserStatsStored [_ _ _])
(onUserAchievementStored [_ _ _ _ _ _]))))
(.requestCurrentStats @stats))))
(def set-achievement (partial achievement-fn
(fn [stats achievement]
(.setAchievement stats achievement)
(.storeStats stats))))
(def clear-achievement (partial achievement-fn
(fn [stats achievement]
(.clearAchievement stats achievement)
(.storeStats stats))))
(def all-achievements ["MASTER_SLEUTH"])
(defn clear-all-achievements []
(doall (map clear-achievement all-achievements)))
(defn write-file [filename edn]
(let [edn (pr-str edn)]
(steamify
(let [rs (SteamRemoteStorage. nil)
v edn
bb (ByteBuffer/allocateDirect (* 2 (count v)))]
(-> bb .asCharBuffer (.put v) )
(.fileWrite rs filename bb (* 2 (count v))))
(let [f (files! :local filename)]
(.writeString f edn false)))))
(defn snapshot-list []
(steamify
(let [rs (SteamRemoteStorage. nil)]
(for [i (range (.getFileCount rs))
:let [len (* 1024 1024)
n (.getFileNameAndSize rs i (make-array Integer/TYPE 1))
bb (ByteBuffer/allocateDirect len)]
:when (.endsWith n ".edn")]
(.fileRead rs n bb len)
(-> bb .asCharBuffer .toString edn/read-string)))
(for [save-file (.list (files! :local ".") ".edn")]
(edn/read-string (.readString save-file)))))
(defn add-screenshot [filename]
(steamify
(let [rs (SteamRemoteStorage. nil)
bytes (.readBytes (files! :local filename))
bb (ByteBuffer/allocateDirect (count bytes))]
(.put bb bytes)
(.fileWrite rs filename bb (count bytes)))))
(defn get-screenshot-bytes [filename]
(steamify
(let [rs (SteamRemoteStorage. nil)
len (.getFileSize rs filename)
bb (ByteBuffer/allocateDirect len)
bytes (make-array Byte/TYPE len)]
(.fileRead rs filename bb len)
(.get bb bytes)
bytes)
(.readBytes (files! :local filename))))
(defn save-screenshot [pm filename]
(steamify
(let [rs (SteamRemoteStorage. nil)
png (PixmapIO$PNG. (* (.getWidth pm) (.getHeight pm) 1.5))
baos (ByteArrayOutputStream. (* (.getWidth pm) (.getHeight pm) 1.5))
_ (.write png baos pm)
bytes (.toByteArray baos)
bb (ByteBuffer/allocateDirect (count bytes))]
(.put bb bytes)
(.fileWrite rs filename bb (count bytes)))
(let [f (files! :local filename)
png (PixmapIO$PNG. (* (.getWidth pm) (.getHeight pm) 1.5))]
(.write png f pm)
(.dispose png))))