continued refactoring actions

This commit is contained in:
2014-09-16 23:18:36 -07:00
parent d86ea452ab
commit 8f32ec50d3
2 changed files with 85 additions and 97 deletions

View File

@@ -16,7 +16,8 @@
(begin [this screen entities]) (begin [this screen entities])
(done? [this screen entities]) (done? [this screen entities])
(continue [this screen entities]) (continue [this screen entities])
(terminate [this screen entities])) (terminate [this screen entities])
(get-channel [this]))
(defmacro get-script [entities & forms] (defmacro get-script [entities & forms]
`(fn [starting-entities#] `(fn [starting-entities#]
@@ -45,9 +46,17 @@
dy (- y1 y2)] dy (- y1 y2)]
(Math/sqrt (+ (* dx dx) (* dy dy))))) (Math/sqrt (+ (* dx dx) (* dy dy)))))
(defmacro run-action [entities & forms]
`(let [c# (chan)]
(do
(put! (get-in (deref ~entities) [:actions :channel])
(reify IAction
(get-channel [_] c#)
~@forms))
(reset! ~entities (<!! c#)))))
(defn walk-to [entities target-id [final-x final-y]] (defn walk-to [entities target-id [final-x final-y]]
(let [c (chan) (let [{start-x :x start-y :y} (@entities target-id)
{start-x :x start-y :y} (@entities target-id)
final-x (int final-x) final-x (int final-x)
final-y (int final-y) final-y (int final-y)
path (vec (take-nth 5 (advent.pathfind/visit-all path (vec (take-nth 5 (advent.pathfind/visit-all
@@ -59,10 +68,7 @@
[]) [])
targets-left (atom path)] targets-left (atom path)]
(if (seq path) (if (seq path)
(do (run-action entities
(put! (get-in @entities [:actions :channel])
(reify
IAction
(begin [this screen entities] (begin [this screen entities]
entities) entities)
@@ -92,21 +98,15 @@
(< (dist final-x final-y from-x from-y) 1))) (< (dist final-x final-y from-x from-y) 1)))
(terminate [this screen entities] (terminate [this screen entities]
(let [entities (stop screen entities target-id)] (stop screen entities target-id)))
(put! c entities)
entities))))
(reset! entities (<!! c)))
@entities))) @entities)))
(defn get-text-duration [text] (defn get-text-duration [text]
(* (count (s/split text #" ")) 0.75)) (* (count (s/split text #" ")) 0.75))
(defn talk [entities target-id text] (defn talk [entities target-id text]
(let [c (chan) (let [initial-time (atom nil)]
initial-time (atom nil)] (run-action entities
(put! (get-in @entities [:actions :channel])
(reify
IAction
(begin [this screen entities] (begin [this screen entities]
(let [_ (swap! initial-time #(or % (:total-time screen))) (let [_ (swap! initial-time #(or % (:total-time screen)))
target-y (get-in entities [target-id :y]) target-y (get-in entities [target-id :y])
@@ -127,16 +127,11 @@
(get-text-duration text))) (get-text-duration text)))
(terminate [this screen entities] (terminate [this screen entities]
(put! c entities)
(run! dialogue/talking-screen :stop-talk :target-id target-id) (run! dialogue/talking-screen :stop-talk :target-id target-id)
(stop screen entities target-id)))) (stop screen entities target-id)))))
(reset! entities (<!! c))))
(defn give [entities target-id item] (defn give [entities target-id item]
(let [c (chan)] (run-action entities
(put! (get-in @entities [:actions :channel])
(reify
IAction
(begin [this screen entities] (begin [this screen entities]
(sound! (sound "pickup.mp3") :play) (sound! (sound "pickup.mp3") :play)
@@ -146,19 +141,13 @@
(continue [this screen entities] entities) (continue [this screen entities] entities)
(done? [this screen entities] (done? [this screen entities] true)
true)
(terminate [this screen entities] (terminate [this screen entities]
(put! c entities)
entities))) entities)))
(reset! entities (<!! c))))
(defn transition-background [entities new-background [x y]] (defn transition-background [entities new-background [x y]]
(let [c (chan)] (run-action entities
(put! (get-in @entities [:actions :channel])
(reify
IAction
(begin [this screen entities] (begin [this screen entities]
(-> entities (-> entities
(assoc-in [:background] (get-in entities [:backgrounds new-background])) (assoc-in [:background] (get-in entities [:backgrounds new-background]))
@@ -167,10 +156,7 @@
(continue [this screen entities] entities) (continue [this screen entities] entities)
(done? [this screen entities] (done? [this screen entities] true)
true)
(terminate [this screen entities] (terminate [this screen entities]
(put! c entities)
entities))) entities)))
(reset! entities (<!! c))))

View File

@@ -79,8 +79,10 @@
(let [entities (if started? entities (actions/begin current screen entities)) (let [entities (if started? entities (actions/begin current screen entities))
entities (actions/continue current screen entities)] entities (actions/continue current screen entities)]
(if (actions/done? current screen entities) (if (actions/done? current screen entities)
(recur screen (assoc (actions/terminate current screen entities) (let [terminated (actions/terminate current screen entities)]
:actions {:channel channel :current nil :started? false})) (put! (actions/get-channel current) terminated)
(recur screen (assoc terminated
:actions {:channel channel :current nil :started? false})))
(assoc-in entities [:actions :started?] true))) (assoc-in entities [:actions :started?] true)))
(let [[current _] (alts!! [channel] :default nil)] (let [[current _] (alts!! [channel] :default nil)]
(assoc entities :actions {:channel channel :current current :started? false})))) (assoc entities :actions {:channel channel :current current :started? false}))))