diff --git a/desktop/src-common/advent/screens/title.clj b/desktop/src-common/advent/screens/title.clj index db9ce0a9..92276586 100644 --- a/desktop/src-common/advent/screens/title.clj +++ b/desktop/src-common/advent/screens/title.clj @@ -140,7 +140,7 @@ (stack-y 305 0) (assoc :z 8 :interactable true)) - :rewind (-> (make-label "Previous chapter" (when is-starting? (color :white))) + :rewind (-> (make-label "Previous chapter" (when is-starting? (color :gray))) (stack-y 305 1) (assoc :z 8 :interactable (not is-starting?))) @@ -174,18 +174,27 @@ (every-pred :save #(utils/intersects? % [x y])) (vals entities)))) -(defn saves-menu [] - (into {:back (-> (make-label "Back") - (stack-y 305 7) - (assoc :z 8 - :interactable true))} - (for [[name index] (map #(vector %1 %2) - (utils/snapshot-list) (range))] - [name (-> (make-label name) - (stack-y 305 index) - (assoc :z 8 - :interactable true - :save (saves/name->save name)))]))) +(defn saves-menu [entities [save screenshot]] + (let [last? (= save (-> (:saves-list entities) last first)) + first? (= save (-> (:saves-list entities) first first))] + {:back (-> (make-label "Back") + (stack-y 305 7) + (assoc :z 8 :interactable true)) + :title (-> (make-label (str save)) + (stack-y 305 0) + (assoc :z 8 + :interactable true + :save (saves/name->save save))) + :screenshot (-> (texture screenshot) + (assoc :z 8 :x (/ 1280 2) :y (- 305 5) :origin-y 180 :origin-x 120 :height 180 :width 240 + :save (saves/name->save save))) + + :next (-> (make-label "Next >" (when last? (color :gray))) + (assoc :x 780 :y 203 + :interactable (not last?))) + :prev (as-> (make-label "< Prev" (when first? (color :gray))) prev + (assoc prev :x (- 500 (.getWidth (:object prev))) :y 203 + :interactable (not first?)))})) (defn style-ui [entities] (doseq [entity (vals entities) @@ -250,7 +259,8 @@ :z 7) center) :main-menu (main-menu) - :saves-menu (saves-menu) + :saves-list (utils/snapshot-screenshots) + :save-index 0 :font font :music music :volume 1.0 @@ -310,7 +320,7 @@ (utils/save-settings!) entities) - :on-touch-up (fn [screen [entities]] + :on-touch-up (fn [screen [{:keys [prev next saves-list save-index] :as entities}]] (when-not (get-in entities [:tweens :fade-out]) (let [[x y] (utils/unproject screen) selected-save (get-selected-save entities [x y])] @@ -324,7 +334,7 @@ (and (utils/intersects? (:rewind entities) [x y]) (-> entities :rewind :interactable)) (-> (apply dissoc entities (keys (:main-menu entities))) - (merge (:saves-menu entities))) + (merge (saves-menu entities (nth saves-list save-index)))) (utils/intersects? (:quit entities) [x y]) (quit screen entities) @@ -333,8 +343,18 @@ (utils/toggle-fullscreen!) (and (:back entities) (utils/intersects? (:back entities) [x y])) - (-> (apply dissoc entities (keys (:saves-menu entities))) + (-> entities (dissoc :screenshot :back :title :prev :next) (merge (:main-menu entities))) + + (and next (:interactable next) (utils/intersects? next [x y])) + (-> entities + (update-in [:save-index] inc) + (merge (saves-menu entities (nth saves-list (inc save-index))))) + + (and prev (:interactable prev) (utils/intersects? prev [x y])) + (-> entities + (update-in [:save-index] dec) + (merge (saves-menu entities (nth saves-list (dec save-index))))) selected-save (start-playing screen entities (:save selected-save)) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index d18f40c6..b7eaba6a 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -62,6 +62,8 @@ atlas (texture-atlas "packed/pack.atlas")] (texture (texture-atlas! atlas :find-region atlas-name)))) +(defn save-screenshot-file-name [name] + (str "screenshot-" (clojure.core/name name) ".png" )) (defn snapshot-list [] (let [prefs (.getPreferences (Gdx/app) "ticks-tales-saves")] @@ -69,22 +71,26 @@ (edn/read-string (.getString prefs "snapshot-list")) []))) +(defn snapshot-screenshots [] + (for [snapshot (snapshot-list)] + [snapshot (try (Pixmap. (FileHandle. (save-screenshot-file-name (saves/name->save snapshot))) ) + (catch Exception e + (Pixmap. 160 120 Pixmap$Format/RGB888)))])) + (defn snapshot-state [entities name] (doto (.getPreferences (Gdx/app) "ticks-tales-saves") (.putString (saves/saves name) (pr-str (entities :state))) - (.putString "snapshot-list" (pr-str (filter (complement #{"Autosave"}) - (cons (saves/saves name) - (filter (complement #{(saves/saves name)}) - (snapshot-list)))))) + (.putString "snapshot-list" (pr-str (cons (saves/saves name) + (filter (complement #{(saves/saves name)}) + (snapshot-list))))) .flush) - (on-gl (let [f (FileHandle. (str "screenshot-" (clojure.core/name name) ".png" )) + (on-gl (let [f (FileHandle. (save-screenshot-file-name name)) _ (Pixmap/setFilter Pixmap$Filter/BiLinear) - #_#_[x y w h g-l g-r] [(.getScreenX viewport) (.getScreenY viewport) (.getScreenWidth viewport) (.getScreenHeight viewport)] - [x y w h] [0 0 1400 900] + 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. 128 96 Pixmap$Format/RGB888) - _ (.drawPixmap resized pm 0 0 w h 0 0 128 96) + resized (Pixmap. 160 120 Pixmap$Format/RGB888) + _ (.drawPixmap resized pm 0 0 w h 0 0 160 120) png (PixmapIO$PNG. (* w h 1.5))] (.write png f resized) (.dispose png) @@ -289,8 +295,8 @@ (defn intersects? [e [x y]] (and (:object e) - (< (:x e) x (+ (:x e) (or (:width e) (.getWidth ^Actor (:object e))))) - (< (:y e) y (+ (:y e) (or (:height e) (.getHeight ^Actor (:object e))))))) + (< (:x e) x (+ (:x e) (or (:width e) (when (actor? e) (.getWidth ^Actor (:object e)))))) + (< (:y e) y (+ (:y e) (or (:height e) (when (actor? e) (.getHeight ^Actor (:object e)))))))) (defn get-current-music [entities] (let [time (get-in entities [:state :time])