(ns advent.screens.rooms.outside-house
  (:require [advent.screens.rooms :as rooms]
            [advent.actions :as actions]
            [advent.utils :as utils]
            [clojure.zip :as zip]
            [play-clj.core :refer :all]
            [play-clj.ui :refer :all]
            [play-clj.utils :refer :all]
            [play-clj.g2d :refer :all]))

(defn wizard-dialogue [entities]
  (actions/do-dialogue entities :ego "Hello there Mr. Fangald!" :wizard "Oh no, not you again!")
  (actions/present-choices entities
                           {:choices ["What do you mean, \"Not you again?\""
                                      {:run #(actions/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?"
                                                 {:run #(do
                                                          (actions/respond entities %
                                                                           :wizard "That was you!?"
                                                                           :wizard "My house was nearly destroyed!"
                                                                           :wizard "I spent weeks rebuilding my home!"
                                                                           :wizard "Leave, now, or I'll turn you into a ..."
                                                                           :wizard "... a ..."
                                                                           :wizard "... a frog!"
                                                                           :ego "Okay, okay! I'm leaving.")
                                                          (actions/transition-background entities :outside-house [262 88])
                                                          (actions/talk entities :ego "I guess he's really upset with me."))}
                                                 "You're still cross about my stealing your magic cowboy hat?"
                                                 {:run #(do (actions/respond entities %
                                                                             :wizard "Of course I'm cross! It's irreplaceable!"
                                                                             :wizard "That cowboy hat accented my facial physique."
                                                                             :wizard "And complemented my skin color."
                                                                             :wizard "And you little cheat stole it from me!"
                                                                             :wizard "That's why I bought my MagiSafe 5000, to keep out intruders like you."
                                                                             :wizard "Now leave.")
                                                            (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 #(actions/respond entities % :wizard "What gives you the right to try to teach me a lesson?")
                                                  :choices ["My good looks?"
                                                            {:run #(do (actions/respond entities %
                                                                                        :wizard "You know, handsome looks aren't all they're chocked up to be."
                                                                                        :wizard "Take me for example."
                                                                                        :wizard "When you have a bod like man, you can hardly go to the grocery store without being noticed."
                                                                                        :wizard "But no. Your looks, however good they may be, don't give you the right to teach me a lesson."
                                                                                        :wizard "Now please leave me in peace.")
                                                                       (actions/transition-background entities :outside-house [262 88]))}
                                                            "My good standing within the community?"
                                                            {:run #(do (actions/respond entities %
                                                                                        :wizard "Ha! Good standing?"
                                                                                        :wizard "You're the neighborhood cheat and everyone knows it."
                                                                                        :wizard "Now please leave me in peace.")
                                                                       (actions/transition-background entities :outside-house [262 88]))}
                                                            "I'm going to be a knight! That counts for something doesn't it?"
                                                            {:run #(do (actions/respond entities %
                                                                                        :wizard "You are, are you?"
                                                                                        :wizard "Pray tell, how do you, a mere wreckless youth, plan on becoming a knight?"))
                                                             :choices ["By pulling the Sword of Blergh from its stone!"
                                                                       {:run #(actions/respond entities %
                                                                                               :wizard "Well, well. It sounds I was wrong about you."
                                                                                               :wizard "Indeed, you are on the path of setting your destructive past behind you."
                                                                                               :wizard "But know this, the stone cannot be cheated easily."
                                                                                               :wizard "You must fulfill the age-old prophecy."
                                                                                               :wizard "'The Sword of Blergh with magic sting,' ..."
                                                                                               :wizard "... 'Shall yield to no earthly king.'"
                                                                                               :wizard "'To draw from hardened, weathered stone,' ..."
                                                                                               :wizard "... 'One must have valor, right to the bone.'"
                                                                                               :wizard "'Worthy in courage, wisdom and might,' ..."
                                                                                               :wizard "... 'only then with sword he'll fight.'"
                                                                                               :wizard "'But a hero should he prove not be,' ..."
                                                                                               :wizard "... 'Only ruin will fall on he.'"
                                                                                               :wizard "'Should he use guile or guise'..."
                                                                                               )
                                                                        :choices ["Is this almost over?"
                                                                                  {:run #(do (actions/update-state entities (fn [state] (assoc state :convinced-wizard? true)))
                                                                                             (actions/respond entities %
                                                                                                              :wizard "Patience, boy."
                                                                                                              :wizard "... 'Such a man will have great surprise.'"
                                                                                                              :wizard "If this is truely your quest, boy, then I will help you in your quest. "
                                                                                                              :wizard "But heed the warning from the prophecy: No cheat can pull the Sword of Blergh."
                                                                                                              :ego "No cheating."
                                                                                                              :ego "Check."))}
                                                                                  "*cough* *cough* *ahem*"
                                                                                  {:run #(do (actions/update-state entities (fn [state] (assoc state :convinced-wizard? true)))
                                                                                             (actions/respond entities %
                                                                                                              :wizard "Excuse you. Moving on..."
                                                                                                              :wizard "... 'Such a man will have great surprise.'"
                                                                                                              :wizard "If this is truely your quest, boy, then I will help you in your quest. "
                                                                                                              :wizard "But heed the warning from the prophecy: No cheat can pull the Sword of Blergh."
                                                                                                              :ego "No cheating."
                                                                                                              :ego "Check."))}]}
                                                                       "By besting swamp, foe, and the occasional bizarre conversation tree."
                                                                       {:run #(do (actions/respond entities %
                                                                                                   :wizard "While your goal sounds noble, no amount of bizarre conversation tree searching will earn my respect."
                                                                                                   :wizard "Now please leave.")
                                                                                  (actions/transition-background entities :outside-house [262 88]))}]}]}]}
                                      "You're not happy to see me, Mr. Fangald?"
                                      {:run #(actions/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 
                                               (actions/respond entities % :wizard "Now scram!")
                                               (actions/transition-background entities :outside-house [262 88]))}]}))
(defn make [screen]
  (let [sheep-stand-sheet (texture! (texture "outsidehouse/sheep-anim.png") :split 33 21)
        sheep-walk-sheet (texture! (texture "outsidehouse/sheep-walk.png") :split 33 21)
        sheep-stand (animation 0.15 (for [i (flatten [(repeat 10 0) 1 2 3 4 5 6 7 4 5 6 7 8 9 10 (repeat 25 11) (repeat 15 12)])]
                                    (aget sheep-stand-sheet 0 i)))
        sheep-walk (animation 0.15 (for [i (range 6)]
                                     (aget sheep-walk-sheet 0 i)))]
    (rooms/make :interactions
                {:door {:box [258 100 281 160]
                        :script (actions/get-script
                                 entities
                                 (actions/walk-to entities :ego [262 88])
                                 (actions/talk entities :ego (str "Anyone home?"))
                                 (actions/transition-background entities :inside-house [237 0])
                                 (if (get-in @entities [:state :convinced-wizard?])
                                   (actions/talk entities :wizard (str "Oh, hello there boy."))
                                   (wizard-dialogue entities)))}
                 :sword {:box [274 55 305 88]
                         :script (actions/get-script
                                  entities
                                  (actions/talk entities :ego (str "It's the coolest sword I've ever seen!"))
                                  (actions/walk-to entities :ego [290 66])
                                  (actions/talk entities :ego "Maybe I can pull it out."))}
                 :right-dir {:box [300 131 320 224]
                             :script (actions/get-script
                                      entities
                                      (actions/walk-to entities :ego [244 150])
                                      (actions/transition-background entities :behind-house [122 140])
                                      (actions/walk-to entities :ego [172 122]))
                             :cursor :right}
                 :up-dir {:box [60 180 224 240]
                          :script (actions/get-script
                                   entities
                                   (actions/walk-to entities :ego [137 204])
                                   (actions/transition-background entities :cat-tree [203 1]))
                          :cursor :up}
                 :left-dir {:box [0 40 20 140]
                            :script (actions/get-script
                                     entities
                                     (actions/walk-to entities :ego [0 80])
                                     (actions/transition-background entities :outside-castle [310 80]))
                            :cursor :left}}
                :layers [(assoc (texture "bg5.png") :x 0 :y 0 :baseline 0)
                         (assoc (texture "house.png") :x 0 :y 0 :baseline 122)
                         (assoc (texture "outsidehouse/fence.png") :x 0 :y 0 :baseline 95)
                         (assoc (texture "overdirt.png") :x 0 :y 0 :baseline 240)
                         (assoc (texture "background-trees.png") :x 0 :y 0 :baseline 44)]
                :entities {:sheep (actions/start-animation screen
                                                           (assoc (animation->texture screen sheep-stand) :x 38 :y 160 :baseline 160
                                                                  :box [38 160 71 181]
                                                                  :script (actions/get-script
                                                                           entities
                                                                           (if ((get-in @entities [:state :inventory]) :wool)
                                                                             (actions/talk entities :ego "The sheep has given me enough wool.")
                                                                             (do (actions/give entities :wool)
                                                                                 (actions/talk entities :ego "I guess her wool is shedding."))))
                                                                  :scripts {:wool (actions/get-script entities
                                                                                                      (actions/talk entities :ego "She doesn't need it back."))
                                                                            :carrot (actions/get-script entities
                                                                                                        (actions/walk-to entities :ego [132 140])
                                                                                                        (actions/talk entities :ego "Come on girl, get the carrot!")
                                                                                                        (actions/walk-straight-to entities :sheep [95 150]))}
                                                                  :left {:walk (utils/flip sheep-walk)
                                                                         :stand (utils/flip sheep-stand)}
                                                                  :right {:walk sheep-walk
                                                                          :stand sheep-stand})
                                                           sheep-stand)}
                :collision "outsidehouse/collision.png"
                :scale-fn (utils/scaler-fn-with-baseline 110 0.10 1.00))))
