176 lines
12 KiB
Clojure
176 lines
12 KiB
Clojure
(ns advent.screens.rooms.space
|
|
(:require [advent.screens.rooms :as rooms]
|
|
[advent.screens.rooms.common :as common]
|
|
[advent.actions :as actions]
|
|
[advent.screens.items :as items]
|
|
[advent.utils :as utils]
|
|
[clojure.zip :as zip]
|
|
[clojure.set :as set]
|
|
[clojure.string :as str]
|
|
[play-clj.core :refer :all]
|
|
[play-clj.ui :refer :all]
|
|
[play-clj.utils :refer :all]
|
|
[play-clj.math :refer :all]
|
|
[play-clj.g2d :refer :all]))
|
|
|
|
(defn taunt [screen entities]
|
|
(when (and (not (get-in entities [:actions :script-running?]))
|
|
(get-in entities [:state :active?])
|
|
(not (get-in entities [:state :blergh-dead?])))
|
|
((actions/get-script entities (actions/do-dialogue entities :blergh (rand-nth ["Come on, little man! Try and hit me!"
|
|
"What's the matter? Cold feet?"
|
|
"Come here and fight me like man!"
|
|
"Your precious Georgia McGorgeous would be laughing if she saw you now."
|
|
"Pick up your weapon and fight!"]))) entities))
|
|
nil)
|
|
|
|
(defn start-swing-if-necessary [screen e]
|
|
(if (and (not= (:anim e) :swing)
|
|
(> (:x e) 190))
|
|
(actions/start-animation screen e :swing)
|
|
e))
|
|
|
|
(defn start-fade-if-necessary [e screen]
|
|
(if (and (nil? (get-in e [:tweens :flash]))
|
|
(< (get-in e [:room :entities :ego :y]) 100))
|
|
(assoc-in e [:tweens :flash] (utils/tween :flash screen [:white-fade :opacity] 0.0 1.0 0.5 :power 3.0))
|
|
e))
|
|
|
|
(defn swing-at-blergh [entities]
|
|
(let [jump-path (bezier (map #(apply vector-2* %) [[15 45] [110 145] [195 180]]))
|
|
swing-path (bezier (map #(apply vector-2* %) [[195 180] [205 45]]))
|
|
jump-dist (utils/dist 15 45 205 45)
|
|
speed 190.0
|
|
jump-duration (/ jump-dist speed)
|
|
swing-dist (utils/dist 195 180 205 45)
|
|
swing-duration (/ swing-dist (* speed 1.5))]
|
|
(actions/run-action entities
|
|
(begin [this screen entities]
|
|
(-> entities
|
|
(update-in [:room :entities :ego]
|
|
#(actions/start-animation screen % :jump))
|
|
(assoc-in [:tweens :jump-pos] (utils/tween :jump-pos screen [:room :entities :ego :move-pct] 0.0 1.0 jump-duration :power 2))))
|
|
|
|
(continue [this screen entities]
|
|
(let [v (vector-2 0 0)
|
|
a (bezier! jump-path :value-at v (get-in entities [:room :entities :ego :move-pct] 0.0))]
|
|
(update-in entities [:room :entities :ego] #(assoc % :x (vector-2! v :x) :y (vector-2! v :y)))))
|
|
|
|
(done? [this screen entities]
|
|
(= (get-in entities [:room :entities :ego :move-pct]) 1.0))
|
|
|
|
(terminate [this screen entities]
|
|
(assoc-in entities [:room :entities :ego :move-pct] 0.0))
|
|
(can-skip? [this screen entities]
|
|
false))
|
|
|
|
(actions/run-action entities
|
|
(begin [this screen entities]
|
|
|
|
(-> entities
|
|
(update-in [:room :entities :ego]
|
|
#(actions/start-animation screen % :swing))
|
|
(assoc-in [:tweens :swing-pos] (utils/tween :swing-pos screen [:room :entities :ego :move-pct] 0.0 1.0 swing-duration :power 10))))
|
|
|
|
(continue [this screen entities]
|
|
(let [v (vector-2 0 0)
|
|
a (bezier! swing-path :value-at v (get-in entities [:room :entities :ego :move-pct] 0.0))]
|
|
(-> entities
|
|
(start-fade-if-necessary screen)
|
|
(update-in [:room :entities :ego] #(assoc % :x (vector-2! v :x) :y (vector-2! v :y))))))
|
|
|
|
(done? [this screen entities]
|
|
(= (get-in entities [:room :entities :ego :move-pct]) 1.0))
|
|
|
|
(terminate [this screen entities]
|
|
(-> entities
|
|
(assoc-in [:room :entities :ego :move-pct] 0.0)
|
|
(update-in [:room :entities :ego] #(actions/start-animation screen % :pant))))
|
|
(can-skip? [this screen entities]
|
|
|
|
false))
|
|
(actions/run-action entities
|
|
(begin [this screen entities]
|
|
(assoc-in entities [:tweens :flash] (utils/tween :flash screen [:white-fade :opacity] 1.0 0.0 3.0 :power 2.0)))
|
|
|
|
(continue [this screen entities]
|
|
entities)
|
|
|
|
(done? [this screen entities]
|
|
(nil? (get-in entities [:tweens :flash])))
|
|
|
|
(terminate [this screen entities]
|
|
entities)
|
|
(can-skip? [this screen entities]
|
|
false))))
|
|
|
|
|
|
|
|
(defn make [screen]
|
|
(let [blergh-stand (texture "space/blergh-stand.png")
|
|
blergh-talk (texture "space/blergh-talk.png")
|
|
blergh-flex (texture "space/blergh-flex.png")
|
|
blergh-talk-anim (animation 0.3 [blergh-talk blergh-stand])
|
|
blergh-stand-anim (animation 0.7 [blergh-flex blergh-stand])
|
|
blergh-swing (utils/make-anim "space/blergh-swing.png" [106 165] 0.1 [0 0 1 2 3 4 ])
|
|
blergh-appear (utils/make-anim "space/blergh-appear.png" [106 165] 0.05 (flatten [(range 13) 12 12 12 12 12 12 12 12 12 12 12 12 12 ]))
|
|
blergh-grow (utils/make-anim "space/blergh-grow.png" [106 165] 0.10 [0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 5 6 7 8 9 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11])
|
|
bullet (utils/make-anim "space/bullet.png" [24 24] 0.0075 [0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 3 3 3 4 4 5 5 6 5 4 7])]
|
|
(rooms/make :music :town-1
|
|
:interactions
|
|
{}
|
|
:layers [(assoc (texture "space/background.png") :x 0 :y 0 :baseline 0)]
|
|
:timers {:taunt [10.0 8.0 taunt]}
|
|
:blergh (rooms/make-entity :blergh (assoc (animation->texture screen blergh-appear)
|
|
:x 180 :y 50 :baseline 190
|
|
:stand blergh-stand-anim :talk blergh-talk-anim
|
|
:swing blergh-swing
|
|
:appear blergh-appear
|
|
:grow blergh-grow
|
|
:talk-color (color 0.95 0.4 0.2 1.0)
|
|
:script (actions/get-script entities (actions/do-dialogue entities :blergh "Come on! Try and hit me!"))
|
|
:scripts {:sword (actions/get-script entities
|
|
#_(actions/walk-straight-to entities :ego [205 45] :anim :jump :stop? false :speed 3.0)
|
|
(swing-at-blergh entities)
|
|
#_(actions/play-animation entities :ego :swing)
|
|
(actions/do-dialogue entities :blergh "Ha ha ha! Is that the best you can do?"
|
|
:blergh "Take this!")
|
|
(actions/play-animation entities :blergh :swing)
|
|
(actions/walk-straight-to entities :ego [100 45] :anim :squat :override-dir :right :speed 3.0)
|
|
(actions/do-dialogue entities :ego "Ouch!"
|
|
:blergh "My turn.")
|
|
|
|
#_(common/go-to-jail entities)
|
|
#_(actions/do-dialogue entities :ego "Hey!"
|
|
:ego "What's going on? I was just about to teach Blergh a lesson!"))
|
|
:magic-slingshot (actions/get-script entities
|
|
(actions/do-dialogue entities
|
|
:ego "Hey Blergh!"
|
|
:ego "Take this!")
|
|
(actions/play-animation entities :ego :shoot)
|
|
(actions/add-entity entities :bullet (get-in @entities [:room :bullet]))
|
|
(actions/walk-straight-to entities :bullet [213 166] :update-baseline? false :speed 5.0)
|
|
(actions/add-entity entities :broken-jewel (get-in @entities [:room :broken-jewel]))
|
|
(Thread/sleep 500)
|
|
(actions/remove-entity entities :bullet)
|
|
(actions/update-state entities #(assoc % :broke-jewel? true))
|
|
(actions/do-dialogue entities
|
|
:blergh "Argh! My magic lightning helmet!"
|
|
:blergh "No matter. I will destroy you with my bare hands!"))}))
|
|
:entities {}
|
|
:bullet (assoc (animation->texture screen bullet)
|
|
:x 130 :y 85 :baseline 241
|
|
:walk bullet)
|
|
:broken-jewel (assoc (texture "space/broken-jewel.png")
|
|
:x 222 :y 172 :baseline 240)
|
|
:collision "space/collision.png"
|
|
:scale-fn (constantly 1.5)
|
|
:start-pos [140 55]
|
|
:apply-state (fn [e]
|
|
(as-> e e
|
|
(if (get-in e [:state :broke-jewel?])
|
|
(assoc-in e [:room :entities :broken-jewel] (get-in e [:room :entities :broken-jewel]))
|
|
e)
|
|
(assoc-in e [:room :entities :blergh] (get-in e [:room :blergh])))
|
|
))))
|