diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index 08f17413..04adba77 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -163,30 +163,33 @@ (recur (inc so-far) (zip/right zipper))))) (defn make-zipper [tree] - (zip/zipper map? (comp vals :choices) (fn [n c] nil) tree)) + (zip/zipper map? (comp #(map second %) #(partition 2 %) :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)] + (let [selected-index (atom nil) + node (zip/node zipper) + dialogue-choices (partition 2 (:choices node))] (run-action entities (begin [this screen entities] - (run! dialogue/choice-screen :on-present-choices :choices (:choices node) :callback #(reset! selected-choice %)) + (run! dialogue/choice-screen :on-present-choices :choices dialogue-choices :callback #(reset! selected-index %)) (run! @(resolve 'advent.screens.scene/scene) :on-deactivate) entities) (continue [this screen entities] entities) - (done? [this screen entities] (not (nil? @selected-choice))) + (done? [this screen entities] (not (nil? @selected-index))) (terminate [this screen entities] (run! @(resolve 'advent.screens.scene/scene) :on-reactivate) entities)) - (let [zipper (nth-child zipper (-> node :choices keys (.indexOf @selected-choice))) + (let [zipper (nth-child zipper @selected-index) node (zip/node zipper)] (when-let [run (:run node)] - (run @selected-choice)) + (run (-> dialogue-choices + (nth @selected-index) + first))) (when-let [next-choices (:choices node)] (if (fn? next-choices) (recur (next-choices zipper)) diff --git a/desktop/src-common/advent/screens/dialogue.clj b/desktop/src-common/advent/screens/dialogue.clj index 5f9e4f86..e00fb9a6 100644 --- a/desktop/src-common/advent/screens/dialogue.clj +++ b/desktop/src-common/advent/screens/dialogue.clj @@ -75,7 +75,7 @@ tx (.getTexture tr) _ (texture! tx :set-filter Texture$TextureFilter/Linear Texture$TextureFilter/Linear)] (-> entities - (into (for [[text i] (map vector (keys choices) (range))] + (into (for [[[text] i] (map vector choices (range))] [i (assoc (label text (style :label font (color :white))) :x 30 :y (* 30 i))])) (assoc :state {:object nil :callback callback :choices choices})))) @@ -83,7 +83,7 @@ (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] (when (seq entities) (when (< y (* 30 (count entities))) - ((get-in entities [:state :callback]) (nth (keys (get-in entities [:state :choices])) (int (/ y 30)))) + ((get-in entities [:state :callback]) (int (/ y 30))) {})))) :on-mouse-moved (fn [screen [entities]] diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 55e93610..9c6a7ce2 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -160,9 +160,9 @@ (defn wizard-dialogue [entities] { - :choices {"What do you mean, \"Not you again?\"" + :choices ["What do you mean, \"Not you again?\"" {:run #(respond entities % :wizard "I mean, you've wrecked my life and I never want to see you again.") - :choices {"You mean the time I set your house on fire with a fire mint?" + :choices ["You mean the time I set your house on fire with a fire mint?" {:run #(do (respond entities % :wizard "That was you!?" @@ -185,16 +185,16 @@ (actions/transition-background entities :outside-house [262 88]))} "Even an old hoot like you needs a kick in the pants every now and again." {:run #(respond entities % :wizard "What gives you the right to try to teach me a lesson?") - :choices {"My good looks?" {:choices actions/previous-choices} + :choices ["My good looks?" {:choices actions/previous-choices} "My good standing within the community?" {:choices actions/previous-choices} - "My respectful attitude?" {:choices actions/previous-choices}}}}} + "My respectful attitude?" {:choices actions/previous-choices}]}]} "You're not happy to see me, Mr. Fangald?" {:run #(respond entities % :wizard "Of course not, you little brat. You've made my life a living hell!") :choices #(-> % zip/left)} "Good bye, Mr. Fangald!" {:run #(do (respond entities % :wizard "Now scram!") - (actions/transition-background entities :outside-house [262 88]))}}}) + (actions/transition-background entities :outside-house [262 88]))}]}) (defn backgrounds [screen] (let [sheep-sheet (texture! (texture "outsidehouse/sheep-anim.png") :split 33 21)