Files
gitea-docker/desktop/src-common/advent/screens/rooms/inside_antique.clj
2015-08-16 14:14:39 -07:00

274 lines
25 KiB
Clojure

(ns advent.screens.rooms.inside-antique
(:require [advent.screens.rooms :as rooms]
[advent.actions :as actions]
[advent.screens.items :as items]
[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 do-antique-dialogue [entities]
(actions/do-dialogue entities
:shopkeep "Welcome to my antique shop!"
:shopkeep "Can I help you?")
(actions/present-choices entities
{:choices ["What do you have for sale here?"
{:run #(actions/respond entities %
:shopkeep "For sale?"
:shopkeep "This is a very UNIQUE antique shop."
:shopkeep "Nothing's for sale, sonny."
:shopkeep "It's more like a museum."
:shopkeep "You can take look around at some of my items, but nothing is for sale.")
:choices ["How do you make money then?"
{:run #(actions/respond entities %
:shopkeep "Mostly insurance claims."
:shopkeep "When you run such an impressive shop as I do, items sometimes just go missing.")
:choices actions/previous-choices}
"Is there anything here you will sell?"
{:run #(actions/respond entities %
:shopkeep "No."
:shopkeep "But I do have some free magical lava mints that Gandarf brewed up."
:shopkeep "Careful! They're spicy.")
:choices actions/previous-choices}
"So in order to continue on my quest, I'll need to solve some puzzle here?"
{:run #(actions/respond entities %
:shopkeep "I have no idea what you're talking about, sonny.")
:choices actions/previous-choices}
"Something else."
{:choices actions/something-else}]}
(when (and (get-in @entities [:state :wants-toy])
(not (get-in @entities [:state :allowed-to-keep-teddy?])))
"Listen, I really need that teddy bear you have.")
{:run #(actions/respond entities %
:shopkeep "Why?"
:shopkeep "It belonged to my long lost son."
:shopkeep "Why should I give it to you?")
:choices ["Because it's the choicest toy I've ever seen!"
{:run #(actions/respond entities %
:shopkeep "I'm sorry, it's not for sale.")
:choices actions/something-else}
"Your long lost son said I could have it."
{:run #(do (actions/respond entities %
:shopkeep "REALLY? You've met him?"
:ego "... erm. Yes!"
:shopkeep "If you really met him, you'll have to prove it."
:shopkeep "What is my son's name?"))
:choices ["... Bud?"
{:run #(do (actions/respond entities % :shopkeep "No. That's not it.")
(actions/play-animation entities :shopkeep :sigh)
(actions/do-dialogue entities :ego "Oh. I must be thinking of another long lost son."))}
"... Steve?"
{:run #(do (actions/respond entities % :shopkeep "No. That's not it.")
(actions/play-animation entities :shopkeep :sigh)
(actions/do-dialogue entities :ego "Oh. I must be thinking of another long lost son."))}
"... Bob?"
{:run #(do (actions/respond entities % :shopkeep "No. That's not it.")
(actions/play-animation entities :shopkeep :sigh)
(actions/do-dialogue entities :ego "Oh. I must be thinking of another long lost son."))}
(when ((get-in @entities [:state :clues]) :name)
"Herb.")
{:run #(do (actions/respond entities %
:shopkeep "Yes, that's it!"
:shopkeep "You must have really met my son!"
:shopkeep "Of course you can keep the teddy bear.")
(actions/update-state entities (fn [s] (assoc s :allowed-to-keep-teddy? true))))}]}]}
"How's life in the antique shop biz?"
{:run #(do (actions/respond entities %
:shopkeep "Pretty lonely."
:shopkeep "My long lost son used to help me run this shop, but he's been gone for five years now."
:shopkeep "I've been couped up in here by myself ever since.")
(actions/play-animation entities :shopkeep :sigh)
(actions/do-dialogue entities :shopkeep "Now all I have is this grandfather clock to keep me company."))
:choices actions/previous-choices}
"Nevermind." {:run #(actions/respond entities % :shopkeep "Feel free to look around.")}]}))
(defn return-portrait [ entities]
(actions/walk-to entities :ego [143 64] :face :left)
(actions/play-animation entities :ego :reach)
(actions/add-entity entities :portrait (get-in @entities [:room :portrait]))
(actions/remove-item entities :portrait))
(defn has-to-return-teddy? [entities]
(and (actions/has-item? entities :teddy)
(not (get-in @entities [:state :allowed-to-keep-teddy?]))))
(defn make [screen]
(let [shopkeep-sheet (texture! (texture "inside-antique/shopkeep-talk.png") :split 18 21)
shopkeep-stand (animation 0.1 (for [i (flatten [(repeat 30 0) 1 (repeat 50 0) 1 0 1 0 1])]
(aget shopkeep-sheet 0 i)))
shopkeep-talk (animation 0.15 (for [i [0 2 0 2 0 3 1 0]]
(aget shopkeep-sheet 0 i)))
shopkeep-sigh (utils/make-anim "inside-antique/antique-sigh.png" [22 21] 0.2 (flatten [ (range 9) 0 0 0 0 0 0 ]))
beard (utils/make-anim "inside-antique/beard.png" [26 52] 0.5 [0 1 0 2])
teddy (assoc (texture "inside-antique/teddy.png")
:x 255
:y 95
:baseline 160
:script (actions/get-script entities
(actions/walk-to entities :ego [242 49] :face :right)
(actions/play-animation entities :ego :reach)
(actions/give entities :teddy)
(actions/remove-entity entities :teddy)
(when (not (get-in @entities [:state :allowed-to-keep-teddy?]))
(actions/do-dialogue entities
:ego "Aww, a cute teddy bear!"
:shopkeep "Don't get any fast ideas."
:shopkeep "That teddy bear does not leave my store."))))]
(rooms/make :music :inside-antique
:interactions
{:right {:box [250 0 320 75]
:cursor :right
:script (actions/get-script entities
(when (or (actions/has-item? entities :portrait)
(has-to-return-teddy? entities))
(actions/walk-to entities :ego [235 15])
(actions/talk entities :shopkeep "Excuse me sonny. Please return my belongings before you leave.")
(when (actions/has-item? entities :portrait)
(return-portrait entities))
(when (has-to-return-teddy? entities)
(actions/walk-to entities :ego [242 49] :face :right)
(actions/play-animation entities :ego :reach)
(actions/add-entity entities :teddy teddy)
(actions/remove-item entities :teddy)))
(actions/walk-to entities :ego [235 15] :stop? false :skip-type :end)
(actions/walk-straight-to entities :ego [320 -5])
(actions/transition-background entities :inside-castle [182 90])
(actions/walk-to entities :ego [187 75]))}
:return-portrait {:box [103 70 206 116]
:script (actions/get-script entities (actions/talk entities :ego "It's the shopkeep's desk."))
:scripts {:portrait (actions/get-script entities
(return-portrait entities))}}
:window {:box [210 125 256 183]
:script (actions/get-script entities
(actions/talk entities :ego "It's a nice, big window."))
:scripts {:portrait (actions/get-script entities
(actions/walk-to entities :ego [142 49] :face :left)
(actions/play-animation entities :ego :hold-up-to-window)
(actions/talk entities :ego "The portrait says 'Herb' on the back.")
(actions/update-state entities (fn [state] (update-in state [:clues] #(conj % :name)) )))}}
:grandfather-clock {:box [55 70 103 185]
:script (actions/get-script entities
(actions/do-dialogue entities :ego "Cool grandfather clock!"
:shopkeep "It's quite the exquisit piece, isn't it?"))}
:shelf {:box [0 60 52 199]
:script (actions/get-script entities
(actions/walk-to entities :ego [48 58])
(actions/talk entities :ego "All of these trinkets seem too bulky to fit in my pack."))}
:flowers {:box [178 115 188 143]
:script (actions/get-script entities
(actions/update-state entities (fn [s] (assoc s :mints-eaten 0)))
(actions/talk entities :ego "I've never been a fan of flowers."))}
:lian {:box [264 103 317 198]
:script (actions/get-script entities
(actions/walk-to entities :ego [220 35] :face :right)
(actions/do-dialogue entities
:ego "It's a tapestry of Rupert the Lion!"
:ego "He's the town of Remington's mascot."))}
}
:layers [(assoc (texture "inside-antique/background.png") :x 0 :y 0 :baseline 0)
(assoc (texture "inside-antique/desk.png") :x 0 :y 0 :baseline 113)
(assoc (texture "inside-antique/fg.png") :x 0 :y 0 :baseline 320 :parallax 1.5)
(assoc (texture "inside-antique/glow.png") :x 0 :y 0 :baseline 240 :additive? true :opacity 0.3)]
:entities {:shopkeep (actions/start-animation screen (assoc (animation->texture screen shopkeep-stand) :x 148 :y 122 :baseline 112
:stand shopkeep-stand
:scale-x 1.6
:scale-y 1.6
:talk-color (color 0.2 1.0 0.2 1.0)
:talk shopkeep-talk
:sigh shopkeep-sigh
:anim-merges {shopkeep-sigh {:origin-x 9}
:default {:origin-x 9}}
:script (actions/get-script entities (do-antique-dialogue entities))
:scripts #(condp = %
:teddy (actions/get-script entities
(if (get-in @entities [:state :allowed-to-keep-teddy?])
(actions/talk entities :shopkeep "Please give the teddy bear to Herb when you see him.")
(actions/talk entities :shopkeep "That belonged to my long lost son.")))
:portrait (actions/get-script entities
(if (get-in @entities [:state :allowed-to-keep-teddy?])
(actions/talk entities :shopkeep "That's a portrait of my little Herb. "
:shopkeep "Please put it back before you leave." )
(actions/talk entities :shopkeep "That's a portrait of my long lost son. "
:shopkeep "Please put it back before you leave.")))
(actions/get-script entities
(actions/talk entities :shopkeep "No thanks, sonny."))))
:stand)
:beard (assoc (animation->texture screen beard)
:anim beard
:anim-start 0
:x 70
:y 86
:baseline 120)
:smoke-particle (doto (assoc (particle-effect "inside-antique/smoke-particle") :x 162 :y 108
:baseline 240)
(particle-effect! :set-position 162 108))
:fire-particle (doto (assoc (particle-effect "inside-antique/fire-particle") :x 162 :y 108
:baseline 240)
(particle-effect! :set-position 162 108))
:bowl (assoc (texture "inside-antique/bowl.png")
:x 165
:y 110
:baseline 125
:script (actions/get-script entities
(if (= 3 (get-in @entities [:state :mints-eaten]))
(do (actions/walk-to entities :ego [159 62] :face :right)
#_(actions/update-state entities (fn [s] (assoc s :mints-eaten 0)))
(actions/do-dialogue entities
:ego "She's all out."
:shopkeep "That's right I'm all out."
:shopkeep "Go tell Gandarf that I need some more brewed up."
:shopkeep "Pronto!"))
(do (actions/walk-to entities :ego [159 62] :face :right)
(if (= 0 (get-in @entities [:state :mints-eaten]))
(actions/talk entities :ego "I'll just try one of these mints.")
(actions/talk entities :ego "I'll just try another one of these mints."))
(actions/play-animation entities :ego :reach)
(actions/update-state entities (fn [s] (assoc s :mints-eaten (inc (s :mints-eaten)))))
(sound! (sound (str "inside-antique/fire-" (get-in @entities [:state :mints-eaten]) ".ogg")) :play (utils/current-sound-volume))
(cond
(= 2 (get-in @entities [:state :mints-eaten]))
(do (particle-effect! (get-in @entities [:room :entities :smoke-particle]) :reset)
(particle-effect! (get-in @entities [:room :entities :smoke-particle]) :start))
(= 3 (get-in @entities [:state :mints-eaten]))
(do (particle-effect! (get-in @entities [:room :entities :fire-particle]) :reset)
(particle-effect! (get-in @entities [:room :entities :fire-particle]) :start)))
(actions/play-animation entities :ego [:fire (get-in @entities [:state :mints-eaten])])
(actions/talk entities :ego "WOWZA! Those are hot.")
(when (= 3 (get-in @entities [:state :mints-eaten]))
(actions/do-dialogue entities :shopkeep "Oh drat! You ate the last mint."
:shopkeep "It seems like I'm always running out."
:shopkeep "Now be a good lad and tell Gandarf that I need some more brewed up."
:shopkeep "Pronto!"))))))
:teddy teddy}
:portrait (rooms/make-entity :portrait
(assoc (texture "inside-antique/portrait.png")
:x 112
:y 114
:baseline 120
:script (actions/get-script entities
(actions/walk-to entities :ego [140 61] :face :left)
(actions/play-animation entities :ego :reach)
(actions/remove-entity entities :portrait)
(actions/give entities :portrait)
(actions/talk entities :ego "It's a portrait. There's something on the back but it's too dim to read."))))
:collision "inside-antique/collision.png"
:apply-state (fn [_ entities]
(as-> entities entities
(if (or (actions/has-item? entities :teddy)
(actions/has-obtained? entities :balloon))
(update-in entities [:room :entities] #(dissoc % :teddy))
entities)
(if (actions/has-item? entities :portrait )
entities
(assoc-in entities [:room :entities :portrait] (get-in entities [:room :portrait])))))
:scale-fn (utils/scaler-fn-with-baseline 110 0.10 1.75)
:start-pos [222 3])))