Files
gitea-docker/desktop/src-common/advent/screens/rooms/dream.clj
2017-06-01 08:05:02 -07:00

601 lines
44 KiB
Clojure
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(ns advent.screens.rooms.dream
(:require
[clojure.core.async :as a]
[advent.screens.rooms :as rooms]
[advent.screens.rooms.common :as common]
[advent.actions :as actions]
[advent.screens.items :as items]
[advent.tween :as tween]
[advent.utils :as utils]
[advent.saves :as saves]
[advent.steam :as steam]
[clojure.zip :as zip]
[clojure.set :as set]
[clojure.string :as str]
[play-clj.core :refer :all]
[play-clj.math :refer :all]
[play-clj.ui :refer :all]
[play-clj.utils :refer :all]
[play-clj.g2d :refer :all])
(:import [com.badlogic.gdx.graphics Color]))
(println "loading " *ns*)
(def walk-chan (a/chan))
(defn set-opacity [entities opacity tool-opacity]
(-> entities
(assoc-in [:room :current-layers 0 :opacity] opacity)
(assoc-in [:room :current-layers 1 :opacity] opacity)
(assoc-in [:room :current-layers 2 :opacity] opacity)
(assoc-in [:room :current-layers 3 :opacity] opacity)
(assoc-in [:room :current-layers 4 :opacity] opacity)
(assoc-in [:room :current-layers 5 :opacity] opacity)
(assoc-in [:room :current-layers 6 :opacity] opacity)
(assoc-in [:room :current-layers 7 :opacity] opacity)
(assoc-in [:room :current-layers 8 :opacity] opacity)
(assoc-in [:room :entities :fairy-godfather :label] (if (> opacity 0.0) "Fairy Godfather" nil))
(assoc-in [:room :entities :fairy-godfather :cursor] (if (> opacity 0.0) :talk nil))
(assoc-in [:room :entities :sword :opacity] tool-opacity)
(assoc-in [:room :entities :case :opacity] tool-opacity)
(assoc-in [:room :entities :broom :opacity] tool-opacity)
(assoc-in [:room :entities :shovel :opacity] tool-opacity)
(assoc-in [:room :entities :fairy-godfather :opacity] opacity)
(assoc-in [:room :entities :sign :opacity] opacity)
(assoc-in [:room :entities :plaque-1 :opacity] tool-opacity)
(assoc-in [:room :entities :plaque-2 :opacity] tool-opacity)
(assoc-in [:room :entities :plaque-3 :opacity] tool-opacity)))
(defn fade-in [entities]
(actions/run-action entities
(begin [this screen entities]
(-> entities
(assoc-in [:tweens :fade-in]
(tween/tween :fade-in screen [:room :current-layers 0 :opacity] 0.0 1.0 0.5 :ease tween/ease-in-out-quintic))))
(continue [this screen entities]
(set-opacity entities (get-in entities [:room :current-layers 0 :opacity] ) 0.0))
(done? [this screen entities]
(= 1.0 (get-in entities [:room :current-layers 0 :opacity])))
(terminate [this screen entities]
entities)
(skip-type [this screen entities]
:none)))
(defn fade-in-tools [entities]
(actions/run-action entities
(begin [this screen entities]
(-> entities
(assoc-in [:tweens :fade-in]
(tween/tween :fade-in screen [:room :entities :sword :opacity] 0.0 1.0 0.5 :ease tween/ease-in-out-quintic))))
(continue [this screen entities]
(set-opacity entities 1.0 (get-in entities [:room :entities :sword :opacity])))
(done? [this screen entities]
(= 1.0 (get-in entities [:room :entities :sword :opacity])))
(terminate [this screen entities]
entities)
(skip-type [this screen entities]
:none)))
(defn face-fairy [entities]
(if (< (get-in @entities [:room :entities :fairy-godfather :x])
(get-in @entities [:room :entities :ego :x]))
(actions/do-stop entities :ego :face :left)
(actions/do-stop entities :ego :face :right)))
(defn read-sword-plaque [entities]
(actions/walk-to entities :ego [168 76] :face :left)
(if-not (get-in @entities [:state :plaques-read :sword])
(do
(actions/talk entities :ego "There's a plaque here.")
(actions/play-animation entities :ego :start-squat-2 :stop? false)
(actions/squat-talk entities
"\"A noble choice to be a knight.\nStrength and valor guard thee from fright."
"Theres no need to shove\nTo find thy true love,"
"'Cause maidens swoon for guys with might.\"")
(actions/play-animation entities :ego :end-squat)
(actions/do-dialogue entities
:ego "Awesome!"
:ego "If I become a knight, maybe Georgia McGorgeous will love me!")
(actions/in-love entities))
(actions/talk entities :ego "I can't get through that glass!"))
(actions/stop-walking entities :ego :face :right)
(when-not (get-in @entities [:room :entities :fairy-godfather :distracted?])
(face-fairy entities)
(actions/do-dialogue entities
:fairy-godfather "Tick, I told you that you can't be a knight."
:fairy-godfather "I think you'd be much better suited for a more menial job."
:ego "Hey! Why can't I be a knight? It's my destiny!"
:ego "And plus, it's the only way to get Georgia McGorgeous to love me!"
:ego "And this plaque here says that maidens love knights."
:fairy-godfather "As long as you're under my watch, Tick, I forbid it!"
:fairy-godfather "And you're just not cut out for it!"))
(actions/update-state entities #(update-in % [:plaques-read] conj :sword)))
(defn read-broom-plaque [entities]
(actions/walk-to entities :ego [267 70] :face :right)
(actions/talk entities :ego "There's a plaque here.")
(actions/play-animation entities :ego :start-squat-2 :stop? false)
(actions/squat-talk entities
"\"Grab thy broom, son, and sweep that dirt!\nSweep and mop till thy armpits hurt."
"Thou smell like a hog,\nWith stench like a fog,"
"So with thou no cute babes wouldst flirt.\"")
(actions/play-animation entities :ego :end-squat)
(actions/play-animation entities :ego :sigh)
(when-not (get-in @entities [:room :entities :fairy-godfather :distracted?])
(face-fairy entities)
(actions/talk entities :ego "So can I at least slay ghouls with this broom?")
(actions/stop-walking entities :ego :face :left)
(actions/do-dialogue entities :fairy-godfather "Not quite, young Tick."
:fairy-godfather "This weapon is used to fight a more persistent foe."
:fairy-godfather "Dust and grime!"
:fairy-godfather "Take the broom, and cast it into the pit of fate."
:fairy-godfather "Then you can fulfill your fate as a janitor."))
(actions/update-state entities #(update-in % [:plaques-read] conj :broom)))
(defn read-shovel-plaque [entities]
(actions/walk-to entities :ego [61 72] :face :left)
(actions/talk entities :ego "There's a plaque here.")
(actions/play-animation entities :ego :start-squat-2 :stop? false)
(actions/squat-talk entities
"\"With thy shovel thou will enroll\nFor the dead man a resting hole."
"Thou doth own the night\nBut beware the plight:"
"Thou will not wed, if twas thy goal.\"")
(actions/play-animation entities :ego :end-squat)
(actions/play-animation entities :ego :sigh)
(when-not (get-in @entities [:room :entities :fairy-godfather :distracted?])
(face-fairy entities)
(actions/do-dialogue entities
:fairy-godfather "Don't be dismayed, young Tick."
:fairy-godfather "Remember, these destinies can't be mistaken."
:ego "But it sounds so dull!"))
(actions/update-state entities #(update-in % [:plaques-read] conj :shovel)))
(defn do-intro [entities]
(Thread/sleep 2000)
(actions/talk entities :ego "What's going on?")
(actions/walk-straight-to entities :ego [160 60])
(actions/do-dialogue entities :ego "Who turned out the lights?")
(actions/walk-straight-to entities :ego [120 50])
(Thread/sleep 900)
(actions/talk entities :ego "Am I...")
(Thread/sleep 500)
(actions/talk entities :ego "... dead?")
(Thread/sleep 900)
(actions/talk entities :ego "... But I'm too young to die!" :anim :frustrated-talk :stop? false)
(Thread/sleep 200)
(actions/talk entities :ego "I promise I'll be a better boy!" :anim :frustrated-talk :stop? false)
(Thread/sleep 200)
(actions/talk entities :ego "I'll never steal another one of Gandarf's potions!" :anim :frustrated-talk :stop? false)
(Thread/sleep 200)
(actions/talk entities :ego "I swear!" :anim :frustrated-talk :stop? false)
(actions/talk entities :fairy-godfather "... Tick ...")
(Thread/sleep 500)
(actions/walk-straight-to entities :ego [140 55] :face :right)
(Thread/sleep 500)
(actions/do-dialogue entities :ego "Huh?")
(actions/talk entities :fairy-godfather "... Tiiiiccckk ...")
(Thread/sleep 500)
(actions/present-choices entities {:choices ["Who is that?"
{:run #(actions/talk entities :ego %)}
"What do you want from me?"
{:run #(actions/talk entities :ego %)}
"Show yourself!"
{:run #(actions/talk entities :ego %)}]})
(actions/talk entities :fairy-godfather "Taaaaaaaaaaaaaaaaaa-")
(particle-effect! (get-in @entities [:room :entities :magic]) :reset)
(particle-effect! (get-in @entities [:room :entities :magic]) :start)
(actions/begin-animation entities :fairy-godfather :magic)
(fade-in entities)
(actions/transition-music entities :dream :duration 0.25 )
(actions/talk entities :fairy-godfather "-daaaaaaaaaaaaa!")
(Thread/sleep 1500)
(actions/talk entities :ego "Oh no! The grim reaper!" :anim :frustrated-talk)
(actions/do-dialogue entities
:fairy-godfather "Relax, Tick. You're dreaming!"
:ego "I am?"
:ego "Then who are you?"
:fairy-godfather "Why, I'm your fairy godfather of course!"
:fairy-godfather "I've brought you here, to the pit of destiny."
:fairy-godfather "Today you will choose your trade!"
:fairy-godfather "Let us see what your fate could bring!"
:fairy-godfather "Behold!")
(particle-effect! (get-in @entities [:room :entities :magic]) :reset)
(particle-effect! (get-in @entities [:room :entities :magic]) :start)
(actions/play-animation entities :fairy-godfather :magic)
(fade-in-tools entities)
(Thread/sleep 2500)
(actions/do-dialogue entities
:fairy-godfather "These, young Tick, represent the potential destinies for your life."
:fairy-godfather "They have been selected since the dawn of time."
:fairy-godfather "These destinies are never mistaken.")
(actions/present-choices entities {:choices ["So I'm destined to be a shovel?"
{:run #(actions/talk entities :ego %)}
"So I'm destined to be a broom?"
{:run #(actions/talk entities :ego %)}
"So I'm destined to be a sword?"
{:run #(actions/talk entities :ego %)}]})
(actions/do-dialogue entities :fairy-godfather "No, no, no!")
(actions/walk-straight-to entities :fairy-godfather [87 120] :speed 1.5 :update-baseline? false)
(actions/do-dialogue entities :fairy-godfather "This shovel represents the job of gravedigger."
:fairy-godfather "A simple job, for a simple fellow."
:ego "Hey! "
:ego "I'm not simple.")
(actions/walk-straight-to entities :fairy-godfather [260 120] :speed 1.5 :update-baseline? false)
(actions/do-dialogue entities :fairy-godfather "Next, we have the broom, representing the humble job of a janitor."
:ego "I'm not going to be a janitor!"
:ego "What about that sword?"
:fairy-godfather "Hmm? Sword?")
(actions/walk-straight-to entities :fairy-godfather [192 120] :speed 1.5 :update-baseline? false)
(actions/do-dialogue entities
:fairy-godfather "Sword...?"
:fairy-godfather "Uh, oh. There must be some mistake."
:fairy-godfather "Ahem."
:fairy-godfather "You must choose between being a janitor and a gravedigger."
:ego "But I want that sword so that I can be a knight!"
:ego "And you said that these destinies are never mistaken!"
:fairy-godfather "Nevermind that."
:fairy-godfather "Choose the broom or shovel, and cast it into the pit of fate."
:ego "But..."
:fairy-godfather "No buts.")
(utils/save-chapter @entities :chapter-1)
(actions/update-state entities #(assoc % :seen-intro? true :time :day)))
(defn swing [entities]
(actions/run-action entities
(begin [this screen entities]
(update-in entities [:room :entities :ego] #(actions/start-animation screen % :swing-shovel) ))
(continue [this screen entities]
(if (and (= (get-in entities [:room :entities :ego :current-frame-index]) 3)
(not= (get-in entities [:room :entities :ego :previous-frame-index]) 3))
(do
(particle-effect! (get-in entities [:room :entities :explode]) :reset)
(particle-effect! (get-in entities [:room :entities :explode]) :start)
(update-in entities [:room :entities] dissoc :case))
entities))
(done? [this screen entities]
(animation! (actions/find-animation (get-in entities [:room :entities :ego]) :swing-shovel)
:is-animation-finished
(- (:total-time screen) (get-in entities [:room :entities :ego :anim-start]))))
(terminate [this screen entities]
(actions/stop screen entities :ego))
(skip-type [this screen entities]
:none)))
(defn return-from-island [screen entities]
(when (and (not (get-in entities [:fg-actions :script-running?]))
(get-in entities [:state :active?])
(get-in entities [:room :entities :fairy-godfather :distracted?]))
(if (> (get-in entities [:room :entities :fairy-godfather :distracted-time] 0) 15)
(do
((actions/get-script entities
(actions/update-entities entities (fn [e] (update-in e [:room :entities :fairy-godfather] dissoc :distracted?)))
(actions/walk-straight-to entities :fairy-godfather [192 120] :speed 3.0 :update-baseline? false :face :left)
(actions/do-dialogue entities
:fairy-godfather "Hey! I didn't see anything over there!"
:ego "Oh, yes, it must have flown off."))
entities)
nil)
(update-in entities [:room :entities :fairy-godfather :distracted-time] (fnil inc 0)))))
(defn distract [entities message subject]
(actions/respond entities message
:fairy-godfather (str "A " subject "!?"))
(actions/walk-straight-to entities :fairy-godfather [230 120] :speed 2.0 :update-baseline? false)
(Thread/sleep 500)
(actions/walk-straight-to entities :fairy-godfather [180 120] :speed 2.0 :update-baseline? false)
(Thread/sleep 500)
(actions/do-dialogue entities
:fairy-godfather "Where?"
:ego "Err..."
:ego "Umm...")
(actions/play-animation entities :ego :idea)
(actions/do-dialogue entities
:ego "On that island over there!"
:ego (str "Yes, that's it! There's a " subject " on that island!")
:fairy-godfather "I've got to see it to believe it."
:fairy-godfather "You better not be messing with me, Tick.")
(actions/update-entities entities (fn [e] (update-in e [:room :entities :fairy-godfather] assoc :distracted? true :distracted-time 0)))
(actions/walk-straight-to entities :fairy-godfather [211 210] :face :left :update-baseline? false))
(defn talk-to-fairy [entities]
(do
(face-fairy entities)
(actions/do-dialogue entities :fairy-godfather "Young Tick, you must choose your destiny!")
(actions/present-choices entities {:choices ["What if I don't like any of these choices?"
{:run #(do (actions/respond entities %
:fairy-godfather "Who wouldn't want to be a gravedigger or janitor?"
:fairy-godfather "That's the problem with kids these days."
:fairy-godfather "Always complaining about what they can't have."
:fairy-godfather "You need an attitude adjustment, mister."))
:choices actions/previous-choices}
"Look out!"
{:run #(do (actions/respond entities %
:fairy-godfather "What is it?"
:ego "Err... Um..."
:ego "I saw a, um..."))
:choices ["... a dragon!"
{:run #(distract entities % "dragon")}
"... a ghost!"
{:run #(distract entities % "ghost")}
"... a fairy godfather-eating plant!"
{:run #(distract entities % "fairy godfather-eating plant")}] }
"Nevermind."
{:run #(actions/respond entities % :fairy-godfather "Don't worry, Tick.")}]})))
(defn describe-shovel [entities]
(actions/do-dialogue entities :fairy-godfather "Gravedigging is just the thing for you, Tick."
:fairy-godfather "Just think about it."
:fairy-godfather "You'll have your own little shack at the cemetery..."
:fairy-godfather "... where you can stay and not see another person for months on end ..."
:fairy-godfather "... well, another alive person anyways."))
(defn describe-broom [entities]
(actions/do-dialogue entities :fairy-godfather "Janitoring is just the thing for you, Tick."
:fairy-godfather "Just think about it."
:fairy-godfather "Imagine the sweet smell of victory once you've mopped up some spilled milk."
:fairy-godfather "Or the smell of soap in the bathroom, where you'll spend your time making the tile and porcelain shine."))
(defn make [screen atlas global-atlas]
(let [fairy-godfather-anim (utils/make-anim atlas "fairy-godfather" [63 77] 0.15 [0 1 2 3 2 1 0 1 4 3 2 1])
fairy-godfather-talk-anim (utils/make-anim atlas "fairy-godfather" [63 77] 0.15 [5 6 7 8 7 6])
fairy-godfather-magic-anim (utils/make-anim atlas "fairy-godfather-magic" [100 77] 0.15 [0 1 2 3 4 4 4 4 3 2 1 0])]
(rooms/make :music {:intro :wind :day :dream}
:name "Dream"
:interactions {:pit {:box [54 0 219 36]
:label "Pit of destiny"
:cursor :look
:script (actions/get-script entities
(actions/walk-to entities :ego [154 41])
(actions/talk entities :ego "Wow! That's a long way down."))
:scripts {:shovel (actions/get-script entities
(actions/walk-to entities :ego [154 41])
(actions/talk entities :ego "I guess I'm doomed to be a gravedigger.")
(actions/play-animation entities :ego :sigh)
(actions/play-animation entities :ego :reach-start :stop? false)
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(Thread/sleep 1000)
(describe-shovel entities))
(actions/play-animation entities :ego :reach-stop :stop? true)
(actions/do-dialogue entities
:ego "I can't bring myself to do it."
:ego "It seems like misery!"
:ego "Plus, how can I ever win the heart of my true love, Georgia McGorgeous?"))
:broom (actions/get-script entities
(actions/walk-to entities :ego [154 41])
(actions/talk entities :ego "I guess I'm doomed to be a janitor.")
(actions/play-animation entities :ego :sigh)
(actions/play-animation entities :ego :reach-start :stop? false)
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(Thread/sleep 1000)
(describe-broom entities))
(actions/play-animation entities :ego :reach-stop :stop? true)
(actions/do-dialogue entities
:ego "I can't bring myself to do it."
:ego "It seems like misery!"
:ego "Plus, how can I ever win the heart of my true love, Georgia McGorgeous?"))}}}
:timers {:return [1.0 1.0 return-from-island]}
:layers [(assoc (utils/atlas->texture atlas "sky") :x 0 :y 0 :baseline -3 :parallax 0.5)
(assoc (utils/atlas->texture atlas "far") :x -10 :y 0 :baseline -2 :origin-x 160 :parallax 0.5)
(assoc (utils/atlas->texture atlas "clouds1") :x -10 :y 0 :baseline -1 :parallax 0.2 :scale-x 1.1 :scale-y 1.1)
(assoc (utils/atlas->texture atlas "island") :x 180 :y 180 :baseline 0 :parallax 0.3 :scale-x 1.1 :scale-y 1.1)
(assoc (utils/atlas->texture atlas "cliff") :x 50 :y 133 :baseline 1 :parallax 0.6 :scale-x 1.2 :scale-y 1.2)
(assoc (utils/atlas->texture atlas "background") :x 0 :y 0 :baseline 2)
(assoc (utils/atlas->texture atlas "corner-l") :x -10 :y -10 :baseline 240 :parallax 2.0 )
(assoc (utils/atlas->texture atlas "corner-r") :x (- 320 80) :y -20 :baseline 240 :parallax 3.2)
(assoc (utils/atlas->texture atlas "pedestals") :x 0 :y 0 :baseline 139)]
:current-layers [(assoc (utils/atlas->texture atlas "sky") :x 160 :y 120 :origin-y 120 :baseline -3 :origin-x 160 :parallax 0.01)
(assoc (utils/atlas->texture atlas "far") :x 160 :y 120 :baseline -2 :origin-y 120 :origin-x 160 :parallax 0.01)
(assoc (utils/atlas->texture atlas "clouds1") :x 150 :y 120 :baseline -1 :origin-x 160 :origin-y 120 :parallax 0.1 :scale-x 1.1 :scale-y 1.1)
(assoc (utils/atlas->texture atlas "island") :x 180 :y 180 :origin-x 15 :origin-y 10 :baseline 0 :parallax 0.2 :scale-x 1.1 :scale-y 1.1)
(assoc (utils/atlas->texture atlas "cliff") :x 160 :y 120 :origin-x 160 :origin-y 120 :baseline 1 :parallax 0.6 :scale-x 1.2 :scale-y 1.2)
(assoc (utils/atlas->texture atlas "background") :x 0 :y 0 :baseline 2)
(assoc (utils/atlas->texture atlas "corner-l") :x -10 :y -10 :baseline 240 :parallax 2.0 )
(assoc (utils/atlas->texture atlas "corner-r") :x (- 320 80) :y -20 :baseline 240 :parallax 3.2)
(assoc (utils/atlas->texture atlas "pedestals") :x 0 :y 0 :baseline 139)]
:entities {:magic (assoc (particle-effect "particles/dream-magic") :x 160 :y 80 :baseline 240)
:clouds (assoc (particle-effect "particles/cloudy2") :x 160 :y 120 :baseline 241)
:case (assoc (utils/atlas->texture atlas "case")
:x 144 :y 122 :baseline 139
:label "Glass case"
:cursor :look
:script (actions/get-script entities
(read-sword-plaque entities))
:scripts {:shovel (actions/get-script entities
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(do (actions/walk-to entities :ego [148 76] :face :right)
(swing entities)
(actions/play-animation entities :ego :reach-start :stop? false)
(actions/remove-entity entities :sword)
(actions/play-animation entities :ego :reach-stop)
(actions/give entities :dream-sword)
(actions/do-dialogue entities :ego "Yes! Now, before he gets back!")
(actions/pause-camera entities)
(actions/play-animation entities :ego :jump-straight :stop? false)
(actions/walk-straight-to entities :ego [160 98] :anim :jumping-straight :update-baseline? false :speed 5.0 :stop? false)
(actions/walk-straight-to entities :ego [173 121] :anim :jumping-straight :update-baseline? false :speed 3.0 :stop? false)
(actions/walk-straight-to entities :ego [175 125] :anim :jumping-straight :update-baseline? false :speed 1.0 :stop? false)
(actions/play-sound entities
(get-in @entities [:room :entities :ego :drop-sound])
0.2
false)
(actions/walk-straight-to entities :ego [180 100] :anim :jumping-straight :update-baseline? false :stop? false :speed 2.0)
(actions/walk-straight-to entities :ego [190 30] :anim :jumping-straight :update-baseline? false :stop? false :speed 3.0)
(actions/walk-straight-to entities :ego [200 -80] :anim :jumping-straight :update-baseline? false :stop? false :speed 8.0)
(actions/remove-item entities :dream-sword :quiet? true)
(actions/remove-item entities :broom :quiet? true)
(actions/remove-item entities :shovel :quiet? true)
(actions/transition-background entities :inside-castle [92 150] :time 8.0)
(actions/resume-camera entities)
(actions/walk-straight-to entities :ego [79 145] :stop? false)
(actions/walk-to entities :ego [159 74])
(steam/set-achievement "DESTINY")
(actions/do-dialogue entities
:ego "Man! What a dream!"
:ego "If only I could become a real knight."
:ego "Then I'd be able to win Georgia McGorgeous' heart.")
(actions/in-love entities)
(utils/save-chapter @entities :chapter-2))
(do (actions/walk-to entities :ego [148 76] :face :right)
(actions/do-dialogue entities
:fairy-godfather "What are you doing?" :ego "Erm... Nothing."))))
:broom (actions/get-script entities
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(actions/talk entities :ego "I don't think this is hard enough to break the case.")
(do (actions/walk-to entities :ego [148 76] :face :right)
(actions/do-dialogue entities
:fairy-godfather "What are you doing?" :ego "Erm... Nothing."))))})
:sword (assoc (utils/atlas->texture atlas "sword")
:x 144 :y 122 :baseline 139)
:explode (assoc (particle-effect "particles/explode") :x 150 :y 138 :baseline 240)
:broom (assoc (utils/atlas->texture atlas "broom") :x 286 :y 122
:path (catmull-rom-spline (map #(apply vector-2* %) [[286 122] [286 128]]) true)
:update-fn (partial utils/update-path-location 0.30)
:baseline 240
:label "Broom"
:cursor :hand
:script (actions/get-script entities
(if ((get-in @entities [:state :plaques-read]) :broom)
(do
(actions/walk-to entities :ego [267 70] :face :right)
(actions/play-animation entities :ego :sigh)
(actions/play-animation entities :ego :reach)
(actions/remove-entity entities :broom)
(actions/give entities :broom))
(read-broom-plaque entities))))
:shovel (assoc (utils/atlas->texture atlas "shovel") :x 33 :y 122
:path (catmull-rom-spline (map #(apply vector-2* %) [[22 122] [22 128]]) true)
:update-fn (partial utils/update-path-location 0.33)
:baseline 240
:label "Shovel"
:cursor :hand
:script (actions/get-script entities
(if ((get-in @entities [:state :plaques-read]) :shovel)
(do
(actions/walk-to entities :ego [61 72] :face :left)
(actions/play-animation entities :ego :sigh)
(actions/play-animation entities :ego :reach)
(actions/remove-entity entities :shovel)
(actions/give entities :shovel))
(read-shovel-plaque entities))))
:sign (assoc (utils/atlas->texture atlas "sign") :x 229 :y 33 :baseline 207)
:plaque-1 (assoc (utils/atlas->texture atlas "plaque1") :x 39 :y 99 :baseline 139 :label "Plaque" :cursor :look :script (actions/get-script entities (read-shovel-plaque entities)))
:plaque-2 (assoc (utils/atlas->texture atlas "plaque2") :x 147 :y 104 :baseline 139 :label "Plaque" :cursor :look :script (actions/get-script entities (read-sword-plaque entities)))
:plaque-3 (assoc (utils/atlas->texture atlas "plaque3") :x 283 :y 98 :baseline 139 :label "Plaque" :cursor :look :script (actions/get-script entities (read-broom-plaque entities)))
:outside-particles (common/make-outside-particles)
:bounce-surrogate {:object nil
:path (catmull-rom-spline (map #(apply vector-2* %) [[200 130] [200 150]]) true)
:path-start-time 0
:x 200
:y 130
:delta-y 0
:update-fn (fn [s es e]
(let [y (:y e)
new-y (:y (utils/update-path-location 0.3 s es e))]
(assoc e :delta-y (- new-y y))))
}
:fairy-godfather (assoc (animation->texture screen fairy-godfather-anim)
:x 200 :y 130
:baseline 240
:origin-x 31
:origin-y 0
:scale-x 1.0929411888122558
:scale-y 1.0929411888122558
:test true
:anim fairy-godfather-anim :anim-start 0
:path-start-time 0
:scaled true
:magic-sound (utils/load-sound "dream/appear.ogg")
:anim-sound-frames {fairy-godfather-magic-anim {1 [:magic-sound (constantly 0.5)]}}
:left {:walk fairy-godfather-anim
:talk fairy-godfather-talk-anim
:stand fairy-godfather-anim
:magic fairy-godfather-magic-anim}
:right {:walk (utils/flip fairy-godfather-anim)
:stand (utils/flip fairy-godfather-anim)
:talk (utils/flip fairy-godfather-talk-anim)
:magic fairy-godfather-magic-anim}
:anim-merges {fairy-godfather-magic-anim {:origin-x 59}
:default {:origin-x 31}}
:facing :left
:update-fn (fn [s es e]
(assoc-in e [:offset-y] (* (:scale-y e) (get-in es [:bounce-surrogate :delta-y] 0))))
:talk-color (Color/valueOf "ADA6FFFF")
:label "Fairy godfather"
:cursor :talk
:script (actions/get-script entities
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(actions/do-dialogue entities :ego "He wouldn't be able to hear me from there.")
(talk-to-fairy entities)))
:scripts {:shovel (actions/get-script entities
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(actions/do-dialogue entities :ego "He wouldn't be able to hear me from there.")
(do
(describe-shovel entities)
(actions/play-animation entities :ego :sigh))))
:broom (actions/get-script entities
(if (get-in @entities [:room :entities :fairy-godfather :distracted?])
(actions/do-dialogue entities :ego "He wouldn't be able to hear me from there.")
(do
(describe-broom entities)
(actions/play-animation entities :ego :sigh))))})}
:collision "dream/collision.png"
:scale-fn (utils/scaler-fn-from-image "dream/scale.png" 0.1 1.3)
:apply-state (fn [_ entities]
(utils/fast-forward-particle (get-in entities [:room :entities :outside-particles]))
(as-> entities entities
(if (get-in entities [:state :seen-intro?])
(set-opacity entities 1.0 1.0)
(set-opacity entities 0.0 0.0))
(if (actions/has-item? entities :broom)
(update-in entities [:room :entities] dissoc :broom)
entities)
(if (actions/has-item? entities :shovel)
(update-in entities [:room :entities] dissoc :shovel)
entities)))
:start-pos [140 55])))