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