diff --git a/desktop/in-jail.edn b/desktop/in-jail.edn index a1ff6dd6..bc005f39 100644 --- a/desktop/in-jail.edn +++ b/desktop/in-jail.edn @@ -1 +1 @@ -{:active? true, :convinced-wizard? true, :inventory [:ladder :flask-1 :grass :medal :kiss :trophy :flask-1-strength :sword ], :wizard-left? false, :clues #{}, :current-riddle :wool, :last-room :inside-jail, :wants-toy true, :mints-eaten 0, :object nil, :obtained-items #{:kiss :medal :sword :flask-1 :grass :ladder :trophy}} +{:active? true, :convinced-wizard? true, :inventory [] :chest-contents [:ladder :flask-1 :grass :medal :kiss :trophy :flask-1-strength :sword ], :wizard-left? false, :clues #{}, :current-riddle :wool, :last-room :inside-jail, :wants-toy true, :mints-eaten 0, :object nil, :obtained-items #{:kiss :medal :sword :flask-1 :grass :ladder :trophy}} diff --git a/desktop/resources/inside-jail/collision-free.png b/desktop/resources/inside-jail/collision-free.png index 5fb71cfe..a301c2db 100644 Binary files a/desktop/resources/inside-jail/collision-free.png and b/desktop/resources/inside-jail/collision-free.png differ diff --git a/desktop/src-common/advent/actions.clj b/desktop/src-common/advent/actions.clj index 27bac2d4..4b5dc291 100644 --- a/desktop/src-common/advent/actions.clj +++ b/desktop/src-common/advent/actions.clj @@ -113,6 +113,7 @@ (defn stop [screen entities target-id & {:keys [face]}] (update-in entities [:room :entities target-id] (comp #(start-animation screen % :stand) (if face #(assoc % :facing face) identity)))) + (defn walk-straight-to [entities target-id [final-x final-y] & {:keys [update-baseline? face speed anim override-dir]}] (let [{start-x :x start-y :y} (get-in @entities [:room :entities target-id]) final-x (int final-x) @@ -187,6 +188,18 @@ (terminate [this screen entities] entities) (can-skip? [this screen entities] false))) +(defn stop-walking [entities target-id & {:keys [face]}] + (run-action entities + (begin [this screen entities] + (stop screen entities target-id :face face)) + + (continue [this screen entities] entities) + + (done? [this screen entities] true) + + (terminate [this screen entities] entities) + (can-skip? [this screen entities] false))) + (defn walk-to [entities target-id [final-x final-y] & {:keys [can-skip? face]}] (let [{start-x :x start-y :y} (get-in @entities [:room :entities target-id]) final-x (int final-x) diff --git a/desktop/src-common/advent/screens/rooms/inside_jail.clj b/desktop/src-common/advent/screens/rooms/inside_jail.clj index 8ec11f5e..79e81b82 100644 --- a/desktop/src-common/advent/screens/rooms/inside_jail.clj +++ b/desktop/src-common/advent/screens/rooms/inside_jail.clj @@ -1,5 +1,6 @@ (ns advent.screens.rooms.inside-jail - (:require [advent.screens.rooms :as rooms] + (:require [clojure.core.async :refer [chan]] + [advent.screens.rooms :as rooms] [advent.actions :as actions] [advent.screens.items :as items] [advent.utils :as utils] @@ -30,6 +31,9 @@ (actions/do-dialogue entities :ego "Hey!" :ego "All my possessions are in here!") + (actions/update-state entities #(-> % + (assoc :inventory (concat (:inventory %) (:chest-contents %))) + (assoc :chest-contents []))) (when (not (actions/has-obtained? entities :rope)) (actions/do-dialogue entities :ego "Looks like there's some rope in here too."))) @@ -121,6 +125,11 @@ :ego "Maybe you should give it a rest."))) (actions/update-state entities #(assoc % :hay-searches (inc hay-searches))))) +(defn go-to-jail [entities] + (actions/update-state entities #(assoc % :chest-contents (remove #{:key} (:inventory %)))) + (actions/update-state entities #(assoc % :inventory [])) + (actions/update-state entities #(assoc % :opened-bars? false)) + (actions/transition-background entities :inside-jail [130 85])) (defn make [screen] @@ -152,10 +161,40 @@ :script (actions/get-script entities (search-hay entities))} :chest {:box [194 62 228 99] - :script (actions/get-script entities (touch-chest entities))}} + :script (actions/get-script entities (touch-chest entities))} + :door {:box [257 62 301 152] + :cursor :down + :script (actions/get-script entities + (if (get-in @entities [:state :opened-bars?]) + (do + (actions/walk-to entities :ego [279 57]) + (actions/transition-background entities :outside-jail [50 46] )) + (actions/talk entities :ego "Do you really think I can walk down those steps while I'm locked up?")))}} :layers [(assoc (texture "inside-jail/background.png") :x 0 :y 0 :baseline 0) (assoc (texture "inside-jail/bars.png") :x 0 :y 0 :baseline 165) (assoc (texture "inside-jail/glow.png") :x 0 :y 0 :baseline 240)] + :hotspots [{:box [121 40 258 44] + :fn (fn [screen entities] + + (let [is-walking? (#{(get-in entities [:room :entities :ego :left :walk]) + (get-in entities [:room :entities :ego :right :walk])} (get-in entities [:room :entities :ego :anim]))] + (if is-walking? + (let [entities (-> entities + (update-in [:actions] #(assoc % :channel (chan) :current nil :started? false)) + (update-in [:room :entities :ego] #(actions/start-animation screen % :stand)))] + ((actions/get-script entities + (actions/stop-walking entities :ego) + (actions/do-dialogue entities + :ego "*creak*" + :ego "Oops!" + :warden "Hey! What are you doing?" + :warden "Get back in jail.") + (go-to-jail entities) + (actions/do-dialogue entities :warden "Now don't let me catch you trying to escape again.") + (actions/play-animation entities :warden :fall-asleep :stop? false) + (actions/begin-animation entities :warden :sleep)) entities) + entities) + entities)))}] :entities {:warden (assoc (texture "inside-jail/warden.png" ) :x 40 :y 60 :baseline 166 :stand warden-stand @@ -192,7 +231,7 @@ :start-pos [130 85] :apply-state (fn [entities] (as-> entities entities - (if (actions/has-item? entities :ball-n-chain) + (if (actions/has-obtained? entities :ball-n-chain) (update-in entities [:room :entities] #(dissoc % :ball-n-chain)) entities) (if (get-in entities [:state :warden-sleeping?]) diff --git a/desktop/src-common/advent/screens/scene.clj b/desktop/src-common/advent/screens/scene.clj index 00b8021c..ee832cea 100644 --- a/desktop/src-common/advent/screens/scene.clj +++ b/desktop/src-common/advent/screens/scene.clj @@ -252,6 +252,13 @@ (assoc entities :actions {:channel channel :current current :started? false :script-running? (get-in entities [:actions :script-running?])})))) +(defn update-from-hotspots [screen entities] + (if-let [hot-spots (get-in entities [:room :hotspots])] + (if-let [hotspot-hit (first (filter #((apply zone/box (:box %)) (get-in entities [:room :entities :ego :x]) (get-in entities [:room :entities :ego :y])) hot-spots))] + ((:fn hotspot-hit) screen entities) + entities) + entities)) + (defn update-cursor [screen {{:keys [current override last]} :cursor :as entities}] (let [new-current (or override current)] (when-not (= new-current @@ -349,6 +356,7 @@ (clear!) (let [entities (update-cursor screen entities) entities (update-from-script screen entities) + entities (update-from-hotspots screen entities) entities (assoc-in entities [:room :entities :ego :last-frame] (get-in entities [:room :entities :ego :object])) entities (update-in entities [:room :entities] (fn [entities] (into entities