revamping how inventory works.

This commit is contained in:
Bryce Covert
2016-08-02 09:26:19 -07:00
parent ad5f2acfec
commit c0ab101bc4

View File

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