Files
gitea-docker/desktop/src-common/advent/screens/rooms.clj

69 lines
3.6 KiB
Clojure

(ns advent.screens.rooms
(:require [advent.zone :as zone])
(: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]
(if-let [box (get-in entities [:room :entities id :box])]
((apply zone/box box) x y)
(let [{entity-x :x 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} (get-in 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 (- entity-x (* (or origin-x 0)
(or scale-x 1)))
entity-y (- entity-y (* (or origin-y 0)
(or scale-y 1)))]
((zone/box entity-x entity-y
(+ entity-x (* width (or scale-x 1)))
(+ entity-y (* height (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]
((apply zone/box box) 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})))