From ff04d07a0f99a70af755ecd3f5eb9fa0f0b1a896 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Thu, 19 Nov 2015 17:39:24 -0800 Subject: [PATCH] background script pt 1 --- desktop/src-common/advent/actions.clj | 8 +- .../src-common/advent/screens/rooms/dream.clj | 2 +- .../src-common/advent/screens/rooms/held.clj | 2 +- .../advent/screens/rooms/inside_castle.clj | 2 +- .../advent/screens/rooms/inside_jail.clj | 2 +- .../src-common/advent/screens/rooms/space.clj | 4 +- desktop/src-common/advent/screens/scene.clj | 97 +++++++++++-------- desktop/src-common/advent/utils.clj | 6 +- 8 files changed, 70 insertions(+), 53 deletions(-) diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index b7613cb5..131b1edb 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -50,7 +50,7 @@ (defmacro run-action [entities & forms] `(let [c# (chan)] (do - (put! (get-in (deref ~entities) [:actions :channel]) + (put! (get-in (deref ~entities) [:fg-actions :channel]) (reify IAction (get-channel [_] c#) ~@forms)) @@ -64,7 +64,7 @@ (defn change-script-state [entities state] (run-action entities (begin [this screen entities] - (update-in entities [:actions] assoc :script-running? state :last-skip-type (if state :end nil))) + (update-in entities [:fg-actions] assoc :script-running? state :last-skip-type (if state :end nil))) (continue [this screen entities] entities) @@ -78,7 +78,7 @@ (defmacro get-script [entities & forms] `(fn [starting-entities#] - (put! (get-in starting-entities# [:actions :script-chan]) + (put! (get-in starting-entities# [:fg-actions :script-chan]) (fn [starting-entities#] (let [~entities (atom starting-entities#)] (thread (do @@ -88,7 +88,7 @@ (defmacro get-unsaved-script [entities & forms] `(fn [starting-entities#] - (put! (get-in starting-entities# [:actions :script-chan]) + (put! (get-in starting-entities# [:fg-actions :script-chan]) (fn [starting-entities#] (let [~entities (atom starting-entities#)] (thread (do diff --git a/desktop/src-common/advent/screens/rooms/dream.clj b/desktop/src-common/advent/screens/rooms/dream.clj index c0430905..99098573 100644 --- a/desktop/src-common/advent/screens/rooms/dream.clj +++ b/desktop/src-common/advent/screens/rooms/dream.clj @@ -281,7 +281,7 @@ (defn return-from-island [screen entities] - (when (and (not (get-in entities [:actions :script-running?])) + (when (and (not (get-in entities [:fg-actions :script-running?])) (get-in entities [:state :active?]) (get-in entities [:room :entities :fairy-godfather :distracted?])) (if (> (get-in entities [:room :entities :fairy-godfather :distracted-time] 0) 15) diff --git a/desktop/src-common/advent/screens/rooms/held.clj b/desktop/src-common/advent/screens/rooms/held.clj index c93bc8f4..4663b427 100644 --- a/desktop/src-common/advent/screens/rooms/held.clj +++ b/desktop/src-common/advent/screens/rooms/held.clj @@ -37,7 +37,7 @@ (actions/update-entities entities (fn [e] (assoc-in e [:room :bloodclot-timer] 0))))}]})) (defn add-second [screen entities] - (when (and (not (get-in entities [:actions :script-running?])) + (when (and (not (get-in entities [:fg-actions :script-running?])) (get-in entities [:state :active?])) (if (> (get-in entities [:room :bloodclot-timer] 0) 7) (do diff --git a/desktop/src-common/advent/screens/rooms/inside_castle.clj b/desktop/src-common/advent/screens/rooms/inside_castle.clj index 6d60b1a5..fe518c20 100644 --- a/desktop/src-common/advent/screens/rooms/inside_castle.clj +++ b/desktop/src-common/advent/screens/rooms/inside_castle.clj @@ -15,7 +15,7 @@ [play-clj.g2d :refer :all])) (defn brian [screen entities] - (when (and (not (get-in entities [:actions :script-running?])) + (when (and (not (get-in entities [:fg-actions :script-running?])) (get-in entities [:state :active?]) (get-in entities [:room :entities :game-player])) ((actions/get-script entities diff --git a/desktop/src-common/advent/screens/rooms/inside_jail.clj b/desktop/src-common/advent/screens/rooms/inside_jail.clj index 5a55af65..3330cc8d 100644 --- a/desktop/src-common/advent/screens/rooms/inside_jail.clj +++ b/desktop/src-common/advent/screens/rooms/inside_jail.clj @@ -334,7 +334,7 @@ (get-in entities [:room :entities :ego :right :walk])} (get-in entities [:room :entities :ego :anim]))] (if is-walking? (let [entities (-> entities - (update-in [:actions] #(assoc % :channel (chan) :current nil :started? false :script-running? false)) + (update-in [:fg-actions] #(assoc % :channel (chan) :current nil :started? false :script-running? false)) (update-in [:room :entities :ego] #(actions/start-animation screen % :stand)))] ((actions/get-script entities (actions/stop-walking entities :ego) diff --git a/desktop/src-common/advent/screens/rooms/space.clj b/desktop/src-common/advent/screens/rooms/space.clj index 915d368a..36b989c9 100644 --- a/desktop/src-common/advent/screens/rooms/space.clj +++ b/desktop/src-common/advent/screens/rooms/space.clj @@ -17,7 +17,7 @@ [play-clj.g2d :refer :all])) (defn taunt [screen entities] - (when (and (not (get-in entities [:actions :script-running?])) + (when (and (not (get-in entities [:fg-actions :script-running?])) (get-in entities [:state :active?]) (not (get-in entities [:state :blergh-dead?])) (not (actions/has-item? entities :magic-slingshot))) @@ -30,7 +30,7 @@ nil) (defn shock [screen entities] - (when (and (not (get-in entities [:actions :script-running?])) + (when (and (not (get-in entities [:fg-actions :script-running?])) (get-in entities [:state :active?]) (not (get-in entities [:state :blergh-dead?])) (actions/has-item? entities :magic-slingshot)) diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index ab92ffb2..4755d875 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -180,7 +180,7 @@ void main () (defn click-inventory [screen entities] - (when (not (get-in entities [:actions :script-running?])) + (when (not (get-in entities [:fg-actions :script-running?])) (if (= (get-in entities [:cursor :current] ) :main) (do (screen! inventory-screen :show-screen :items (map (entities :all-items) (get-in entities [:state :inventory]))) @@ -190,22 +190,22 @@ void main () (assoc-in entities [:cursor :current] :main)))) (defn skip-action [screen entities] - (let [current-action (get-in entities [:actions :current])] + (let [current-action (get-in entities [:fg-actions :current])] (cond (= :skip (actions/skip-type current-action screen entities)) (let [terminated-entities (actions/terminate current-action screen entities)] (do (put! (actions/get-channel current-action) terminated-entities) (-> terminated-entities - (assoc-in [:actions :current] nil) - (assoc-in [:actions :started?] false)))) + (assoc-in [:fg-actions :current] nil) + (assoc-in [:fg-actions :started?] false)))) (= :end (actions/skip-type current-action screen entities)) (let [terminated-entities (actions/terminate current-action screen entities)] (println "trying to end") (do (put! (actions/get-channel current-action) :end) (-> terminated-entities - (assoc-in [:actions :script-running?] false) - (assoc-in [:actions :current] nil) - (assoc-in [:actions :started?] false)))) + (assoc-in [:fg-actions :script-running?] false) + (assoc-in [:fg-actions :current] nil) + (assoc-in [:fg-actions :started?] false)))) :else entities))) @@ -229,7 +229,7 @@ void main () _ (println "clicked " x y) interaction (get-interaction entities x y) interacting-entity (get-interacting-entity entities x y) - current-action (get-in entities [:actions :current]) + current-action (get-in entities [:fg-actions :current]) ;; TODO - hacky way of resetting queue @@ -239,7 +239,8 @@ void main () (skip-action screen entities) entities)] - (when (and (not (get-in entities [:actions :script-running?])) + + (when (and (not (get-in entities [:fg-actions :script-running?])) (= (get-in entities [:cursor :down-target]) (or (:id interacting-entity) (:id interaction) nil))) ((or (when interacting-entity @@ -768,32 +769,40 @@ void main () (merge (animation->texture screen (:stand (:right ego))) ego) :stand))) -(defn start-script-if-necessary [screen {{:keys [script-running? script-chan]} :actions :as entities}] - (if script-running? - entities - (let [[next-script] (alts!! [script-chan] :default nil)] - (if next-script - (do - (next-script entities) - (println "starting script") - - (assoc-in entities [:actions :script-running?] true)) - entities)))) +(defn start-script-if-necessary [screen entities key] + (let [{{:keys [script-running? script-chan]} key} entities] + (if script-running? + entities + (let [[next-script] (alts!! [script-chan] :default nil)] + (if next-script + (do + (next-script entities) + (println "starting script") + + (assoc-in entities [key :script-running?] true)) + entities))))) -(defn update-from-script [screen {{:keys [current started? channel script-chan]} :actions :as entities}] - (if current - (let [entities (if started? entities (actions/begin current screen entities)) - entities (actions/continue current screen entities)] - (if (actions/done? current screen entities) - (let [terminated (actions/terminate current screen entities)] - (put! (actions/get-channel current) terminated) - (recur screen (assoc terminated - :actions {:channel channel :script-chan (get-in entities [:actions :script-chan]) :current nil :started? false :script-running? (get-in entities [:actions :script-running?]) :last-skip-type (get-in entities [:actions :last-skip-type])}))) - (assoc-in entities [:actions :started?] true))) - (let [[current _] (alts!! [channel] :default nil)] - (assoc entities :actions {:script-chan (get-in entities [:actions :script-chan]) :channel channel :current current :started? false :script-running? (get-in entities [:actions :script-running?]) :last-skip-type (if current - (actions/skip-type current screen entities) - (get-in entities [:actions :last-skip-type]))})))) +(defn update-from-script [screen entities key] + (let [{{:keys [current started? channel script-chan script-running?]} key} entities] + + (if current + (let [entities (if started? entities (actions/begin current screen entities)) + entities (actions/continue current screen entities)] + (if (actions/done? current screen entities) + (let [terminated (actions/terminate current screen entities)] + (put! (actions/get-channel current) terminated) + (recur screen + (update-in terminated [key] assoc :current nil :started? false) + key)) + (assoc-in entities [key :started?] true))) + (let [[current _] (alts!! [channel] :default nil)] + + (-> entities + (assoc-in [key :started?] false) + (assoc-in [key :last-skip-type] (if current + (actions/skip-type current screen entities) + (get-in entities [key :last-skip-type]))) + (assoc-in [key :current] current)))))) (defn update-from-hotspots [screen entities] @@ -1104,12 +1113,18 @@ void main () :origin-y 0 :x -20 :y -20) - :actions {:object nil + :fg-actions {:object nil :channel (chan) :current nil :script-running? false :started? false - :script-chan (chan (dropping-buffer 1))} + :script-chan (chan (dropping-buffer 1))} + :bg-actions {:object nil + :channel (chan) + :current nil + :script-running? false + :started? false + :script-chan (chan (dropping-buffer 1))} :volume {:object nil :value 0.0} :music-override {:object nil @@ -1171,8 +1186,10 @@ void main () (let [entities (fade-in-first-time-if-necessary screen entities) entities (utils/apply-tweens screen entities (:tweens entities)) entities (update-cursor screen entities) - entities (start-script-if-necessary screen entities) - entities (update-from-script screen entities) + entities (start-script-if-necessary screen entities :fg-actions) + entities (update-from-script screen entities :fg-actions) + entities (start-script-if-necessary screen entities :bg-actions) + entities (update-from-script screen entities :bg-actions) entities (update-from-room screen entities) entities (update-from-hotspots screen entities) entities (assoc-in entities [:room :entities :ego :last-frame] (get-in entities [:room :entities :ego :object])) @@ -1292,7 +1309,7 @@ void main () :on-show-inventory (fn [screen [entities]] (click-inventory screen entities)) :on-save (fn [screen [entities]] - (when-not (get-in entities [:actions :script-running?]) + (when-not (get-in entities [:fg-actions :script-running?]) (let [date (.format (java.text.SimpleDateFormat. "MM/dd/YY") (java.util.Date.)) save-name (str (-> entities :room :name) " - " date)] (utils/save entities @@ -1363,7 +1380,7 @@ void main () ) (defn hud-interactable? [] (let [[scene-entities] (-> scene :entities deref)] - (and (not (get-in scene-entities [:actions :script-running?])) + (and (not (get-in scene-entities [:fg-actions :script-running?])) (get-in scene-entities [:state :active?]) (= 0.0 (get-in scene-entities [:fade :opacity]))))) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 80103004..23995e39 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -353,10 +353,10 @@ (< y1 y (+ y1 height)))) (defn is-unstoppable-script-running [screen entities] - (let [current-action (get-in entities [:actions :current]) - is-script-running (get-in entities [:actions :script-running?])] + (let [current-action (get-in entities [:fg-actions :current]) + is-script-running (get-in entities [:fg-actions :script-running?])] (and is-script-running - (= :none (get-in entities [:actions :last-skip-type]))))) + (= :none (get-in entities [:fg-actions :last-skip-type]))))) (defn update-override [{:keys [^FitViewport viewport] :as screen} entities] (let [raw-pos (get-in entities [:cursor :last-pos])