76 lines
4.6 KiB
Clojure
76 lines
4.6 KiB
Clojure
(ns advent.screens.rooms
|
|
(:require [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.utils.viewport FitViewport]
|
|
[com.badlogic.gdx.scenes.scene2d Actor Stage]
|
|
[java.lang Object]))
|
|
|
|
(defn make-entity [id {:keys [scripts script only-script] :as entity}]
|
|
(merge entity
|
|
{:id id
|
|
:mouse-in? (fn [entities x y]
|
|
(let [e (utils/get-entity entities id)]
|
|
(if-let [[bx1 by1 bx2 by2] (:box e)]
|
|
(zone/within bx1 by1 bx2 by2 x y)
|
|
(let [{^float entity-x :x ^float entity-y :y width :width scale-x :scale-x scale-y :scale-y origin-x :origin-x origin-y :origin-y height :height region :object} (-> entities :room :entities id)
|
|
|
|
width (or width (if (instance? TextureRegion region ) (.getRegionWidth ^TextureRegion region) 0))
|
|
height (or height (if (instance? TextureRegion region ) (.getRegionHeight ^TextureRegion region) 0))
|
|
entity-x (double (unchecked-add (float entity-x) (unchecked-multiply (float -1.0)
|
|
(unchecked-multiply (float (or origin-x 0))
|
|
(float (or scale-x 1))))))
|
|
entity-y (double (unchecked-add (float entity-y) (unchecked-multiply
|
|
(float -1.0)
|
|
(unchecked-multiply (float (or origin-y 0))
|
|
(float (or scale-y 1))))))]
|
|
|
|
(zone/within entity-x entity-y
|
|
(unchecked-add (float entity-x) (unchecked-multiply (float width) (float (or scale-x 1))))
|
|
(unchecked-add (float entity-y) (unchecked-multiply (float height) (float (or scale-y 1))))
|
|
x y)))))}
|
|
(when (or script scripts only-script)
|
|
{:get-script (fn [cursor [x y]]
|
|
(cond only-script
|
|
only-script
|
|
|
|
(= :main cursor)
|
|
script
|
|
|
|
scripts
|
|
(or (scripts (:value cursor)) (scripts :default))
|
|
|
|
:else
|
|
nil)
|
|
)})))
|
|
(defn make [& {:keys [collision interactions entities] :as params}]
|
|
(let [interactions-as-list (for [[id {:keys [script scripts only-script box] :as spec}] interactions]
|
|
(merge spec
|
|
(when box
|
|
{:mouse-in? (fn [_ x y]
|
|
(let [[bx1 by1 bx2 by2] box]
|
|
(zone/within bx1 by1 bx2 by2 x y)))})
|
|
(when (or script scripts only-script)
|
|
{:get-script (fn [cursor [x y]]
|
|
(cond only-script
|
|
only-script
|
|
|
|
(= :main cursor)
|
|
script
|
|
|
|
scripts
|
|
(or (scripts (:value cursor)) (scripts :default))
|
|
|
|
:else
|
|
nil)
|
|
)})
|
|
{:id id}))
|
|
entities (into {} (for [[id entity] entities]
|
|
[id (make-entity id entity)]))]
|
|
(merge params {:collision (advent.pathfind/map-from-resource collision)
|
|
:interactions interactions-as-list
|
|
:entities entities})))
|
|
|
|
|