(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 [[:dbh ["\"Tick's Tales\" Created By" "Bryce Covert"]] [:dbh ["Kiss for Courage" "Jana Covert"] ["Frog Legs" "Marya Yama"] ["Motivational Tapes" "Eriq Chang"]] [:pos ["CTO" "Richard Flores"] ["CEO" "Cesar Bittar"] ["General Manager" "Scott Steinburg"]] [:pos ["QA" "Dane Tippman" "Henri Hänninen" "David Goodin"] ["QA Lead" "Wayne Sung"] ["CCO" "Katie Hallahan"]] [:pos ["Public Relations Director" "Katie Hallahan"] ["Social Media Associate" "Wayne Sung"]] [:pos ["Website Design" "Michael Fortunato"]] [:pos ["Promotional Graphics and Design" "Michael Fortunato" "Elisa Pavinato"]] [:pos ["Promotional Video Editing" "Mikael Palsio"]] ]) (defn get-role-style [entities opacity] (style :label (:font entities) (color 1.0 1.0 1.0 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] (let [fade-out (tween/tween [:fade :out] (assoc screen :total-time (+ 4.0 (:total-time screen))) [:fade :opacity] 0.0 1.0 2.0 :finish (fn [e] (-> e (dissoc :credit-table) (assoc-in [:fade :opacity] 0.0)))) pause (tween/tween [:fade :pause] (assoc screen :total-time (+ 2.0 (:total-time screen))) [:fade :opacity] 0.0 0.0 2.0 :finish (fn [e] (assoc-in e [:tweens [:fade :out]] fade-out))) fade-in (tween/tween [:fade :in] screen [:fade :opacity] 1.0 0.0 2.0 :finish (fn [e] (assoc-in e [:tweens [:fade :pause]] pause)))] fade-in)) (def saved-took? (atom false)) (defn msg->table [ msg entities] (-> (table (reduce (fn [cols [role & persons]] :x 640 :y 480 (-> cols (conj [(table (reduce (fn [people-rows person-name] (-> people-rows (conj :row) (conj [(label person-name (get-person-style entities 1.0) :set-alignment Align/center :set-font-scale 0.25) :height 50]))) [[(label role (get-role-style entities 1.0) :set-alignment Align/center :set-font-scale 0.25) :height 50]] persons)) :top :width 350 :pad-right 30 :pad-left 30]))) [] msg)) (assoc :y 400 :width 1280 :height 200 :x 0 :z 8 :opacity 1.0))) (defn fade-logo-if-necessary [entities screen logo] (let [last-logo (:last-logo entities) fade-in (tween/tween :fade-logo-in (assoc screen :total-time (+ 0.5 (:total-time screen))) [logo :opacity] 0.0 1.0 0.5)] (if (not= logo last-logo) (assoc-in entities [:tweens :fade-logo-out] (tween/tween :fade-logo-out screen [last-logo :opacity] 1.0 0.0 0.5 :finish (fn [e] (assoc-in e [:tweens :fade-logo-in] fade-in)))) entities))) (defn start-message-if-necessary [screen entities] (if (and (not (get-in entities [:credit-table])) (= 0.0 (get-in entities [:fade :opacity]))) (let [[[logo & msg] & remaining-messages] (:remaining-messages entities)] (if msg (-> entities (fade-logo-if-necessary screen logo) (assoc :credit-table (msg->table msg entities)) (assoc-in [:tweens [:fade :in]] (chain-tweens screen entities)) (assoc :remaining-messages remaining-messages) (assoc :last-logo logo)) (do (set-screen! @(resolve 'advent.core/advent) @(resolve 'advent.screens.title/title-screen)) 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 :bg (assoc (utils/get-texture "black.png") :scale-x 80 :scale-y 80 :opacity 1.0 :origin-x 0 :origin-y 0) :fade (assoc (utils/get-texture "black.png") :scale-x 80 :scale-y 80 :opacity 0.0 :origin-x 0 :origin-y 0) :pos (assoc (utils/get-texture "pos.png") :x 640 :y 700 :scale-x 1 :scale-y 1 :origin-x 145 :origin-y 0 :z 1 :opacity 0.0) :dbh (assoc (utils/get-texture "dbh.png") :x 640 :y 500 :scale-x 0.5 :scale-y 0.5 :origin-x 640 :origin-y 0 :z 1 :opacity 0.0) :remaining-messages (cond (= @saved-took? :died) (conj credit-messages [nil ["In Loving Memory Of" "Took, son of Luke, son of Puke (1125 - 1151)"]]) (= @saved-took? :saved) (conj credit-messages [nil ["In Honor Of" "Took, son of Luke, son of Puke (1125 - present)"]]) :else (conj credit-messages [nil ["" ""]])) #_#_: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-key-up (fn [screen entities] (when (= (key-code :escape) (:key screen)) (utils/toggle-fullscreen!)) nil) :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)] (clear!) (render! screen [(:bg entities) (:credit-table entities) (:fade entities) (:dbh entities) (:pos 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)))