(ns advent.screens.rooms.common (:require [clojure.core.async :refer [chan]] [advent.screens.rooms :as rooms] [advent.actions :as actions] [advent.screens.items :as items] [advent.utils :as utils] [advent.pathfind] [advent.tween :as tween] [clojure.zip :as zip] [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 go-to-jail [entities] (actions/update-state entities #(assoc % :time :night)) (actions/update-state entities #(assoc % :chest-contents (concat (remove #{:key :ladder} (:inventory %)) (:chest-contents %)))) (actions/update-state entities #(assoc % :inventory [])) (actions/update-state entities #(assoc % :opened-bars? false)) (actions/transition-background entities :inside-jail [130 85])) (defn make-wizard [screen wizard-spec] (let [wizard-sheet (texture! (texture "wizard/talk.png") :split 20 46) wizard-stand (animation 0.2 (for [i (flatten [(repeat 10 0) 1])] (aget wizard-sheet 0 i))) wizard-disappear (utils/make-anim "wizard/disappear.png" [20 46] 0.075 (range 19)) wizard-talk (animation 0.2 (for [i [0 2 0 2 1 2 0 3 0 2 0 1 0 2]] (aget wizard-sheet 0 i)))] (actions/start-animation screen (merge (assoc (animation->texture screen wizard-stand) :left {:talk (utils/flip wizard-talk) :stand (utils/flip wizard-stand) :disappear (utils/flip wizard-disappear) } :right {:talk wizard-talk :stand wizard-stand :disappear wizard-disappear } :night-profile :sprite :origin-x 0 :origin-y 0 :talk-color (color 0.95 0.3 1.0 1.0) :facing :left) wizard-spec) :stand))) (defn read-note-1 [entities] (actions/do-dialogue entities :ego "It's a note from Gandarf! It says:" :ego "'Boy, I have been kidnapped by Bloodclot.'" :ego "'He's got me locked up in his fortress of doom.'" :ego "'It's actually pretty comfortable, despite the name.'" :ego "'You must cast the spell to restore magic to the Slinger's Shot yourself.'" :ego "'You still do have The Slinger's Shot, don't you?'" :ego "'I will do my best to help you along the way.'" :ego "'You will need to add to your flask the ashes of magic, and the sound of buzzing.'" :ego "'Then stir with the gift of flight.'" :ego "'Then pour the contents in the cauldron.'" :ego "'I will give you more instructions when I can.'" :ego "'And please hurry, because we're being forced into a karaoke competition.'" :ego "'I'm about at my witt's end.'" :ego "'P.S., Guard that slingshot with your life!'" :ego "'P.P.S., If anything goes wrong, you can look for my secret stash of helpful stuff behind a nearby r...'" :ego "It just cuts off there.")) (defn read-note-2 [entities] (actions/do-dialogue entities :ego "It's a Bingo card." :ego "Look's like there's a note on the back." :ego "'Boy, the situation is dire. I don't have much time. Please hurry.'" :ego "'We've been forced into playing bingo for the last 3 hours.'" :ego "'You are almost done with the spell to restore magic to The Slinger's Shot.'" :ego "'You haven't lost it, right?'" :ego "'You need to add the root of all evil to the cauldron.'" :ego "'Also, you'll need to add a split second.'" :ego "'Then, dip the Slinger's Shot in to complete the spell.'" :ego "'Don't forget about my secret stash of helpful stuff.'")) (defn listen-1 [entities] (actions/talk entities :ego "Did you see the look on Tick's face when we took his stuff?" :animate? false :stop? false) (actions/talk entities :ego "It looked like he was about to pee his pants." :animate? false :stop? false) (actions/talk entities :ego "Am I right boys?" :animate? false :stop? false)) (defn listen-2 [entities] (actions/talk entities :ego "Hey Bubba, did you put our spoils in our secret stash yet?" :animate? false :stop? false) (actions/talk entities :ego "You don't remember where it's at?" :animate? false :stop? false) (actions/talk entities :ego "It's right outside the jail." :animate? false :stop? false) (actions/talk entities :ego "You just have to pull the secret lever." :animate? false :stop? false) (actions/update-state entities #(assoc % :knows-about-stash? true :stop? false))) (defn listen-3 [entities] (actions/talk entities :ego "We're going to be rich after we fence this stuff we've stolen." :animate? false :stop? false) (actions/talk entities :ego "Am I right boys?" :animate? false :stop? false)) (defn listen-to-frankie [entities] ((rand-nth [listen-1 listen-2 listen-3]) entities)) (defn explode [entities] (actions/run-action entities (begin [this screen entities] (-> entities (update-in [:room :entities :bloodclot] #(actions/start-animation screen % :explode)) (update-in [:room :entities] dissoc :bloodclot-head) (assoc-in [:room :entities :ego :facing] :right) (update-in [:room :entities :ego] #(actions/start-animation screen % :crawl)))) (continue [this screen entities] (if (= 170 (get-in entities [:room :entities :bloodclot :current-frame-index])) (particle-effect! (get-in entities [:room :entities :grow-explode]) :start)) (let [move-speed (* 0.17 (/ (:delta-time screen) (/ 1.0 60.0))) entities (update-in entities [:room :entities :ego :x] #(max 80 (- % move-speed)))] (if (= 80 (get-in entities [:room :entities :ego :x])) (update-in entities [:room :entities :ego] #(actions/start-animation screen % :crawl-hide)) entities ))) (done? [this screen entities] (= (get-in entities [:room :entities :bloodclot :current-frame-index]) 176)) (terminate [this screen entities] (-> entities (update-in [:room :entities] dissoc :bloodclot) (assoc-in [:tweens :flash] (tween/tween :flash screen [:white-fade :opacity] 0.0 1.0 0.2 :ease tween/ease-in-cubic)))) (can-skip? [this screen entities] false)) (actions/run-action entities (begin [this screen entities] entities) (continue [this screen entities] entities) (done? [this screen entities] (not (get-in entities [:tweens :flash]))) (terminate [this screen entities] entities) (can-skip? [this screen entities] false)) (actions/run-action entities (begin [this screen entities] (assoc-in entities [:tweens :flash] (tween/tween :flash screen [:white-fade :opacity] 1.0 0.0 4.0 :ease tween/ease-in-cubic))) (continue [this screen entities] entities) (done? [this screen entities] (not (get-in entities [:tweens :flash]))) (terminate [this screen entities] (update-in entities [:room :entities :ego] dissoc :stand-override)) (can-skip? [this screen entities] false))) (defn win [] (actions/get-script entities (actions/do-dialogue entities :ego "Hey Bloodclot!" :ego "I have this potion which will make me as strong as you!" :bloodclot-head "What?!" :bloodclot-head "Give it here!") (actions/transition-background entities :space [200 45] :between (fn [s e] (-> e (assoc-in [:room :entities :ego :stand-override] :crawl-stand) (update-in [:room :entities :ego] #(actions/start-animation s % :crawl-stand))) )) (actions/do-dialogue entities :bloodclot-head "Yes!" :bloodclot-head "Ultimate power is mine!" :bloodclot-head "If I drink this entire bottle, I'll be as powerful as a god!") (explode entities) (actions/play-animation entities :ego :standup) (Thread/sleep 15000) ))