diff --git a/desktop/src-common/advent/.#steam.clj b/desktop/src-common/advent/.#steam.clj deleted file mode 120000 index 3f573afa..00000000 --- a/desktop/src-common/advent/.#steam.clj +++ /dev/null @@ -1 +0,0 @@ -brycecovert@brometheus.local.6703 \ No newline at end of file diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index b7613cb5..9af62260 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -84,7 +84,7 @@ (thread (do ~@forms (change-script-state ~entities false) - (utils/save @~entities :autosave "Autosave")))))))) + (utils/save @~entities "autosave" "Autosave")))))))) (defmacro get-unsaved-script [entities & forms] `(fn [starting-entities#] diff --git a/desktop/src-common/advent/screens/rooms/outside_house.clj b/desktop/src-common/advent/screens/rooms/outside_house.clj index 8875bd11..30845c68 100644 --- a/desktop/src-common/advent/screens/rooms/outside_house.clj +++ b/desktop/src-common/advent/screens/rooms/outside_house.clj @@ -208,7 +208,7 @@ :wizard "If this is truly your quest, then I will help you. " :ego "So you're my friend now, Gandarf?" :wizard "No.") - (utils/save @entities :autosave "Autosave"))}]}) + (utils/save @entities "autosave" "Autosave"))}]}) (defn wizard-dialogue [entities] (if (get-in @entities [:state :has-met-gandarf?]) @@ -621,7 +621,7 @@ (if (get-in @entities [:state :convinced-wizard?]) (do (actions/talk entities :wizard "Oh, hello there, boy.") - (utils/save @entities :autosave "Autosave")) + (utils/save @entities "autosave" "Autosave")) (wizard-dialogue entities))))) :cursor :right} diff --git a/desktop/src-common/advent/steam.clj b/desktop/src-common/advent/steam.clj index 04387c63..4a150650 100644 --- a/desktop/src-common/advent/steam.clj +++ b/desktop/src-common/advent/steam.clj @@ -1,8 +1,11 @@ -(ns advent.steam) +(ns advent.steam + (:require [play-clj.core :refer :all] + [clojure.edn :as edn]) + (:import [java.nio ByteBuffer CharBuffer])) (def has-steam? (try - (import '[com.codedisaster.steamworks SteamUserStats SteamUserStatsCallback SteamAPI]) + (import '[com.codedisaster.steamworks SteamUserStats SteamUserStatsCallback SteamAPI SteamRemoteStorage]) true (catch Exception e false))) @@ -42,3 +45,51 @@ (defn clear-all-achievements [] (doall (map clear-achievement all-achievements))) + +(defn write-file [filename edn] + (let [edn (pr-str edn)] + (if has-steam? + (eval `(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 [] + (if has-steam? + (eval `(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")] + (do (println n#) + (.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] + (when has-steam? + (eval `(let [rs# (SteamRemoteStorage. nil) + bytes# (.readBytes (files! :local ~filename)) + bb# (ByteBuffer/allocateDirect (count bytes#))] + + (.put bb# bytes#) + (.fileWrite rs# ~filename bb# (count bytes#)))))) + +(defn download-screenshot [filename] + (when (and has-steam? (not (.exists (files! :local filename)))) + (eval `(let [rs# (SteamRemoteStorage. nil) + len# (.getFileSize rs# ~filename) + bb# (ByteBuffer/allocateDirect len#) + bytes# (make-array Byte/TYPE len#)] + (do (.fileRead rs# ~filename bb# len#) + (.get bb# bytes#) + (.writeBytes (files! :local ~filename) + bytes# + false)))))) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 31d68d87..43342ffc 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -9,7 +9,8 @@ [clojure.java.io :as io] [clojure.edn :as edn] [clojure.string :as str] - [advent.saves :as saves]) + [advent.saves :as saves] + [advent.steam :as steam]) (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Format Pixmap$Blending Pixmap$Filter Texture Texture$TextureFilter] [com.badlogic.gdx.graphics.g2d TextureRegion Animation] [com.badlogic.gdx.utils.viewport FitViewport] @@ -69,15 +70,16 @@ (if (= "Autosave" (:name s)) (Long/MIN_VALUE) (- (Long/parseLong (:id s))))) - (for [save-file (.list (files! :local ".") ".edn")] - (edn/read-string (.readString save-file))))) + (steam/snapshot-list))) (defn snapshot-screenshots [] - (for [snapshot (snapshot-list)] - (update-in snapshot [:screenshot] - #(try (Pixmap. (files! :local %) ) - (catch Exception e - (Pixmap. 160 120 Pixmap$Format/RGB888)))))) + (doall (for [snapshot (snapshot-list)] + (do + (steam/download-screenshot (:screenshot snapshot)) + (update-in snapshot [:screenshot] + #(try (Pixmap. (files! :local %) ) + (catch Exception e + (Pixmap. 160 120 Pixmap$Format/RGB888)))))))) (defn save-chapter [entities chapter] (let [prefs (.getPreferences (Gdx/app) "ticks-tales-saves") @@ -97,8 +99,9 @@ saves/chapters))) (defn write-file [filename edn] - (let [f (files! :local filename)] - (.writeString f (pr-str edn) false))) + (steam/write-file filename edn) + #_(let [f (files! :local filename)] + (.writeString f (pr-str edn) false))) (defn save-file-name [id] (str id ".edn")) @@ -112,7 +115,7 @@ :y (get-in entities [:room :entities :ego :y])) :blurb (or blurb name)}] (write-file (save-file-name id) save) - (on-gl (let [f (files! :local (save-screenshot-file-name id)) + (on-gl (let [f (files! :local (save-screenshot-file-name id)) _ (Pixmap/setFilter Pixmap$Filter/BiLinear) viewport (-> @ (resolve 'advent.screens.scene/scene) :screen deref :viewport) [x y w h g-l g-r] [(.getScreenX viewport) (.getScreenY viewport) (.getScreenWidth viewport) (.getScreenHeight viewport)] @@ -121,7 +124,8 @@ _ (.drawPixmap resized pm 0 0 w h 0 0 160 120) png (PixmapIO$PNG. (* w h 1.5))] (.write png f resized) - (.dispose png))))) + (.dispose png) + (steam/add-screenshot (save-screenshot-file-name id)))))) (defn remove-save [id] (on-gl (doseq [f [(files! :local (save-screenshot-file-name id))