Merge branch 'master' of https://bitbucket.org/brycecovertoperations/advent
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 31 KiB |
BIN
desktop/resources/behindhouse/house-cover.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 13 KiB |
BIN
desktop/resources/behindhouse/stick.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 3.4 KiB |
BIN
desktop/resources/ego/cat-toy.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
desktop/resources/ego/cat-toy.pxa/0.pxi
Normal file
BIN
desktop/resources/ego/cat-toy.pxa/1.pxi
Normal file
BIN
desktop/resources/ego/cat-toy.pxa/2.pxi
Normal file
BIN
desktop/resources/ego/cat-toy.pxa/3.pxi
Normal file
BIN
desktop/resources/ego/cat-toy.pxa/4.pxi
Normal file
26
desktop/resources/ego/cat-toy.pxa/CelData.plist
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
</array>
|
||||
</plist>
|
||||
BIN
desktop/resources/ego/reach.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
desktop/resources/ego/reach.pxa/0.pxi
Normal file
BIN
desktop/resources/ego/reach.pxa/1.pxi
Normal file
BIN
desktop/resources/ego/reach.pxa/2.pxi
Normal file
BIN
desktop/resources/ego/reach.pxa/3.pxi
Normal file
22
desktop/resources/ego/reach.pxa/CelData.plist
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
</array>
|
||||
</plist>
|
||||
BIN
desktop/resources/ego/squat.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
desktop/resources/ego/squat.pxa/0.pxi
Normal file
BIN
desktop/resources/ego/squat.pxa/1.pxi
Normal file
BIN
desktop/resources/ego/squat.pxa/2.pxi
Normal file
BIN
desktop/resources/ego/squat.pxa/3.pxi
Normal file
22
desktop/resources/ego/squat.pxa/CelData.plist
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
</array>
|
||||
</plist>
|
||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 30 KiB |
BIN
desktop/resources/inside-castle/game-player-talk.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
desktop/resources/inside-castle/game-player-talk.pxa/0.pxi
Normal file
BIN
desktop/resources/inside-castle/game-player-talk.pxa/1.pxi
Normal file
BIN
desktop/resources/inside-castle/game-player-talk.pxa/2.pxi
Normal file
BIN
desktop/resources/inside-castle/game-player-talk.pxa/3.pxi
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>duration</key>
|
||||
<real>1</real>
|
||||
</dict>
|
||||
</array>
|
||||
</plist>
|
||||
BIN
desktop/resources/inside-castle/gameplayer.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
desktop/resources/inside-castle/gameplayer.pxi
Normal file
BIN
desktop/resources/inside-castle/player.pxi
Normal file
BIN
desktop/resources/inside-fangald.mp3
Normal file
BIN
desktop/resources/inside-fangald.ogg
Normal file
BIN
desktop/resources/megaboss.mp3
Normal file
BIN
desktop/resources/outside-castle/steer.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
desktop/resources/outside-castle/steer.pxi
Normal file
BIN
desktop/resources/town-music-1.ogg
Normal file
BIN
desktop/resources/town-music-2.mp3
Normal file
BIN
desktop/resources/town-music-2.ogg
Normal file
BIN
desktop/resources/town-music.ogg
Normal file
@@ -23,6 +23,8 @@
|
||||
(can-skip? [this screen entities])
|
||||
(get-channel [this]))
|
||||
|
||||
(defn has-item? [entities item]
|
||||
((set (get-in entities [:state :inventory])) item))
|
||||
|
||||
(defmacro get-script [entities & forms]
|
||||
`(fn [starting-entities#]
|
||||
@@ -36,22 +38,25 @@
|
||||
:y y
|
||||
:baseline (- 240 y))]
|
||||
(if (:scaled entity)
|
||||
(assoc entity :scale-x (scale-fn y) :scale-y (scale-fn y))
|
||||
(assoc entity :scale-x (scale-fn [x y]) :scale-y (scale-fn [x y]))
|
||||
entity)))
|
||||
|
||||
(defn find-animation [entity anim]
|
||||
(if (keyword? anim)
|
||||
(or (get-in entity [(:facing entity) anim])
|
||||
(anim entity))
|
||||
anim))
|
||||
|
||||
(defn start-animation [screen entity anim]
|
||||
(let [new-anim (if (keyword? anim)
|
||||
(or (get-in entity [(:facing entity) anim])
|
||||
(anim entity))
|
||||
anim)]
|
||||
(let [new-anim (find-animation entity anim)]
|
||||
(if (and anim (not= new-anim (:anim entity)))
|
||||
(assoc entity
|
||||
:anim new-anim
|
||||
:anim-start (:total-time screen))
|
||||
entity)))
|
||||
|
||||
(defn stop [screen entities target-id]
|
||||
(update-in entities [:room :entities target-id] #(start-animation screen % :stand)))
|
||||
(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))))
|
||||
|
||||
|
||||
(defmacro run-action [entities & forms]
|
||||
@@ -105,7 +110,36 @@
|
||||
(can-skip? [this screen entities]
|
||||
false))))
|
||||
|
||||
(defn walk-to [entities target-id [final-x final-y] & [can-skip?]]
|
||||
(defn play-animation [entities target-id anim]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
(update-in entities [:room :entities target-id] #(start-animation screen % anim) ))
|
||||
|
||||
(continue [this screen entities] entities)
|
||||
|
||||
(done? [this screen entities]
|
||||
(animation! (find-animation (get-in entities [:room :entities target-id ]) anim)
|
||||
:is-animation-finished
|
||||
(- (:total-time screen) (get-in entities [:room :entities target-id :anim-start]))))
|
||||
|
||||
(terminate [this screen entities]
|
||||
(stop screen entities target-id))
|
||||
(can-skip? [this screen entities]
|
||||
false)))
|
||||
|
||||
(defn update-entity [entities target-id f]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
(update-in entities [:room :entities target-id] f))
|
||||
|
||||
(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)
|
||||
final-y (int final-y)
|
||||
@@ -154,7 +188,7 @@
|
||||
(< (utils/dist final-x final-y from-x from-y) 1)))
|
||||
|
||||
(terminate [this screen entities]
|
||||
(stop screen entities target-id))
|
||||
(stop screen entities target-id :face face))
|
||||
(can-skip? [this screen entities]
|
||||
(or can-skip? false)))
|
||||
@entities)))
|
||||
@@ -169,10 +203,11 @@
|
||||
(begin [this screen entities]
|
||||
(let [_ (swap! initial-time #(or % (:total-time screen)))
|
||||
target-y (get-in entities [:room :entities target-id :y])
|
||||
target-x (get-in entities [:room :entities target-id :x])
|
||||
scale-fn (get-in entities [:room :scale-fn])
|
||||
scale (scale-fn target-y)
|
||||
scale (scale-fn [target-x target-y])
|
||||
height (* scale 36)]
|
||||
(run! dialogue/talking-screen :on-talk :text text
|
||||
(screen! dialogue/talking-screen :on-talk :text text
|
||||
:x (get-in entities [:room :entities target-id :x]) :y (+ (get-in entities [:room :entities target-id :y]) height)
|
||||
:target-id target-id
|
||||
:scale scale)
|
||||
@@ -186,7 +221,7 @@
|
||||
(get-text-duration text)))
|
||||
|
||||
(terminate [this screen entities]
|
||||
(run! dialogue/talking-screen :stop-talk :target-id target-id)
|
||||
(screen! dialogue/talking-screen :stop-talk :target-id target-id)
|
||||
(if stop?
|
||||
(stop screen entities target-id)
|
||||
entities))
|
||||
@@ -207,17 +242,17 @@
|
||||
(recur (inc so-far) (zip/right zipper)))))
|
||||
|
||||
(defn make-zipper [tree]
|
||||
(zip/zipper map? (comp #(map second %) #(partition 2 %) :choices) (fn [n c] nil) tree))
|
||||
(zip/zipper map? (comp #(map second %) #(filter first (partition 2 %)) :choices) (fn [n c] nil) tree))
|
||||
|
||||
(defn present-choices [entities choices]
|
||||
(loop [zipper (make-zipper choices)]
|
||||
(let [selected-index (atom nil)
|
||||
node (zip/node zipper)
|
||||
dialogue-choices (partition 2 (:choices node))]
|
||||
dialogue-choices (filter first (partition 2 (:choices node)))]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
(run! dialogue/choice-screen :on-present-choices :choices dialogue-choices :callback #(reset! selected-index %))
|
||||
(run! @(resolve 'advent.screens.scene/scene) :on-deactivate)
|
||||
(screen! dialogue/choice-screen :on-present-choices :choices dialogue-choices :callback #(reset! selected-index %))
|
||||
(screen! @(resolve 'advent.screens.scene/scene) :on-deactivate)
|
||||
entities)
|
||||
|
||||
(continue [this screen entities] entities)
|
||||
@@ -225,7 +260,7 @@
|
||||
(done? [this screen entities] (not (nil? @selected-index)))
|
||||
|
||||
(terminate [this screen entities]
|
||||
(run! @(resolve 'advent.screens.scene/scene) :on-reactivate)
|
||||
(screen! @(resolve 'advent.screens.scene/scene) :on-reactivate)
|
||||
entities)
|
||||
(can-skip? [this screen entities]
|
||||
false))
|
||||
@@ -252,6 +287,22 @@
|
||||
(can-skip? [this screen entities]
|
||||
false)))
|
||||
|
||||
(defn remove-item [entities item]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
(-> entities
|
||||
(update-in [:state :inventory] #(remove (partial = item) %))
|
||||
(assoc-in [:cursor :current] :main)))
|
||||
|
||||
(continue [this screen entities] entities)
|
||||
|
||||
(done? [this screen entities] true)
|
||||
|
||||
(terminate [this screen entities]
|
||||
entities)
|
||||
(can-skip? [this screen entities]
|
||||
false)))
|
||||
|
||||
(defn give [entities item]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
@@ -259,7 +310,7 @@
|
||||
|
||||
(-> entities
|
||||
(update-in [:state :inventory] #(conj % item))
|
||||
(assoc-in [:cursor :current] item)))
|
||||
(assoc-in [:cursor :current] (:cursor item))))
|
||||
|
||||
(continue [this screen entities] entities)
|
||||
|
||||
@@ -285,47 +336,63 @@
|
||||
false)))
|
||||
|
||||
(defn transition-background [entities new-background [x y]]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
|
||||
(-> entities
|
||||
(assoc-in [:transition]
|
||||
(assoc (texture "black.png")
|
||||
:scale-x 20
|
||||
:scale-y 20
|
||||
:baseline 9500
|
||||
:opacity 0.1))))
|
||||
|
||||
(continue [this screen entities]
|
||||
(update-in entities [:transition :opacity] + 0.075))
|
||||
|
||||
(done? [this screen entities]
|
||||
(>= (get-in entities [:transition :opacity]) 1.0))
|
||||
|
||||
(terminate [this screen entities]
|
||||
entities)
|
||||
(can-skip? [this screen entities]
|
||||
false))
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
(let [ego (get-in entities [:room :entities :ego])
|
||||
entities (-> entities
|
||||
(assoc-in [:room] (get-in entities [:rooms new-background]))
|
||||
(assoc-in [:room :entities :ego] ego))]
|
||||
(let [old-music (get-in @entities [:room :music])
|
||||
new-music (get-in @entities [:rooms new-background :music])
|
||||
music-changed? (not= old-music new-music)]
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
|
||||
(-> entities
|
||||
(update-in [:room :entities :ego] #(jump-to screen entities % [x y])))))
|
||||
(assoc-in [:transition]
|
||||
(assoc (texture "black.png")
|
||||
:scale-x 20
|
||||
:scale-y 20
|
||||
:baseline 9500
|
||||
:opacity 0.1))))
|
||||
|
||||
(continue [this screen entities]
|
||||
(update-in entities [:transition :opacity] - 0.075))
|
||||
(continue [this screen entities]
|
||||
(when music-changed?
|
||||
(music! (get-in entities [:musics old-music]) :set-volume (max (- 1.0 (get-in entities [:transition :opacity])) 0.0)))
|
||||
(update-in entities [:transition :opacity] + 0.05))
|
||||
|
||||
(done? [this screen entities]
|
||||
(<= (get-in entities [:transition :opacity]) 0.0))
|
||||
(done? [this screen entities]
|
||||
(>= (get-in entities [:transition :opacity]) 1.0))
|
||||
|
||||
(terminate [this screen entities]
|
||||
(dissoc entities :transition))
|
||||
(terminate [this screen entities]
|
||||
entities)
|
||||
(can-skip? [this screen entities]
|
||||
false))
|
||||
(run-action entities
|
||||
(begin [this screen entities]
|
||||
(let [ego (get-in entities [:room :entities :ego])
|
||||
old-music (get-in entities [:room :music])
|
||||
entities (-> entities
|
||||
(assoc-in [:room] (get-in entities [:rooms new-background]))
|
||||
(assoc-in [:room :entities :ego] ego))
|
||||
new-music (get-in entities [:room :music])]
|
||||
(when (not= new-music old-music)
|
||||
(doseq [[k v] (:musics entities)
|
||||
:when (and v (not= new-music k))]
|
||||
(music! v :stop))
|
||||
(when new-music
|
||||
(music! (get-in entities [:musics new-music]) :set-volume 0)
|
||||
(music! (get-in entities [:musics new-music]) :play)))
|
||||
(-> entities
|
||||
(update-in [:room :entities :ego] #(jump-to screen entities % [x y])))))
|
||||
|
||||
(can-skip? [this screen entities]
|
||||
false)))
|
||||
(continue [this screen entities]
|
||||
(when music-changed?
|
||||
(music! (get-in entities [:musics new-music]) :set-volume (max (- 1.0 (get-in entities [:transition :opacity])) 0.0)))
|
||||
(update-in entities [:transition :opacity] - 0.075))
|
||||
|
||||
(done? [this screen entities]
|
||||
(<= (get-in entities [:transition :opacity]) 0.0))
|
||||
|
||||
(terminate [this screen entities]
|
||||
(dissoc entities :transition))
|
||||
|
||||
(can-skip? [this screen entities]
|
||||
false))))
|
||||
|
||||
(defn do-dialogue [entities & pairs]
|
||||
(loop [pairs (partition 2 pairs)]
|
||||
|
||||
@@ -37,16 +37,14 @@
|
||||
(let [font (bitmap-font "ego/font.fnt" )
|
||||
tr (bitmap-font! font :get-region)
|
||||
scale (or (min (max scale 0.75) 1) 1)
|
||||
width (/ (game :width) 1.5)
|
||||
tx (.getTexture tr)
|
||||
_ (texture! tx :set-filter Texture$TextureFilter/Linear Texture$TextureFilter/Linear)
|
||||
talk (assoc (label text (style :label font (color :white))) :x (- (* 4 x) (/ width 2)) :y (* 4 y))
|
||||
talk (ensure-on-screen talk)]
|
||||
(label! talk :set-wrap true)
|
||||
(label! talk :set-width width)
|
||||
talk (assoc (label text (style :label font (color :white))) :y (* 4 y))]
|
||||
(label! talk :set-font-scale scale)
|
||||
(label! talk :set-alignment Align/center)
|
||||
(assoc entities target-id talk)))
|
||||
(assoc entities target-id (-> talk
|
||||
(assoc :x (- (* 4 x) (/ (label! talk :get-width) 2)))
|
||||
ensure-on-screen ))))
|
||||
|
||||
:stop-talk
|
||||
(fn [{:keys [target-id] } [entities]]
|
||||
@@ -79,7 +77,7 @@
|
||||
[i (assoc (label text (style :label font (color :white))) :x 30 :y (* 30 i))]))
|
||||
(assoc :state {:object nil :callback callback :choices choices}))))
|
||||
|
||||
:on-touch-down (fn [screen [entities]]
|
||||
:on-touch-up (fn [screen [entities]]
|
||||
(let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})]
|
||||
(when (seq entities)
|
||||
(when (< y (* 30 (dec (count entities))))
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
InputMultiplexer InputProcessor Net Preferences Screen]))
|
||||
|
||||
|
||||
(defn close [entities]
|
||||
(screen! @(resolve 'advent.screens.scene/scene) :on-reactivate)
|
||||
(-> entities
|
||||
(assoc :shown? false)
|
||||
(assoc :start-showing? false)))
|
||||
|
||||
|
||||
(defscreen inventory-screen
|
||||
:on-show
|
||||
@@ -45,7 +51,7 @@
|
||||
(render! screen [(:fade entities) (:overlay entities)])
|
||||
(render! screen (:items entities))
|
||||
(if-let [item (:highlighted-item entities)]
|
||||
(label! (:highlighted-text entities) :set-text (name item))
|
||||
(label! (:highlighted-text entities) :set-text (:name item))
|
||||
(label! (:highlighted-text entities) :set-text ""))
|
||||
(render! screen [(:highlighted-text entities)]))
|
||||
entities))
|
||||
@@ -60,7 +66,7 @@
|
||||
offset-y (+ y (/ item-width 2))
|
||||
padding (/ item-width 2)
|
||||
padding (* 4 padding)]]
|
||||
(assoc (texture (aget (:all-items entities) 0 (.indexOf utils/+all-cursors+ item)))
|
||||
(assoc (texture (aget (:all-items entities) 0 (.indexOf utils/+all-cursors+ (:cursor item))))
|
||||
:x x :y y
|
||||
:scale-x 4
|
||||
:scale-y 4
|
||||
@@ -74,16 +80,21 @@
|
||||
(assoc entities :highlighted-item (:item selected-entity))
|
||||
(assoc entities :highlighted-item nil))))
|
||||
|
||||
:on-touch-down (fn [screen [entities]]
|
||||
:on-touch-up (fn [screen [entities]]
|
||||
(when (:shown? entities)
|
||||
(run! @(resolve 'advent.screens.scene/scene) :on-reactivate)
|
||||
(let [{:keys [highlighted-item]} entities]
|
||||
(when highlighted-item
|
||||
(run! @(resolve 'advent.screens.scene/scene) :on-chose-item :item highlighted-item)))
|
||||
(-> entities
|
||||
(assoc :shown? false)
|
||||
(assoc :start-showing? false))))
|
||||
(let [{:keys [highlighted-item]} entities
|
||||
room-entities (-> @(resolve 'advent.screens.scene/scene)
|
||||
:entities
|
||||
deref
|
||||
first)
|
||||
current-cursor (get-in room-entities [:cursor :current])]
|
||||
(if highlighted-item
|
||||
(if (= :main current-cursor)
|
||||
(screen! @(resolve 'advent.screens.scene/scene) :on-chose-item :item highlighted-item)
|
||||
(when-let [interaction-script ((or (:scripts highlighted-item) (constantly nil)) (:value current-cursor))]
|
||||
(interaction-script room-entities)
|
||||
(close entities)))
|
||||
(close entities)))))
|
||||
|
||||
:on-resize (fn [screen entities]
|
||||
(height! screen 960)
|
||||
entities))
|
||||
(size! screen 1280 960)))
|
||||
|
||||
52
desktop/src-common/advent/screens/items.clj
Normal file
@@ -0,0 +1,52 @@
|
||||
(ns advent.screens.items
|
||||
(:require [advent.actions :as actions]))
|
||||
|
||||
|
||||
(declare stick)
|
||||
(declare wool)
|
||||
(declare cat-toy)
|
||||
(declare flask-1-with-milk)
|
||||
(def make-cat-toy
|
||||
(actions/get-script entities
|
||||
(actions/remove-item entities stick)
|
||||
(actions/remove-item entities wool)
|
||||
(actions/give entities cat-toy)
|
||||
(actions/talk entities :ego "It makes a little cat toy!")))
|
||||
|
||||
(def wool {:name "Wool" :value :wool :cursor :wool :scripts {:stick make-cat-toy}})
|
||||
(def mushrooms {:name "Mushrooms" :value :mushrooms :cursor :mushrooms})
|
||||
(def carrot {:name "Carrot" :value :carrot :cursor :carrot})
|
||||
|
||||
(def flask-1-with-mushrooms {:name "Flask with mushrooms" :value :flask-1-with-mushrooms :cursor :flask-with-contents})
|
||||
(def flask-1-with-cream-of-mushroom {:name "Flask with cream of mushrooms soup" :value :flask-1-with-cream-of-mushroom :cursor :flask-with-contents})
|
||||
|
||||
|
||||
(defn make-cream-of-mushroom []
|
||||
(actions/get-script entities
|
||||
(actions/remove-item entities flask-1-with-mushrooms)
|
||||
(actions/remove-item entities flask-1-with-milk)
|
||||
(actions/remove-item entities mushrooms)
|
||||
(actions/give entities flask-1-with-cream-of-mushroom)
|
||||
(actions/talk entities :ego "It's just like cream of mushroom soup.")))
|
||||
|
||||
(def flask-1-with-milk {:name "Flask with milk" :value :flask-1-with-milk :cursor :flask-with-contents
|
||||
:scripts {:mushrooms (make-cream-of-mushroom)}})
|
||||
|
||||
(def flask-1-strength {:name "Strength potion" :value :flask-1-strength :cursor :flask-with-contents})
|
||||
(def flask-1 {:name "Flask" :value :flask-1 :cursor :flask
|
||||
:scripts {:mushrooms (actions/get-script entities
|
||||
(actions/remove-item entities flask-1)
|
||||
(actions/remove-item entities mushrooms)
|
||||
(actions/give entities flask-1-with-mushrooms)
|
||||
(actions/talk entities :ego "I'll just put a few of these in here."))}})
|
||||
|
||||
(def trophy {:name "Trophy of wisdom" :value :trophy :cursor :trophy})
|
||||
(def cheat-deck {:name "Warlock's Tower cheat deck" :value :cheat-deck :cursor :cheat-deck})
|
||||
|
||||
(def cat-toy {:name "Cat toy" :value :cat-toy :cursor :cat-toy})
|
||||
(def stick {:name "Stick" :value :stick :cursor :stick :scripts {:wool make-cat-toy}})
|
||||
(def balloon {:name "Choicest of balloons" :value :balloon :cursor :balloon})
|
||||
(def frog-legs {:name "Frog legs" :value :frog-legs :cursor :frog-legs})
|
||||
(def stool {:name "Stool" :value :stool :cursor :stool})
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
:get-script (fn [cursor [x y]]
|
||||
(if (= :main cursor)
|
||||
(:script spec)
|
||||
(get-in spec [:scripts cursor])))}))
|
||||
(when-let [scripts (:scripts spec)]
|
||||
(scripts (:value cursor)))))}))
|
||||
entities (into {} (for [[id entity] entities]
|
||||
[id (merge entity
|
||||
{:mouse-in? (fn [entities x y]
|
||||
@@ -20,7 +21,8 @@
|
||||
{:get-script (fn [cursor [x y]]
|
||||
(if (= :main cursor)
|
||||
(:script entity)
|
||||
(get-in entity [:scripts cursor])))}))]))]
|
||||
(when-let [scripts (:scripts entity)]
|
||||
(scripts (:value cursor)))))}))]))]
|
||||
(merge params {:collision (advent.pathfind/map-from-resource collision)
|
||||
:interactions interactions-as-list
|
||||
:entities entities})))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
(ns advent.screens.rooms.behind-house
|
||||
(:require [advent.screens.rooms :as rooms]
|
||||
[advent.screens.items :as items]
|
||||
[advent.actions :as actions]
|
||||
[advent.utils :as utils]
|
||||
[clojure.zip :as zip]
|
||||
@@ -9,7 +10,8 @@
|
||||
[play-clj.g2d :refer :all]))
|
||||
|
||||
(defn make [screen]
|
||||
(rooms/make :interactions
|
||||
(rooms/make :music :town-2
|
||||
:interactions
|
||||
{:left-dir {:box [0 131 20 224]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
@@ -17,22 +19,19 @@
|
||||
(actions/transition-background entities :outside-house [244 150])
|
||||
(actions/walk-to entities :ego [195 140]))
|
||||
:cursor :left}
|
||||
:crack {:box [68 100 73 114]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
(actions/walk-to entities :ego [70 80])
|
||||
(actions/talk entities :ego "I can see Fangald, the wizard inside.")
|
||||
(actions/talk entities :ego "It looks like he's opening his Magi-safe.")
|
||||
(actions/talk entities :ego "[todo: sounds play.]")
|
||||
(actions/talk entities :ego "A lot of good it'll do me to know his password while he's still there."))}
|
||||
#_:crack #_{:box [68 100 73 114]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
)}
|
||||
:mushrooms {:box [247 59 269 76]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
(if ((get-in @entities [:state :inventory]) :mushrooms)
|
||||
(if (actions/has-item? @entities items/mushrooms)
|
||||
(actions/talk entities :ego "I've already got a junk ton of mushrooms.")
|
||||
(do
|
||||
(actions/walk-to entities :ego [242 75])
|
||||
(actions/give entities :mushrooms)
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/give entities items/mushrooms)
|
||||
(actions/talk entities :ego "Perfectly ripe mushrooms!"))))}
|
||||
:window {:box [103 44 130 140]
|
||||
:script (actions/get-script
|
||||
@@ -42,6 +41,32 @@
|
||||
:layers [(assoc (texture "behindhouse/background.png") :x 0 :y 0 :baseline 0)
|
||||
(assoc (texture "behindhouse/house.png") :x 0 :y 0 :baseline 122)
|
||||
(assoc (texture "behindhouse/brush.png") :x 0 :y 0 :baseline 240)]
|
||||
:entities {}
|
||||
:entities {:stick (assoc (texture "behindhouse/stick.png")
|
||||
:x 26 :y 80 :baseline 160
|
||||
:script (actions/get-script entities
|
||||
(actions/walk-to entities :ego [50 80])
|
||||
(actions/play-animation entities :ego :reach)
|
||||
(actions/remove-entity entities :stick)
|
||||
(actions/give entities items/stick)
|
||||
(actions/talk entities :ego "This stick might be useful.")
|
||||
))
|
||||
:peeling (assoc (texture "behindhouse/house-cover.png")
|
||||
:x 60 :y 92 :baseline 148
|
||||
:script (actions/get-script entities
|
||||
(if (get-in @entities [:state :opened-crack?])
|
||||
(do (actions/walk-to entities :ego [70 80])
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/talk entities :ego "I can see Gandarf, the wizard inside.")
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/talk entities :ego "It looks like he's opening his Magi-safe.")
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/talk entities :ego "[todo: sounds play.]")
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/talk entities :ego "A lot of good it'll do me to know his password while he's still there."))
|
||||
(do (actions/walk-to entities :ego [80 80])
|
||||
(actions/talk entities :ego "It looks like the wall is crumbling here.")
|
||||
(actions/play-animation entities :ego :reach)
|
||||
(actions/update-entity entities :peeling #(assoc % :opacity 0))
|
||||
(actions/update-state entities (fn [state] (assoc state :opened-crack? true)))))))}
|
||||
:collision "behindhouse/collision.png"
|
||||
:scale-fn (utils/scaler-fn-with-baseline 110 0.10 1.00)))
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
(let [cat-stand-sheet (texture! (texture "cat-tree/cat-stand.png") :split 22 10)
|
||||
cat-stand (animation 0.15 (for [i (flatten [(repeat 10 0) 1 1 (repeat 10 0) 2 3 4 3 0 0 2 3 4 3 (repeat 10 0) 1 1 (repeat 10 0) 5 5 6 6 7 (repeat 10 [7 8]) 6 5 0])]
|
||||
(aget cat-stand-sheet 0 i)))]
|
||||
(rooms/make :interactions
|
||||
(rooms/make :music :town-2
|
||||
:interactions
|
||||
{:down-dir {:box [150 0 270 20]
|
||||
:script (actions/get-script entities
|
||||
(actions/walk-to entities :ego [203 1])
|
||||
@@ -27,7 +28,10 @@
|
||||
:x 184 :y 173 :baseline 240
|
||||
:script (actions/get-script entities
|
||||
(actions/talk entities :ego "Here kitty, kitty, kitty.")
|
||||
(actions/talk entities :ego "Kitty's not so interested in me.")))
|
||||
(actions/talk entities :ego "Kitty's not so interested in me."))
|
||||
:scripts {:cat-toy (actions/get-script entities
|
||||
(actions/play-animation entities :ego :cat-toy)
|
||||
(actions/talk entities :ego "I guess I'm too far away."))})
|
||||
cat-stand)}
|
||||
:collision "cat-tree/collision.png"
|
||||
:scale-fn (utils/scaler-fn-with-baseline 110 0.10 1.20))))
|
||||
|
||||
157
desktop/src-common/advent/screens/rooms/inside_castle.clj
Normal file
@@ -0,0 +1,157 @@
|
||||
(ns advent.screens.rooms.inside-castle
|
||||
(:require [advent.screens.rooms :as rooms]
|
||||
[advent.actions :as actions]
|
||||
[advent.screens.items :as items]
|
||||
[advent.utils :as utils]
|
||||
[clojure.zip :as zip]
|
||||
[play-clj.core :refer :all]
|
||||
[play-clj.ui :refer :all]
|
||||
[play-clj.utils :refer :all]
|
||||
[play-clj.g2d :refer :all]))
|
||||
|
||||
(defn play-warlocks-castle [entities]
|
||||
(let [scenarios [#(actions/do-dialogue entities
|
||||
:game-player "As you approach the lair of the cave beast, a foul odor fills your nostrils."
|
||||
:game-player "To your horror, you realize that the stench is from the corpses of less wise wizards."
|
||||
:game-player "The cave is eerie and dark. What do you do?")
|
||||
#(actions/do-dialogue entities
|
||||
:game-player "As you move forward in your quest, you come upon an abandoned library."
|
||||
:game-player "Still, something doesn't feel right about the place."
|
||||
:game-player "It's quiet."
|
||||
:game-player "A little too quiet.")
|
||||
#(actions/do-dialogue entities
|
||||
:game-player "The treacherous stair lies before you.")]]
|
||||
(doseq [scenario (take 2 (shuffle scenarios))]
|
||||
(scenario))))
|
||||
|
||||
(defn do-game-player-dialogue [entities]
|
||||
(actions/do-dialogue entities :ego "You there!" :game-player "... Yes?")
|
||||
(actions/present-choices entities
|
||||
{:choices ["Do you know anything about the sword in the stone up there?"
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "It is said that only he who is worthy in wisdom can pull the sword!"
|
||||
:game-player "I, of course have such wisdom, but I'm still unable to pull it myself.")
|
||||
:choices ["Can you teach me your ways?"
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "Ha! My intellect has only been achieved with years of precise training!"
|
||||
:game-player "You're out of luck, friend. Unless you are willing to spend hours and hours in careful study, you will always be a dunce."
|
||||
:ego "...")
|
||||
:choices actions/previous-choices}
|
||||
"How come?"
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "You must be mighty in strength to pull the sword."
|
||||
:game-player "And I spend all of my time either playing my game, or at the library.")
|
||||
:choices actions/previous-choices}
|
||||
"Something else."
|
||||
{:choices actions/something-else}]}
|
||||
(when (= nil (get-in @entities [:state :current-riddle]))
|
||||
"Nice trophy.")
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "Thanks. I was nominated the Riddlemaster of Remington for the 7th straight year!"
|
||||
:game-player "I guess I'm pretty wise."
|
||||
:game-player "And with my sharp intellect, I'm guessing you want my trophy?")
|
||||
:choices ["Yes."
|
||||
{:run #(do (actions/update-state entities (fn [state] (assoc state :current-riddle :wool)))
|
||||
(actions/respond entities %
|
||||
:game-player "Well, if you want my trophy, you'll have to earn it."
|
||||
:game-player "There are a few riddles that even I, the wisest in all of Remington, cannot solve."
|
||||
:game-player "How about you help me?"
|
||||
:game-player "Bring me the answer:"
|
||||
:game-player "White as snow, but not as cold,"
|
||||
:game-player "Keeps you warm, or so I'm told."
|
||||
:ego "Okay."))}
|
||||
"No."
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "That's exactly what I'd expect a dummy like you to say.")
|
||||
:choices actions/something-else}]}
|
||||
|
||||
(when (= :wool (get-in @entities [:state :current-riddle]))
|
||||
"What was that riddle again?")
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "White as snow, but not as cold,"
|
||||
:game-player "Keeps you warm, or so I'm told.")
|
||||
:choices actions/previous-choices}
|
||||
|
||||
(when (= :balloon (get-in @entities [:state :current-riddle]))
|
||||
"What was that riddle again?")
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "Filled with air, light as a feather,"
|
||||
:game-player "If you want to keep it, best have a tether.")
|
||||
:choices actions/previous-choices}
|
||||
|
||||
(when (= :frog-legs (get-in @entities [:state :current-riddle]))
|
||||
"What was that riddle again?")
|
||||
{:run #(actions/respond entities %
|
||||
:game-player "Hippity-hop, I jump real far,"
|
||||
:game-player "Now I'm dead, or at least have a scar.")
|
||||
:choices actions/previous-choices}
|
||||
"Nevermind."
|
||||
{:run #(actions/respond entities % :game-player "See you around.")}]}))
|
||||
|
||||
(defn make [screen]
|
||||
(let [game-player-talk-sheet (texture! (texture "inside-castle/game-player-talk.png") :split 40 44)
|
||||
game-player-talk (animation 0.15 (for [i [0 2 0 2 0 2 0 3 0 2 0 1 0 0 0 0 2 0 2 0 3 0 1 0 1 0 0 1 0 2 0 3 0]]
|
||||
(aget game-player-talk-sheet 0 i)))]
|
||||
(rooms/make :music :town-1
|
||||
:interactions
|
||||
{:right-door {:box [286 140 306 160]
|
||||
:cursor :right
|
||||
:script (actions/get-script entities
|
||||
(actions/walk-to entities :ego [284 145])
|
||||
(actions/transition-background entities :outside-castle [82 180])
|
||||
(actions/walk-to entities :ego [129 148]))}
|
||||
:sword {:box [0 130 39 165]
|
||||
:script (actions/get-script entities
|
||||
(actions/talk entities :ego "That's the coolest sword I've ever seen!!")
|
||||
(actions/walk-to entities :ego [37 134] :face :left)
|
||||
(actions/talk entities :ego "Maybe I can pull it out.")
|
||||
(actions/play-animation entities :ego :reach)
|
||||
(actions/do-dialogue entities
|
||||
:ego "I can't pull it out!"
|
||||
:ego "It looks like there's an enscription here.")
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/do-dialogue entities
|
||||
:ego "The Sword of Blergh with magic sting,"
|
||||
:ego "shall yield to no earthly king."
|
||||
:ego "Worthy in wisdom, courage, and might,"
|
||||
:ego "only then with sword he'll fight."))}
|
||||
:sign {:box [125 140 165 155]
|
||||
:script (actions/get-script entities
|
||||
(actions/talk entities :ego "Ye Ol' Antique Shoppe."))}}
|
||||
:layers [(assoc (texture "inside-castle/background.png") :x 0 :y 0 :baseline 0)
|
||||
(assoc (texture "inside-castle/pedestal-overlay.png") :x 0 :y 0 :baseline 135)]
|
||||
:entities {:game-player (assoc (texture "inside-castle/gameplayer.png") :x 266 :y 49 :baseline 191
|
||||
:script (actions/get-script entities (do-game-player-dialogue entities))
|
||||
:scripts {:wool (actions/get-script entities
|
||||
(if (= :wool (get-in @entities [:state :current-riddle]))
|
||||
(do (actions/update-state entities #(assoc % :current-riddle :balloon))
|
||||
(actions/remove-item entities items/wool)
|
||||
(actions/do-dialogue entities
|
||||
:game-player "That's right! Now for your second riddle:"
|
||||
:game-player "Filled with air, light as a feather,"
|
||||
:game-player "If you want to keep it, best have a tether."))
|
||||
(actions/talk entities :ego "He doesn't need it.")))
|
||||
:balloon (actions/get-script entities
|
||||
(if (= :balloon (get-in @entities [:state :current-riddle]))
|
||||
(do (actions/update-state entities #(assoc % :current-riddle :frog-legs))
|
||||
(actions/remove-item entities items/balloon)
|
||||
(actions/do-dialogue entities
|
||||
:game-player "That's right! Now for your third riddle:"
|
||||
:game-player "Hippity-hop, I jump really far,"
|
||||
:game-player "Now I'm dead, or at least a have a scar."))
|
||||
(actions/talk entities :ego "He doesn't need it.")))
|
||||
:frog-legs (actions/get-script entities
|
||||
(if (= :frog-legs (get-in @entities [:state :current-riddle]))
|
||||
(do (actions/update-state entities #(assoc % :current-riddle :done))
|
||||
|
||||
(actions/remove-item entities items/frog-legs)
|
||||
(actions/do-dialogue entities
|
||||
:game-player "Wow! That's right!"
|
||||
:game-player "I guess I'm not the wisest person in Remington."
|
||||
:game-player "You have earned my trophy.")
|
||||
(actions/give entities items/trophy))
|
||||
(actions/talk entities :ego "He doesn't need it.")))}
|
||||
:anim nil
|
||||
:talk game-player-talk)}
|
||||
:collision "inside-castle/collision.png"
|
||||
:scale-fn (utils/scaler-fn-from-image "inside-castle/scale.png" 0.25 1.00))))
|
||||
@@ -1,5 +1,6 @@
|
||||
(ns advent.screens.rooms.inside-house
|
||||
(:require [advent.screens.rooms :as rooms]
|
||||
(:require [advent.screens.items :as items]
|
||||
[advent.screens.rooms :as rooms]
|
||||
[advent.actions :as actions]
|
||||
[advent.utils :as utils]
|
||||
[clojure.zip :as zip]
|
||||
@@ -14,16 +15,23 @@
|
||||
(aget wizard-sheet 0 i)))
|
||||
wizard-talk (animation 0.2 (for [i [0 2 0 2 1 2 0 3 0 2 0 1 0 2]]
|
||||
(aget wizard-sheet 0 i)))]
|
||||
(rooms/make :interactions {:down-dir {:box [151 0 320 20]
|
||||
(rooms/make :music :inside-fangald
|
||||
:interactions {:down-dir {:box [151 0 320 20]
|
||||
:script (actions/get-script entities
|
||||
(actions/walk-to entities :ego [237 1])
|
||||
(actions/transition-background entities :outside-house [262 88]))
|
||||
:cursor :down}
|
||||
:wizard {:box [228 80 248 126]}}
|
||||
:safe {:box [34 70 70 115]
|
||||
:script (actions/get-script entities
|
||||
(actions/walk-to entities :ego [59 65])
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/give entities items/frog-legs)
|
||||
(actions/talk entities :ego "I found some frog legs inside."))}
|
||||
}
|
||||
:layers [(assoc (texture "inside-house/background.png") :x 0 :y 0 :baseline 0)
|
||||
(assoc (texture "inside-house/desk.png") :x 0 :y 0 :baseline 200)
|
||||
(assoc (texture "inside-house/sillhoute.png") :x 0 :y 0 :baseline 240)]
|
||||
:entities {:wizard (actions/start-animation screen (assoc (animation->texture screen wizard-stand) :x 228 :y 80 :baseline 160 :scale-x 1.75 :scale-y 1.75
|
||||
:entities {:wizard (actions/start-animation screen (assoc (animation->texture (doto screen) wizard-stand) :x 228 :y 80 :baseline 160 :scale-x 1.75 :scale-y 1.75
|
||||
:left {:talk (utils/flip wizard-talk)
|
||||
:stand (utils/flip wizard-stand)}
|
||||
:right {:talk wizard-talk
|
||||
@@ -34,7 +42,7 @@
|
||||
:x 265 :y 80 :baseline 240
|
||||
:script (actions/get-script entities
|
||||
(actions/remove-entity entities :flask)
|
||||
(actions/give entities :flask)
|
||||
(actions/give entities items/flask-1)
|
||||
(actions/do-dialogue entities :ego "Hey you think I could have this flask?"
|
||||
:wizard "Sure.")))}
|
||||
:collision "inside-house/collision.png"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
(ns advent.screens.rooms.outside-castle
|
||||
(:require [advent.screens.rooms :as rooms]
|
||||
(:require [advent.screens.items :as items]
|
||||
[advent.screens.rooms :as rooms]
|
||||
[advent.actions :as actions]
|
||||
[advent.utils :as utils]
|
||||
[clojure.zip :as zip]
|
||||
@@ -14,22 +15,32 @@
|
||||
(aget peddler-sheet 0 i)))
|
||||
peddler-stand (animation 0.2 (for [i (flatten [(repeat 5 0) 6])]
|
||||
(aget peddler-sheet 0 i)))]
|
||||
(rooms/make :interactions
|
||||
(rooms/make :music :town-2
|
||||
:interactions
|
||||
{:right-dir {:box [300 40 320 140]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
(actions/walk-to entities :ego [310 80])
|
||||
(actions/transition-background entities :outside-house [0 80]))
|
||||
:cursor :right}
|
||||
:door {:box [66 180 85 195]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
(actions/walk-to entities :ego [82 180])
|
||||
(actions/transition-background entities :inside-castle [280 145])
|
||||
(actions/walk-to entities :ego [245 90]))
|
||||
:cursor :left}
|
||||
:garden {:box [103 170 178 200]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
(if ((get-in @entities [:state :inventory]) :carrot)
|
||||
(if (actions/has-item? @entities items/carrot)
|
||||
(actions/talk entities :ego "If I steal any more, I might get caught.")
|
||||
(do
|
||||
(actions/walk-to entities :ego [128 180])
|
||||
(actions/talk entities :ego "Hey! Carrots. No one will notice one missing.")
|
||||
(actions/give entities :carrot))))}
|
||||
(actions/talk entities :ego "Hey! Carrots.")
|
||||
(actions/play-animation entities :ego :squat)
|
||||
(actions/talk entities :ego "No one will notice one missing.")
|
||||
(actions/give entities items/carrot))))}
|
||||
:peddler {:box [110 90 128 146]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
@@ -42,17 +53,20 @@
|
||||
:peddler "I have the choicest of all types of wares..."
|
||||
:peddler "...I'm well stocked on used earplugs..."
|
||||
:peddler "...glass eyes, motivational tapes... "
|
||||
:peddler "...and useful books like this:"
|
||||
:peddler "'Checkers Mastery in Less Than 10 Seconds'"
|
||||
:ego "I sure am interested on that book on checkers."
|
||||
:peddler "An excellent selection! It is the choicest of checkers book you'll ever find."
|
||||
:peddler "This book will only set you back 75 sheckels."
|
||||
:peddler "... and this nice, big, red balloon."
|
||||
:ego "I sure am interested in that balloon."
|
||||
:peddler "An excellent selection! It is the choicest of balloons you'll ever find."
|
||||
:peddler "This bundle of joy will only set you back 75 sheckels."
|
||||
:ego "But I haven't got any money!"
|
||||
:peddler "Then you won't have the choicest of checkers books."))}}
|
||||
:peddler "Then you won't have the choicest of balloons.")
|
||||
(actions/give entities items/balloon))}}
|
||||
:layers [(assoc (texture "outside-castle/background.png") :x 0 :y 0 :baseline 0)]
|
||||
:entities {:peddler (actions/start-animation screen
|
||||
(assoc (texture "outside-castle/peddler.png") :x 110 :y 90 :baseline 150 :anim nil
|
||||
:talk peddler-talk :stand peddler-stand)
|
||||
:stand)}
|
||||
:stand)
|
||||
:steer (assoc (texture "outside-castle/steer.png" ) :x 203 :y 155 :baseline 80
|
||||
:script (actions/get-script entities
|
||||
(actions/talk entities :ego "That is one buff bull!")))}
|
||||
:collision "outside-castle/collision.png"
|
||||
:scale-fn (utils/scaler-fn-with-baseline 110 0.10 1.00))))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
(ns advent.screens.rooms.outside-house
|
||||
(:require [advent.screens.rooms :as rooms]
|
||||
(:require [advent.screens.items :as items]
|
||||
[advent.screens.rooms :as rooms]
|
||||
[advent.actions :as actions]
|
||||
[advent.utils :as utils]
|
||||
[clojure.zip :as zip]
|
||||
@@ -19,7 +20,7 @@
|
||||
(< (dist-to-sheep entities) 45))
|
||||
|
||||
(defn wizard-dialogue [entities]
|
||||
(actions/do-dialogue entities :ego "Hello there Mr. Fangald!" :wizard "Oh no, not you again!")
|
||||
(actions/do-dialogue entities :ego "Hello there Gandarf!" :wizard "Oh no, not you again!")
|
||||
(actions/present-choices entities
|
||||
{:choices ["What do you mean, \"Not you again?\""
|
||||
{:run #(actions/respond entities % :wizard "I mean, you've wrecked my life and I never want to see you again.")
|
||||
@@ -103,10 +104,10 @@
|
||||
:wizard "While your goal sounds noble, no amount of bizarre conversation tree searching will earn my respect."
|
||||
:wizard "Now please leave.")
|
||||
(actions/transition-background entities :outside-house [262 88]))}]}]}]}
|
||||
"You're not happy to see me, Mr. Fangald?"
|
||||
"You're not happy to see me, Gandarf?"
|
||||
{:run #(actions/respond entities % :wizard "Of course not, you little brat. You've made my life a living hell!")
|
||||
:choices #(-> % zip/left)}
|
||||
"Good bye, Mr. Fangald!"
|
||||
"Goodbye, Gandarf!"
|
||||
{:run #(do
|
||||
(actions/respond entities % :wizard "Now scram!")
|
||||
(actions/transition-background entities :outside-house [262 88]))}]}))
|
||||
@@ -115,14 +116,16 @@
|
||||
sheep-walk-sheet (texture! (texture "outsidehouse/sheep-walk.png") :split 33 21)
|
||||
sheep-stand (animation 0.15 (for [i (flatten [(repeat 10 0) 1 2 3 4 5 6 7 4 5 6 7 8 9 10 (repeat 25 11) (repeat 15 12)])]
|
||||
(aget sheep-stand-sheet 0 i)))
|
||||
sheep-walk (animation 0.15 (for [i (range 6)]
|
||||
sheep-walk (animation 0.05 (for [i (range 6)]
|
||||
(aget sheep-walk-sheet 0 i)))]
|
||||
(rooms/make :interactions
|
||||
(rooms/make :music :town-2
|
||||
:interactions
|
||||
{:door {:box [258 100 281 160]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
(actions/walk-to entities :ego [262 88])
|
||||
(actions/walk-to entities :ego [267 90])
|
||||
(actions/talk entities :ego (str "Anyone home?"))
|
||||
(actions/play-animation entities :ego :reach)
|
||||
(actions/transition-background entities :inside-house [237 0])
|
||||
(if (get-in @entities [:state :convinced-wizard?])
|
||||
(actions/talk entities :wizard (str "Oh, hello there boy."))
|
||||
@@ -162,27 +165,30 @@
|
||||
:box [38 160 71 181]
|
||||
:script (actions/get-script
|
||||
entities
|
||||
|
||||
|
||||
(if ((get-in @entities [:state :inventory]) :wool)
|
||||
(if (actions/has-item? @entities items/wool)
|
||||
(actions/talk entities :ego "The sheep has given me enough wool.")
|
||||
(if (is-sheep-close? @entities)
|
||||
(do (actions/walk-to entities :ego ego-sheep-loc)
|
||||
(actions/give entities :wool)
|
||||
(do (actions/walk-to entities :ego ego-sheep-loc :face :left)
|
||||
(actions/play-animation entities :ego :reach)
|
||||
(actions/give entities items/wool)
|
||||
(actions/talk entities :ego "I guess her wool is shedding."))
|
||||
(actions/talk entities :ego "She's too far away for me to pet her."))))
|
||||
:scripts {:wool (actions/get-script entities
|
||||
(actions/talk entities :ego "She doesn't need it back."))
|
||||
:carrot (actions/get-script entities
|
||||
(actions/walk-to entities :ego ego-sheep-loc)
|
||||
(actions/walk-to entities :ego ego-sheep-loc :face :left)
|
||||
(actions/talk entities :ego "Come on girl, get the carrot!")
|
||||
(actions/walk-straight-to entities :sheep [95 150]))
|
||||
:flask (actions/get-script entities
|
||||
:flask-1 (actions/get-script entities
|
||||
(if (is-sheep-close? @entities)
|
||||
(do (actions/walk-to entities :ego ego-sheep-loc)
|
||||
(actions/give entities :flask-with-contents)
|
||||
(do (actions/walk-to entities :ego ego-sheep-loc :face :left)
|
||||
(actions/play-animation entities :ego :reach)
|
||||
(actions/remove-item entities items/flask-1)
|
||||
(actions/give entities items/flask-1-with-milk)
|
||||
(actions/talk entities :ego "Sheeps milk."))
|
||||
(actions/talk entities :ego "She's too far away.")))}
|
||||
(actions/talk entities :ego "She's too far away.")))
|
||||
items/flask-1-with-mushrooms (items/make-cream-of-mushroom)}
|
||||
:left {:walk (utils/flip sheep-walk)
|
||||
:stand (utils/flip sheep-stand)}
|
||||
:right {:walk sheep-walk
|
||||
|
||||
@@ -11,8 +11,10 @@
|
||||
[advent.zone :as zone]
|
||||
[advent.utils :as utils]
|
||||
[advent.screens.rooms :as rooms]
|
||||
[advent.screens.items :as items]
|
||||
[advent.screens.rooms.outside-house :as rooms.outside-house]
|
||||
[advent.screens.rooms.inside-house :as rooms.inside-house]
|
||||
[advent.screens.rooms.inside-castle :as rooms.inside-castle]
|
||||
[advent.screens.rooms.behind-house :as rooms.behind-house]
|
||||
[advent.screens.rooms.outside-castle :as rooms.outside-castle]
|
||||
[advent.screens.rooms.cat-tree :as rooms.cat-tree]
|
||||
@@ -27,7 +29,7 @@
|
||||
(def default-interaction
|
||||
{:get-script (fn [cursor [x y]] (if (= :main cursor)
|
||||
(actions/get-script entities
|
||||
(actions/walk-to entities :ego [x y] true))
|
||||
(actions/walk-to entities :ego [x y] :can-skip? true))
|
||||
(actions/get-script entities
|
||||
(actions/talk entities :ego "I don't know what to do with that."))))})
|
||||
|
||||
@@ -38,7 +40,7 @@
|
||||
(get-in entities [:room :interactions]))))
|
||||
|
||||
(defn open-inventory [screen entities]
|
||||
(run! inventory-screen :show-screen :items (get-in entities [:state :inventory]))
|
||||
(screen! inventory-screen :show-screen :items (get-in entities [:state :inventory]))
|
||||
(assoc-in entities [:state :active?] false))
|
||||
|
||||
|
||||
@@ -46,7 +48,6 @@
|
||||
(let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})]
|
||||
(if ((:mouse-in? (:inventory entities)) x y)
|
||||
(open-inventory screen entities)
|
||||
|
||||
(let [interaction (first (filter #((:mouse-in? %) entities x y)
|
||||
(get-in entities [:room :interactions])))
|
||||
interacting-entity (first (filter #(and (:mouse-in? %)
|
||||
@@ -78,24 +79,48 @@
|
||||
(let [player-sheet (texture! (texture "player.png") :split 18 36)
|
||||
talk-sheet (texture! (texture "ego/talk.png") :split 18 36)
|
||||
stand-sheet (texture! (texture "ego/stand.png") :split 18 36)
|
||||
squat-sheet (texture! (texture "ego/squat.png") :split 18 36)
|
||||
reach-sheet (texture! (texture "ego/reach.png") :split 18 36)
|
||||
cat-toy-sheet (texture! (texture "ego/cat-toy.png") :split 41 50)
|
||||
walk-right (animation 0.075 (for [i (range 8)]
|
||||
(texture (aget player-sheet 0 i))))
|
||||
stand-anim (animation 0.1 (for [i (flatten [(repeat 6 [(repeat 10 0) (repeat 3 1) (repeat 20 0)]) 3 4 5 5 5 6 5 6 5 6 5 4 3 ])]
|
||||
(texture (aget stand-sheet 0 i))))
|
||||
talk-anim (animation 0.2 (for [i (range 8)]
|
||||
(texture (aget talk-sheet 0 i))))
|
||||
squat-anim (animation 0.05 (for [i [0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 2 1] ]
|
||||
(texture (aget squat-sheet 0 i))))
|
||||
reach-anim (animation 0.1 (for [i [0 1 2 3 3 3 3 3 3 2 1 0]]
|
||||
(texture (aget reach-sheet 0 i))))
|
||||
cat-toy-anim (animation 0.1 (for [i [0 0 1 1 2 2 3 4 3 2 3 4 3 2 3 4 3 2 3 4 3 2 2 1 1 0 0]]
|
||||
(texture (aget cat-toy-sheet 0 i))))
|
||||
ego {:right {:walk walk-right
|
||||
:stand stand-anim
|
||||
:talk talk-anim}
|
||||
:talk talk-anim
|
||||
:squat squat-anim
|
||||
:reach reach-anim
|
||||
:cat-toy cat-toy-anim}
|
||||
:left {:walk (utils/flip walk-right)
|
||||
:stand (utils/flip stand-anim)
|
||||
:talk (utils/flip talk-anim)}
|
||||
:talk (utils/flip talk-anim)
|
||||
:squat (utils/flip squat-anim)
|
||||
:reach (utils/flip reach-anim)
|
||||
:cat-toy (utils/flip cat-toy-anim)}
|
||||
:baseline 95
|
||||
:facing :right
|
||||
:origin-x 9
|
||||
:origin-y 0
|
||||
:scaled true
|
||||
|
||||
#_:mouse-in? #_(fn [entities x y]
|
||||
(let [{entity-x :x entity-y :y region :object} (get-in entities [:room :entities :ego])
|
||||
width (.getRegionWidth region)
|
||||
height (.getRegionHeight region)]
|
||||
|
||||
((zone/box entity-x entity-y (+ entity-x width) (+ entity-y height)) x y)))
|
||||
#_:get-script #_(fn [cursor [x y]]
|
||||
(case cursor
|
||||
items/flask-with-cream-of-mushroom (actions/get-script entities (actions/talk entities :ego "Yuck. I filled it with backwash."))))
|
||||
:x 150 :y 95
|
||||
:id "ego"}]
|
||||
(actions/start-animation screen
|
||||
@@ -117,45 +142,57 @@
|
||||
|
||||
|
||||
(defn update-cursor [screen {{:keys [current override last]} :cursor :as entities}]
|
||||
(when-not (= (or override current)
|
||||
last)
|
||||
(input! :set-cursor-image (utils/cursor "cursor.png" (or override current)) 0 0))
|
||||
(assoc-in entities [:cursor :last] (or override current)))
|
||||
(let [new-current (or override current)]
|
||||
(when-not (= new-current
|
||||
last)
|
||||
(input! :set-cursor-image (utils/cursor "cursor.png" (or (:cursor new-current) new-current)) 0 0))
|
||||
(assoc-in entities [:cursor :last] new-current)))
|
||||
|
||||
|
||||
|
||||
(defn animate [entity screen]
|
||||
(merge entity (animation->texture (update-in screen [:total-time] #(- % (:anim-start entity)))
|
||||
(:anim entity))))
|
||||
|
||||
(defn play-sound [snd]
|
||||
(music! snd :play))
|
||||
|
||||
(defn make-music [r]
|
||||
(doto (music r) (music! :set-looping true)))
|
||||
|
||||
(defscreen scene
|
||||
:on-show
|
||||
(fn [screen entities]
|
||||
(update! screen :renderer (stage) :camera (orthographic))
|
||||
(let [_ (input! :set-cursor-image (utils/cursor "cursor.png" :main) 0 0)
|
||||
music (sound "town-music.mp3")
|
||||
;; _ (sound! music :loop 0.80)
|
||||
rooms {:inside-house (rooms.inside-house/make screen)
|
||||
:outside-house (rooms.outside-house/make screen)
|
||||
:behind-house (rooms.behind-house/make screen)
|
||||
:cat-tree (rooms.cat-tree/make screen)
|
||||
:outside-castle (rooms.outside-castle/make screen)}]
|
||||
{:rooms rooms
|
||||
:state {:object nil
|
||||
:active? true
|
||||
:inventory (sorted-set)}
|
||||
:actions {:object nil
|
||||
:channel (chan)
|
||||
:current nil
|
||||
:started? false}
|
||||
:cursor {:id "cursor"
|
||||
:current :main
|
||||
:last :main
|
||||
:override nil}
|
||||
:room (assoc-in (:outside-house rooms)
|
||||
[:entities :ego] (get-ego screen))
|
||||
:inventory (assoc (texture "inventory.png") :x 278 :y 0 :baseline 9000
|
||||
:mouse-in? (zone/box 278 0 320 42))
|
||||
:fps (assoc (label "0" (color :white) ) :x 5 :baseline 0)}))
|
||||
(let [screen (assoc screen :total-time 0)]
|
||||
(update! screen :renderer (stage) :camera (orthographic))
|
||||
(let [_ (input! :set-cursor-image (utils/cursor "cursor.png" :main) 0 0)
|
||||
rooms {:inside-house (rooms.inside-house/make screen)
|
||||
:outside-house (rooms.outside-house/make screen)
|
||||
:behind-house (rooms.behind-house/make screen)
|
||||
:cat-tree (rooms.cat-tree/make screen)
|
||||
:inside-castle (rooms.inside-castle/make screen)
|
||||
:outside-castle (rooms.outside-castle/make screen)}]
|
||||
{:rooms rooms
|
||||
:musics {:object nil
|
||||
:town-1 (make-music "town-music-1.ogg")
|
||||
:town-2 (doto (make-music "town-music-2.ogg") play-sound)
|
||||
:inside-fangald (make-music "inside-fangald.ogg")}
|
||||
:state {:object nil
|
||||
:active? true
|
||||
:inventory []}
|
||||
:actions {:object nil
|
||||
:channel (chan)
|
||||
:current nil
|
||||
:started? false}
|
||||
:cursor {:id "cursor"
|
||||
:current :main
|
||||
:last :main
|
||||
:override nil}
|
||||
:room (assoc-in (:outside-house rooms)
|
||||
[:entities :ego] (get-ego screen))
|
||||
:inventory (assoc (texture "inventory.png") :x 278 :y 0 :baseline 9000
|
||||
:mouse-in? (zone/box 278 0 320 42))
|
||||
:fps (assoc (label "0" (color :white) ) :x 5 :baseline 0)})))
|
||||
|
||||
:on-render
|
||||
(fn [screen [entities]]
|
||||
@@ -184,7 +221,7 @@
|
||||
(assoc-in entities [:cursor :override] (:cursor mouse-override))
|
||||
(assoc-in entities [:cursor :override] nil)))))
|
||||
|
||||
:on-touch-down (fn [screen [entities]]
|
||||
:on-touch-up (fn [screen [entities]]
|
||||
(when (get-in entities [:state :active?])
|
||||
(if (= (button-code :right)
|
||||
(:button screen))
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
(let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})]
|
||||
(println (:input-x screen) (:input-y screen) "->" x y)))
|
||||
|
||||
(def +all-cursors+ [:main :wool :mushrooms :carrot :right :down :left :up :flask :flask-with-contents])
|
||||
(def +all-cursors+ [:main :wool :mushrooms :carrot :right :down :left :up :flask :flask-with-contents :trophy :stool :stick :cat-toy :balloon :frog-legs])
|
||||
|
||||
(defn cursor [filename which]
|
||||
(let [scale 2
|
||||
@@ -38,12 +38,22 @@
|
||||
|
||||
(defn scaler-fn-with-baseline [baseline minimum-size & [maximum-size]]
|
||||
(let [maximum-size (or maximum-size 1.0)]
|
||||
(fn [y]
|
||||
(fn [[_ y]]
|
||||
(if (< y baseline) maximum-size
|
||||
(let [percent-complete (- 1.0 (/ (- y baseline) (- +screen-height+ baseline)))
|
||||
range (+ (* percent-complete (- maximum-size minimum-size)) minimum-size)]
|
||||
range)))))
|
||||
|
||||
(defn scaler-fn-from-image [image minimum-size maximum-size]
|
||||
(let [image (pixmap image)
|
||||
maximum-size (or maximum-size 1.0)]
|
||||
(fn [[x y]]
|
||||
(let [percent-complete (-> image
|
||||
(pixmap! :get-pixel x (- 240 y))
|
||||
color
|
||||
(.r))]
|
||||
(+ (* percent-complete (- maximum-size minimum-size)) minimum-size)))))
|
||||
|
||||
(defn dist [x1 y1 x2 y2]
|
||||
(let [dx (- x1 x2)
|
||||
dy (- y1 y2)]
|
||||
|
||||