diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index a4480f39..6b99dc64 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -100,24 +100,34 @@ (edn/read-string (.getString prefs "chapters")) saves/chapters))) +(defn try-times [fn times] + (first (drop-while #{:fail} + (repeatedly times + #(try (fn) + (catch Exception e + (log/error "Could not save!" e) + :fail)))))) + (defn save [entities id name & [blurb]] - (log/info "Saving " id name) - (let [save {:name name - :id id - :screenshot (steam/save-screenshot-file-name id) - :state (assoc (entities :state) - :x (get-in entities [:room :entities :ego :x]) - :y (get-in entities [:room :entities :ego :y])) - :blurb (or blurb name)}] - - (steam/write-bytes (steam/save-file-name id) (.getBytes (pr-str save) "UTF-8")) - (on-gl (let [_ (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)] - pm (ScreenUtils/getFrameBufferPixmap x y w h) - resized (Pixmap. 160 120 Pixmap$Format/RGB888) - _ (.drawPixmap resized pm 0 0 w h 0 0 160 120)] - (steam/save-screenshot resized (steam/save-screenshot-file-name id)))))) + (let [save-fn (fn [] + (log/info "Saving " id name) + (let [save {:name name + :id id + :screenshot (steam/save-screenshot-file-name id) + :state (assoc (entities :state) + :x (get-in entities [:room :entities :ego :x]) + :y (get-in entities [:room :entities :ego :y])) + :blurb (or blurb name)}] + + (steam/write-bytes (steam/save-file-name id) (.getBytes (pr-str save) "UTF-8")) + (on-gl (let [_ (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)] + pm (ScreenUtils/getFrameBufferPixmap x y w h) + resized (Pixmap. 160 120 Pixmap$Format/RGB888) + _ (.drawPixmap resized pm 0 0 w h 0 0 160 120)] + (steam/save-screenshot resized (steam/save-screenshot-file-name id))))))] + (try-times save-fn 3))) (defn remove-save [id] (doseq [f [(steam/save-screenshot-file-name id)