diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index 7ded9e04..8b421f29 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -102,6 +102,7 @@ (defn force-end [entities current-action key] (do (put! (get-channel current-action) :end) + (screen! dialogue/talking-screen :stop-talk :id key) (-> entities (assoc-in [key :script-running?] false) (assoc-in [key :current] nil) @@ -386,7 +387,8 @@ (defn talk [entities target-id text & {:keys [stop? animate? anim wait color] :or {wait true}}] (let [initial-time (atom nil) stop? (if (nil? stop?) true stop?) - animate? (if (nil? animate?) true animate?)] + animate? (if (nil? animate?) true animate?) + fg-or-bg *fg-bg-key*] (run-action entities (begin [this screen entities] (let [_ (swap! initial-time #(or % (:total-time screen))) @@ -403,6 +405,7 @@ scale (get-in entities [:room :entities target-id :scale-y] 1) height (* scale height)] (screen! dialogue/talking-screen :on-talk :text text + :id fg-or-bg :scene-viewport (:viewport screen) :x target-x :y (+ target-y height) :color (or color (get-in entities [:room :entities target-id :talk-color])) @@ -425,7 +428,7 @@ (terminate [this screen entities] (if wait (do - (screen! dialogue/talking-screen :stop-talk :target-id target-id) + (screen! dialogue/talking-screen :stop-talk :id fg-or-bg) (if stop? (stop screen entities target-id) entities)) @@ -691,7 +694,7 @@ entities))) (skip-type [this screen entities] :none)) - (screen! dialogue/talking-screen :stop-talk) + (screen! dialogue/talking-screen :stop-talk :id :bg-actions) (run-action entities (begin [this screen entities] (utils/stop-all-sounds! entities) diff --git a/desktop/src-common/advent/screens/dialogue.clj b/desktop/src-common/advent/screens/dialogue.clj index 3ddfd394..9711d3f2 100644 --- a/desktop/src-common/advent/screens/dialogue.clj +++ b/desktop/src-common/advent/screens/dialogue.clj @@ -50,7 +50,7 @@ entities) :on-talk - (fn [{:keys [create-talk target-id color text x y scale scene-viewport] :as screen} [entities]] + (fn [{:keys [create-talk target-id color text x y scale scene-viewport id] :as screen} [entities]] (let [font (bitmap-font "ego/font.fnt" ) p (NinePatchEntity. (skin! (skin "ui/ui.json") :get-patch "ui-bg")) _ (nine-patch! p :set-padding 25 25 5 15) @@ -71,25 +71,30 @@ :source-x source-x :source-y source-y ) x (- x (/ (label! talk :get-width) 2)) - talk (assoc talk :x x :y y) + talk (assoc talk :x x :y y :id id) talk (ensure-on-screen talk)] - (assoc entities :dialogue talk))) + (assoc entities id talk))) :on-update-camera - (fn [{:keys [scene-viewport scene-camera viewport] :as screen} [ {:keys [dialogue] :as entities}]] - (when dialogue - (let [[x y] (scene-world->talk-world scene-viewport [(:source-x dialogue) - (:source-y dialogue)])] - (-> entities - (assoc-in [:dialogue :x] (- x (/ (label! dialogue :get-width) 2))) - (assoc-in [:dialogue :y] y) - (update-in [:dialogue] ensure-on-screen) - )))) + (fn [{:keys [scene-viewport scene-camera viewport] :as screen} [ entities]] + (reduce-kv (fn [entities id e] + (if (:id e) + (let [[x y] (scene-world->talk-world scene-viewport [(:source-x e) + (:source-y e)])] + (-> entities + (assoc-in [id :x] (- x (/ (label! e :get-width) 2))) + (assoc-in [id :y] y) + (update-in [id] ensure-on-screen))) + entities)) + entities + entities) + + ) :stop-talk - (fn [{:keys [target-id] } [entities]] - (dissoc entities :dialogue)) + (fn [{:keys [id] } [entities]] + (dissoc entities (or id :fg-actions))) :on-resize (fn [{:keys [viewport width height]} entities] diff --git a/desktop/src-common/advent/screens/rooms/castle_gate.clj b/desktop/src-common/advent/screens/rooms/castle_gate.clj index 9e279a48..300029b2 100644 --- a/desktop/src-common/advent/screens/rooms/castle_gate.clj +++ b/desktop/src-common/advent/screens/rooms/castle_gate.clj @@ -97,7 +97,7 @@ (update-in entities [:tweens] dissoc :coin-y))) (actions/walk-straight-to entities :coin-flip [212 90] :update-baseline? false :speed 3.0) - (screen! dialogue/talking-screen :stop-talk :target-id :ego) + (screen! dialogue/talking-screen :stop-talk) (actions/do-stop entities :ego) (actions/walk-straight-to entities :coin-flip [210 105] :update-baseline? false :speed 1.0)