diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index b93ba5a7..7ded9e04 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -100,6 +100,13 @@ (change-script-state ~entities false) (utils/save @~entities :autosave "Autosave")))))))) +(defn force-end [entities current-action key] + (do (put! (get-channel current-action) :end) + (-> entities + (assoc-in [key :script-running?] false) + (assoc-in [key :current] nil) + (assoc-in [key :started?] false)))) + (defmacro get-unsaved-script [entities & forms] `(fn [starting-entities#] (put! (get-in starting-entities# [:fg-actions :script-chan]) @@ -197,6 +204,19 @@ (skip-type [this screen entities] :skip))) +(defn do-force-end [entities key] + (run-action entities + (begin [this screen entities] + (if (get-in entities [key :script-running?]) + (force-end entities (get-in entities [key :current]) key) + entities)) + (continue [this screen entities] entities) + (done? [this screen entities] true) + (terminate [this screen entities] + entities) + (skip-type [this screen entities] + :none))) + (defn walk-straight-to [entities target-id [final-x final-y] & {:keys [update-baseline? face speed anim override-dir stop?]}] @@ -662,12 +682,16 @@ (assoc-in [:state :next-time] nil)) entities) :ego - :face face)] + :face face) + entities (if (get-in entities [:bg-actions :script-running?]) + (force-end entities (get-in entities [:bg-actions :current]) :bg-actions) + entities)] (if-let [stop-fn (get-in entities [:room :stop-fn])] (stop-fn screen entities) entities))) (skip-type [this screen entities] :none)) + (screen! dialogue/talking-screen :stop-talk) (run-action entities (begin [this screen entities] (utils/stop-all-sounds! entities) diff --git a/desktop/src-common/advent/screens/rooms/inside_castle.clj b/desktop/src-common/advent/screens/rooms/inside_castle.clj index 405b5a02..0f5c945c 100644 --- a/desktop/src-common/advent/screens/rooms/inside_castle.clj +++ b/desktop/src-common/advent/screens/rooms/inside_castle.clj @@ -15,7 +15,6 @@ [play-clj.g2d :refer :all])) (defn brian [screen entities] - (when (and (not (get-in entities [:fg-actions :script-running?])) (not (get-in entities [:bg-actions :script-running?])) (get-in entities [:state :active?]) @@ -116,7 +115,8 @@ {:run #(actions/respond entities % :game-player "Fine by me.")}]}) (defn walk-to-player [entities] - (actions/walk-to entities :ego [209 74] :face :right)) + (actions/walk-to entities :ego [209 74] :face :right) + (actions/do-force-end entities :bg-actions)) (defn brian-pause-from-work [entities] (actions/play-animation entities :game-player :pause-from-work :stop? false) diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 4755d875..779ddac2 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -189,6 +189,8 @@ void main () (assoc-in [:cursor :override] nil))) (assoc-in entities [:cursor :current] :main)))) + + (defn skip-action [screen entities] (let [current-action (get-in entities [:fg-actions :current])] (cond (= :skip (actions/skip-type current-action screen entities)) @@ -201,11 +203,8 @@ void main () (= :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 [:fg-actions :script-running?] false) - (assoc-in [:fg-actions :current] nil) - (assoc-in [:fg-actions :started?] false)))) + (actions/force-end terminated-entities current-action :fg-actions) + ) :else entities)))