diff --git a/desktop/resources/ego/scared-walk.png b/desktop/resources/ego/scared-walk.png index fb6559e9..48b85872 100644 Binary files a/desktop/resources/ego/scared-walk.png and b/desktop/resources/ego/scared-walk.png differ diff --git a/desktop/resources/ego/scared-walk.pxa/0.pxi b/desktop/resources/ego/scared-walk.pxa/0.pxi index 7c266220..db670bb7 100644 Binary files a/desktop/resources/ego/scared-walk.pxa/0.pxi and b/desktop/resources/ego/scared-walk.pxa/0.pxi differ diff --git a/desktop/resources/ego/scared-walk.pxa/1.pxi b/desktop/resources/ego/scared-walk.pxa/1.pxi index de6c0618..3e919c8b 100644 Binary files a/desktop/resources/ego/scared-walk.pxa/1.pxi and b/desktop/resources/ego/scared-walk.pxa/1.pxi differ diff --git a/desktop/resources/ego/scared-walk.pxa/2.pxi b/desktop/resources/ego/scared-walk.pxa/2.pxi index 076b624e..3a18afad 100644 Binary files a/desktop/resources/ego/scared-walk.pxa/2.pxi and b/desktop/resources/ego/scared-walk.pxa/2.pxi differ diff --git a/desktop/resources/ego/scared-walk.pxa/3.pxi b/desktop/resources/ego/scared-walk.pxa/3.pxi index 4faf8ae3..fa108a22 100644 Binary files a/desktop/resources/ego/scared-walk.pxa/3.pxi and b/desktop/resources/ego/scared-walk.pxa/3.pxi differ diff --git a/desktop/resources/ego/scared-walk.pxa/4.pxi b/desktop/resources/ego/scared-walk.pxa/4.pxi index 2a27a31e..c4a4305c 100644 Binary files a/desktop/resources/ego/scared-walk.pxa/4.pxi and b/desktop/resources/ego/scared-walk.pxa/4.pxi differ diff --git a/desktop/resources/ego/scared-walk.pxa/5.pxi b/desktop/resources/ego/scared-walk.pxa/5.pxi index 5ffc1be0..f604be31 100644 Binary files a/desktop/resources/ego/scared-walk.pxa/5.pxi and b/desktop/resources/ego/scared-walk.pxa/5.pxi differ diff --git a/desktop/resources/ego/scared.png b/desktop/resources/ego/scared.png index 670c25d6..771097aa 100644 Binary files a/desktop/resources/ego/scared.png and b/desktop/resources/ego/scared.png differ diff --git a/desktop/resources/ego/scared.pxa/0.pxi b/desktop/resources/ego/scared.pxa/0.pxi index 4c2b12ea..474df50b 100644 Binary files a/desktop/resources/ego/scared.pxa/0.pxi and b/desktop/resources/ego/scared.pxa/0.pxi differ diff --git a/desktop/resources/ego/scared.pxa/1.pxi b/desktop/resources/ego/scared.pxa/1.pxi index 7484b518..a799262d 100644 Binary files a/desktop/resources/ego/scared.pxa/1.pxi and b/desktop/resources/ego/scared.pxa/1.pxi differ diff --git a/desktop/resources/ego/scared.pxa/2.pxi b/desktop/resources/ego/scared.pxa/2.pxi index 210670e0..d9eca387 100644 Binary files a/desktop/resources/ego/scared.pxa/2.pxi and b/desktop/resources/ego/scared.pxa/2.pxi differ diff --git a/desktop/resources/ego/scared.pxa/3.pxi b/desktop/resources/ego/scared.pxa/3.pxi index 8f38c5e2..9b5cb211 100644 Binary files a/desktop/resources/ego/scared.pxa/3.pxi and b/desktop/resources/ego/scared.pxa/3.pxi differ diff --git a/desktop/settings.edn b/desktop/settings.edn index 6de83e6a..75134168 100644 --- a/desktop/settings.edn +++ b/desktop/settings.edn @@ -1 +1 @@ -{:sound-volume 84.0, :music-volume 38.0} \ No newline at end of file +{:sound-volume 45.0, :music-volume 53.0} \ No newline at end of file diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index 211ed10e..1a32101e 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -344,13 +344,14 @@ scaled (get-in entities [:room :entities target-id :scaled]) scale-fn (get-in entities [:room :scale-fn]) scale (get-in entities [:room :entities target-id :scale-y] 1) - height (* scale height)] + height (* scale height)] (screen! dialogue/talking-screen :on-talk :text text - :x target-x :y (+ (get-in entities [:room :entities target-id :y]) height) - :color (get-in entities [:room :entities target-id :talk-color]) - - :target-id target-id - :scale scale) + :scene-viewport (:viewport screen) + :x target-x :y (+ target-y height) + :color (get-in entities [:room :entities target-id :talk-color]) + + :target-id target-id + :scale scale) (if animate? (update-in entities [:room :entities target-id ] #(start-animation screen % (or anim :talk))) entities))) @@ -611,7 +612,7 @@ entities (if apply-state (apply-state entities) entities) - entities (utils/update-override entities)] + entities (utils/update-override screen entities)] (when (and (not= new-music old-music) transition-music?) (doseq [[k v] (:musics entities) :when (and v (not= new-music k))] diff --git a/desktop/src-common/advent/screens/dialogue.clj b/desktop/src-common/advent/screens/dialogue.clj index 21f1c17d..ff0aa900 100644 --- a/desktop/src-common/advent/screens/dialogue.clj +++ b/desktop/src-common/advent/screens/dialogue.clj @@ -12,6 +12,7 @@ (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter] [com.badlogic.gdx.graphics.g2d TextureRegion] [com.badlogic.gdx.scenes.scene2d.utils Align] + [com.badlogic.gdx.math Vector3 Vector2 Matrix4] [com.badlogic.gdx Screen])) (defn ensure-on-screen [talk] @@ -19,10 +20,19 @@ minimum-x margin-width maximum-x (- (game :width) margin-width) label-width (label! talk :get-width) - label-right (+ (:x talk) label-width)] - (cond (> label-right maximum-x) (assoc talk :x (- maximum-x label-width)) - (< (:x talk) minimum-x) (assoc talk :x minimum-x) - :else talk))) + label-right (+ (:x talk) label-width) + talk (cond (> label-right maximum-x) (assoc talk :x (- maximum-x label-width)) + (< (:x talk) minimum-x) (assoc talk :x minimum-x) + :else talk)] + (doto talk + (label! :set-x (:x talk)) + (label! :set-y (:y talk))))) + +(defn scene-world->talk-world [scene-viewport [x y]] + (let [[screen-x screen-y] (utils/project {:viewport scene-viewport} [x y]) + x (/ screen-x (/ (game :width) 1280.0 )) + y (/ screen-y (/ (game :height) 960.0 ))] + [x y])) (defscreen talking-screen :on-show @@ -30,12 +40,13 @@ (utils/setup-viewport screen 1280 960) {}) :on-render - (fn [screen [entities]] + (fn [{:keys [camera] :as screen} [entities]] + (render! screen (vals entities)) entities) :on-talk - (fn [{:keys [create-talk target-id color text x y scale]} [entities]] + (fn [{:keys [create-talk target-id color text x y scale scene-viewport] :as screen} [entities]] (let [font (bitmap-font "ego/font.fnt" ) p (nine-patch {:region (:object (texture "talk-bg-2.png")) :left 9 :top 9 :right 9 :bottom 9}) _ (nine-patch! p :set-padding 25 25 5 15) @@ -48,16 +59,31 @@ _ (texture! tx :set-filter Texture$TextureFilter/Linear Texture$TextureFilter/Linear) style (style :label font color) #__ #_(set! (.background style) bg) - talk (assoc (label text style) :y (* 4 y) )] - (label! talk :set-font-scale scale) - (label! talk :set-alignment Align/center) - (assoc entities target-id (-> talk - (assoc :x (- (* 4 x) (/ (label! talk :get-width) 2))) - ensure-on-screen )))) + [source-x source-y] [x y] + + [x y] (scene-world->talk-world scene-viewport [source-x + source-y]) + talk (assoc (label text style :set-font-scale scale :set-alignment Align/center) + :source-x source-x :source-y source-y) + x (- x (/ (label! talk :get-width) 2)) + talk (assoc talk :x x :y y) + talk (ensure-on-screen talk)] + + (assoc entities :dialogue 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))))) :stop-talk (fn [{:keys [target-id] } [entities]] - (dissoc entities target-id)) + (dissoc entities :dialogue)) :on-resize (fn [{:keys [viewport width height]} entities] diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index c58be20f..2b5738f2 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -621,23 +621,26 @@ all-entities (concat (vals entities) layers (vals (get-in entities [:room :entities])))] (when (nil? (:zoom (:cam entities))) (println entities)) + (screen! talking-screen :on-update-camera :scene-viewport (:viewport screen) :scene-camera (:camera screen)) (set! (. camera zoom) (:zoom (:cam entities))) (set! (.. camera position x) (:x (:cam entities) 160.0)) (set! (.. camera position y) (:y (:cam entities) 120.0)) - - (when (= (get-in entities [:fade :opacity]) - 0.0) - (play-key-sounds entities)) - (doseq [m (vals (get-in entities [:musics]))] - (when m - (music! m :set-volume (utils/current-music-volume (get-in entities [:volume :value]))))) - (doseq [e (sort-by :baseline all-entities)] - (if (:parallax e) - (render-parallax screen e) - (render! screen [e]))) - - - entities)) + (let [entities (utils/update-override screen entities)] + + + (when (= (get-in entities [:fade :opacity]) + 0.0) + (play-key-sounds entities)) + (doseq [m (vals (get-in entities [:musics]))] + (when m + (music! m :set-volume (utils/current-music-volume (get-in entities [:volume :value]))))) + (doseq [e (sort-by :baseline all-entities)] + (if (:parallax e) + (render-parallax screen e) + (render! screen [e]))) + + + entities))) :on-resize (fn [{:keys [viewport width height]} [entities]] (.update viewport width height)) @@ -654,8 +657,7 @@ (.getScreenWidth viewport) (.getScreenHeight viewport) input-x input-y) - (let [[x y] (utils/unproject screen)] - (utils/update-override (assoc-in entities [:cursor :last-pos] [x y]))) + (utils/update-override screen (assoc-in entities [:cursor :last-pos] [input-x input-y])) (assoc-in entities [:cursor :override] nil))) :on-touch-up (fn [{:keys [input-x input-y viewport] :as screen} [entities]] diff --git a/desktop/src-common/advent/screens/title.clj b/desktop/src-common/advent/screens/title.clj index c864b5c9..7f9c05e7 100644 --- a/desktop/src-common/advent/screens/title.clj +++ b/desktop/src-common/advent/screens/title.clj @@ -34,51 +34,46 @@ (defscreen title-screen :on-show (fn [screen entities] - (let [cam (orthographic) - viewport (FitViewport. 1280 960 cam)] - (utils/load-settings!) - (update! screen :renderer (stage) :camera cam :viewport viewport) - (.apply viewport) - (let [font (utils/get-font "ego/font.fnt") - start-playing (assoc (label "Embark on thy adventure" (style :label font (color 0.6 1.0 1.0 1.0))) :x 0 :y 100) - start-playing (center start-playing) - quit (assoc (label "Quit thy adventure" (style :label font (color 0.6 1.0 1.0 1.0))) :x 0 :y 50) - quit (center quit) - music (utils/make-music "intro.ogg") - ui-skin (skin "ui/ui.json")] - (label! start-playing :set-alignment Align/center) - - {:overlay (assoc (texture "title-overlay.png" ) :x 0 :y 0 :scale-x 4 :scale-y 4 :origin-x 0 :origin-y 0) - :fade (assoc (texture "black.png") - :scale-x 80 - :scale-y 80 - :opacity 1.0) - :music-volume-slider (assoc (slider {:min 0 :max 100 :step 1} ui-skin :set-value (:music-volume @utils/settings)) - :x ( - (/ (game :width) 2) - 150) - :width 300 - :y 200) - :sound-volume-slider (assoc (slider {:min 0 :max 100 :step 1 } ui-skin :set-value (:sound-volume @utils/settings)) - :width 300 - :x ( - (/ (game :width) 2) - 150) - :y 150) - :viewport viewport - :font font - :music music - :volume 1.0 - :start-showing? false - :start-playing start-playing - :quit quit - :tweens {:fade-in (tween/tween :fade-in screen [:fade :opacity] 1.0 0.0 1.0 - :finish #(do (utils/play-sound (:music %)) %) - :ease tween/ease-in-quadratic)}}))) + + (utils/setup-viewport screen 1280 960) + (utils/load-settings!) + (let [font (utils/get-font "ego/font.fnt") + start-playing (assoc (label "Embark on thy adventure" (style :label font (color 0.6 1.0 1.0 1.0))) :x 0 :y 100) + start-playing (center start-playing) + quit (assoc (label "Quit thy adventure" (style :label font (color 0.6 1.0 1.0 1.0))) :x 0 :y 50) + quit (center quit) + music (utils/make-music "intro.ogg") + ui-skin (skin "ui/ui.json")] + (label! start-playing :set-alignment Align/center) + + {:overlay (assoc (texture "title-overlay.png" ) :x 0 :y 0 :scale-x 4 :scale-y 4 :origin-x 0 :origin-y 0) + :fade (assoc (texture "black.png") + :scale-x 80 + :scale-y 80 + :opacity 1.0) + :music-volume-slider (assoc (slider {:min 0 :max 100 :step 1} ui-skin :set-value (:music-volume @utils/settings)) + :x ( - (/ (game :width) 2) + 150) + :width 300 + :y 200) + :sound-volume-slider (assoc (slider {:min 0 :max 100 :step 1 } ui-skin :set-value (:sound-volume @utils/settings)) + :width 300 + :x ( - (/ (game :width) 2) + 150) + :y 150) + + :font font + :music music + :volume 1.0 + :start-showing? false + :start-playing start-playing + :quit quit + :tweens {:fade-in (tween/tween :fade-in screen [:fade :opacity] 1.0 0.0 1.0 + :finish #(do (utils/play-sound (:music %)) %) + :ease tween/ease-in-quadratic)}})) :on-render (fn [screen [entities]] - (.update (:camera screen)) - (.apply (:viewport screen)) - (clear!) (let [entities (utils/apply-tweens screen entities (:tweens entities))] @@ -129,6 +124,6 @@ :else nil))) - :on-resize (fn [screen [entities]] - (.update (:viewport entities) (game :width) (game :height) true) + :on-resize (fn [{:keys [viewport width height]} [entities]] + (.update viewport width height) nil)) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index a963b4a5..1b369641 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -129,13 +129,7 @@ (:cursor %)) (get-in entities [:room :interactions])))) -(defn update-override [entities] - (if (get-in entities [:state :active?]) - (let [last-pos (get-in entities [:cursor :last-pos])] - (if-let [mouse-override (find-override entities last-pos)] - (assoc-in entities [:cursor :override] (:cursor mouse-override)) - (assoc-in entities [:cursor :override] nil))) - entities)) + (defn remove-interaction [entities id] (update-in entities [:room :interactions] (fn [i] (remove #(= id (:id %)) i)))) @@ -180,12 +174,30 @@ (.apply viewport) [cam viewport stage])) -(defn unproject [screen] - (let [pj (.unproject (:viewport screen) (vector-2 (:input-x screen) (:input-y screen))) - x (.x pj) - y (.y pj)] - [x y])) +(defn unproject + ([screen] + (unproject screen [(:input-x screen) (:input-y screen)]) ) + ([screen [x y]] + (let [pj (.unproject ^FitViewport (:viewport screen) (vector-2 x y)) + x (.x pj) + y (.y pj)] + [x y]))) + +(defn project + ([screen [x y]] + (let [pj (.project ^FitViewport (:viewport screen) (vector-2 x y)) + x (.x pj) + y (.y pj)] + [x y]))) (defn contains-point? [x1 y1 width height x y] (and (< x1 x (+ x1 width)) (< y1 y (+ y1 height)))) + +(defn update-override [screen entities] + (let [last-pos (unproject screen (get-in entities [:cursor :last-pos]))] + (if (get-in entities [:state :active?]) + (if-let [mouse-override (find-override entities last-pos)] + (assoc-in entities [:cursor :override] (:cursor mouse-override)) + (assoc-in entities [:cursor :override] nil)) + entities)))