a better approach to dialogue treees.
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user