(ns advent.screens.credits (:require [play-clj.core :refer :all] [play-clj.ui :refer :all] [play-clj.utils :refer :all] [play-clj.g2d :refer :all] [clojure.pprint] [advent.pathfind] [advent.tween :as tween] [advent.zone :as zone] [advent.utils :as utils]) (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter] [com.badlogic.gdx.graphics.g2d TextureRegion] [com.badlogic.gdx.scenes.scene2d.utils Align] [com.badlogic.gdx.utils.viewport FitViewport] [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input InputMultiplexer InputProcessor Net Preferences Screen])) (defn center [e] (assoc e :x (- (/ 1280 2) (/ (or (:width e) (.getWidth (:object e))) 2)))) (def credit-messages [["\"Tick's Tales\" Created By" "Bryce Covert"] ["Artwork" "Bryce Covert"] ["Programming" "Bryce Covert"] ["Music" "Bryce Covert"] ["Sound Effects" "Bryce Covert"] ["Frog Legs" "Marya Yama"] ["Perspective Tutorials" "Jana Covert"] ["Motivational Tapes" "Eriq Chang"] ["In Loving Memory Of" "Took, son of Luke, son of Puke"]]) (defn get-role-style [entities opacity] (style :label (:font entities) (color 1.0 1.0 1.0 opacity))) (defn style-role [entities] (when-let [opacity (:opacity (:role entities))] (label! (:role entities) :set-style (get-role-style entities opacity)))) (defn get-person-style [entities opacity] (style :label (:font entities) (color 0.6 1.0 1.0 opacity))) (defn style-person [entities] (when-let [opacity (:opacity (:person entities))] (label! (:person entities) :set-style (get-person-style entities opacity)))) (defn chain-tweens [screen entities id] (let [fade-out (tween/tween [:fade id :out] (assoc screen :total-time (+ 4.0 (:total-time screen))) [id :opacity] 1.0 0.0 2.0 :finish #(dissoc % id)) pause (tween/tween [:fade id :pause] (assoc screen :total-time (+ 2.0 (:total-time screen))) [id :opacity] 1.0 1.0 2.0 :finish (fn [e] (assoc-in e [:tweens [:fade id :out]] fade-out))) fade-in (tween/tween [:fade id :in] screen [id :opacity] 0.0 1.0 2.0 :finish (fn [e] (assoc-in e [:tweens [:fade id :pause]] pause)))] fade-in)) (defn start-message-if-necessary [screen entities] (if (and (not (get-in entities [:role])) (= 0.0 (get-in entities [:fade :opacity]))) (let [[[next-role next-person] & remaining-messages] (:remaining-messages entities)] (if next-role (-> entities (assoc :role (center (assoc (label next-role (get-role-style entities 0.0) :set-alignment Align/center) :x 640 :y 480 ))) (assoc :person (center (assoc (label next-person (get-person-style entities 0.0) :set-alignment Align/center) :x 640 :y 440 ))) (assoc-in [:tweens [:fade :role :in]] (chain-tweens screen entities :role)) (assoc-in [:tweens [:fade :person :in]] (chain-tweens screen entities :person)) (assoc :remaining-messages remaining-messages)) entities)) entities)) (defscreen credits :on-show (fn [screen entities] (utils/setup-viewport screen 1280 960) (input! :set-cursor-image (utils/cursor "cursor.png" :main) 0 0) (let [font (bitmap-font "ego/font.fnt" )] {:font font :fade (assoc (utils/get-texture "black.png") :scale-x 80 :scale-y 80 :opacity 0.0 :origin-x 0 :origin-y 0) :remaining-messages credit-messages :the-end (assoc (utils/get-texture "the-end.png") :x 0 :y 0 :scale-x 4 :scale-y 4 :origin-x 0 :origin-y 0) :tweens {:fade-in (tween/tween :fade-in screen [:fade :opacity] 1.0 0.0 5.0 :ease tween/ease-out-cubic)}})) :on-render (fn [{:keys [^FitViewport viewport] :as screen} [entities]] (.apply viewport) (let [entities (utils/apply-tweens screen entities (:tweens entities)) entities (start-message-if-necessary screen entities)] (style-role entities) (style-person entities) (render! screen [(:the-end entities) (:role entities) (:person entities) (:fade entities)]) entities)) :on-touch-up (fn [screen [entities]] (set-screen! @(resolve 'advent.core/advent) @(resolve 'advent.screens.title/title-screen))) :on-resize (fn [{:keys [width height viewport]} entities] (.update viewport width height)))