diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index cf1f07f8..0d5dcebf 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -1448,49 +1448,164 @@ void main () (get-in scene-entities [:state :active?]) (= 0.0 (get-in scene-entities [:fade :opacity]))))) -(defmulti transition-hud (fn [screen entities new-state] [(:state entities) new-state])) -(defmethod transition-hud :default [screen entities new-state] entities) +(defmulti transition-hud (fn [screen entities new-state state-data] + + [(get-in entities [:inv-fsm :state]) new-state])) -(defmethod transition-hud [:none :opening-inventory] +(defmethod transition-hud :default [screen entities new-state state-data] entities) + +(defprotocol ITransition + (start-transition [this screen entities]) + (transition-done? [this screen entities])) + +(defn accept-state [entities state state-data transitions] + (-> entities + (assoc-in [:inv-fsm :state] state) + (assoc-in [:inv-fsm :state-data] state-data) + (assoc-in [:inv-fsm :transition-steps] transitions))) + +(defmethod transition-hud [:none :open] + [screen entities state state-data] + (accept-state entities state state-data + [(reify ITransition + (start-transition [this screen entities] + (update-in entities [:inventory] #(actions/start-animation screen % :open))) + (transition-done? [this screen entities] + (animation! (get-in entities [:inventory :anim]) + :is-animation-finished + (- (+ (:delta-time screen) (:total-time screen)) (get-in entities [:inventory :anim-start]))))) + + (reify ITransition + (start-transition [this screen entities] + (update-in entities [:inventory] #(actions/start-animation screen % :opened))) + (transition-done? [this screen entities] + true)) + + (reify ITransition + (start-transition [this screen entities] + (screen! scene :on-click-inventory) + entities) + (transition-done? [this screen entities] + true))])) + +(defmethod transition-hud [:open :none] + [screen entities state state-data] + (accept-state entities state state-data + [(reify ITransition + (start-transition [this screen entities] + (update-in entities [:inventory] #(actions/start-animation screen % :closing))) + (transition-done? [this screen entities] + (animation! (get-in entities [:inventory :anim]) + :is-animation-finished + (- (+ (:delta-time screen) (:total-time screen)) (get-in entities [:inventory :anim-start]))))) + + (reify ITransition + (start-transition [this screen entities] + (update-in entities [:inventory] #(actions/start-animation screen % :default))) + (transition-done? [this screen entities] + true))])) + +(defmethod transition-hud [:open :selected] + [screen entities state state-data] + + (accept-state entities state state-data + [(reify ITransition + (start-transition [this screen entities] + (-> entities + (assoc :selected-item + (assoc (texture (aget (get-in entities [:all-items]) 0 (.indexOf utils/+all-cursors+ (:cursor state-data)))) + :x 300 :y 40 :baseline 9000 :opacity 0.0 + :item state-data)) + (assoc-in [:tweens :appear-item] + (tween/tween :appear-item screen [:selected-item :opacity] 0.0 1.0 0.5 :ease tween/ease-in-out-quadratic)) + (assoc-in [:tweens :appear-item-y] + (tween/tween :appear-item-y screen [:selected-item :y] 30 35 0.5 :ease tween/ease-in-out-quadratic)))) + (transition-done? [this screen entities] + (not (get-in entities [:tweens :appear-item]))))])) + +(defmethod transition-hud [:selected :none] + [screen entities state state-data] + (accept-state entities state state-data)) + +(defmethod transition-hud [:none :aquiring] + [screen entities state state-data] + (accept-state entities state state-data)) + +(defmethod transition-hud [:aquiring :none] + [screen entities state state-data] + (accept-state entities state state-data)) + +(defmethod transition-hud [:selected :aquiring] + [screen entities state state-data] + (accept-state entities state state-data)) + +(defmethod transition-hud [:aquiring :selected] + [screen entities state state-data] + (accept-state entities state state-data)) + +(defn fsm-busy? [entities] + (seq (get-in entities [:inv-fsm :transition-steps]))) + +(defn process-fsm [screen { {:keys [transition-steps current-transition] [next-state next-state-data] :pending-states [next-transition & remaining-transitions] :transition-steps} :inv-fsm :as entities}] + (cond + (and current-transition (transition-done? current-transition screen entities)) + (-> entities + (update-in [:inv-fsm ] dissoc :current-transition)) + + current-transition + nil ;; waiting + + (fsm-busy? entities) + (-> (start-transition next-transition screen entities) + (assoc-in [:inv-fsm :current-transition] next-transition) + (assoc-in [:inv-fsm :transition-steps] remaining-transitions)) + + next-state + (transition-hud screen entities next-state next-state-data) + + :else + nil)) + +#_(defmethod transition-hud [:none :opening-inventory] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :open)) (assoc :state :opening-inventory))) -(defmethod transition-hud [:opening-inventory :opened-inventory] +#_(defmethod transition-hud [:opening-inventory :opened-inventory] [screen entities _] (screen! scene :on-click-inventory) (-> entities (update-in [:inventory] #(actions/start-animation screen % :opened)) (assoc :state :opened-inventory))) -(defmethod transition-hud [:opened-inventory :closing-inventory] +#_(defmethod transition-hud [:opened-inventory :closing-inventory] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :closing)) (assoc :state :closing-inventory))) -(defmethod transition-hud [:closing-inventory :none] +#_(defmethod transition-hud [:closing-inventory :none] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :default)) (assoc :state :none))) -(defmethod transition-hud [:returning-item :none] +#_(defmethod transition-hud [:returning-item :none] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :default)) (dissoc :selected-item) (assoc :state :none))) -(defmethod transition-hud [:remove-item :none] +#_(defmethod transition-hud [:remove-item :none] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :default)) (dissoc :selected-item) (assoc :state :none))) -(defmethod transition-hud [:opened-inventory :choosing-item] +#_(defmethod transition-hud [:opened-inventory :choosing-item] [{:keys [cursor] :as screen} entities _] (-> entities (assoc :selected-item @@ -1503,7 +1618,7 @@ void main () (tween/tween :appear-item-y screen [:selected-item :y] 30 35 0.5 :ease tween/ease-in-out-quadratic)) (assoc :state :choosing-item))) -(defmethod transition-hud [:none :choosing-item] +#_(defmethod transition-hud [:none :choosing-item] [{:keys [cursor] :as screen} entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :open)) @@ -1517,7 +1632,7 @@ void main () (tween/tween :appear-item-y screen [:selected-item :y] 30 35 0.5 :ease tween/ease-in-out-quadratic)) (assoc :state :choosing-item))) -(defmethod transition-hud [:none :give-item] +#_(defmethod transition-hud [:none :give-item] [{:keys [item] :as screen} entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :opened)) @@ -1531,7 +1646,7 @@ void main () (tween/tween :appear-item-y screen [:selected-item :y] 40 35 0.5 :ease tween/ease-in-out-quadratic)) (assoc :state :give-item))) -(defmethod transition-hud [:chose-item :returning-item] +#_(defmethod transition-hud [:chose-item :returning-item] [{:keys [cursor] :as screen} entities _] (screen! scene :on-click-inventory) (-> entities @@ -1542,7 +1657,7 @@ void main () (update-in [:inventory] (fn [i] (actions/start-animation screen i :closing))) (assoc :state :returning-item))) -(defmethod transition-hud [:chose-item :remove-item] +#_(defmethod transition-hud [:chose-item :remove-item] [{:keys [cursor] :as screen} entities _] (-> entities (assoc-in [:tweens :disappear-item] @@ -1552,24 +1667,24 @@ void main () (update-in [:inventory] (fn [i] (actions/start-animation screen i :closing))) (assoc :state :remove-item))) -(defmethod transition-hud [:give-item :chose-item] +#_(defmethod transition-hud [:give-item :chose-item] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :opened)) (assoc :state :chose-item))) -(defmethod transition-hud [:choosing-item :chose-item] +#_(defmethod transition-hud [:choosing-item :chose-item] [screen entities _] (-> entities (update-in [:inventory] #(actions/start-animation screen % :opened)) (assoc :state :chose-item))) -(defmulti process-state (fn [screen entities] +#_(defmulti process-state (fn [screen entities] (:state entities))) -(defmethod process-state :default [screen entities] entities) +#_(defmethod process-state :default [screen entities] entities) -(defmethod process-state :opening-inventory +#_(defmethod process-state :opening-inventory [screen entities] (when (animation! (get-in entities [:inventory :open]) @@ -1577,7 +1692,7 @@ void main () (- (+ (:delta-time screen) (:total-time screen)) (get-in entities [:inventory :anim-start]))) (transition-hud screen entities :opened-inventory))) -(defmethod process-state :closing-inventory +#_(defmethod process-state :closing-inventory [screen entities] (when (animation! (get-in entities [:inventory :closing]) @@ -1585,12 +1700,12 @@ void main () (- (+ (:delta-time screen) (:total-time screen)) (get-in entities [:inventory :anim-start]))) (transition-hud screen entities :none))) -(defmethod process-state :choosing-item +#_(defmethod process-state :choosing-item [screen entities] (when-not (get-in entities [:tweens :appear-item]) (transition-hud screen entities :chose-item))) -(defmethod process-state :returning-item +#_(defmethod process-state :returning-item [screen entities] (when (and (animation! (get-in entities [:inventory :closing]) @@ -1599,7 +1714,7 @@ void main () (not (get-in entities [:tweens :disappear-item]))) (transition-hud screen entities :none))) -(defmethod process-state :remove-item +#_(defmethod process-state :remove-item [screen entities] (when (and (animation! (get-in entities [:inventory :closing]) @@ -1608,7 +1723,7 @@ void main () (not (get-in entities [:tweens :disappear-item]))) (transition-hud screen entities :none))) -(defmethod process-state :give-item +#_(defmethod process-state :give-item [screen entities] (when-not (get-in entities [:tweens :appear-item]) (transition-hud screen entities :chose-item))) @@ -1619,7 +1734,12 @@ void main () (let [screen (assoc screen :total-time 0)] (utils/setup-viewport screen 320 240) - {:state :none + {:inv-fsm {:state :none + :state-data {} + :target nil + :target-data nil + :transition-steps [] + :pending-states []} :already-saved? false :close (assoc (utils/get-texture "close.png") @@ -1671,7 +1791,7 @@ void main () (update-in entities [:save] assoc :r 0.75 :g 0.75 :b 0.75) (grow-hud screen entities :save false))) - entities (or (process-state screen entities) entities)] + entities (or (process-fsm screen entities) entities)] #_(label! (:fps entities) :set-text (str (game :fps))) @@ -1692,20 +1812,21 @@ void main () :on-give-item (fn [screen [ entities]] - (transition-hud screen entities :give-item)) + #_(transition-hud screen entities :give-item)) :on-remove-item (fn [{:keys [item] :as screen} [ entities]] - (println "removing...") - (when (= (:value item) (get-in entities [:selected-item :value])) + + #_(when (= (:value item) (get-in entities [:selected-item :value])) (transition-hud screen entities :remove-item))) :on-return-item (fn [screen [ entities]] (if (hud-interactable?) + nil - (transition-hud screen entities :returning-item))) + #_(transition-hud screen entities :returning-item))) :on-start-script @@ -1718,8 +1839,8 @@ void main () (let [selected-item? (and (:value cursor) (:cursor cursor))] (if selected-item? - (transition-hud screen entities :choosing-item) - (transition-hud screen entities :closing-inventory)))) + (transition-hud screen entities :selected cursor) + (transition-hud screen entities :none nil)))) :on-mouse-moved (fn [screen [entities]] @@ -1765,8 +1886,9 @@ void main () ((:mouse-in? (:inventory entities)) x y) (if (:selected-item entities) - (transition-hud screen entities :returning-item) - (transition-hud screen entities :opening-inventory)) + entities + #_(transition-hud screen entities :returning-item) + (doto (transition-hud screen entities :open nil) println)) (utils/intersects? (:close entities) [x y]) (screen! scene :on-menu)