286 lines
17 KiB
Clojure
286 lines
17 KiB
Clojure
(ns advent.screens.rooms.castle-gate
|
|
(:require [advent.screens.rooms :as rooms]
|
|
[advent.actions :as actions]
|
|
[advent.screens.items :as items]
|
|
[advent.screens.rooms.common :as common]
|
|
[advent.utils :as utils]
|
|
[advent.screens.dialogue :as dialogue]
|
|
[advent.steam :as steam]
|
|
|
|
[advent.tween :as tween]
|
|
[clojure.zip :as zip]
|
|
[play-clj.core :refer :all]
|
|
[play-clj.ui :refer :all]
|
|
|
|
[play-clj.math :refer :all]
|
|
[play-clj.utils :refer :all]
|
|
[play-clj.g2d :refer :all]))
|
|
|
|
(println "loading " *ns*)
|
|
|
|
(defn make-night [entities]
|
|
entities)
|
|
|
|
(defn make-coin-flip [screen atlas]
|
|
(let [coin-flip (utils/make-anim atlas "coinflip" [10 10] 0.05 (range 5))]
|
|
(assoc (animation->texture screen coin-flip)
|
|
:x 212 :y 114 :baseline 151
|
|
:opacity 0.0
|
|
:label "Coin"
|
|
:cursor :hand
|
|
:origin-x 5
|
|
:origin-y 5
|
|
:night-profile :none
|
|
:update-fn (partial utils/update-path-location 0.5)
|
|
:script (actions/get-script entities
|
|
(when (get-in @entities [:state :has-dropped-coin?])
|
|
(actions/walk-to entities :ego [196 46] :face :left)
|
|
(actions/play-animation entities :ego :squat)
|
|
(actions/remove-entity entities :coin-flip)
|
|
(actions/give entities :money)))
|
|
:walk coin-flip
|
|
:coinflip coin-flip)))
|
|
|
|
(defn make-goon-1 [screen atlas]
|
|
(let [stand (utils/make-anim atlas "goon-1" [13 33] 0.21 [0 0 0 0 0 0 0 0 0 1])]
|
|
(assoc (animation->texture screen stand)
|
|
:x 244 :y 102 :baseline 138
|
|
:label "Goon"
|
|
:cursor :talk
|
|
:scale-x 1.4
|
|
:scale-y 1.4
|
|
:night-profile :sprite
|
|
:anim stand
|
|
:anim-start 0
|
|
:stand stand)))
|
|
|
|
(defn make-goon-2 [screen atlas]
|
|
(let [
|
|
stand (utils/make-anim atlas "goon-2" [12 32] 0.175 [0 0 0 0 0 0 0 0 0 0 0 0 0 1])
|
|
talk (utils/make-anim atlas "goon-2-talk" [12 32] 0.175 (range 2))
|
|
flip (utils/make-anim atlas "goon-2-flip" [12 32] 0.05 [1 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ])
|
|
search (utils/make-anim atlas "goon-2-search" [24 32] 0.3 [0 1 2 3 2 3 2 1 4 5 6 5 6 7 6 7 6 7 6 1 0])
|
|
walk (utils/flip (utils/make-anim atlas "goon-2-walk" [24 34] 0.075 (range 7)))]
|
|
(assoc (animation->texture screen stand)
|
|
:x 214 :y 102 :baseline 151
|
|
:scale-x 1.4
|
|
:scale-y 1.4
|
|
:origin-x 6
|
|
:origin-y 0
|
|
:label "Bubba"
|
|
:cursor :talk
|
|
:anim stand
|
|
:talk talk
|
|
:flip flip
|
|
:walk walk
|
|
:search search
|
|
:flip-sound (utils/load-sound "castle-gate/flip.ogg")
|
|
:anim-sound-frames {flip {1 [:flip-sound 0.4]}}
|
|
:anim-merges {search {:origin-x 12 :origin-y 0}
|
|
talk {:origin-x 6 :origin-y 0}
|
|
walk {:origin-x 12 :origin-y 3}
|
|
:default {:origin-x 6 :origin-y 0}}
|
|
:update-fn (fn [s es e]
|
|
(if (and (= (:flip e) (:anim e))
|
|
(animation! (:flip e)
|
|
:is-animation-finished
|
|
(- (:total-time s) (:anim-start e))))
|
|
(actions/start-animation s e :stand)
|
|
e))
|
|
:script (actions/get-script entities
|
|
(if (get-in @entities [:tweens :coin-y])
|
|
(do
|
|
(actions/update-entities entities (fn [entities]
|
|
(assoc-in entities [:room :entities :coin-flip :opacity] 1.0)))
|
|
(actions/talk entities :ego "Hey, Bubba!" :wait false)
|
|
(actions/update-entities entities (fn [entities]
|
|
(-> entities
|
|
(update-in [:tweens] dissoc :coin-y)
|
|
(assoc-in [:room :entities :coin-flip :opacity] 1.0))))
|
|
|
|
(actions/walk-straight-to entities :coin-flip [212 90] :update-baseline? false :speed 3.0)
|
|
(screen! dialogue/talking-screen :stop-talk {})
|
|
(actions/do-stop entities :ego)
|
|
|
|
(actions/walk-straight-to entities :coin-flip [210 105] :update-baseline? false :speed 1.0)
|
|
(Thread/sleep 50)
|
|
(actions/walk-straight-to entities :coin-flip [205 75] :update-baseline? false :speed 1.5)
|
|
|
|
(actions/walk-straight-to entities :coin-flip [202 83] :update-baseline? false :speed 1.0)
|
|
(Thread/sleep 50)
|
|
(actions/walk-straight-to entities :coin-flip [195 65] :update-baseline? false :speed 0.5)
|
|
|
|
(actions/walk-straight-to entities :coin-flip [192 70] :update-baseline? false :speed 0.5)
|
|
(Thread/sleep 50)
|
|
(actions/walk-straight-to entities :coin-flip [185 44] :update-baseline? false :speed 0.5)
|
|
(actions/update-state entities (fn [s] (assoc s :has-dropped-coin? true)))
|
|
(actions/talk entities :goon-2 "You made me lose my coin, Dipstick!" :anim :search)
|
|
(actions/talk entities :ego "Umm, sorry!"))
|
|
(do
|
|
(actions/do-dialogue entities :ego "Hey, Bubba!"
|
|
:goon-2 "Beat it, Dipstick."))))
|
|
:scripts {:money (actions/get-script entities
|
|
(actions/do-dialogue entities :ego "I don't want to give it back!"))
|
|
:default (actions/get-script entities
|
|
(actions/do-dialogue entities :goon-2 "Beat it, Dipstick."))}
|
|
:night-profile :sprite
|
|
:anim-start 0
|
|
:stand stand)))
|
|
|
|
|
|
(defn attempt-walking-through-gate [entities]
|
|
(actions/walk-to entities :ego [157 83] :skip-type :end)
|
|
(actions/walk-straight-to entities :ego [100 83])
|
|
(actions/transition-background entities :inside-castle [280 145])
|
|
(actions/walk-to entities :ego [245 90] :skip-type :end))
|
|
|
|
(defn flip-coin [screen entities]
|
|
(println "here")
|
|
(if (and (= 0 (rand-int 2))
|
|
(not (get-in entities [:state :has-dropped-coin?]))
|
|
(not (get-in entities [:state :bubba-gone?]))
|
|
(= (get-in entities [:room :entities :goon-2 :anim])
|
|
(get-in entities [:room :entities :goon-2 :stand])))
|
|
(-> entities
|
|
(update-in [:room :entities :coin-flip] (fn [cf] (-> (actions/start-animation screen cf :coinflip)
|
|
(assoc :opacity 1.0))))
|
|
(assoc-in [:tweens :coin-y] (tween/tween :coin-y screen [:room :entities :coin-flip :y] 112 175 0.5 :ease tween/ease-out-cubic
|
|
:finish (fn [e]
|
|
(assoc-in e [:tweens :coin-y] (tween/tween :coin-y (assoc screen :total-time (+ 0.5 (:total-time screen))) [:room :entities :coin-flip :y] 174 118 0.5 :ease tween/ease-in-cubic
|
|
:finish (fn [e]
|
|
(assoc-in e [:room :entities :coin-flip :opacity] 0.0)))))))
|
|
(update-in [:room :entities :goon-2] (fn [g] (-> (actions/start-animation screen g :flip)))))
|
|
entities))
|
|
|
|
(defn look-at-note [entities]
|
|
(actions/walk-to entities :ego [126 65] :face :left)
|
|
(if (get-in @entities [:state :has-voted?])
|
|
(actions/do-dialogue entities
|
|
:ego "It's a notice for a town vote."
|
|
:ego "Let's see..."
|
|
:ego "It looks like Took's going to get a pardon! 35 to 34!")
|
|
(actions/do-dialogue entities :ego "It's a notice for a town vote."
|
|
:ego "\"Took, son of Luke, son of Puke abandoned his post and duties,"
|
|
:ego "... and let a hoodlum steal the Duke's ladder."
|
|
:ego "Vote 'Yea' by signing below to pardon him of his crime."
|
|
:ego "And vote 'Nay' to exact due justice.\""
|
|
:ego "Let's see..."
|
|
:ego "It looks like it's perfect tie! 34 to 34!"))
|
|
(actions/update-state entities #(assoc % :has-read-voting-sheet? true)))
|
|
|
|
(defn sign-note [entities]
|
|
(actions/walk-to entities :ego [126 65] :face :left)
|
|
(cond
|
|
(not (get-in @entities [:state :has-read-voting-sheet?]))
|
|
(do
|
|
(actions/do-dialogue entities :ego "Let me read it first.")
|
|
(look-at-note entities)
|
|
(recur entities))
|
|
|
|
(get-in @entities [:state :has-voted?])
|
|
(actions/do-dialogue entities :ego "Looks like I've already voted.")
|
|
:else
|
|
(do
|
|
(actions/do-dialogue entities
|
|
:ego "It'd be a shame to have Took punished on my account!"
|
|
:ego "I'll vote to give him a pardon.")
|
|
(actions/play-animation entities :ego :reach)
|
|
(actions/do-dialogue entities :ego "There, now the vote is 35 to 34!")
|
|
(actions/update-state entities #(assoc % :has-voted? true))
|
|
(steam/set-achievement "PARDON"))))
|
|
|
|
(defn make-note []
|
|
{:box [97 102 111 132]
|
|
:label "Note"
|
|
:cursor :look
|
|
:script (actions/get-script entities
|
|
(look-at-note entities))
|
|
:scripts {:charcoal (actions/get-script entities
|
|
(sign-note entities))}})
|
|
|
|
(defn make [screen atlas global-atlas]
|
|
(let [throw-walkie (utils/make-anim-seq atlas "throw-walkie" [205 136] 0.1 (flatten [(repeat 55 0) (range 9) (repeat 55 8)]))
|
|
walkie-visible (animation 1.0 [(utils/atlas->texture atlas "throw-walkie" 8)])
|
|
walkie-invisible (animation 1.0 [(utils/atlas->texture atlas "throw-walkie" 0)])]
|
|
(rooms/make :music {:day :town-2 :night :night}
|
|
:name "Castle gate"
|
|
:timers {:taunt [1.0 6.0 flip-coin]}
|
|
:interactions {:right-dir {:box [280 40 320 83]
|
|
:script (actions/get-script entities
|
|
(actions/walk-to entities :ego [301 46] :face :right :skip-type :end)
|
|
(actions/walk-straight-to entities :ego [340 40])
|
|
(actions/transition-background entities :outside-castle [82 180])
|
|
(actions/update-state entities #(assoc % :bubba-gone? false))
|
|
(actions/walk-to entities :ego [129 148] :skip-type :end))
|
|
:cursor :right}
|
|
:left-dir {:box [115 93 169 212]
|
|
:script (actions/get-script entities (attempt-walking-through-gate entities))
|
|
:cursor :left}
|
|
|
|
:window {:box [192 157 215 215]
|
|
:label "Window"
|
|
:cursor :look
|
|
:script (actions/get-script entities
|
|
(actions/talk entities :ego "That's a big window!"))
|
|
:scripts {:walkie-talkies (actions/get-script entities
|
|
(actions/play-animation entities :ego :idea)
|
|
(actions/walk-to entities :ego [285 71])
|
|
(actions/walk-straight-to entities :ego [308 105] :face :left)
|
|
(actions/add-entity entities :walkie-talkies (actions/start-animation (get-in @entities [:room :walkie-talkies])
|
|
:walkie-invisible))
|
|
(actions/begin-animation entities :walkie-talkies :throw-walkie)
|
|
(actions/play-animation entities :ego :throw)
|
|
(actions/remove-item entities :walkie-talkies)
|
|
(actions/begin-animation entities :walkie-talkies :stand)
|
|
(Thread/sleep 2000)
|
|
(actions/walk-straight-to entities :ego [285 71]))}}
|
|
:note (make-note)}
|
|
|
|
:layers {:day [(assoc (utils/atlas->texture atlas "background") :x 0 :y 0 :baseline 0)
|
|
(assoc (utils/atlas->texture atlas "overlay") :x 0 :y 0 :baseline 240)]
|
|
:night [(assoc (utils/atlas->texture atlas "background") :x 0 :y 0 :baseline 0)
|
|
(assoc (utils/atlas->texture atlas "overlay") :x 0 :y 0 :baseline 240)]}
|
|
:entities {:frankie (common/make-frankie screen global-atlas)
|
|
:goon-1 (make-goon-1 screen atlas)
|
|
:goon-2 (make-goon-2 screen atlas)
|
|
:outside-particles (common/make-outside-particles)
|
|
:coin-flip (make-coin-flip screen atlas)
|
|
}
|
|
:walkie-talkies (rooms/make-entity :walkie-talkies
|
|
(assoc (animation->texture screen walkie-visible)
|
|
:x 104 :y 88
|
|
:baseline 130
|
|
:night-profile :sprite
|
|
:throw-walkie throw-walkie
|
|
:stand walkie-visible
|
|
:walkie-invisible walkie-invisible
|
|
:anim-start 0
|
|
:anim walkie-visible))
|
|
|
|
:collision "castle-gate/collision.png"
|
|
:scale-fn (utils/scaler-fn-with-baseline 110 0.10 1.30)
|
|
:apply-state (fn [_ entities]
|
|
(utils/fast-forward-particle (get-in entities [:room :entities :outside-particles]))
|
|
(as-> entities entities
|
|
(if (= :night (get-in entities [:state :time]))
|
|
(make-night entities)
|
|
entities)
|
|
(if (and (not (actions/has-item? entities :walkie-talkies))
|
|
(actions/has-obtained? entities :walkie-talkies))
|
|
(assoc-in entities [:room :entities :walkie-talkies]
|
|
(get-in entities [:room :walkie-talkies]))
|
|
entities)
|
|
|
|
(if (and (not (actions/has-obtained? entities :money))
|
|
(get-in entities [:state :has-dropped-coin?]))
|
|
(do (update-in entities [:room :entities :coin-flip] assoc :x 185 :y 44 :opacity 1.0))
|
|
entities)
|
|
(if (actions/has-obtained? entities :money)
|
|
(update-in entities [:room :entities] dissoc :coin-flip)
|
|
entities)
|
|
(if (get-in entities [:state :bubba-gone?])
|
|
(update-in entities [:room :entities] dissoc :coin-flip :goon-2)
|
|
entities
|
|
)))
|
|
:start-pos [300 45])))
|