diff --git a/desktop/src-common/advent/screens/inventory.clj b/desktop/src-common/advent/screens/inventory.clj index 2503e2ae..649cf6cd 100644 --- a/desktop/src-common/advent/screens/inventory.clj +++ b/desktop/src-common/advent/screens/inventory.clj @@ -24,48 +24,75 @@ (assoc-in [:tweens :fade-out] (tween/tween :fade-out screen [:opacity] 1.0 0.0 0.2 :ease tween/ease-out-cubic :finish #(assoc % :shown? false))))) -(defn mouse-interact [screen [entities]] +(defn mouse-down [screen [entities]] (let [[x y] (utils/unproject screen) - selected-entity (first (filter #((:box %) x y) (:items entities)))] - (if selected-entity - (assoc entities :highlighted-item (:item selected-entity)) - (assoc entities :highlighted-item nil)))) -(defn left-click [screen entities] - (let [{:keys [highlighted-item]} entities - room-entities (-> @(resolve 'advent.screens.scene/scene) + selected-entity (first (filter #((:box %) x y) (vals (:items entities))))] + (assoc entities :selected-item (:item selected-entity)))) + +(defn mouse-drag [screen [{:keys [selected-item] :as entities}]] + (let [[x y] (utils/unproject screen) + hovered-entity (first (filter #((:box %) x y) (vals (:items entities)))) + ] + (if selected-item + (-> entities + (assoc-in [:items selected-item :x] (- x 32)) + (assoc-in [:items selected-item :y] (- y 32)) + (assoc :hovered-item (:item hovered-entity))) + (assoc entities :hovered-item (:item hovered-entity))))) + + +(defn mouse-move [screen [entities]] + (let [[x y] (utils/unproject screen) + hovered-entity (first (filter #((:box %) x y) (vals (:items entities))))] + (assoc entities :hovered-item (:item hovered-entity)))) + +(defn left-click [screen {:keys [selected-item hovered-item] :as entities}] + (let [room-entities (-> @(resolve 'advent.screens.scene/scene) :entities deref first) current-cursor (get-in room-entities [:cursor :current])] - (log/info "chose inventory item" highlighted-item) - (if highlighted-item + (log/info "chose inventory item" selected-item) + (if selected-item (if (= :main current-cursor) - (screen! @(resolve 'advent.screens.scene/scene) :on-chose-item :item highlighted-item) - (when-let [interaction-script ((or (:scripts highlighted-item) (constantly nil)) (:value current-cursor))] + (do (screen! @(resolve 'advent.screens.scene/scene) :on-chose-item :item selected-item) + (close screen entities false)) + (when-let [interaction-script ((or (:scripts selected-item) (constantly nil)) (:value current-cursor))] (interaction-script room-entities) (close screen entities true))) (close screen entities false)))) -(defn right-click [screen entities] - (let [{:keys [highlighted-item]} entities +(defn right-click [screen {:keys [selected-item] :as entities} ] + (let [ room-entities (-> @(resolve 'advent.screens.scene/scene) :entities deref first) current-cursor (get-in room-entities [:cursor :current]) ego (get-in room-entities [:room :entities :ego])] - (when (and highlighted-item (= :main current-cursor)) - (((:get-script ego) highlighted-item [0 0]) room-entities) + (when (and selected-item (= :main current-cursor)) + (((:get-script ego) selected-item [0 0]) room-entities) (close screen entities)))) +(defn update-hovered-text [screen {:keys [hovered-text hovered-item selected-item] :as entities}] + (cond + (and hovered-item selected-item (not= hovered-item selected-item)) + (label! (:hovered-text entities) :set-text (str "Use " (:name selected-item) " with " (:name hovered-item))) + + hovered-item + (label! (:hovered-text entities) :set-text (:name hovered-item)) + + :else + (label! (:hovered-text entities) :set-text ""))) + (defscreen inventory-screen :on-show (fn [screen entities] (utils/setup-viewport screen 1280 960) - (let [highlighted-text (assoc (label "Hello" (style :label (utils/get-font "ego/font.fnt") (color :white)) :set-font-scale 0.25) :x 0 :y 850 :width 1280 )] - (label! highlighted-text :set-alignment Align/bottom) + (let [hovered-text (assoc (label "Hello" (style :label (utils/get-font "ego/font.fnt") (color :white)) :set-font-scale 0.25) :x 0 :y 850 :width 1280 )] + (label! hovered-text :set-alignment Align/bottom) {:overlay (assoc (utils/get-texture "inventory-overlay.png" ) :x 0 :y 0 :scale-x 4 :scale-y 4 :origin-x 0 :origin-y 0 :opacity 0.0) :fade (assoc (utils/get-texture "black.png") :scale-x 80 @@ -76,10 +103,10 @@ :all-items (texture! (texture (pixmap "cursor.png")) :split 18 16) :items [] :shown? false - :highlighted-item nil + :hovered-item nil :opacity 0.0 :tweens {} - :highlighted-text highlighted-text})) + :hovered-text hovered-text})) :on-render (fn [{:keys [^FitViewport viewport] :as screen} [entities]] @@ -90,19 +117,21 @@ entities (-> entities (assoc-in [:overlay :opacity] opacity) (assoc-in [:fade :opacity] (* 0.6 opacity)) - (assoc-in [:highlighted-text :opacity] opacity) - (update-in [:items] (fn [i] - (map #(assoc % :opacity opacity) i))))] + (assoc-in [:hovered-text :opacity] opacity) + (update-in [:items] (fn [items] + (reduce-kv (fn [c k i] + (assoc c k (assoc i :opacity opacity))) + + items items))))] (when (:shown? entities) - (doto (:highlighted-text entities) + (doto (:hovered-text entities) (label! :set-color (color 1 1 1 opacity))) (render! screen [(:fade entities) (:overlay entities)]) - (render! screen (:items entities)) - (if-let [item (:highlighted-item entities)] - (label! (:highlighted-text entities) :set-text (:name item)) - (label! (:highlighted-text entities) :set-text "")) - (render! screen [(:highlighted-text entities)])) + (render! screen (vals (:items entities))) + (update-hovered-text screen entities) + + (render! screen [(:hovered-text entities)])) entities)) :show-screen (fn [{items :items :as screen} [entities]] @@ -113,30 +142,31 @@ (-> entities (assoc :shown? true :opacity 0.0 - :items (for [[item index] (map vector items (range)) - :let [row (int (/ index 8)) - column (mod index 8) - base-x (* 79 4) - base-y (* 180 4) - x (+ base-x (* column (* 24 4))) - y (- base-y (* row (* 24 4))) - item-width 18 - offset-x (+ x (/ item-width 2)) - offset-y (+ y (/ item-width 2)) - padding (/ item-width 2) - padding (* 4 padding)]] - (assoc (texture (aget (:all-items entities) 0 (.indexOf utils/+all-cursors+ (:cursor item)))) - :x x :y y - :scale-x 4 - :scale-y 4 - :origin-x 0 - :origin-y 0 - :item item - :box (zone/box (- offset-x padding) (- offset-y padding) (+ offset-x item-width padding padding) (+ offset-y item-width padding padding))))) + :items (into {} (for [[item index] (map vector items (range)) + :let [row (int (/ index 8)) + column (mod index 8) + base-x (* 79 4) + base-y (* 180 4) + x (+ base-x (* column (* 24 4))) + y (- base-y (* row (* 24 4))) + item-width 18 + offset-x (+ x (/ item-width 2)) + offset-y (+ y (/ item-width 2)) + padding (/ item-width 2) + padding (* 4 padding)]] + [item (assoc (texture (aget (:all-items entities) 0 (.indexOf utils/+all-cursors+ (:cursor item)))) + :x x :y y + :scale-x 4 + :scale-y 4 + :origin-x 0 + :origin-y 0 + :item item + :box (zone/box (- offset-x padding) (- offset-y padding) (+ offset-x item-width padding padding) (+ offset-y item-width padding padding)))]))) (assoc-in [:tweens :fade-in] (tween/tween :fade-in screen [:opacity] 0.0 1.0 0.2 :ease tween/ease-out-cubic))))) - :on-mouse-moved mouse-interact - :on-touch-down mouse-interact + :on-mouse-moved mouse-move + :on-touch-dragged mouse-drag + :on-touch-down mouse-down :on-touch-up (fn [screen [entities]] (when (and (:shown? entities) (= 1.0 (:opacity entities)))