good progress on fight experience.

This commit is contained in:
Bryce Covert
2018-01-11 21:18:29 -08:00
parent 994669b132
commit 3ac732b172
61 changed files with 985 additions and 351 deletions

View File

@@ -0,0 +1,257 @@
(ns advent.screens.rooms.tongue-fight
(:require [advent.screens.rooms :as rooms]
[advent.screens.rooms.common :as common]
[advent.screens.rooms.held :as held]
[advent.saves :as saves]
[advent.actions :as actions]
[advent.screens.items :as items]
[advent.utils :as utils]
[advent.tween :as tween]
[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]))
(println "loading " *ns*)
(defn cause-damage [entities is-player-wound?]
(if is-player-wound?
(update-in entities [:room :ego-hearts] dec)
(update-in entities [:room :tongue-hearts] dec)))
(defn show-heart [entities screen is-player-wound?]
(let [[x y] (if is-player-wound?
[256 163]
[146 185])]
(-> entities
(update-in [:room :entities :heart] #(assoc % :opacity 1 :x x :y y))
(assoc-in [:tweens :heart-y] (tween/tween :heart-y screen [:room :entities :heart :y] y (+ y 10) 0.5 :ease tween/ease-out-cubic))
(assoc-in [:tweens :heart-opacity] (tween/tween :heart-opacity screen [:room :entities :heart :opacity] 1.0 0.0 0.5 :ease tween/ease-in-cubic))
(cause-damage is-player-wound?))))
(defn stop-swing-if-necessary [screen {{{{:keys [anim anim-start] {:keys [tongue-swing]} :left } :ego} :entities} :room :as entities}]
(if (and (= tongue-swing anim)
(animation! anim
:is-animation-finished
(- (:total-time screen) anim-start)))
(update-in entities [:room :entities :ego] #(actions/start-animation screen % :tongue-idle))
entities))
(defn trigger-tongue [screen {{{
{:keys [state started anim anim-start]} :tongue
{ego-anim :anim {ego-windup :tongue-windup} :left } :ego
} :entities
:keys [ego-hearts tongue-hearts]} :room
:as entities}]
(let [time-in-state (- (:total-time screen) (or started (:total-time screen)))
is-player-wound? (= ego-anim ego-windup)
entities (stop-swing-if-necessary screen entities)]
(cond
(and (not (get-in entities [:fg-actions :script-running?]))
(get-in entities [:state :active?])
(= 0 ego-hearts))
(do
((actions/get-script entities
(actions/transition-background entities :held [113 120])
(Thread/sleep 10000))
entities)
entities)
(and (not (get-in entities [:fg-actions :script-running?]))
(get-in entities [:state :active?])
(= 0 tongue-hearts))
(do
((actions/get-script entities
(actions/transition-background entities :cat-tree [113 120])
(Thread/sleep 10000))
entities)
entities)
(and
(= state :attack)
(animation! anim
:is-animation-finished
(- (:total-time screen) anim-start)))
(-> entities
(update-in [:room :entities :tongue] #(actions/start-animation screen % :idle))
(update-in [:room :entities :tongue] assoc :state :idle :started (:total-time screen)))
(and
(= state :windup)
(animation! anim
:is-animation-finished
(- (:total-time screen) anim-start)))
(-> entities
(update-in [:room :entities :tongue] #(actions/start-animation screen % :attack))
(update-in [:room :entities :tongue] assoc :state :attack :started (:total-time screen))
(update-in [:room :entities :ego] #(if is-player-wound?
(actions/start-animation screen % :tongue-swing)
%))
(show-heart screen is-player-wound?))
;; reset timer if you wind up while the tongue is idle
(and (= state :idle)
is-player-wound?)
(assoc-in entities [:room :entities :tongue :started] (:total-time screen))
(and (= state :idle)
(= 1 (rand-int (* 60 3)))
(> time-in-state 3.0)
(not is-player-wound?))
(-> entities
(update-in [:room :entities :tongue] #(actions/start-animation screen % :windup))
(update-in [:room :entities :tongue] assoc :state :windup :started (:total-time screen)))
(not started)
(assoc-in entities [:room :entities :tongue :started] (:total-time screen))
:else
entities
)))
(defn make [screen atlas global-atlas]
(let [hair-0 (utils/make-anim-seq atlas "hair-0" [7 8] 0.12 (range 4))
hair-1 (utils/make-anim-seq atlas "hair-1" [23 16] 0.13 [0 1 2 1])
hair-2 (utils/make-anim-seq atlas "hair-2" [47 66] 0.15 [0 1 2 1])
hair-3 (utils/make-anim-seq atlas "hair-3" [7 8] 0.12 [0 1 2 1])
hair-4 (utils/make-anim-seq atlas "hair-4" [12 28] 0.12 [0 1 2 1])
hair-5 (utils/make-anim-seq atlas "hair-5" [8 10] 0.12 [0 1 2 1])
hair-6 (utils/make-anim-seq atlas "hair-6" [4 6] 0.16 [0 1 2 1])
hair-7 (utils/make-anim-seq atlas "hair-7" [5 7] 0.16 [0 1 2 1])
hair-8 (utils/make-anim-seq atlas "hair-8" [6 6] 0.16 [0 1 2 1])
hair-9 (utils/make-anim-seq atlas "hair-9" [12 18] 0.16 [0 1 2 1])
heart (utils/make-anim-seq atlas "heart" [32 32] 0.16 [0])
tongue-idle (utils/make-anim-seq atlas "tongue-idle/tongue-idle" [135 145] 0.16 (range 5))
tongue-windup (utils/make-anim-seq atlas "tongue-idle/tongue-idle" [135 145] 0.16 [0 0 0 0 0])
tongue-attack (utils/make-anim-seq atlas "tongue-idle/tongue-idle" [135 145] 0.16 [1 1 1 1])]
(rooms/make :name "Tongue Fight"
:interactions {}
:layers [(assoc (utils/atlas->texture atlas "background") :x 0 :y 0 :baseline 0 :scale-x 1 :scale-y 1)]
:update-fn trigger-tongue
:ego-hearts 5
:tongue-hearts 5
:entities {:hair-0 (assoc (animation->texture screen hair-0)
:x 35
:y 46
:width 6
:height 7
:baseline 1
:anim hair-0
:anim-start 0)
:hair-1 (assoc (animation->texture screen hair-1)
:x 113
:y 176
:width 23
:height 16
:baseline 1
:anim hair-1
:anim-start 0)
:hair-2 (assoc (animation->texture screen hair-2)
:x 243
:y 104
:width 47
:height 66
:baseline 1
:anim hair-2
:anim-start 0)
:hair-3 (assoc (animation->texture screen hair-3)
:x 121
:y 222
:width 7
:height 8
:baseline 1
:anim hair-3
:anim-start 0)
:hair-4 (assoc (animation->texture screen hair-4)
:x 71
:y 6
:width 12
:height 28
:baseline 1
:anim hair-4
:anim-start 0)
:hair-5 (assoc (animation->texture screen hair-5)
:x 100
:y 12
:width 8
:height 10
:baseline 1
:anim hair-5
:anim-start 0)
:hair-6 (assoc (animation->texture screen hair-6)
:x 113
:y 38
:width 4
:height 6
:baseline 1
:anim hair-6
:anim-start 0)
:hair-7 (assoc (animation->texture screen hair-7)
:x 125
:y 21
:width 5
:height 7
:baseline 1
:anim hair-7
:anim-start 0)
:hair-8 (assoc (animation->texture screen hair-8)
:x 145
:y 6
:width 6
:height 6
:baseline 1
:anim hair-8
:anim-start 0)
:hair-9 (assoc (animation->texture screen hair-9)
:x 23
:y 29
:width 12
:height 18
:baseline 1
:anim hair-9
:anim-start 0)
:heart (assoc (animation->texture screen heart)
:x 23
:y 29
:width 32
:height 32
:baseline 320
:opacity 0
:anim heart
:anim-start 0)
:tongue (assoc (animation->texture screen tongue-idle)
:x 186
:y 65
:origin-x 23
:origin-y 10
:width 135
:height 145
:baseline 2
:anim tongue-idle
:windup tongue-windup
:idle tongue-idle
:attack tongue-attack
:anim-start 0
:state :idle
:script (actions/get-script
entities
(actions/play-animation entities :ego :tongue-windup)))}
:collision "space/collision.png"
:scale-fn (constantly 1.0)
:start-pos [141 110]
:apply-state (fn [screen e]
(-> e
(update-in [:room :entities :ego] #(actions/start-animation screen % :tongue-idle))
(assoc-in [:room :entities :ego :stand-override] :tongue-idle)
(assoc-in [:room :entities :ego :x] 141)
(assoc-in [:room :entities :ego :y] 110))))))