a better approach to dialogue treees.

This commit is contained in:
2014-09-26 16:51:27 -07:00
parent 51be2e0e14
commit 27d992776a
3 changed files with 61 additions and 39 deletions

View File

@@ -5,6 +5,7 @@
[play-clj.g2d :refer :all]
[clojure.pprint]
[clojure.string :as s]
[clojure.zip :as zip]
[advent.pathfind]
[advent.actions :as actions]
[advent.screens.dialogue :as dialogue]
@@ -148,18 +149,48 @@
(stop screen entities target-id)
entities)))))
(defn present-choices [entities & pairs]
(run-action entities
(begin [this screen entities]
(run! dialogue/choice-screen :on-present-choices :pairs pairs)
(run! @(resolve 'advent.screens.scene/scene) :on-deactivate)
entities)
(defn something-else [zipper]
(-> zipper zip/up zip/up))
(continue [this screen entities] entities)
(defn previous-choices [zipper]
(-> zipper zip/up))
(done? [this screen entities] true)
(defn nth-child [zipper i]
(loop [so-far 0
zipper (zip/down zipper)]
(if (= so-far i)
zipper
(recur (inc so-far) (zip/right zipper)))))
(terminate [this screen entities] entities)))
(defn make-zipper [tree]
(zip/zipper map? (comp vals :choices) (fn [n c] nil) tree))
(defn present-choices [entities choices]
(loop [zipper (make-zipper choices)]
(let [selected-choice (atom nil)
node (zip/node zipper)]
(run-action entities
(begin [this screen entities]
(run! dialogue/choice-screen :on-present-choices :choices (:choices node) :callback #(reset! selected-choice %))
(run! @(resolve 'advent.screens.scene/scene) :on-deactivate)
entities)
(continue [this screen entities] entities)
(done? [this screen entities] (not (nil? @selected-choice)))
(terminate [this screen entities]
(run! @(resolve 'advent.screens.scene/scene) :on-reactivate)
entities))
(let [zipper (nth-child zipper (-> node :choices keys (.indexOf @selected-choice)))
node (zip/node zipper)]
(when-let [run (:run node)]
(run @selected-choice))
(when-let [next-choices (:choices node)]
(if (fn? next-choices)
(recur (next-choices zipper))
(recur zipper)))))))
(defn give [entities target-id item]