diff --git a/desktop/resources/inside-house/safe-1.ogg b/desktop/resources/inside-house/safe-1.ogg new file mode 100644 index 00000000..6a0e0cc9 Binary files /dev/null and b/desktop/resources/inside-house/safe-1.ogg differ diff --git a/desktop/resources/inside-house/safe-2.ogg b/desktop/resources/inside-house/safe-2.ogg new file mode 100644 index 00000000..35d7ab80 Binary files /dev/null and b/desktop/resources/inside-house/safe-2.ogg differ diff --git a/desktop/resources/inside-house/safe-3.ogg b/desktop/resources/inside-house/safe-3.ogg new file mode 100644 index 00000000..6b60da5e Binary files /dev/null and b/desktop/resources/inside-house/safe-3.ogg differ diff --git a/desktop/resources/inside-house/safe-4.ogg b/desktop/resources/inside-house/safe-4.ogg new file mode 100644 index 00000000..e95881bf Binary files /dev/null and b/desktop/resources/inside-house/safe-4.ogg differ diff --git a/desktop/resources/inside-house/safe-5.ogg b/desktop/resources/inside-house/safe-5.ogg new file mode 100644 index 00000000..1e9ea653 Binary files /dev/null and b/desktop/resources/inside-house/safe-5.ogg differ diff --git a/desktop/resources/inside-house/safe-screen.png b/desktop/resources/inside-house/safe-screen.png new file mode 100644 index 00000000..f7a43f0c Binary files /dev/null and b/desktop/resources/inside-house/safe-screen.png differ diff --git a/desktop/src-common/advent/screens/safe.clj b/desktop/src-common/advent/screens/safe.clj new file mode 100644 index 00000000..c8729603 --- /dev/null +++ b/desktop/src-common/advent/screens/safe.clj @@ -0,0 +1,96 @@ +(ns advent.screens.safe + (: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.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 Application Audio Files Game Gdx Graphics Input + InputMultiplexer InputProcessor Net Preferences Screen])) + + +(def start-x 60) +(def start-y 83) + +(defn close [entities] + (screen! @(resolve 'advent.screens.scene/scene) :on-reactivate) + (-> entities + (assoc :shown? false) + (assoc :start-showing? false))) + +(defn button-box [x y] + (zone/box (+ start-x x) (+ start-y y) (+ start-x x 16) (+ start-y y 16))) + +(defn get-button [[x y]] + (first (filter (fn [{:keys [in?] :as button}] + (when (in? x y) + button)) + [{:in? (button-box 9 17) :sound (sound "inside-house/safe-1.ogg") :id 1 } + {:in? (button-box 29 17) :sound (sound "inside-house/safe-2.ogg") :id 2} + {:in? (button-box 49 17) :sound (sound "inside-house/safe-3.ogg") :id 3} + {:in? (button-box 70 17) :sound (sound "inside-house/safe-4.ogg") :id 4} + {:in? (button-box 91 17) :sound (sound "inside-house/safe-5.ogg") :id 5}]))) + +(defscreen safe-screen + :on-show + (fn [screen entities] + (update! screen :renderer (stage) :camera (orthographic)) + {:fade (assoc (texture "black.png") + :scale-x 80 + :scale-y 80 + :opacity 0.7) + :safe (assoc (texture "inside-house/safe-screen.png") :x start-x :y start-y) + :start-showing? false + :shown? false}) + + :on-render + (fn [screen [entities]] + (let [entities (if (:start-showing? entities) + (-> entities + (assoc :start-showing? false) + (assoc :shown? true)) + entities)] + + (when (:shown? entities) + (render! screen [(:fade entities) (:safe entities)])) + entities)) + + :show-screen (fn [{:keys [success failure]} [entities]] + (assoc entities + :start-showing? true + :button-choices [] + :success success + :failure failure)) + + :on-mouse-moved (fn [screen [entities]] + entities) + + :on-touch-up (fn [screen [entities]] + (when (:shown? entities) + (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] + (if-let [button (get-button [x y])] + (do (sound! (:sound button) :play) + (let [new-state (update-in entities [:button-choices] #(conj % (:id button)))] + (cond (= [4 2 1 5 3] (:button-choices new-state)) + (do ((:success entities) (-> @(resolve 'advent.screens.scene/scene) + :entities + deref + first)) + (close entities)) + (= 5 (count (:button-choices new-state))) + (do ((:failure entities) (-> @(resolve 'advent.screens.scene/scene) + :entities + deref + first)) + (close entities)) + :else + new-state))) + (close entities))))) + + :on-resize (fn [screen entities] + (size! screen 320 240)))