From 7423f991b094b3343d5e9d42bb7cd67a9373b443 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Wed, 7 Oct 2015 18:04:13 -0700 Subject: [PATCH] sound progress. --- .../advent/screens/rooms/inside_castle.clj | 31 ++++------------ .../advent/screens/rooms/outside_jail.clj | 4 +- desktop/src-common/advent/screens/scene.clj | 11 +++--- desktop/src-common/advent/utils.clj | 37 +++++++++++-------- 4 files changed, 38 insertions(+), 45 deletions(-) diff --git a/desktop/src-common/advent/screens/rooms/inside_castle.clj b/desktop/src-common/advent/screens/rooms/inside_castle.clj index 69da2caf..c913d9b1 100644 --- a/desktop/src-common/advent/screens/rooms/inside_castle.clj +++ b/desktop/src-common/advent/screens/rooms/inside_castle.clj @@ -46,9 +46,7 @@ (actions/has-obtained? entities :sword) 0.0 :else - (* (max 0.0 (- 1.0 (/ (utils/dist 45 97 (:x ego) (:y ego)) 50.0))) - (- 1.0 (get-in entities [:fade :opacity])) - (get-in entities [:volume :value] 1.0))))) + (max 0.0 (- 1.0 (/ (utils/dist 45 97 (:x ego) (:y ego)) 50.0)))))) (defn bloodclot-appear [entities] (actions/run-action entities @@ -626,9 +624,14 @@ :chorus {:sound (utils/load-sound "inside-castle/chorus.ogg")} :collision "inside-castle/collision.png" :scale-fn (utils/scaler-fn-from-image "inside-castle/scale.png" 0.25 1.00) - :apply-state (fn [_ entities] + :apply-state (fn [screen entities] (utils/fast-forward-particle (get-in entities [:room :entities :outside-particles])) (as-> entities entities + (utils/play-sound! screen entities + (get-in entities [:room :chorus :sound]) + get-chorus-volume + 0.5 + :loop) (if (actions/has-obtained? entities :trophy) (update-in entities [:room :entities] #(dissoc % :trophy)) entities) @@ -642,23 +645,5 @@ (if (#{:night :sunrise} (get-in entities [:state :time])) (make-night entities) entities))) - :update-fn (fn [screen entities] - #_(when (and (actions/has-obtained? entities :sword) - (get-in entities [:room :entities :magic]) - (particle-effect! (get-in entities [:room :entities :magic]) :is-complete)) - ) - (let [chorus-volume (get-chorus-volume entities)] - (if (= 0.0 chorus-volume) - (if (get-in entities [:room :chorus :instance]) - (do (sound! (get-in entities [:room :chorus :sound]) :stop) - (update-in entities [:room :chorus] dissoc :instance)) - entities) - (let [chorus (get-in entities [:room :chorus])] - (if (:instance chorus) - (do (sound! (:sound chorus) :set-volume - (:instance chorus) - (utils/current-sound-volume chorus-volume)) - entities) - (assoc-in entities [:room :chorus :instance] (sound! (:sound chorus) :loop - (utils/current-sound-volume chorus-volume)))))))) + :start-pos [245 90]))) diff --git a/desktop/src-common/advent/screens/rooms/outside_jail.clj b/desktop/src-common/advent/screens/rooms/outside_jail.clj index a6a5a03d..f47b7cee 100644 --- a/desktop/src-common/advent/screens/rooms/outside_jail.clj +++ b/desktop/src-common/advent/screens/rooms/outside_jail.clj @@ -283,7 +283,9 @@ (as-> entities entities (utils/play-sound! screen entities (get-in entities [:room :fountain-sound :sound]) - :fountain 0.5 [172 120] :loop) + (utils/sourced-volume-fn :fountain 0.5 [172 120]) + (utils/get-sound-pan 172) + :loop) (if (= :night (get-in entities [:state :time])) (make-night entities) diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 99acf583..f94fdc1a 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -805,9 +805,8 @@ void main() (if-let [[snd vol-scale] (get-in anim-sound-frames [anim current-frame-index])] (utils/play-sound! screen entities (or (snd e) (snd (:sounds entities))) - target - vol-scale - [x y]) + (utils/sourced-volume-fn target vol-scale [x y]) + (utils/get-sound-pan x)) entities) entities)) @@ -822,10 +821,10 @@ void main() (defn update-current-sound-vols! [entities] (loop [entities entities - [{:keys [id sound duration loc vol-scale target loc]} & rest] (get-in entities [:current-sounds :value])] + [{:keys [id sound volume-fn]} & rest] (get-in entities [:current-sounds :value])] (if id (do - (sound! sound :set-volume id (utils/get-sound-volume entities target vol-scale loc)) + (sound! sound :set-volume id (volume-fn entities)) (recur entities rest)) entities))) @@ -1027,6 +1026,8 @@ void main() (if (get-in entities [:closing? :value]) (let [entities (utils/apply-tweens screen entities (:tweens entities)) + entities (update-current-sound-vols! entities) + entities (remove-ended-sounds screen entities) layers (get-layers entities) all-entities (concat (vals entities) layers (vals (get-in entities [:room :entities])))] (screen! fade-screen :update-fade :opacity (get-in entities [:fade :opacity])) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 48913ba4..d7416f4a 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -256,9 +256,9 @@ (defn load-sound [f] (try - (sound (str f ".mp3")) + (sound f) (catch Exception _ - (sound f)))) + (sound (str f ".mp3"))))) @@ -402,36 +402,41 @@ (defn get-sound-volume [entities target vol-scale [x y]] - (if (= target :ego) - (-> (* (/ (get-in entities [:room :entities :ego :scale-x]) 1.5) 0.75) - (* (or vol-scale 1.0)) - (clamp-volume)) - (proximity-volume entities [x y] :scale vol-scale))) + (* (if (= target :ego) + (-> (* (/ (get-in entities [:room :entities :ego :scale-x]) 1.5) 0.75) + (* (or vol-scale 1.0)) + (clamp-volume)) + (proximity-volume entities [x y] :scale vol-scale)) + (- 1.0 (get-in entities [:fade :opacity])))) (defn get-sound-pan [x] (/ (- x 160 ) 160)) +(defn sourced-volume-fn [target vol-scale [x y]] + (fn [entities] + (get-sound-volume entities target vol-scale [x y]))) + (defn play-sound! - ([screen entities snd target vol-scale [x y]] - (play-sound! screen entities snd target vol-scale [x y] :once)) + ([screen entities snd volume-fn] + (play-sound! screen entities snd volume-fn 0.5)) - ([screen entities snd target vol-scale [x y] type] - (let [vol (get-sound-volume entities target vol-scale [x y]) - pan (get-sound-pan x) + ([screen entities snd volume-fn pan] + (play-sound! screen entities snd volume-fn pan :once)) + + ([screen entities snd volume-fn pan type] + (let [vol (volume-fn entities) sound-id (if (= :once type) (sound! snd :play (current-sound-volume vol) 1.0 pan) (sound! snd :loop (current-sound-volume vol) 1.0 pan)) ] (update-in entities [:current-sounds :value] conj {:id sound-id :sound snd - :loc [x y] - :vol-scale vol-scale + :volume-fn volume-fn :type type :ends-at (if (= type :once) (+ (:total-time screen) (sound! snd :duration)) - nil) - :target target})))) + nil)})))) (defn stop-all-sounds! [entities] (doseq [snd (get-in entities [:current-sounds :value])]