├── .gitignore ├── 01-title.clj ├── 02-about.clj ├── 03-projects.clj ├── 04-gateway.clj ├── 05-class.clj ├── 06-problem.clj ├── 07-indie.clj ├── 08-gameplay.clj ├── 09-graphics.clj ├── 10-artistic.clj ├── 11-tools.clj ├── 12-hosted.clj ├── 13-unity-libgdx.clj ├── 14-good-hosted.clj ├── 15-play-clj-init.clj ├── 16-play-clj-core.clj ├── 17-play-clj-defscreen.clj ├── 18-play-clj-state.clj ├── 19-play-clj-transform.clj ├── 20-play-clj-entities.clj ├── 21-play-clj-interop.clj ├── 22-play-clj-dsl.clj ├── 23-play-clj-dsl-bang.clj ├── 24-play-clj-docs.clj ├── 25-platformer.clj ├── 26-functional.clj ├── 27-logic.clj ├── 28-dungeon-crawler.clj ├── 29-interactivity.clj ├── 30-graffiti.clj ├── 31-street-music.clj ├── 32-mural.clj ├── 33-games-as-art.clj ├── 34-bottom-line.clj ├── 35-quest-quest.clj ├── 36-review.clj ├── 37-end.clj ├── README.md ├── core.clj ├── dungeon-crawler ├── 64x64.png ├── brick.png ├── brick1.png ├── brick2.png ├── brick3.png ├── brick4.png ├── brick5.png ├── brick6.png ├── catacomb.png ├── characters │ ├── elemental.png │ ├── goblin.png │ ├── magician.png │ ├── male_base.png │ ├── male_heavy.png │ ├── male_light.png │ ├── male_longbow.png │ ├── male_longsword.png │ ├── male_shield.png │ ├── male_staff.png │ ├── male_unarmored.png │ ├── ogre.png │ ├── skeleton.png │ ├── slime.png │ ├── werewolf.png │ └── zombie.png ├── cocutos.png ├── crypt.png ├── death.wav ├── gallery.png ├── gehena.png ├── hive.png ├── lair.png ├── lapis.png ├── level1.tmx ├── monsterhurt.wav ├── moss.png ├── mucus.png ├── normal.png ├── pandem1.png ├── pandem2.png ├── pandem3.png ├── pandem4.png ├── pandem6.png ├── playerhurt.wav ├── rock.png └── tunnel.png ├── images ├── braid.jpg ├── class1.jpg ├── class2.jpg ├── class3.jpg ├── clojure.png ├── defscreen.png ├── docs.png ├── graffiti.jpg ├── libgdx.png ├── lone-survivor.jpg ├── mural.jpg ├── on-render.png ├── on-show.png ├── papers-please.jpg ├── passage-gravitation.jpg ├── play-clj.png ├── shovel-knight.jpg ├── spelunky.jpg ├── street-music.jpg └── unity.png ├── particle-effect ├── fire.p ├── particle-cloud.png ├── particle-fire.png ├── particle-star.png └── particle.png ├── platformer ├── level.tmx ├── player_jump.png ├── player_stand.png ├── player_walk1.png ├── player_walk2.png ├── player_walk3.png └── tiles.png ├── quest-quest ├── first-enemy.png ├── jump.wav ├── koala_player.png ├── player.png ├── portrait.png ├── quester copy.png ├── quester.png ├── tile-map.png ├── tileSet.png └── world.tmx ├── settings.edn └── skin ├── droid_32.fnt ├── droid_32.png ├── droid_48.fnt ├── droid_48.png ├── droid_96.fnt ├── droid_961.png ├── droid_962.png ├── uiskin.atlas ├── uiskin.json └── uiskin.png /.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | -------------------------------------------------------------------------------- /01-title.clj: -------------------------------------------------------------------------------- 1 | (defscreen title-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(label (str "Making Games" \newline 9 | "at Runtime" \newline 10 | "with Clojure") 11 | ui-skin 12 | :set-alignment (align :center)) 13 | :row 14 | [(label "by Zach Oakes" small-style) 15 | :pad-top 10]] 16 | :align (align :center) 17 | :set-fill-parent true))) 18 | 19 | :on-render 20 | (fn [screen entities] 21 | (render! screen entities)) 22 | 23 | :on-resize 24 | (fn [screen entities] 25 | (height! screen (:height screen)))) 26 | -------------------------------------------------------------------------------- /02-about.clj: -------------------------------------------------------------------------------- 1 | (defscreen about-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "About me" medium-style) 11 | :row 12 | (label (str "Independent programmer" \newline 13 | "Used to do crypto/stego" \newline 14 | "Joined the dark side" \newline 15 | "Quit in 2012 and started using Clojure") 16 | small-style)] 17 | :align (align :center) 18 | :set-fill-parent true))) 19 | 20 | :on-render 21 | (fn [screen entities] 22 | (render! screen entities)) 23 | 24 | :on-resize 25 | (fn [screen entities] 26 | (height! screen (:height screen)))) 27 | -------------------------------------------------------------------------------- /03-projects.clj: -------------------------------------------------------------------------------- 1 | (defscreen projects-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "My Clojure Projects" medium-style) 11 | :row 12 | (label (str "Nightweb - anonymous networking client" \newline 13 | "Nightcode - IDE for beginners" \newline 14 | "play-clj - game library" \newline 15 | "Nightmod - game creation tool") 16 | small-style)] 17 | :align (align :center) 18 | :set-fill-parent true))) 19 | 20 | :on-render 21 | (fn [screen entities] 22 | (render! screen entities)) 23 | 24 | :on-resize 25 | (fn [screen entities] 26 | (height! screen (:height screen)))) 27 | -------------------------------------------------------------------------------- /04-gateway.clj: -------------------------------------------------------------------------------- 1 | (defscreen gateway-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Gamedev -> Clojure" medium-style) 11 | :row 12 | (label (str \newline 13 | "Gamedev is a gateway drug" \newline 14 | "Learned C++ at 15 by making games" \newline 15 | "A solid gamedev \"story\" is useful" \newline 16 | "Brings in new people from diverse backgrounds") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /05-class.clj: -------------------------------------------------------------------------------- 1 | (defscreen class-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(image "images/class2.jpg" :set-scaling (scaling :fit)) 9 | (image "images/class3.jpg" :set-scaling (scaling :fit)) 10 | :row 11 | (image "images/class1.jpg" :set-scaling (scaling :fit)) 12 | (label "Photo credit:\nAmbridge Connection" small-style)] 13 | :set-fill-parent true 14 | :pad (float 50) (float 0) (float 0) (float 0)))) 15 | 16 | :on-render 17 | (fn [screen entities] 18 | (render! screen entities)) 19 | 20 | :on-resize 21 | (fn [screen entities] 22 | (height! screen (:height screen)))) 23 | -------------------------------------------------------------------------------- /06-problem.clj: -------------------------------------------------------------------------------- 1 | (defscreen problem-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Clojure -> Gamedev" medium-style) 11 | :row 12 | (label (str \newline 13 | "Need to define what problem we're solving" \newline 14 | "Big budget (AAA) games are mostly stale" \newline 15 | "Only innovate in a narrow way (graphics)" \newline 16 | "Current gamedev tools are great for this") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /07-indie.clj: -------------------------------------------------------------------------------- 1 | (defscreen indie-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Indie Games" medium-style) 11 | :row 12 | (label (str \newline 13 | "Made by small teams and individuals" \newline 14 | "Fairly new category due to digital stores" \newline 15 | "Use simple graphics by necessity" \newline 16 | "Differentiate with gameplay, artistic merit") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /08-gameplay.clj: -------------------------------------------------------------------------------- 1 | (defscreen gameplay-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(stack [(image "images/braid.jpg" :set-scaling (scaling :fit)) 9 | (label "Braid (2008)" small-style 10 | :set-alignment (align :bottom-left))]) 11 | (stack [(image "images/spelunky.jpg" 12 | :set-scaling (scaling :fit)) 13 | (label "Spelunky (2009)" small-style 14 | :set-alignment (align :bottom-left))])] 15 | :set-fill-parent true))) 16 | 17 | :on-render 18 | (fn [screen entities] 19 | (render! screen entities)) 20 | 21 | :on-resize 22 | (fn [screen entities] 23 | (height! screen (:height screen)))) 24 | -------------------------------------------------------------------------------- /09-graphics.clj: -------------------------------------------------------------------------------- 1 | (defscreen graphics-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(stack [(image "images/lone-survivor.jpg" 9 | :set-scaling (scaling :fit)) 10 | (label "Lone Survivor (2012)" small-style 11 | :set-alignment (align :bottom-left))]) 12 | (stack [(image "images/shovel-knight.jpg" 13 | :set-scaling (scaling :fit)) 14 | (label "Shovel Knight (2014)" small-style 15 | :set-alignment (align :bottom-left))])] 16 | :set-fill-parent true))) 17 | 18 | :on-render 19 | (fn [screen entities] 20 | (render! screen entities)) 21 | 22 | :on-resize 23 | (fn [screen entities] 24 | (height! screen (:height screen)))) 25 | -------------------------------------------------------------------------------- /10-artistic.clj: -------------------------------------------------------------------------------- 1 | (defscreen artistic-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(stack [(image "images/passage-gravitation.jpg" 9 | :set-scaling (scaling :fit)) 10 | (label "Passage (2007) and Gravitation (2008)" small-style 11 | :set-alignment (align :bottom-left))]) 12 | (stack [(image "images/papers-please.jpg" 13 | :set-scaling (scaling :fit)) 14 | (label "Papers, Please (2013)" small-style 15 | :set-alignment (align :bottom-left))])] 16 | :set-fill-parent true))) 17 | 18 | :on-render 19 | (fn [screen entities] 20 | (render! screen entities)) 21 | 22 | :on-resize 23 | (fn [screen entities] 24 | (height! screen (:height screen)))) 25 | -------------------------------------------------------------------------------- /11-tools.clj: -------------------------------------------------------------------------------- 1 | (defscreen tools-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Tools for Gamedev" medium-style) 11 | :row 12 | (label (str \newline 13 | "1. Hosted languages" \newline 14 | "2. Functional & logic programming" \newline 15 | "3. Interactive programming") 16 | small-style)] 17 | :align (align :center) 18 | :set-fill-parent true))) 19 | 20 | :on-render 21 | (fn [screen entities] 22 | (render! screen entities)) 23 | 24 | :on-resize 25 | (fn [screen entities] 26 | (height! screen (:height screen)))) 27 | -------------------------------------------------------------------------------- /12-hosted.clj: -------------------------------------------------------------------------------- 1 | (defscreen hosted-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Hosted Languages in Games" medium-style) 11 | :row 12 | (label (str \newline 13 | "Gamedevs traditionally reject GC" \newline 14 | "Things have changed in last half-decade" \newline 15 | "Many indie games are now made in C# / Java" \newline 16 | "Indies have scarce resources, need to ship") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /13-unity-libgdx.clj: -------------------------------------------------------------------------------- 1 | (defscreen unity-libgdx-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(image "images/unity.png" :set-scaling (scaling :fit)) 9 | (image "images/libgdx.png" :set-scaling (scaling :fit)) 10 | :row 11 | (label "CLR / Mono" small-style) 12 | (label "JVM" small-style) 13 | :row 14 | (label "Desktop+Mobile+Web+Consoles" small-style) 15 | (label "Desktop+Mobile+Web" small-style) 16 | :row 17 | (label "2D+3D (focused on 3D)" small-style) 18 | (label "2D+3D (focused on 2D)" small-style) 19 | :row 20 | (label "Can use Clojure (via Arcadia)" small-style) 21 | (label "Can use Clojure (via play-clj or directly)" small-style)] 22 | :set-fill-parent true))) 23 | 24 | :on-render 25 | (fn [screen entities] 26 | (render! screen entities)) 27 | 28 | :on-resize 29 | (fn [screen entities] 30 | (height! screen (:height screen)))) 31 | -------------------------------------------------------------------------------- /14-good-hosted.clj: -------------------------------------------------------------------------------- 1 | (defscreen good-hosted-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "It's Good to be Hosted" medium-style) 11 | :row 12 | (label (str \newline 13 | "The argument has been turned on its head" \newline 14 | "Being hosted on CLR / JVM is huge advantage" \newline 15 | "Many alt langs are on their own island" \newline 16 | "Can make toy games, but shippable games are hard") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /15-play-clj-init.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-init-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Getting Started with play-clj" medium-style) 11 | :row 12 | (label (str \newline 13 | "lein new play-clj hello-world" \newline 14 | \newline 15 | "hello-world/" \newline 16 | " android/" \newline 17 | " desktop/" \newline 18 | " ios/" \newline 19 | \newline 20 | "Android uses lein-droid, iOS uses lein-fruit" \newline 21 | "Mobile is experimental" \newline 22 | "Web backend not supported (maybe later via TeaVM?)") 23 | small-style)] 24 | :align (align :center) 25 | :set-fill-parent true))) 26 | 27 | :on-render 28 | (fn [screen entities] 29 | (render! screen entities)) 30 | 31 | :on-resize 32 | (fn [screen entities] 33 | (height! screen (:height screen)))) 34 | -------------------------------------------------------------------------------- /16-play-clj-core.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-core-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Hello, World!" medium-style) 11 | :row 12 | (label (str \newline 13 | "desktop/src-common/hello_world/core.clj") 14 | small-style) 15 | :row 16 | (image "images/play-clj.png" :set-scaling (scaling :fit))] 17 | :align (align :center) 18 | :set-fill-parent true))) 19 | 20 | :on-render 21 | (fn [screen entities] 22 | (render! screen entities)) 23 | 24 | :on-resize 25 | (fn [screen entities] 26 | (height! screen (:height screen)))) 27 | -------------------------------------------------------------------------------- /17-play-clj-defscreen.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-defscreen-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [[(label "defscreen" medium-style) 11 | :colspan 2] 12 | :row 13 | [(image "images/defscreen.png" :set-scaling (scaling :fit)) 14 | :pad 5 5 5 5]] 15 | :align (align :center) 16 | :set-fill-parent true))) 17 | 18 | :on-render 19 | (fn [screen entities] 20 | (render! screen entities)) 21 | 22 | :on-resize 23 | (fn [screen entities] 24 | (height! screen (:height screen)))) 25 | -------------------------------------------------------------------------------- /18-play-clj-state.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-state-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "State in play-clj" medium-style) 11 | :row 12 | (label (str \newline 13 | "`screen` is a hash-map" \newline 14 | "`entities` is a vector") 15 | small-style) 16 | :row 17 | (image "images/on-show.png" :set-scaling (scaling :fit))] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /19-play-clj-transform.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-transform-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Transforming Entities" medium-style) 11 | :row 12 | (image "images/on-render.png" :set-scaling (scaling :fit))] 13 | :align (align :center) 14 | :set-fill-parent true))) 15 | 16 | :on-render 17 | (fn [screen entities] 18 | (render! screen entities)) 19 | 20 | :on-resize 21 | (fn [screen entities] 22 | (height! screen (:height screen)))) 23 | -------------------------------------------------------------------------------- /20-play-clj-entities.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-entities-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "What are entities?" medium-style) 11 | :row 12 | (label (str \newline 13 | "Records that implement the Entity protocol" \newline 14 | \newline 15 | "(shape :filled :set-color (color :red) :rect 0 0 10 10)" \newline 16 | "(texture \"image.png\")" \newline 17 | "(particle-effect \"particles/fire.p\")" \newline 18 | "; many other types of entities" \newline) 19 | small-style)] 20 | :align (align :center) 21 | :set-fill-parent true))) 22 | 23 | :on-render 24 | (fn [screen entities] 25 | (render! screen entities)) 26 | 27 | :on-resize 28 | (fn [screen entities] 29 | (height! screen (:height screen)))) 30 | 31 | (defscreen play-clj-entities-background-screen 32 | :on-show 33 | (fn [screen entities] 34 | (update! screen :renderer (stage) :camera (orthographic)) 35 | [(assoc (shape :filled 36 | :set-color (color :red) 37 | :rect 0 0 100 100) 38 | :x 100 :y 500) 39 | (assoc (texture "images/clojure.png") 40 | :x 100 :y 350 :width 100 :height 100) 41 | (assoc (particle-effect "particle-effect/fire.p") 42 | :x 150 :y 200)]) 43 | 44 | :on-render 45 | (fn [screen entities] 46 | (render! screen entities)) 47 | 48 | :on-resize 49 | (fn [screen entities] 50 | (height! screen (:height screen)))) 51 | -------------------------------------------------------------------------------- /21-play-clj-interop.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-interop-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "When :x and :y are not enough" medium-style) 11 | :row 12 | (label (str \newline 13 | "Entities contain Java object in :object key" \newline 14 | \newline 15 | "(let [entity (texture \"clojure.png\")] 16 | (doto ^TextureRegion (:object entity) 17 | (.flip true false) 18 | (.setRegion 0 0 100 100)) 19 | entity)") 20 | small-style)] 21 | :align (align :center) 22 | :set-fill-parent true))) 23 | 24 | :on-render 25 | (fn [screen entities] 26 | (render! screen entities)) 27 | 28 | :on-resize 29 | (fn [screen entities] 30 | (height! screen (:height screen)))) 31 | -------------------------------------------------------------------------------- /22-play-clj-dsl.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-dsl-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label (str "(texture \"clojure.png\" 11 | :flip true false 12 | :set-region 0 0 100 100)" \newline 13 | \newline 14 | "(let [entity (texture \"clojure.png\")] 15 | (doto ^TextureRegion (:object entity) 16 | (.flip true false) 17 | (.setRegion 0 0 100 100)) 18 | entity)") 19 | small-style)] 20 | :align (align :center) 21 | :set-fill-parent true))) 22 | 23 | :on-render 24 | (fn [screen entities] 25 | (render! screen entities)) 26 | 27 | :on-resize 28 | (fn [screen entities] 29 | (height! screen (:height screen)))) 30 | -------------------------------------------------------------------------------- /23-play-clj-dsl-bang.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-dsl-bang-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label (str "(texture! entity :set-region 0 0 100 100)" \newline 11 | \newline 12 | "(.setRegion ^TextureRegion (:object entity) 0 0 100 100)") 13 | small-style)] 14 | :align (align :center) 15 | :set-fill-parent true))) 16 | 17 | :on-render 18 | (fn [screen entities] 19 | (render! screen entities)) 20 | 21 | :on-resize 22 | (fn [screen entities] 23 | (height! screen (:height screen)))) 24 | -------------------------------------------------------------------------------- /24-play-clj-docs.clj: -------------------------------------------------------------------------------- 1 | (defscreen play-clj-docs-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :black))] 8 | (table [(image "images/docs.png" :set-scaling (scaling :fit))] 9 | :set-fill-parent true))) 10 | 11 | :on-render 12 | (fn [screen entities] 13 | (render! screen entities)) 14 | 15 | :on-resize 16 | (fn [screen entities] 17 | (height! screen (:height screen)))) 18 | -------------------------------------------------------------------------------- /25-platformer.clj: -------------------------------------------------------------------------------- 1 | ; utils 2 | 3 | (def ^:const vertical-tiles-p 20) 4 | (def ^:const duration-p 0.15) 5 | (def ^:const damping-p 0.5) 6 | (def ^:const max-velocity-p 14) 7 | (def ^:const max-jump-velocity-p 56) 8 | (def ^:const deceleration-p 0.9) 9 | (def ^:const gravity-p -2.5) 10 | 11 | (defn decelerate-p 12 | [velocity] 13 | (let [velocity (* velocity deceleration-p)] 14 | (if (< (Math/abs velocity) damping-p) 15 | 0 16 | velocity))) 17 | 18 | (defn get-x-velocity-p 19 | [entity] 20 | (if (:player? entity) 21 | (cond 22 | (key-pressed? :dpad-left) 23 | (* -1 max-velocity-p) 24 | (key-pressed? :dpad-right) 25 | max-velocity-p 26 | :else 27 | (:x-velocity entity)) 28 | (:x-velocity entity))) 29 | 30 | (defn get-y-velocity-p 31 | [entity] 32 | (if (:player? entity) 33 | (cond 34 | (and (:can-jump? entity) (key-pressed? :dpad-up)) 35 | max-jump-velocity-p 36 | :else 37 | (:y-velocity entity)) 38 | (:y-velocity entity))) 39 | 40 | (defn get-direction-p 41 | [entity] 42 | (cond 43 | (> (:x-velocity entity) 0) :right 44 | (< (:x-velocity entity) 0) :left 45 | :else (:direction entity))) 46 | 47 | (defn get-touching-tile-p 48 | [screen entity & layer-names] 49 | (let [layers (map #(tiled-map-layer screen %) layer-names)] 50 | (->> (for [tile-x (range (int (:x entity)) 51 | (+ (:x entity) (:width entity))) 52 | tile-y (range (int (:y entity)) 53 | (+ (:y entity) (:height entity)))] 54 | (some #(when (tiled-map-cell % tile-x tile-y) 55 | [tile-x tile-y]) 56 | layers)) 57 | (drop-while nil?) 58 | first))) 59 | 60 | ; entities 61 | 62 | (defn create-player-p 63 | [] 64 | (let [stand (texture "platformer/player_stand.png") 65 | jump (texture "platformer/player_jump.png") 66 | walk [(texture "platformer/player_walk1.png") 67 | (texture "platformer/player_walk2.png") 68 | (texture "platformer/player_walk3.png")]] 69 | (assoc stand 70 | :stand-right stand 71 | :stand-left (texture stand :flip true false) 72 | :jump-right jump 73 | :jump-left (texture jump :flip true false) 74 | :walk-right (animation duration-p 75 | walk 76 | :set-play-mode (play-mode :loop-pingpong)) 77 | :walk-left (animation duration-p 78 | (map #(texture % :flip true false) walk) 79 | :set-play-mode (play-mode :loop-pingpong)) 80 | :width 1 81 | :height (/ 26 18) 82 | :x-velocity 0 83 | :y-velocity 0 84 | :x 12 85 | :y 10 86 | :player? true 87 | :can-jump? false 88 | :direction :right))) 89 | 90 | (defn move-p 91 | [screen entity] 92 | (let [x-velocity (get-x-velocity-p entity) 93 | y-velocity (+ (get-y-velocity-p entity) gravity-p) 94 | x-change (* x-velocity (:delta-time screen)) 95 | y-change (* y-velocity (:delta-time screen))] 96 | (if (or (not= 0 x-change) (not= 0 y-change)) 97 | (assoc entity 98 | :x-velocity (decelerate-p x-velocity) 99 | :y-velocity (decelerate-p y-velocity) 100 | :x-change x-change 101 | :y-change y-change 102 | :x (+ (:x entity) x-change) 103 | :y (+ (:y entity) y-change) 104 | :can-jump? (if (> y-velocity 0) false (:can-jump? entity))) 105 | entity))) 106 | 107 | (defn animate-p 108 | [screen {:keys [x-velocity y-velocity 109 | stand-right stand-left 110 | jump-right jump-left 111 | walk-right walk-left] :as entity}] 112 | (let [direction (get-direction-p entity)] 113 | (merge entity 114 | (cond 115 | (not= y-velocity 0) 116 | (if (= direction :right) jump-right jump-left) 117 | (not= x-velocity 0) 118 | (if (= direction :right) 119 | (animation->texture screen walk-right) 120 | (animation->texture screen walk-left)) 121 | :else 122 | (if (= direction :right) stand-right stand-left)) 123 | {:direction direction}))) 124 | 125 | (defn prevent-move-p 126 | [screen entity] 127 | (let [old-x (- (:x entity) (:x-change entity)) 128 | old-y (- (:y entity) (:y-change entity)) 129 | entity-x (assoc entity :y old-y) 130 | entity-y (assoc entity :x old-x) 131 | up? (> (:y-change entity) 0)] 132 | (merge entity 133 | (when (get-touching-tile-p screen entity-x "walls") 134 | {:x-velocity 0 :x-change 0 :x old-x}) 135 | (when (get-touching-tile-p screen entity-y "walls") 136 | {:y-velocity 0 :y-change 0 :y old-y :can-jump? (not up?)})))) 137 | 138 | ; core 139 | 140 | (defn update-screen-p! 141 | [screen entities] 142 | (doseq [entity entities] 143 | (when (:player? entity) 144 | (position! screen (:x entity) (/ vertical-tiles-p 2)) 145 | (when (< (:y entity) (- (:height entity))) 146 | (restart-game!)))) 147 | entities) 148 | 149 | (defscreen platformer-screen 150 | :on-show 151 | (fn [screen entities] 152 | (update! screen 153 | :camera (orthographic) 154 | :renderer (orthogonal-tiled-map "platformer/level.tmx" 1/16)) 155 | (create-player-p)) 156 | 157 | :on-render 158 | (fn [screen entities] 159 | (clear! 0.5 0.5 1 1) 160 | (->> entities 161 | (map (fn [entity] 162 | (->> entity 163 | (move-p screen) 164 | (prevent-move-p screen) 165 | (animate-p screen)))) 166 | (render! screen) 167 | (update-screen-p! screen))) 168 | 169 | :on-resize 170 | (fn [screen entities] 171 | (height! screen vertical-tiles-p))) 172 | -------------------------------------------------------------------------------- /26-functional.clj: -------------------------------------------------------------------------------- 1 | (defscreen functional-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Functional Programming in Games" medium-style) 11 | :row 12 | (label (str \newline 13 | "Same benefits as in other kinds of software" \newline 14 | " Easy parallelism" \newline 15 | " Immutable entities simplify change (i.e., time rewinding)" \newline 16 | "Functional idioms are already being adopted" \newline 17 | " Carmack on functional prog in C++: http://goo.gl/oZvaon" \newline 18 | " ECS architecture replacing OO-style inheritance") 19 | small-style)] 20 | :align (align :center) 21 | :set-fill-parent true))) 22 | 23 | :on-render 24 | (fn [screen entities] 25 | (render! screen entities)) 26 | 27 | :on-resize 28 | (fn [screen entities] 29 | (height! screen (:height screen)))) 30 | -------------------------------------------------------------------------------- /27-logic.clj: -------------------------------------------------------------------------------- 1 | (defscreen logic-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Logic Programming in Games" medium-style) 11 | :row 12 | (label (str \newline 13 | "Representing Game Dialogue as Expressions in First-Order Logic" \newline 14 | " http://goo.gl/B6F0hH (via @swannodette)" \newline 15 | " by Kaylen Wheeler" \newline 16 | " Dialogues are data structures instead of strings" \newline 17 | "A Logical Approach to Building Dungeons" \newline 18 | " http://goo.gl/mBfLwO" \newline 19 | " by Anthony Smith and Joanna Bryson" \newline 20 | " Generating levels for a roguelike game" \newline) 21 | small-style)] 22 | :align (align :center) 23 | :set-fill-parent true))) 24 | 25 | :on-render 26 | (fn [screen entities] 27 | (render! screen entities)) 28 | 29 | :on-resize 30 | (fn [screen entities] 31 | (height! screen (:height screen)))) 32 | -------------------------------------------------------------------------------- /28-dungeon-crawler.clj: -------------------------------------------------------------------------------- 1 | ; utils 2 | 3 | (def ^:const vertical-tiles 4) 4 | (def ^:const pixels-per-tile 64) 5 | (def ^:const duration 0.2) 6 | (def ^:const damping 0.5) 7 | (def ^:const deceleration 0.9) 8 | (def ^:const map-width 40) 9 | (def ^:const map-height 40) 10 | (def ^:const aggro-distance 2) 11 | (def ^:const attack-distance 0.25) 12 | (def ^:const grid-tile-size 256) 13 | (def ^:const directions [:w :nw :n :ne 14 | :e :se :s :sw]) 15 | (def ^:const velocities [[-1 0] [-1 1] [0 1] [1 1] 16 | [1 0] [1 -1] [0 -1] [-1 -1]]) 17 | 18 | (def ^:const bar-w 20) 19 | (def ^:const bar-h 80) 20 | (def ^:const npc-bar-h 0.1) 21 | 22 | (defn on-layer? 23 | [screen {:keys [width height] :as entity} & layer-names] 24 | (let [{:keys [x y]} (screen->isometric screen entity) 25 | layers (map #(tiled-map-layer screen %) layer-names)] 26 | (->> (for [tile-x (range (int x) (+ x width)) 27 | tile-y (range (int y) (+ y height))] 28 | (-> (some #(tiled-map-cell % tile-x tile-y) layers) 29 | nil? 30 | not)) 31 | (filter identity) 32 | first 33 | nil? 34 | not))) 35 | 36 | (defn entity-rect 37 | [{:keys [x y x-feet y-feet width height]} min-distance] 38 | (rectangle (- (+ x x-feet) 39 | (/ min-distance 4)) 40 | (- (+ y y-feet) 41 | (/ min-distance 4)) 42 | (- (+ width (/ min-distance 2)) 43 | (* 2 x-feet)) 44 | (- (+ height (/ min-distance 2)) 45 | (* 2 y-feet)))) 46 | 47 | (defn near-entity? 48 | [e e2 min] 49 | (and (not= (:id e) (:id e2)) 50 | (> (:health e2) 0) 51 | (rectangle! (entity-rect e min) :overlaps (entity-rect e2 min)))) 52 | 53 | (defn near-entities? 54 | [entities entity min-distance] 55 | (some #(near-entity? entity % min-distance) entities)) 56 | 57 | (defn invalid-location? 58 | [screen entities entity] 59 | (or (near-entities? entities entity 0) 60 | (on-layer? screen entity "walls"))) 61 | 62 | (defn decelerate 63 | [velocity] 64 | (let [velocity (* velocity deceleration)] 65 | (if (< (Math/abs velocity) damping) 66 | 0 67 | velocity))) 68 | 69 | (defn ^:private get-player-velocity 70 | [{:keys [x-velocity y-velocity max-velocity]}] 71 | (if (and (game :touched?) (button-pressed? :left)) 72 | (let [x (float (- (game :x) (/ (game :width) 2))) 73 | y (float (- (game :y) (/ (game :height) 2))) 74 | x-adjust (* max-velocity (Math/abs (double (/ x y)))) 75 | y-adjust (* max-velocity (Math/abs (double (/ y x))))] 76 | [(* (Math/signum x) (min max-velocity x-adjust)) 77 | (* (Math/signum y) (min max-velocity y-adjust))]) 78 | [(cond 79 | (key-pressed? :dpad-left) (* -1 max-velocity) 80 | (key-pressed? :dpad-right) max-velocity 81 | :else x-velocity) 82 | (cond 83 | (key-pressed? :dpad-down) (* -1 max-velocity) 84 | (key-pressed? :dpad-up) max-velocity 85 | :else y-velocity)])) 86 | 87 | (defn ^:private get-npc-axis-velocity 88 | [{:keys [max-velocity]} diff] 89 | (cond 90 | (> diff attack-distance) (* -1 max-velocity) 91 | (< diff (* -1 attack-distance)) max-velocity 92 | :else 0)) 93 | 94 | (defn ^:private get-npc-aggro-velocity 95 | [npc me] 96 | (let [r1 (entity-rect npc attack-distance) 97 | r2 (entity-rect me attack-distance) 98 | x-diff (- (rectangle! r1 :get-x) (rectangle! r2 :get-x)) 99 | y-diff (- (rectangle! r1 :get-y) (rectangle! r2 :get-y))] 100 | (if-not (rectangle! r1 :overlaps r2) 101 | [(get-npc-axis-velocity npc x-diff) 102 | (get-npc-axis-velocity npc y-diff)] 103 | [0 0]))) 104 | 105 | (defn ^:private get-npc-velocity 106 | [entities {:keys [last-attack attack-interval 107 | x-velocity y-velocity max-velocity] 108 | :as entity}] 109 | (let [me (find-first :player? entities)] 110 | (if (near-entity? entity me aggro-distance) 111 | (get-npc-aggro-velocity entity me) 112 | (if (>= last-attack attack-interval) 113 | [(* max-velocity (- (rand-int 3) 1)) 114 | (* max-velocity (- (rand-int 3) 1))] 115 | [x-velocity y-velocity])))) 116 | 117 | (defn get-velocity 118 | [entities {:keys [player? npc?] :as entity}] 119 | (cond 120 | player? (get-player-velocity entity) 121 | npc? (get-npc-velocity entities entity) 122 | :else [0 0])) 123 | 124 | (defn get-direction 125 | [x-velocity y-velocity] 126 | (some->> velocities 127 | (filter (fn [[x y]] 128 | (and (= x (int (Math/signum (float x-velocity)))) 129 | (= y (int (Math/signum (float y-velocity))))))) 130 | first 131 | (.indexOf velocities) 132 | (nth directions))) 133 | 134 | (defn get-direction-to-entity 135 | [{:keys [x y x-feet y-feet last-direction] :as e} e2] 136 | (or (get-direction (- (+ (:x e2) (:x-feet e2)) (+ x x-feet)) 137 | (- (+ (:y e2) (:y-feet e2)) (+ y y-feet))) 138 | last-direction)) 139 | 140 | (defn find-id 141 | [entities id] 142 | (find-first #(= id (:id %)) entities)) 143 | 144 | (defn split-texture 145 | [path size mask-size] 146 | (let [start (/ (- size mask-size) 2) 147 | grid (texture! (texture path) :split size size)] 148 | (doseq [row grid 149 | item row] 150 | (texture! item :set-region item start start mask-size mask-size)) 151 | grid)) 152 | 153 | (defn can-attack? 154 | [e e2] 155 | (and e2 156 | (not= (:npc? e) (:npc? e2)) 157 | (> (:health e) 0) 158 | (>= (:last-attack e) (:attack-interval e)) 159 | (near-entity? e e2 attack-distance))) 160 | 161 | (defn get-entity-at-cursor 162 | [screen entities] 163 | (let [coords (input->screen screen (input! :get-x) (input! :get-y))] 164 | (find-first (fn [{:keys [x y width height npc? health] :as entity}] 165 | (-> (rectangle x y width height) 166 | (rectangle! :contains (:x coords) (:y coords)) 167 | (and npc? (> health 0)))) 168 | entities))) 169 | 170 | ; entities 171 | 172 | (defn create 173 | [grid mask-size] 174 | (let [moves (zipmap directions 175 | (map #(animation duration (take 4 %)) grid)) 176 | attacks (zipmap directions (map #(texture (nth % 4)) grid)) 177 | specials (zipmap directions (map #(texture (nth % 5)) grid)) 178 | hits (zipmap directions (map #(texture (nth % 6)) grid)) 179 | deads (zipmap directions (map #(texture (nth % 7)) grid)) 180 | texture-size (/ mask-size grid-tile-size) 181 | start-direction :s] 182 | (assoc (texture (get-in grid [(.indexOf directions start-direction) 0])) 183 | :width texture-size 184 | :height texture-size 185 | :moves moves 186 | :attacks attacks 187 | :specials specials 188 | :hits hits 189 | :deads deads 190 | :x-velocity 0 191 | :y-velocity 0 192 | :x-feet 0 193 | :y-feet 0 194 | :last-attack 0 195 | :attack-interval 1 196 | :direction start-direction 197 | :health 10 198 | :wounds 0 199 | :damage 2))) 200 | 201 | (defn create-player 202 | [] 203 | (let [path "dungeon-crawler/characters/male_light.png" 204 | mask-size 128 205 | grid (split-texture path grid-tile-size mask-size)] 206 | (assoc (create grid mask-size) 207 | :player? true 208 | :max-velocity 2 209 | :attack-interval 0.25 210 | :health 40 211 | :hurt-sound (sound "dungeon-crawler/playerhurt.wav") 212 | :death-sound (sound "dungeon-crawler/death.wav")))) 213 | 214 | (defn create-npc 215 | [path] 216 | (let [mask-size 256 217 | grid (split-texture path grid-tile-size mask-size)] 218 | (assoc (create grid mask-size) 219 | :npc? true 220 | :max-velocity 2 221 | :x-feet 0.35 222 | :y-feet 0.35 223 | :hurt-sound (sound "dungeon-crawler/monsterhurt.wav")))) 224 | 225 | (defn create-ogre 226 | [] 227 | (assoc (create-npc "dungeon-crawler/characters/ogre.png") 228 | :type :ogre 229 | :max-velocity 1)) 230 | 231 | (defn create-elemental 232 | [] 233 | (assoc (create-npc "dungeon-crawler/characters/elemental.png") 234 | :type :elemental)) 235 | 236 | (defn create-magician 237 | [] 238 | (assoc (create-npc "dungeon-crawler/characters/magician.png") 239 | :type :magician)) 240 | 241 | (defn create-skeleton 242 | [] 243 | (assoc (create-npc "dungeon-crawler/characters/skeleton.png") 244 | :type :skeleton)) 245 | 246 | (defn create-zombie 247 | [] 248 | (assoc (create-npc "dungeon-crawler/characters/zombie.png") 249 | :type :zombie)) 250 | 251 | (defn create-werewolf 252 | [] 253 | (assoc (create-npc "dungeon-crawler/characters/werewolf.png") 254 | :type :werewolf 255 | :width 2 256 | :height 2)) 257 | 258 | (defn update-health-bar 259 | [bar entity] 260 | (when entity 261 | (let [bar-x (:x entity) 262 | bar-y (+ (:y entity) (:height entity)) 263 | bar-w (:width entity) 264 | pct (/ (:health entity) (+ (:health entity) (:wounds entity)))] 265 | (shape bar 266 | :set-color (color :red) 267 | :rect bar-x bar-y bar-w npc-bar-h 268 | :set-color (color :green) 269 | :rect bar-x bar-y (* bar-w pct) npc-bar-h)))) 270 | 271 | (defn move 272 | [{:keys [delta-time]} entities {:keys [x y health] :as entity}] 273 | (let [[x-velocity y-velocity] (get-velocity entities entity) 274 | x-change (* x-velocity delta-time) 275 | y-change (* y-velocity delta-time)] 276 | (cond 277 | (= health 0) 278 | (assoc entity :x-velocity 0 :y-velocity 0) 279 | (or (not= 0 x-change) (not= 0 y-change)) 280 | (assoc entity 281 | :x-velocity (decelerate x-velocity) 282 | :y-velocity (decelerate y-velocity) 283 | :x-change x-change 284 | :y-change y-change 285 | :x (+ x x-change) 286 | :y (+ y y-change)) 287 | :else 288 | entity))) 289 | 290 | (defn ^:private recover 291 | [{:keys [last-attack health direction] :as entity}] 292 | (if (and (>= last-attack 0.5) (> health 0)) 293 | (merge entity 294 | (-> (get-in entity [:moves direction]) 295 | (animation! :get-key-frame 0) 296 | texture)) 297 | entity)) 298 | 299 | (defn animate 300 | [screen {:keys [x-velocity y-velocity] :as entity}] 301 | (if-let [direction (get-direction x-velocity y-velocity)] 302 | (let [anim (get-in entity [:moves direction])] 303 | (merge entity 304 | (animation->texture screen anim) 305 | {:direction direction})) 306 | (recover entity))) 307 | 308 | (defn prevent-move 309 | [screen entities {:keys [x y x-change y-change] :as entity}] 310 | (let [old-x (- x x-change) 311 | old-y (- y y-change) 312 | x-entity (assoc entity :y old-y) 313 | y-entity (assoc entity :x old-x)] 314 | (merge entity 315 | (when (invalid-location? screen entities x-entity) 316 | {:x-velocity 0 :x-change 0 :x old-x}) 317 | (when (invalid-location? screen entities y-entity) 318 | {:y-velocity 0 :y-change 0 :y old-y})))) 319 | 320 | (defn adjust 321 | [{:keys [delta-time]} {:keys [last-attack attack-interval npc?] :as entity}] 322 | (assoc entity 323 | :last-attack (if (and npc? (>= last-attack attack-interval)) 324 | 0 325 | (+ last-attack delta-time)))) 326 | 327 | (defn attack 328 | [screen {:keys [x y x-feet y-feet damage] :as attacker} victim entities] 329 | (map (fn [{:keys [id direction] :as e}] 330 | (cond 331 | (= id (:id attacker)) 332 | (let [direction (or (when victim 333 | (get-direction-to-entity attacker victim)) 334 | direction)] 335 | (merge e 336 | {:last-attack 0 337 | :direction direction} 338 | (when (> (:health e) 0) 339 | (get-in e [:attacks direction])))) 340 | (= id (:id victim)) 341 | (if attacker 342 | (let [health (max 0 (- (:health victim) damage))] 343 | (merge e 344 | {:last-attack 0 345 | :health health 346 | :wounds (+ (:wounds victim) damage) 347 | :play-sound (if (and (= health 0) (:death-sound victim)) 348 | (:death-sound victim) 349 | (:hurt-sound victim))} 350 | (if (> health 0) 351 | (get-in e [:hits direction]) 352 | (get-in e [:deads direction])))) 353 | e) 354 | :else 355 | e)) 356 | entities)) 357 | 358 | ; rooms 359 | 360 | (require '[clojure.core.logic :as l] 361 | 'clojure.set) 362 | 363 | (def ^:const cols 4) 364 | (def ^:const rows 4) 365 | (def ^:const size 10) 366 | 367 | (defn find-valid-rooms 368 | [screen rooms entities entity] 369 | (l/run* [q] 370 | (l/membero q rooms) 371 | (l/featurec q {:start? false}) 372 | (l/fresh [e type] 373 | (l/== e entity) 374 | (l/featurec e {:type type}) 375 | (l/project [type] 376 | (l/featurec q {:end? (= type :werewolf)}))))) 377 | 378 | (defn locations 379 | [room] 380 | (let [room-x (* size (:x room)) 381 | room-y (* size (:y room))] 382 | (for [tile-x (range room-x (+ room-x size)) 383 | tile-y (range room-y (+ room-y size))] 384 | {:x tile-x :y tile-y}))) 385 | 386 | (defn randomize-location 387 | [screen rooms entities {:keys [width height] :as entity}] 388 | (->> (find-valid-rooms screen rooms entities entity) 389 | (map locations) 390 | flatten 391 | (map (partial isometric->screen screen)) 392 | shuffle 393 | (drop-while #(invalid-location? screen entities (merge entity %))) 394 | first 395 | (merge entity))) 396 | 397 | (defn randomize-locations 398 | [screen rooms entities entity] 399 | (conj entities 400 | (-> (if (:npc? entity) 401 | (randomize-location screen rooms entities entity) 402 | entity) 403 | (assoc :id (count entities))))) 404 | 405 | (defn get-rand-neighbor 406 | [rooms {:keys [x y] :as room}] 407 | (try 408 | (->> #{(assoc room :x (- x 1)) 409 | (assoc room :y (- y 1)) 410 | (assoc room :x (+ x 1)) 411 | (assoc room :y (+ y 1))} 412 | (clojure.set/intersection (set rooms)) 413 | vec 414 | rand-nth) 415 | (catch Exception _))) 416 | 417 | (defn connect-room! 418 | [screen r1 r2] 419 | (let [rand-spot (+ 1 (rand-int (- size 3))) 420 | x-diff (- (:x r2) (:x r1)) 421 | y-diff (- (:y r2) (:y r1))] 422 | (doseq [i (range size) 423 | :let [x (+ (* (:x r1) size) 424 | rand-spot 425 | (* x-diff i)) 426 | y (+ (* (:y r1) size) 427 | rand-spot 428 | (* y-diff i))]] 429 | (doto (tiled-map-layer screen "walls") 430 | (tiled-map-layer! :set-cell x y nil) 431 | (tiled-map-layer! :set-cell (+ x 1) y nil) 432 | (tiled-map-layer! :set-cell x (+ y 1) nil) 433 | (tiled-map-layer! :set-cell (+ x 1) (+ y 1) nil))))) 434 | 435 | (defn connect-rooms! 436 | [screen rooms room] 437 | (let [visited-room (assoc room :visited? true :end? false) 438 | rooms (map #(if (= % room) visited-room %) rooms)] 439 | (if-let [next-room (get-rand-neighbor rooms room)] 440 | (do 441 | (connect-room! screen room next-room) 442 | (loop [rooms rooms] 443 | (let [new-rooms (connect-rooms! screen rooms next-room)] 444 | (if (= rooms new-rooms) 445 | rooms 446 | (recur new-rooms))))) 447 | (if (-> (filter :end? rooms) count (> 0)) 448 | rooms 449 | (map #(if (= % visited-room) (assoc % :end? true) %) rooms))))) 450 | 451 | ; core 452 | 453 | (declare dungeon-crawler-screen dungeon-crawler-overlay-screen) 454 | 455 | (defn update-screen! 456 | [screen entities] 457 | (doseq [{:keys [x y player?]} entities] 458 | (when player? 459 | (position! screen x y))) 460 | entities) 461 | 462 | (defn play-sounds! 463 | [entities] 464 | (doseq [{:keys [play-sound]} entities] 465 | (when play-sound 466 | (sound! play-sound :play))) 467 | (map #(dissoc % :play-sound) entities)) 468 | 469 | (defn render-everything! 470 | [screen entities] 471 | (->> (find-first #(= (:id %) (:mouse-npc-id screen)) entities) 472 | (update-health-bar (:npc-health-bar screen)) 473 | (conj entities) 474 | (render-sorted! screen ["walls"])) 475 | entities) 476 | 477 | (defscreen dungeon-crawler-screen 478 | :on-show 479 | (fn [screen entities] 480 | (let [renderer (isometric-tiled-map "dungeon-crawler/level1.tmx" (/ 1 pixels-per-tile)) 481 | screen (update! screen 482 | :camera (orthographic) 483 | :npc-health-bar (shape :filled) 484 | :renderer renderer) 485 | start-room {:x (rand-int rows) 486 | :y (rand-int cols)} 487 | start-player-x (+ (* (:x start-room) size) 488 | (/ size 2)) 489 | start-player-y (+ (* (:y start-room) size) 490 | (/ size 2)) 491 | rooms (for [row (range rows) 492 | col (range cols)] 493 | {:x row :y col}) 494 | rooms (connect-rooms! screen rooms start-room) 495 | rooms (map #(assoc % :start? (and (= (:x %) (:x start-room)) 496 | (= (:y %) (:y start-room)))) 497 | rooms) 498 | me (assoc (create-player) 499 | :x start-player-x 500 | :y start-player-y)] 501 | (->> [(isometric->screen screen me) 502 | (take 5 (repeat (create-ogre))) 503 | (take 5 (repeat (create-elemental))) 504 | (take 5 (repeat (create-magician))) 505 | (take 5 (repeat (create-skeleton))) 506 | (take 5 (repeat (create-zombie))) 507 | (create-werewolf)] 508 | flatten 509 | (reduce #(randomize-locations screen rooms %1 %2) [])))) 510 | 511 | :on-render 512 | (fn [screen entities] 513 | (clear!) 514 | (let [me (find-first :player? entities)] 515 | (screen! dungeon-crawler-overlay-screen :on-update-health-bar :entity me) 516 | (->> (map (fn [entity] 517 | (->> entity 518 | (move screen entities) 519 | (animate screen) 520 | (prevent-move screen entities) 521 | (adjust screen))) 522 | entities) 523 | (attack screen (find-first #(can-attack? % me) entities) me) 524 | play-sounds! 525 | (render-everything! screen) 526 | (update-screen! screen)))) 527 | 528 | :on-resize 529 | (fn [screen entities] 530 | (height! screen vertical-tiles)) 531 | 532 | :on-touch-down 533 | (fn [screen entities] 534 | (when (= (:button screen) (button-code :right)) 535 | (let [me (find-first :player? entities) 536 | victim (get-entity-at-cursor screen entities) 537 | victim (when (can-attack? me victim) victim)] 538 | (attack screen me victim entities)))) 539 | 540 | :on-mouse-moved 541 | (fn [screen entities] 542 | (let [e (get-entity-at-cursor screen entities)] 543 | (update! screen :mouse-npc-id (:id e)) 544 | nil))) 545 | 546 | (defscreen dungeon-crawler-overlay-screen 547 | :on-show 548 | (fn [screen entities] 549 | (update! screen :camera (orthographic) :renderer (stage)) 550 | [(assoc (label "0" (color :white)) 551 | :id :fps 552 | :x 5) 553 | (assoc (shape :filled) 554 | :id :bar 555 | :x 5 556 | :y 40)]) 557 | 558 | :on-render 559 | (fn [screen entities] 560 | (->> (for [entity entities] 561 | (case (:id entity) 562 | :fps (doto entity (label! :set-text (str (game :fps)))) 563 | entity)) 564 | (render! screen))) 565 | 566 | :on-resize 567 | (fn [screen entities] 568 | (height! screen 300)) 569 | 570 | ; custom function that is invoked in main-screen 571 | :on-update-health-bar 572 | (fn [screen entities] 573 | (for [entity entities] 574 | (case (:id entity) 575 | :bar (let [me (:entity screen) 576 | pct (/ (:health me) (+ (:health me) (:wounds me)))] 577 | (shape entity 578 | :set-color (color :red) 579 | :rect 0 0 bar-w bar-h 580 | :set-color (color :green) 581 | :rect 0 0 bar-w (* bar-h pct))) 582 | entity)))) 583 | -------------------------------------------------------------------------------- /29-interactivity.clj: -------------------------------------------------------------------------------- 1 | (defscreen interactivity-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Interactivity" medium-style) 11 | :row 12 | (label (str \newline 13 | "Biggest selling point; it changes the end product" \newline 14 | "Interactivity is not hot-swapping" \newline 15 | "It's the REPL, stupid!" \newline 16 | "Particularly important for art (Overtone, Quil)") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /30-graffiti.clj: -------------------------------------------------------------------------------- 1 | (defscreen graffiti-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(image "images/graffiti.jpg" :set-scaling (scaling :fit)) 9 | :row 10 | (label "Photo credit:\nMatt Niemi (flickr.com/photos/niemster)" small-style)] 11 | :set-fill-parent true))) 12 | 13 | :on-render 14 | (fn [screen entities] 15 | (render! screen entities)) 16 | 17 | :on-resize 18 | (fn [screen entities] 19 | (height! screen (:height screen)))) 20 | -------------------------------------------------------------------------------- /31-street-music.clj: -------------------------------------------------------------------------------- 1 | (defscreen street-music-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(image "images/street-music.jpg" :set-scaling (scaling :fit)) 9 | :row 10 | (label "Photo credit:\nLaura M. on yelp.com (http://goo.gl/lfMSHt)" small-style)] 11 | :set-fill-parent true))) 12 | 13 | :on-render 14 | (fn [screen entities] 15 | (render! screen entities)) 16 | 17 | :on-resize 18 | (fn [screen entities] 19 | (height! screen (:height screen)))) 20 | -------------------------------------------------------------------------------- /32-mural.clj: -------------------------------------------------------------------------------- 1 | (defscreen mural-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | small-font (skin! ui-skin :get-font "small-font") 7 | small-style (style :label small-font (color :white))] 8 | (table [(image "images/mural.jpg" :set-scaling (scaling :fit)) 9 | :row 10 | (label "Photo credit:\nreddit.com/u/bigbadwimp" small-style)] 11 | :set-fill-parent true))) 12 | 13 | :on-render 14 | (fn [screen entities] 15 | (render! screen entities)) 16 | 17 | :on-resize 18 | (fn [screen entities] 19 | (height! screen (:height screen)))) 20 | -------------------------------------------------------------------------------- /33-games-as-art.clj: -------------------------------------------------------------------------------- 1 | (defscreen games-as-art-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Games as Art" medium-style) 11 | :row 12 | (label (str \newline 13 | "Art is the selective imitation of reality" \newline 14 | "Ebert claimed games can't be art: http://goo.gl/AfSQ39" \newline 15 | "He was right...about games today" \newline 16 | "But as a medium they are capable of it") 17 | small-style)] 18 | :align (align :center) 19 | :set-fill-parent true))) 20 | 21 | :on-render 22 | (fn [screen entities] 23 | (render! screen entities)) 24 | 25 | :on-resize 26 | (fn [screen entities] 27 | (height! screen (:height screen)))) 28 | -------------------------------------------------------------------------------- /34-bottom-line.clj: -------------------------------------------------------------------------------- 1 | (defscreen bottom-line-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "The Bottom Line" medium-style) 11 | :row 12 | (label (str \newline 13 | "Interactivity helps you write any kind of code" \newline 14 | "For games, it also helps you get the right \"feel\"" \newline 15 | "It conforms to the way art has always been made") 16 | small-style)] 17 | :align (align :center) 18 | :set-fill-parent true))) 19 | 20 | :on-render 21 | (fn [screen entities] 22 | (render! screen entities)) 23 | 24 | :on-resize 25 | (fn [screen entities] 26 | (height! screen (:height screen)))) 27 | -------------------------------------------------------------------------------- /35-quest-quest.clj: -------------------------------------------------------------------------------- 1 | ; quests 2 | 3 | (def quests 4 | [{:title "Welcome to Quest Quest!" 5 | :body "" 6 | :reward "Falling Unlocked!"}]) 7 | 8 | ; ui 9 | 10 | (defn make-unit-frames 11 | "Initialzes the unit frames, starting information is hardcoded." 12 | [] 13 | (table [:row [(assoc (label (str "HP: " 10) 14 | (color :white)) 15 | :id :health)] 16 | :row [(assoc (label (str "MP: " 10) 17 | (color :white)) 18 | :id :mana)] 19 | :row [(assoc (label (str "LVL: " 1) 20 | (color :white)) 21 | :id :level)]] 22 | :set-position 40 355)) 23 | 24 | (defn make-quest-table 25 | [{:keys [title body]}] 26 | (let [title-label (assoc (label title 27 | (color :white) 28 | :set-scale 1.2 1.2) 29 | :id :quest-title) 30 | body-label (assoc (label body 31 | (color :white)) 32 | :id :quest-body)] 33 | (table [:row [title-label] 34 | :row [body-label]] 35 | :set-position 400 366))) 36 | 37 | (defn make-fps 38 | [] 39 | (assoc (label "0" (color :white)) 40 | :id :fps 41 | :x 5)) 42 | 43 | #_(defn update-all-elements 44 | [screen entities] 45 | (refresh-unit-frames) 46 | (refresh-quest)) 47 | 48 | ; utils 49 | 50 | ;;; Screen vars 51 | (def vertical-tiles-q 12) 52 | (def pixels-per-tile-q 32) 53 | (def camera-height-q 6) 54 | 55 | ;;; Physics vars 56 | (def duration-q 0.15) 57 | (def damping-q 0.5) 58 | (def max-velocity-q 8) 59 | (def max-jump-velocity-q 24) 60 | (def gravity-q -1.5) 61 | (def deceleration-q 0.9) 62 | 63 | ;;; Input handlers 64 | (defn touched-q? 65 | [key] 66 | (and (game :touched?) 67 | (case key 68 | :down (< (game :y) (/ (game :height) 3)) 69 | :up (> (game :y) (* (game :height) (/ 2 3))) 70 | :left (< (game :x) (/ (game :width) 3)) 71 | :right (> (game :x) (* (game :width) (/ 2 3))) 72 | false))) 73 | 74 | ;;; Camera controls 75 | (defn move-camera-q! 76 | "The camera tracks the player if above 8 or 0. It Centers the camera on the world when player is below 8." 77 | [screen x y] 78 | (if (< y camera-height-q) 79 | (if (pos? y) 80 | (position! screen x camera-height-q)) 81 | (position! screen x y))) 82 | 83 | ;;; World handlers 84 | (defn out-of-bounds-q? 85 | [y height] 86 | (< y (- height))) 87 | 88 | ;;; Movement handlers 89 | (defn decelerate-q 90 | [velocity] 91 | (let [velocity (* velocity deceleration-q)] 92 | (if (< (Math/abs velocity) damping-q) 93 | 0 94 | velocity))) 95 | 96 | (defn get-x-velocity-q 97 | [{:keys [id x-velocity]}] 98 | (case id 99 | :player (cond 100 | (or (key-pressed? :dpad-left) (touched-q? :left)) 101 | (* -1 max-velocity-q) 102 | (or (key-pressed? :dpad-right) (touched-q? :right)) 103 | max-velocity-q 104 | :else 105 | x-velocity) 106 | x-velocity)) 107 | 108 | (defn get-y-velocity-q 109 | [{:keys [id y-velocity can-jump?]}] 110 | (case id 111 | :player (cond 112 | (and can-jump? (or (key-pressed? :dpad-up) (touched-q? :up))) 113 | max-jump-velocity-q 114 | :else 115 | y-velocity) 116 | y-velocity)) 117 | 118 | (defn get-direction-q 119 | [{:keys [x-velocity direction]}] 120 | (cond 121 | (pos? x-velocity) :right 122 | (neg? x-velocity) :left 123 | :else 124 | direction)) 125 | 126 | (defn get-touching-tile-q 127 | [screen {:keys [x y width height]} & layer-names] 128 | (let [layers (map #(tiled-map-layer screen %) layer-names)] 129 | (->> (for [tile-x (range (int x) (+ x width)) 130 | tile-y (range (int y) (+ y height))] 131 | (some #(when (tiled-map-cell % tile-x tile-y) 132 | [tile-x tile-y]) 133 | layers)) 134 | (drop-while nil?) 135 | first))) 136 | 137 | (defn properties->hash-map 138 | [properties] 139 | (apply hash-map (interleave (map keyword (.getKeys properties)) 140 | (.getValues properties)))) 141 | 142 | (defn downscale-x-and-y 143 | [properties] 144 | (assoc properties 145 | :x (/ (:x properties) pixels-per-tile-q) 146 | :y (/ (:y properties) pixels-per-tile-q))) 147 | 148 | (defn make-checkpoint 149 | [map-object] 150 | (let [checkpoint (bean map-object)] 151 | (merge checkpoint (-> (properties->hash-map (:properties checkpoint)) 152 | downscale-x-and-y)))) 153 | 154 | ;; FIXME 155 | (defn- touching-checkpoint? 156 | [entity checkpoint] 157 | (or (>= (:x checkpoint) (:x entity)) 158 | (>= (:y checkpoint) (:y entity)) 159 | (>= (:height checkpoint) (:height entity)) 160 | (>= (:width checkpoint) (:width entity)))) 161 | 162 | (defn get-touching-checkpoint-q 163 | "Loads the checkpoints layer from the tile map on the main-screen." 164 | [screen entity] 165 | (let [objects (map-objects (tiled-map-layer screen "checkpoints")) 166 | checkpoints (map make-checkpoint objects)] 167 | (filter #(touching-checkpoint? entity %) checkpoints))) 168 | 169 | (defn near-entity-q? 170 | [{:keys [x y id] :as e} e2 min-distance] 171 | (and (not= id (:id e2)) 172 | (nil? (:draw-time e2)) 173 | (pos? (:health e2)) 174 | (< (Math/abs ^double (- x (:x e2))) min-distance) 175 | (< (Math/abs ^double (- y (:y e2))) min-distance))) 176 | 177 | ;; FIXME near should be touching 178 | (defn near-entities-q? 179 | [entities entity min-distance] 180 | (some #(near-entity-q? entity % min-distance) entities)) 181 | 182 | ;;; Combat handlers 183 | (defn fight [e1 e2]) 184 | 185 | #_(defn process-fighting 186 | [e1 e2] 187 | (when (and (touching? e1 e2) 188 | (not (have-fought? e1 e2))) 189 | (fight e1 e2))) 190 | 191 | (defn process-damage 192 | [{:keys [health wounds] :as entity}] 193 | (assoc entity :health (- health wounds))) 194 | 195 | ; entities 196 | 197 | (defn create-player-q 198 | [{:keys [level image x y]}] 199 | (assoc image 200 | :id :player 201 | :x x 202 | :y y 203 | :width 2 204 | :height 2 205 | :x-velocity 0 206 | :y-velocity 0 207 | :level level 208 | :health (* 10 level) 209 | :wounds 0 210 | :can-jump? false 211 | :direction :left 212 | :right image 213 | :left (texture image :flip true false) 214 | :jump-sound (sound "quest-quest/jump.wav"))) 215 | 216 | (defn create-enemy-q 217 | [{:keys [image level x y id]}] 218 | (assoc image 219 | :id id 220 | :x x 221 | :y y 222 | :level level 223 | :x-velocity 0 224 | :y-velocity 0 225 | :width 1 226 | :height level 227 | :direction :right 228 | :health (* 10 level) 229 | :wounds 0)) 230 | 231 | (defn level-up 232 | [screen {:keys [player? level] :as entity}] 233 | (if player? 234 | (assoc entity 235 | :level (inc level)) 236 | entity)) 237 | 238 | (defn ^:private enable-jump? 239 | [y-velocity can-jump?] 240 | (if (pos? y-velocity) 241 | false 242 | can-jump?)) 243 | 244 | (defn move-q 245 | [{:keys [delta-time]} {:keys [x y can-jump?] :as entity}] 246 | (let [x-velocity (get-x-velocity-q entity) 247 | y-velocity (+ (get-y-velocity-q entity) gravity-q) 248 | x-change (* x-velocity delta-time) 249 | y-change (* y-velocity delta-time)] 250 | (if (or (not= 0 x-change) 251 | (not= 0 y-change)) 252 | (assoc entity 253 | :x-velocity (decelerate-q x-velocity) 254 | :y-velocity (decelerate-q y-velocity) 255 | :x-change x-change 256 | :y-change y-change 257 | :x (+ x x-change) 258 | :y (+ y y-change) 259 | :can-jump? (enable-jump? y-velocity can-jump?)) 260 | entity))) 261 | 262 | (defn prevent-move-q 263 | [screen {:keys [x y x-change y-change] :as entity}] 264 | (let [old-x (- x x-change) 265 | old-y (- y y-change) 266 | entity-x (assoc entity :y old-y) 267 | entity-y (assoc entity :x old-x) 268 | up? (> y-change 0)] 269 | (merge entity 270 | (when (get-touching-tile-q screen entity-x "walls") 271 | {:x-velocity 0 :x-change 0 :x old-x}) 272 | (when-let [tile (get-touching-tile-q screen entity-y "walls")] 273 | {:y-velocity 0 :y-change 0 :y old-y :can-jump? (not up?)})))) 274 | 275 | (defn animate-q 276 | [screen {:keys [x-velocity y-velocity 277 | right left] :as entity}] 278 | (let [direction (get-direction-q entity)] 279 | (merge entity 280 | (if (= direction :right) right left) 281 | {:direction direction}))) 282 | 283 | (defn spawn-all 284 | "returns a vector containing all of the starting entities" 285 | [] 286 | (vector (create-player-q {:image (texture "quest-quest/quester.png") :level 1 :x 20 :y 69}) 287 | (create-enemy-q {:image (texture "quest-quest/first-enemy.png") :level 1 :id :enemy-first :x 45 :y 10}) 288 | (create-enemy-q {:image (texture "quest-quest/first-enemy.png") :level 2 :id :enemy-second :x 60 :y 10}) 289 | (create-enemy-q {:image (texture "quest-quest/first-enemy.png") :level 3 :id :enemy-three :x 75 :y 10}) 290 | (create-enemy-q {:image (texture "quest-quest/first-enemy.png") :level 10 :id :boss :x 200 :y 80}))) 291 | 292 | ; core 293 | 294 | (declare main-screen ui-screen) 295 | 296 | (defn update-screen-q! 297 | "Used in the render function to focus the camera on the player and reset 298 | the screen if the player goes out of bounds." 299 | [screen entities] 300 | (doseq [{:keys [x y height id]} entities] 301 | (case id 302 | :player (do 303 | (move-camera-q! screen x y) 304 | (when (out-of-bounds-q? y height) 305 | (restart-game!))) 306 | entities)) 307 | entities) 308 | 309 | (defn play-sounds-q! 310 | [entities] 311 | (doseq [{:keys [play-sound]} entities] 312 | (when play-sound 313 | (sound! play-sound :play))) 314 | (map #(dissoc % :play-sound) entities)) 315 | 316 | (defscreen quest-quest-screen 317 | :on-show 318 | (fn [screen entities] 319 | (update! screen :camera (orthographic)) 320 | (update! screen :renderer (orthogonal-tiled-map "quest-quest/world.tmx" (/ 1 pixels-per-tile-q))) 321 | (spawn-all)) 322 | 323 | :on-render 324 | (fn [screen entities] 325 | (clear! (/ 135 255) (/ 206 255) (/ 235 255) 100) 326 | #_(screen! ui-screen :on-update-ui :entities entities) 327 | 328 | (->> entities 329 | (map (fn [entity] 330 | (->> entity 331 | #_(level-up screen) 332 | (move-q screen) 333 | (prevent-move-q screen) 334 | (animate-q screen)))) 335 | play-sounds-q! 336 | (render! screen) 337 | (update-screen-q! screen))) 338 | 339 | :on-resize 340 | (fn [{:keys [width height] :as screen} entities] 341 | (height! screen vertical-tiles-q) 342 | nil)) 343 | 344 | (defscreen quest-quest-ui-screen 345 | :on-show 346 | (fn [screen entities] 347 | (update! screen :camera (orthographic) :renderer (stage)) 348 | (vector (make-quest-table (first quests)) 349 | (make-unit-frames) 350 | (make-fps))) 351 | 352 | :on-render 353 | (fn [screen entities] 354 | (render! screen 355 | (for [entity entities] 356 | (case (:id entity) 357 | :fps (doto entity (label! :set-text (str (game :fps)))) 358 | entity)))) 359 | 360 | :on-resize 361 | (fn [{:keys [width height] :as screen} entities] 362 | (height! screen (:height screen)) 363 | nil) 364 | 365 | :on-update-ui 366 | (fn [screen entities] 367 | #_(update-all-elements screen entities))) 368 | -------------------------------------------------------------------------------- /36-review.clj: -------------------------------------------------------------------------------- 1 | (defscreen review-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "Review" medium-style) 11 | :row 12 | (label (str \newline 13 | "1. Hosted languages (don't reinvent the wheel)" \newline 14 | "2. Functional & logic programming (new abstractions)" \newline 15 | "3. Interactive programming (games as art)") 16 | small-style)] 17 | :align (align :center) 18 | :set-fill-parent true))) 19 | 20 | :on-render 21 | (fn [screen entities] 22 | (render! screen entities)) 23 | 24 | :on-resize 25 | (fn [screen entities] 26 | (height! screen (:height screen)))) 27 | -------------------------------------------------------------------------------- /37-end.clj: -------------------------------------------------------------------------------- 1 | (defscreen end-screen 2 | :on-show 3 | (fn [screen entities] 4 | (update! screen :renderer (stage) :camera (orthographic)) 5 | (let [ui-skin (skin "skin/uiskin.json") 6 | medium-font (skin! ui-skin :get-font "medium-font") 7 | medium-style (style :label medium-font (color :white)) 8 | small-font (skin! ui-skin :get-font "small-font") 9 | small-style (style :label small-font (color :white))] 10 | (table [(label "The End" medium-style) 11 | :row 12 | (label (str \newline 13 | "https://github.com/oakes/clojure-conj-2014" \newline 14 | "zsoakes@gmail.com" \newline) 15 | small-style)] 16 | :align (align :center) 17 | :set-fill-parent true))) 18 | 19 | :on-render 20 | (fn [screen entities] 21 | (render! screen entities)) 22 | 23 | :on-resize 24 | (fn [screen entities] 25 | (height! screen (:height screen)))) 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | These are my slides for Clojure/conj 2014. You can view them in Nightmod by copying the ".git" address and then clicking "Download" on the home screen. 4 | 5 | ## Licensing 6 | 7 | * All files that originate from this project are dedicated to the public domain. 8 | * The platformer game uses [this bird](http://opengameart.org/content/blue-bird-for-jump-and-run-arcade) and [this tileset](http://opengameart.org/content/old-frogatto-tile-art). 9 | * The dungeon crawler game uses [this character set](http://opengameart.org/content/isometric-hero-and-creatures) and [this tileset](http://opengameart.org/content/64x64-isometric-roguelike-tiles). 10 | * The [Quest Quest](https://github.com/mkcp/quest-quest) game is courtesy of Mike Patella (graphic art by Steven Fick). 11 | -------------------------------------------------------------------------------- /core.clj: -------------------------------------------------------------------------------- 1 | (load-game-file "01-title.clj") 2 | (load-game-file "02-about.clj") 3 | (load-game-file "03-projects.clj") 4 | (load-game-file "04-gateway.clj") 5 | (load-game-file "05-class.clj") 6 | (load-game-file "06-problem.clj") 7 | (load-game-file "07-indie.clj") 8 | (load-game-file "08-gameplay.clj") 9 | (load-game-file "09-graphics.clj") 10 | (load-game-file "10-artistic.clj") 11 | (load-game-file "11-tools.clj") 12 | (load-game-file "12-hosted.clj") 13 | (load-game-file "13-unity-libgdx.clj") 14 | (load-game-file "14-good-hosted.clj") 15 | (load-game-file "15-play-clj-init.clj") 16 | (load-game-file "16-play-clj-core.clj") 17 | (load-game-file "17-play-clj-defscreen.clj") 18 | (load-game-file "18-play-clj-state.clj") 19 | (load-game-file "19-play-clj-transform.clj") 20 | (load-game-file "20-play-clj-entities.clj") 21 | (load-game-file "21-play-clj-interop.clj") 22 | (load-game-file "22-play-clj-dsl.clj") 23 | (load-game-file "23-play-clj-dsl-bang.clj") 24 | (load-game-file "24-play-clj-docs.clj") 25 | (load-game-file "25-platformer.clj") 26 | (load-game-file "26-functional.clj") 27 | (load-game-file "27-logic.clj") 28 | (load-game-file "28-dungeon-crawler.clj") 29 | (load-game-file "29-interactivity.clj") 30 | (load-game-file "30-graffiti.clj") 31 | (load-game-file "31-street-music.clj") 32 | (load-game-file "32-mural.clj") 33 | (load-game-file "33-games-as-art.clj") 34 | (load-game-file "34-bottom-line.clj") 35 | (load-game-file "35-quest-quest.clj") 36 | (load-game-file "36-review.clj") 37 | (load-game-file "37-end.clj") 38 | 39 | (declare background-screen) 40 | 41 | (def slides [[title-screen] 42 | [about-screen] 43 | [projects-screen] 44 | [gateway-screen] 45 | [class-screen] 46 | [problem-screen] 47 | [indie-screen] 48 | [gameplay-screen] 49 | [graphics-screen] 50 | [artistic-screen] 51 | [tools-screen] 52 | [hosted-screen] 53 | [unity-libgdx-screen] 54 | [good-hosted-screen] 55 | [play-clj-init-screen] 56 | [play-clj-core-screen] 57 | [play-clj-defscreen-screen] 58 | [play-clj-state-screen] 59 | [play-clj-transform-screen] 60 | [play-clj-entities-background-screen play-clj-entities-screen] 61 | [play-clj-interop-screen] 62 | [play-clj-dsl-screen] 63 | [play-clj-dsl-bang-screen] 64 | [play-clj-docs-screen] 65 | [platformer-screen] 66 | [functional-screen] 67 | [logic-screen] 68 | [dungeon-crawler-screen dungeon-crawler-overlay-screen] 69 | [interactivity-screen] 70 | [graffiti-screen] 71 | [street-music-screen] 72 | [mural-screen] 73 | [games-as-art-screen] 74 | [bottom-line-screen] 75 | [quest-quest-screen quest-quest-ui-screen] 76 | [review-screen] 77 | [end-screen]]) 78 | 79 | (defn slide-num 80 | [] 81 | (or (:slide (game-pref)) 1)) 82 | 83 | (defn set-slide! 84 | [n] 85 | (when-let [screens (get slides (- n 1))] 86 | (game-pref! :slide n) 87 | (apply set-game-screen! background-screen screens))) 88 | 89 | (defscreen background-screen 90 | :on-show 91 | (fn [screen entities] 92 | (update! screen :renderer (stage) :camera (orthographic)) 93 | (assoc (shape :filled) :id :background)) 94 | 95 | :on-render 96 | (fn [screen entities] 97 | (clear!) 98 | (render! screen entities)) 99 | 100 | :on-resize 101 | (fn [{:keys [width height] :as screen} entities] 102 | (height! screen height) 103 | (let [c1 (color :black) 104 | c2 (color 79/256 90/256 100/256 1)] 105 | (for [e entities] 106 | (case (:id e) 107 | :background (shape e :rect 0 0 width height c1 c1 c2 c2) 108 | e)))) 109 | 110 | :on-key-down 111 | (fn [screen entities] 112 | (cond 113 | (= (:key screen) (key-code :space)) 114 | (set-slide! (+ (slide-num) 1)) 115 | (= (:key screen) (key-code :backspace)) 116 | (set-slide! (- (slide-num) 1))))) 117 | 118 | (set-slide! (slide-num)) 119 | -------------------------------------------------------------------------------- /dungeon-crawler/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/64x64.png -------------------------------------------------------------------------------- /dungeon-crawler/brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick.png -------------------------------------------------------------------------------- /dungeon-crawler/brick1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick1.png -------------------------------------------------------------------------------- /dungeon-crawler/brick2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick2.png -------------------------------------------------------------------------------- /dungeon-crawler/brick3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick3.png -------------------------------------------------------------------------------- /dungeon-crawler/brick4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick4.png -------------------------------------------------------------------------------- /dungeon-crawler/brick5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick5.png -------------------------------------------------------------------------------- /dungeon-crawler/brick6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/brick6.png -------------------------------------------------------------------------------- /dungeon-crawler/catacomb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/catacomb.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/elemental.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/elemental.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/goblin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/goblin.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/magician.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/magician.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_base.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_heavy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_heavy.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_light.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_longbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_longbow.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_longsword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_longsword.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_shield.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_staff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_staff.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/male_unarmored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/male_unarmored.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/ogre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/ogre.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/skeleton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/skeleton.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/slime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/slime.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/werewolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/werewolf.png -------------------------------------------------------------------------------- /dungeon-crawler/characters/zombie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/characters/zombie.png -------------------------------------------------------------------------------- /dungeon-crawler/cocutos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/cocutos.png -------------------------------------------------------------------------------- /dungeon-crawler/crypt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/crypt.png -------------------------------------------------------------------------------- /dungeon-crawler/death.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/death.wav -------------------------------------------------------------------------------- /dungeon-crawler/gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/gallery.png -------------------------------------------------------------------------------- /dungeon-crawler/gehena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/gehena.png -------------------------------------------------------------------------------- /dungeon-crawler/hive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/hive.png -------------------------------------------------------------------------------- /dungeon-crawler/lair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/lair.png -------------------------------------------------------------------------------- /dungeon-crawler/lapis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/lapis.png -------------------------------------------------------------------------------- /dungeon-crawler/level1.tmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | eJzt0LEJAEAMA7GskP2X/RE+kCYYGa5T5a6qPt5vHMdxqU67pj9zHMelOe2a/sxxHJfmtGv6M8dxXJq73AOhgiZB 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /dungeon-crawler/monsterhurt.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/monsterhurt.wav -------------------------------------------------------------------------------- /dungeon-crawler/moss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/moss.png -------------------------------------------------------------------------------- /dungeon-crawler/mucus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/mucus.png -------------------------------------------------------------------------------- /dungeon-crawler/normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/normal.png -------------------------------------------------------------------------------- /dungeon-crawler/pandem1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/pandem1.png -------------------------------------------------------------------------------- /dungeon-crawler/pandem2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/pandem2.png -------------------------------------------------------------------------------- /dungeon-crawler/pandem3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/pandem3.png -------------------------------------------------------------------------------- /dungeon-crawler/pandem4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/pandem4.png -------------------------------------------------------------------------------- /dungeon-crawler/pandem6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/pandem6.png -------------------------------------------------------------------------------- /dungeon-crawler/playerhurt.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/playerhurt.wav -------------------------------------------------------------------------------- /dungeon-crawler/rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/rock.png -------------------------------------------------------------------------------- /dungeon-crawler/tunnel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/dungeon-crawler/tunnel.png -------------------------------------------------------------------------------- /images/braid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/braid.jpg -------------------------------------------------------------------------------- /images/class1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/class1.jpg -------------------------------------------------------------------------------- /images/class2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/class2.jpg -------------------------------------------------------------------------------- /images/class3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/class3.jpg -------------------------------------------------------------------------------- /images/clojure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/clojure.png -------------------------------------------------------------------------------- /images/defscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/defscreen.png -------------------------------------------------------------------------------- /images/docs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/docs.png -------------------------------------------------------------------------------- /images/graffiti.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/graffiti.jpg -------------------------------------------------------------------------------- /images/libgdx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/libgdx.png -------------------------------------------------------------------------------- /images/lone-survivor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/lone-survivor.jpg -------------------------------------------------------------------------------- /images/mural.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/mural.jpg -------------------------------------------------------------------------------- /images/on-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/on-render.png -------------------------------------------------------------------------------- /images/on-show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/on-show.png -------------------------------------------------------------------------------- /images/papers-please.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/papers-please.jpg -------------------------------------------------------------------------------- /images/passage-gravitation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/passage-gravitation.jpg -------------------------------------------------------------------------------- /images/play-clj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/play-clj.png -------------------------------------------------------------------------------- /images/shovel-knight.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/shovel-knight.jpg -------------------------------------------------------------------------------- /images/spelunky.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/spelunky.jpg -------------------------------------------------------------------------------- /images/street-music.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/street-music.jpg -------------------------------------------------------------------------------- /images/unity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/images/unity.png -------------------------------------------------------------------------------- /particle-effect/fire.p: -------------------------------------------------------------------------------- 1 | simple 2 | - Delay - 3 | active: false 4 | - Duration - 5 | lowMin: 1000.0 6 | lowMax: 1000.0 7 | - Count - 8 | min: 0 9 | max: 1000 10 | - Emission - 11 | lowMin: 0.0 12 | lowMax: 0.0 13 | highMin: 10.0 14 | highMax: 10.0 15 | relative: false 16 | scalingCount: 1 17 | scaling0: 1.0 18 | timelineCount: 1 19 | timeline0: 0.0 20 | - Life - 21 | lowMin: 0.0 22 | lowMax: 0.0 23 | highMin: 1000.0 24 | highMax: 1000.0 25 | relative: false 26 | scalingCount: 1 27 | scaling0: 1.0 28 | timelineCount: 1 29 | timeline0: 0.0 30 | - Life Offset - 31 | active: false 32 | - X Offset - 33 | active: false 34 | - Y Offset - 35 | active: false 36 | - Spawn Shape - 37 | shape: point 38 | - Spawn Width - 39 | lowMin: 0.0 40 | lowMax: 0.0 41 | highMin: 0.0 42 | highMax: 0.0 43 | relative: false 44 | scalingCount: 1 45 | scaling0: 1.0 46 | timelineCount: 1 47 | timeline0: 0.0 48 | - Spawn Height - 49 | lowMin: 0.0 50 | lowMax: 0.0 51 | highMin: 0.0 52 | highMax: 0.0 53 | relative: false 54 | scalingCount: 1 55 | scaling0: 1.0 56 | timelineCount: 1 57 | timeline0: 0.0 58 | - Scale - 59 | lowMin: 0.0 60 | lowMax: 0.0 61 | highMin: 32.0 62 | highMax: 32.0 63 | relative: false 64 | scalingCount: 1 65 | scaling0: 1.0 66 | timelineCount: 1 67 | timeline0: 0.0 68 | - Velocity - 69 | active: true 70 | lowMin: 0.0 71 | lowMax: 0.0 72 | highMin: 120.0 73 | highMax: 120.0 74 | relative: false 75 | scalingCount: 1 76 | scaling0: 1.0 77 | timelineCount: 1 78 | timeline0: 0.0 79 | - Angle - 80 | active: true 81 | lowMin: 0.0 82 | lowMax: 0.0 83 | highMin: 1.0 84 | highMax: 360.0 85 | relative: false 86 | scalingCount: 1 87 | scaling0: 1.0 88 | timelineCount: 1 89 | timeline0: 0.0 90 | - Rotation - 91 | active: false 92 | - Wind - 93 | active: false 94 | - Gravity - 95 | active: false 96 | - Tint - 97 | colorsCount: 3 98 | colors0: 1.0 99 | colors1: 1.0 100 | colors2: 1.0 101 | timelineCount: 1 102 | timeline0: 0.0 103 | - Transparency - 104 | lowMin: 0.0 105 | lowMax: 0.0 106 | highMin: 1.0 107 | highMax: 1.0 108 | relative: false 109 | scalingCount: 4 110 | scaling0: 0.0 111 | scaling1: 1.0 112 | scaling2: 1.0 113 | scaling3: 0.0 114 | timelineCount: 4 115 | timeline0: 0.0 116 | timeline1: 0.26712328 117 | timeline2: 0.72602737 118 | timeline3: 1.0 119 | - Options - 120 | attached: false 121 | continuous: true 122 | aligned: false 123 | additive: true 124 | behind: false 125 | - Image Path - 126 | particle.png 127 | 128 | 129 | fire 130 | - Delay - 131 | active: false 132 | - Duration - 133 | lowMin: 1.0 134 | lowMax: 1.0 135 | - Count - 136 | min: 0 137 | max: 1000 138 | - Emission - 139 | lowMin: 0.0 140 | lowMax: 0.0 141 | highMin: 10.0 142 | highMax: 10.0 143 | relative: false 144 | scalingCount: 1 145 | scaling0: 1.0 146 | timelineCount: 1 147 | timeline0: 0.0 148 | - Life - 149 | lowMin: 0.0 150 | lowMax: 0.0 151 | highMin: 1000.0 152 | highMax: 1000.0 153 | relative: false 154 | scalingCount: 1 155 | scaling0: 1.0 156 | timelineCount: 1 157 | timeline0: 0.0 158 | - Life Offset - 159 | active: false 160 | - X Offset - 161 | active: false 162 | - Y Offset - 163 | active: false 164 | - Spawn Shape - 165 | shape: point 166 | - Spawn Width - 167 | lowMin: 0.0 168 | lowMax: 0.0 169 | highMin: 0.0 170 | highMax: 0.0 171 | relative: false 172 | scalingCount: 1 173 | scaling0: 1.0 174 | timelineCount: 1 175 | timeline0: 0.0 176 | - Spawn Height - 177 | lowMin: 0.0 178 | lowMax: 0.0 179 | highMin: 0.0 180 | highMax: 0.0 181 | relative: false 182 | scalingCount: 1 183 | scaling0: 1.0 184 | timelineCount: 1 185 | timeline0: 0.0 186 | - Scale - 187 | lowMin: 0.0 188 | lowMax: 0.0 189 | highMin: 80.0 190 | highMax: 80.0 191 | relative: false 192 | scalingCount: 1 193 | scaling0: 1.0 194 | timelineCount: 1 195 | timeline0: 0.0 196 | - Velocity - 197 | active: true 198 | lowMin: 0.0 199 | lowMax: 0.0 200 | highMin: 50.0 201 | highMax: 50.0 202 | relative: false 203 | scalingCount: 1 204 | scaling0: 1.0 205 | timelineCount: 1 206 | timeline0: 0.0 207 | - Angle - 208 | active: true 209 | lowMin: 0.0 210 | lowMax: 0.0 211 | highMin: 1.0 212 | highMax: 360.0 213 | relative: false 214 | scalingCount: 1 215 | scaling0: 1.0 216 | timelineCount: 1 217 | timeline0: 0.0 218 | - Rotation - 219 | active: true 220 | lowMin: 1.0 221 | lowMax: 360.0 222 | highMin: -180.0 223 | highMax: 180.0 224 | relative: true 225 | scalingCount: 2 226 | scaling0: 0.0 227 | scaling1: 1.0 228 | timelineCount: 2 229 | timeline0: 0.0 230 | timeline1: 1.0 231 | - Wind - 232 | active: false 233 | - Gravity - 234 | active: false 235 | - Tint - 236 | colorsCount: 3 237 | colors0: 1.0 238 | colors1: 0.3372549 239 | colors2: 0.0 240 | timelineCount: 1 241 | timeline0: 0.0 242 | - Transparency - 243 | lowMin: 0.0 244 | lowMax: 0.0 245 | highMin: 1.0 246 | highMax: 1.0 247 | relative: false 248 | scalingCount: 3 249 | scaling0: 1.0 250 | scaling1: 1.0 251 | scaling2: 0.0 252 | timelineCount: 3 253 | timeline0: 0.0 254 | timeline1: 0.6712329 255 | timeline2: 1.0 256 | - Options - 257 | attached: true 258 | continuous: true 259 | aligned: false 260 | additive: true 261 | behind: false 262 | - Image Path - 263 | particle-fire.png 264 | 265 | 266 | stars 267 | - Delay - 268 | active: false 269 | - Duration - 270 | lowMin: 1.0 271 | lowMax: 1.0 272 | - Count - 273 | min: 0 274 | max: 1000 275 | - Emission - 276 | lowMin: 0.0 277 | lowMax: 0.0 278 | highMin: 10.0 279 | highMax: 10.0 280 | relative: false 281 | scalingCount: 1 282 | scaling0: 1.0 283 | timelineCount: 1 284 | timeline0: 0.0 285 | - Life - 286 | lowMin: 0.0 287 | lowMax: 0.0 288 | highMin: 1000.0 289 | highMax: 1500.0 290 | relative: false 291 | scalingCount: 1 292 | scaling0: 1.0 293 | timelineCount: 1 294 | timeline0: 0.0 295 | - Life Offset - 296 | active: false 297 | - X Offset - 298 | active: false 299 | - Y Offset - 300 | active: false 301 | - Spawn Shape - 302 | shape: point 303 | - Spawn Width - 304 | lowMin: 0.0 305 | lowMax: 0.0 306 | highMin: 0.0 307 | highMax: 0.0 308 | relative: false 309 | scalingCount: 1 310 | scaling0: 1.0 311 | timelineCount: 1 312 | timeline0: 0.0 313 | - Spawn Height - 314 | lowMin: 0.0 315 | lowMax: 0.0 316 | highMin: 0.0 317 | highMax: 0.0 318 | relative: false 319 | scalingCount: 1 320 | scaling0: 1.0 321 | timelineCount: 1 322 | timeline0: 0.0 323 | - Scale - 324 | lowMin: 0.0 325 | lowMax: 0.0 326 | highMin: 64.0 327 | highMax: 64.0 328 | relative: false 329 | scalingCount: 6 330 | scaling0: 0.0 331 | scaling1: 1.0 332 | scaling2: 0.33333334 333 | scaling3: 1.0 334 | scaling4: 0.4509804 335 | scaling5: 1.0 336 | timelineCount: 6 337 | timeline0: 0.0 338 | timeline1: 0.12328767 339 | timeline2: 0.28767124 340 | timeline3: 0.4041096 341 | timeline4: 0.5753425 342 | timeline5: 0.70547944 343 | - Velocity - 344 | active: true 345 | lowMin: 0.0 346 | lowMax: 0.0 347 | highMin: 100.0 348 | highMax: 120.0 349 | relative: false 350 | scalingCount: 1 351 | scaling0: 1.0 352 | timelineCount: 1 353 | timeline0: 0.0 354 | - Angle - 355 | active: true 356 | lowMin: 1.0 357 | lowMax: 360.0 358 | highMin: -180.0 359 | highMax: 180.0 360 | relative: true 361 | scalingCount: 2 362 | scaling0: 0.0 363 | scaling1: 1.0 364 | timelineCount: 2 365 | timeline0: 0.0 366 | timeline1: 0.51369864 367 | - Rotation - 368 | active: true 369 | lowMin: 1.0 370 | lowMax: 360.0 371 | highMin: -360.0 372 | highMax: 360.0 373 | relative: true 374 | scalingCount: 2 375 | scaling0: 0.0 376 | scaling1: 1.0 377 | timelineCount: 2 378 | timeline0: 0.0 379 | timeline1: 1.0 380 | - Wind - 381 | active: false 382 | - Gravity - 383 | active: false 384 | - Tint - 385 | colorsCount: 9 386 | colors0: 0.0 387 | colors1: 0.105882354 388 | colors2: 1.0 389 | colors3: 0.0 390 | colors4: 1.0 391 | colors5: 0.09803922 392 | colors6: 1.0 393 | colors7: 0.0 394 | colors8: 0.0 395 | timelineCount: 3 396 | timeline0: 0.0 397 | timeline1: 0.63705105 398 | timeline2: 1.0 399 | - Transparency - 400 | lowMin: 0.0 401 | lowMax: 0.0 402 | highMin: 1.0 403 | highMax: 1.0 404 | relative: false 405 | scalingCount: 5 406 | scaling0: 1.0 407 | scaling1: 1.0 408 | scaling2: 0.0 409 | scaling3: 0.0 410 | scaling4: 1.0 411 | timelineCount: 5 412 | timeline0: 0.0 413 | timeline1: 0.34246576 414 | timeline2: 0.74657536 415 | timeline3: 0.9315069 416 | timeline4: 1.0 417 | - Options - 418 | attached: false 419 | continuous: true 420 | aligned: false 421 | additive: true 422 | behind: false 423 | - Image Path - 424 | particle-star.png 425 | 426 | 427 | smoke 428 | - Delay - 429 | active: false 430 | - Duration - 431 | lowMin: 1.0 432 | lowMax: 1.0 433 | - Count - 434 | min: 0 435 | max: 1000 436 | - Emission - 437 | lowMin: 0.0 438 | lowMax: 0.0 439 | highMin: 3.0 440 | highMax: 3.0 441 | relative: false 442 | scalingCount: 1 443 | scaling0: 1.0 444 | timelineCount: 1 445 | timeline0: 0.0 446 | - Life - 447 | lowMin: 0.0 448 | lowMax: 0.0 449 | highMin: 3000.0 450 | highMax: 3000.0 451 | relative: false 452 | scalingCount: 1 453 | scaling0: 1.0 454 | timelineCount: 1 455 | timeline0: 0.0 456 | - Life Offset - 457 | active: false 458 | - X Offset - 459 | active: false 460 | - Y Offset - 461 | active: false 462 | - Spawn Shape - 463 | shape: square 464 | - Spawn Width - 465 | lowMin: 0.0 466 | lowMax: 0.0 467 | highMin: 180.0 468 | highMax: 180.0 469 | relative: false 470 | scalingCount: 1 471 | scaling0: 1.0 472 | timelineCount: 1 473 | timeline0: 0.0 474 | - Spawn Height - 475 | lowMin: 0.0 476 | lowMax: 0.0 477 | highMin: 110.0 478 | highMax: 110.0 479 | relative: false 480 | scalingCount: 1 481 | scaling0: 1.0 482 | timelineCount: 1 483 | timeline0: 0.0 484 | - Scale - 485 | lowMin: 0.0 486 | lowMax: 0.0 487 | highMin: 256.0 488 | highMax: 256.0 489 | relative: false 490 | scalingCount: 1 491 | scaling0: 1.0 492 | timelineCount: 1 493 | timeline0: 0.0 494 | - Velocity - 495 | active: true 496 | lowMin: -25.0 497 | lowMax: -25.0 498 | highMin: 25.0 499 | highMax: 25.0 500 | relative: false 501 | scalingCount: 2 502 | scaling0: 0.0 503 | scaling1: 1.0 504 | timelineCount: 2 505 | timeline0: 0.0 506 | timeline1: 1.0 507 | - Angle - 508 | active: true 509 | lowMin: 0.0 510 | lowMax: 0.0 511 | highMin: 1.0 512 | highMax: 360.0 513 | relative: false 514 | scalingCount: 1 515 | scaling0: 1.0 516 | timelineCount: 1 517 | timeline0: 0.0 518 | - Rotation - 519 | active: true 520 | lowMin: 1.0 521 | lowMax: 360.0 522 | highMin: -30.0 523 | highMax: 30.0 524 | relative: true 525 | scalingCount: 2 526 | scaling0: 0.0 527 | scaling1: 1.0 528 | timelineCount: 2 529 | timeline0: 0.0 530 | timeline1: 1.0 531 | - Wind - 532 | active: false 533 | - Gravity - 534 | active: false 535 | - Tint - 536 | colorsCount: 6 537 | colors0: 1.0 538 | colors1: 0.0 539 | colors2: 0.0 540 | colors3: 1.0 541 | colors4: 0.9843137 542 | colors5: 0.0 543 | timelineCount: 2 544 | timeline0: 0.0 545 | timeline1: 1.0 546 | - Transparency - 547 | lowMin: 0.0 548 | lowMax: 0.0 549 | highMin: 1.0 550 | highMax: 1.0 551 | relative: false 552 | scalingCount: 3 553 | scaling0: 0.0 554 | scaling1: 0.49122807 555 | scaling2: 0.0 556 | timelineCount: 3 557 | timeline0: 0.0 558 | timeline1: 0.5068493 559 | timeline2: 1.0 560 | - Options - 561 | attached: false 562 | continuous: true 563 | aligned: false 564 | additive: true 565 | behind: false 566 | - Image Path - 567 | particle-cloud.png 568 | -------------------------------------------------------------------------------- /particle-effect/particle-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/particle-effect/particle-cloud.png -------------------------------------------------------------------------------- /particle-effect/particle-fire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/particle-effect/particle-fire.png -------------------------------------------------------------------------------- /particle-effect/particle-star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/particle-effect/particle-star.png -------------------------------------------------------------------------------- /particle-effect/particle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/particle-effect/particle.png -------------------------------------------------------------------------------- /platformer/level.tmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | eJzt2DkKwkAYhuHptE3hAgZ7Ay5XCOLSiLWFyyWMll7A5RIuh/AS6inUS/jFLAwxqSQzaL4HXsZokB9CiI4QRPRLKsj0y2mehT4NhVgF18ctr3keSpd7P1Z1D0FEpEA7stb81cBzz/DWUAEVUQmV1YyXOZbwroUlHQerJR276qiBmqilasCMGeE+sL31zZbe9wt1UBf1UF/hjBRvjCZoimZ6RyGYIwct0PKL75H/Mw8Ef68nuaAruiV8vkYbtEU7VUNlzFl6fUcP9Ew4d48O6IhOKc9F9M/kZ4S8v2rqHIpiRfdYud9KRKq9AM/5G1A= 9 | 10 | 11 | 12 | 13 | eJztmEEKgkAUhl+LNh5DukDQItzUNmjRFYxWdglxEZ3BoO4gHaCj9TKF4ZGWztiz/D/4GAZmMfrPjOMjAgAA0JYROzMEuvjswnBDFM+5LeW8Yr3Z/T870Zd5SH2HeUTsvjBCzi8J2BXRssrA4XtL2EthMuA85J7QImVPhemA89DkIPrXp7HCVFTpy544Nxjblzn/Ghl7NMxq1nuTPED3DDEPj/I7Uq6nfDbLvWPzrejL+TVlx4brmrGPLCb8zF3cT0Ezyiy4vWnP5RuE7NbCsOO16pPb/2dgB/Jwh6yrtqmxIg931NXxZI21qt6KPNzxrq76Sb0VedhxB7ixOZc= 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /platformer/player_jump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/platformer/player_jump.png -------------------------------------------------------------------------------- /platformer/player_stand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/platformer/player_stand.png -------------------------------------------------------------------------------- /platformer/player_walk1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/platformer/player_walk1.png -------------------------------------------------------------------------------- /platformer/player_walk2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/platformer/player_walk2.png -------------------------------------------------------------------------------- /platformer/player_walk3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/platformer/player_walk3.png -------------------------------------------------------------------------------- /platformer/tiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/platformer/tiles.png -------------------------------------------------------------------------------- /quest-quest/first-enemy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/first-enemy.png -------------------------------------------------------------------------------- /quest-quest/jump.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/jump.wav -------------------------------------------------------------------------------- /quest-quest/koala_player.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/koala_player.png -------------------------------------------------------------------------------- /quest-quest/player.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/player.png -------------------------------------------------------------------------------- /quest-quest/portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/portrait.png -------------------------------------------------------------------------------- /quest-quest/quester copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/quester copy.png -------------------------------------------------------------------------------- /quest-quest/quester.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/quester.png -------------------------------------------------------------------------------- /quest-quest/tile-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/tile-map.png -------------------------------------------------------------------------------- /quest-quest/tileSet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/quest-quest/tileSet.png -------------------------------------------------------------------------------- /quest-quest/world.tmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | eJzt2UtOwzAQAFBWwAq4ALCrBMeEG8AN6F16LswCqUT8nMa/8XvSqFIWluN4PJP07AwAAFhj13oCnbM+UNZDisfWk4COyRHgFHpZKE+eQTzyGsbj3Rn4j7U1PkJv0Ms52cs86MNhkADWK51Dh8XvKWOgTs/slGcvzyG+0fI8wjs8c2q5d0fLc+pwnsbSMs+fUjxnjPFh+Y5iP8LfWub5S4rXjDFGsVv8/sQ3NWppmedvKfYZY6wln/iPCL3hbPu89jNzlnwVIWdqsVZE5VxkNvZ8HJ5lPTOvtR5wHLn7dOZ9zXbsIwBa0KMClKPHpzZ1PY/16pOzk5LkfXueARGoVVCf+rEN60hpaiTwSc2BOtTeNpxxANBO9P4n+v2tZV0oRW8PQI61PclWvYy6BbAN52lZy/X1Tg/AVtQUStEfQl1yDmAO+ncAgK+8D48hWh8b7X5gJvKX0UXvfXq4vx7mQD9GqRu/7Vt7GpiBs45RavZ3Rp57LXIcoLy/6pGzGABgHr5V9EEPDgAAEI93bgCIR30HAGjP/+swNjkMc5L7MCffUwHmoueDvj2leM68djgKqOE8xUWKy9YTWaGHub+keM28dlj8Mr7ee7KrFNcpbo6u3aa4S3G/wfjHY2015qfv5p47p1O9pdhnXpPnAACxvAOf3mAC 12 | 13 | 14 | 15 | 16 | eJzt01Fu20AQg2Hf/0Z5lBTfoAdqAmiBgdEHu8AMObP/BxCOU1lm1OXX4/H4ejMAenp34+wc6IudA/Oxc2A+dg7Mx86B+dg5MB87B+Zj58B87ByYj50D87FzYD52DszHzoH52DkwHzsH5mPnwHzsHJiPnWOCT86xY7I5dQH+h3qj7ht/GPYBPqHeKDsHcqn3yc6BXOptsnMgl3qX7BzIpd4kOwdyqffIzoFc6i2ycyCXeofsHMil3iA7B3Kp98fOgVzq7bFzIJd6d+wcyKXeHDsHcqn3xs7ZOXKpt8bO2TlyqXemTgW3PtiLemMOqeDWB/tQ78slFdz6YA/qbTmlglsfzKfelVsquPXBbOpNOaaCWx/Mpd6Tayq49cFM6i05p4JbH8yj3pF7Krj1wSzqDXVIBbc+mEO9ny6p4NYHM6i30ykV3PqgP/VuuqWCWx/0pt5Mx1Rw64O+1HvpmgpufdCTeiudU8GtD/pR76R7Krj1QS/qjUxIBbc+6EO9jymp4NYHPai3MSkV3PrAn3oX01LBrQ+8qTcxMRXc+sCXeg9TU8GtDzyptzA5Fdz6wI96B9NTwa0PvKg3sEMquPWBD/X53yUV3PrAg/rs75QKbn2gpz73u6WCWx9oqc/8jqng1gc66vO+ayq49YGG+qzvnApufVBPfc53TwW3PqilPuOkhlsf1FGfb8LOkUt9tgk7Ry71uSbsHLnUZ5podvXngzx/ctw5f/IdXo/7NV5z3O+vcN36+QifWfe77uuf9/sz/P4I/xbv/fqd18vruvfq8Xp9/N4r3DN+Pn73+uy6Jt7zCvdY18TEZxSf2xm+9wyfP8P758s91s/rb4194vON16/7xOd5hOvjfeNzif8Hx+Pfzzo+w9+ot9MpFT7ZOSHvRr2dTqnwFw2kHqE= 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /settings.edn: -------------------------------------------------------------------------------- 1 | {:title "Clojure/conj 2014" 2 | :description "This is a game." 3 | :version 1} -------------------------------------------------------------------------------- /skin/droid_32.fnt: -------------------------------------------------------------------------------- 1 | info face="Droid Sans" size=32 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=0,0 2 | common lineHeight=38 base=30 scaleW=512 scaleH=512 pages=1 packed=0 3 | page id=0 file="droid_32.png" 4 | chars count=95 5 | char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=30 xadvance=8 page=0 chnl=0 6 | char id=124 x=0 y=0 width=4 height=33 xoffset=8 yoffset=6 xadvance=18 page=0 chnl=0 7 | char id=106 x=4 y=0 width=10 height=33 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 8 | char id=74 x=14 y=0 width=12 height=30 xoffset=-3 yoffset=7 xadvance=9 page=0 chnl=0 9 | char id=125 x=26 y=0 width=11 height=29 xoffset=0 yoffset=7 xadvance=11 page=0 chnl=0 10 | char id=123 x=37 y=0 width=11 height=29 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=0 11 | char id=93 x=48 y=0 width=7 height=29 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=0 12 | char id=91 x=55 y=0 width=7 height=29 xoffset=3 yoffset=7 xadvance=10 page=0 chnl=0 13 | char id=41 x=62 y=0 width=8 height=29 xoffset=2 yoffset=7 xadvance=10 page=0 chnl=0 14 | char id=40 x=70 y=0 width=9 height=29 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=0 15 | char id=81 x=79 y=0 width=21 height=29 xoffset=2 yoffset=7 xadvance=24 page=0 chnl=0 16 | char id=36 x=100 y=0 width=15 height=27 xoffset=2 yoffset=5 xadvance=18 page=0 chnl=0 17 | char id=64 x=115 y=0 width=25 height=27 xoffset=2 yoffset=7 xadvance=28 page=0 chnl=0 18 | char id=121 x=140 y=0 width=19 height=26 xoffset=-1 yoffset=13 xadvance=16 page=0 chnl=0 19 | char id=113 x=159 y=0 width=15 height=26 xoffset=2 yoffset=13 xadvance=19 page=0 chnl=0 20 | char id=112 x=174 y=0 width=15 height=26 xoffset=3 yoffset=13 xadvance=19 page=0 chnl=0 21 | char id=103 x=189 y=0 width=17 height=26 xoffset=1 yoffset=13 xadvance=17 page=0 chnl=0 22 | char id=108 x=206 y=0 width=4 height=25 xoffset=3 yoffset=6 xadvance=8 page=0 chnl=0 23 | char id=107 x=210 y=0 width=15 height=25 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=0 24 | char id=105 x=225 y=0 width=6 height=25 xoffset=2 yoffset=6 xadvance=8 page=0 chnl=0 25 | char id=104 x=231 y=0 width=14 height=25 xoffset=3 yoffset=6 xadvance=19 page=0 chnl=0 26 | char id=102 x=245 y=0 width=12 height=25 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 27 | char id=100 x=257 y=0 width=15 height=25 xoffset=2 yoffset=6 xadvance=19 page=0 chnl=0 28 | char id=98 x=272 y=0 width=15 height=25 xoffset=3 yoffset=6 xadvance=19 page=0 chnl=0 29 | char id=127 x=287 y=0 width=14 height=24 xoffset=3 yoffset=7 xadvance=19 page=0 chnl=0 30 | char id=38 x=301 y=0 width=20 height=24 xoffset=2 yoffset=7 xadvance=22 page=0 chnl=0 31 | char id=35 x=321 y=0 width=20 height=24 xoffset=1 yoffset=7 xadvance=21 page=0 chnl=0 32 | char id=37 x=341 y=0 width=23 height=24 xoffset=2 yoffset=7 xadvance=26 page=0 chnl=0 33 | char id=92 x=364 y=0 width=14 height=24 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 34 | char id=47 x=378 y=0 width=14 height=24 xoffset=-1 yoffset=7 xadvance=12 page=0 chnl=0 35 | char id=63 x=392 y=0 width=13 height=24 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=0 36 | char id=33 x=405 y=0 width=5 height=24 xoffset=2 yoffset=7 xadvance=9 page=0 chnl=0 37 | char id=48 x=410 y=0 width=15 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 38 | char id=57 x=425 y=0 width=15 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 39 | char id=56 x=440 y=0 width=15 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 40 | char id=55 x=455 y=0 width=16 height=24 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=0 41 | char id=54 x=471 y=0 width=16 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 42 | char id=53 x=487 y=0 width=15 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 43 | char id=52 x=0 y=33 width=18 height=24 xoffset=0 yoffset=7 xadvance=18 page=0 chnl=0 44 | char id=51 x=18 y=33 width=16 height=24 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=0 45 | char id=50 x=34 y=33 width=15 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 46 | char id=49 x=49 y=33 width=10 height=24 xoffset=2 yoffset=7 xadvance=18 page=0 chnl=0 47 | char id=90 x=59 y=33 width=14 height=24 xoffset=2 yoffset=7 xadvance=17 page=0 chnl=0 48 | char id=89 x=73 y=33 width=20 height=24 xoffset=-1 yoffset=7 xadvance=17 page=0 chnl=0 49 | char id=88 x=93 y=33 width=21 height=24 xoffset=-1 yoffset=7 xadvance=18 page=0 chnl=0 50 | char id=87 x=114 y=33 width=31 height=24 xoffset=-1 yoffset=7 xadvance=28 page=0 chnl=0 51 | char id=86 x=145 y=33 width=21 height=24 xoffset=-1 yoffset=7 xadvance=18 page=0 chnl=0 52 | char id=85 x=166 y=33 width=17 height=24 xoffset=3 yoffset=7 xadvance=22 page=0 chnl=0 53 | char id=84 x=183 y=33 width=17 height=24 xoffset=0 yoffset=7 xadvance=17 page=0 chnl=0 54 | char id=83 x=200 y=33 width=15 height=24 xoffset=1 yoffset=7 xadvance=17 page=0 chnl=0 55 | char id=82 x=215 y=33 width=17 height=24 xoffset=3 yoffset=7 xadvance=19 page=0 chnl=0 56 | char id=80 x=232 y=33 width=14 height=24 xoffset=3 yoffset=7 xadvance=18 page=0 chnl=0 57 | char id=79 x=246 y=33 width=21 height=24 xoffset=2 yoffset=7 xadvance=24 page=0 chnl=0 58 | char id=78 x=267 y=33 width=18 height=24 xoffset=3 yoffset=7 xadvance=23 page=0 chnl=0 59 | char id=77 x=285 y=33 width=23 height=24 xoffset=3 yoffset=7 xadvance=28 page=0 chnl=0 60 | char id=76 x=308 y=33 width=14 height=24 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=0 61 | char id=75 x=322 y=33 width=18 height=24 xoffset=3 yoffset=7 xadvance=19 page=0 chnl=0 62 | char id=73 x=340 y=33 width=10 height=24 xoffset=1 yoffset=7 xadvance=11 page=0 chnl=0 63 | char id=72 x=350 y=33 width=17 height=24 xoffset=3 yoffset=7 xadvance=22 page=0 chnl=0 64 | char id=71 x=367 y=33 width=19 height=24 xoffset=2 yoffset=7 xadvance=22 page=0 chnl=0 65 | char id=70 x=386 y=33 width=13 height=24 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=0 66 | char id=69 x=399 y=33 width=13 height=24 xoffset=3 yoffset=7 xadvance=17 page=0 chnl=0 67 | char id=68 x=412 y=33 width=18 height=24 xoffset=3 yoffset=7 xadvance=22 page=0 chnl=0 68 | char id=67 x=430 y=33 width=17 height=24 xoffset=2 yoffset=7 xadvance=19 page=0 chnl=0 69 | char id=66 x=447 y=33 width=16 height=24 xoffset=3 yoffset=7 xadvance=20 page=0 chnl=0 70 | char id=65 x=463 y=33 width=22 height=24 xoffset=-1 yoffset=7 xadvance=19 page=0 chnl=0 71 | char id=59 x=485 y=33 width=6 height=22 xoffset=1 yoffset=13 xadvance=9 page=0 chnl=0 72 | char id=116 x=491 y=33 width=10 height=22 xoffset=1 yoffset=9 xadvance=11 page=0 chnl=0 73 | char id=58 x=501 y=33 width=5 height=18 xoffset=2 yoffset=13 xadvance=9 page=0 chnl=0 74 | char id=122 x=0 y=57 width=13 height=18 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=0 75 | char id=120 x=13 y=57 width=15 height=18 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=0 76 | char id=119 x=28 y=57 width=27 height=18 xoffset=-1 yoffset=13 xadvance=24 page=0 chnl=0 77 | char id=118 x=55 y=57 width=18 height=18 xoffset=-1 yoffset=13 xadvance=15 page=0 chnl=0 78 | char id=117 x=73 y=57 width=14 height=18 xoffset=3 yoffset=13 xadvance=19 page=0 chnl=0 79 | char id=115 x=87 y=57 width=12 height=18 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=0 80 | char id=114 x=99 y=57 width=10 height=18 xoffset=3 yoffset=13 xadvance=13 page=0 chnl=0 81 | char id=111 x=109 y=57 width=15 height=18 xoffset=2 yoffset=13 xadvance=18 page=0 chnl=0 82 | char id=110 x=124 y=57 width=14 height=18 xoffset=3 yoffset=13 xadvance=19 page=0 chnl=0 83 | char id=109 x=138 y=57 width=24 height=18 xoffset=3 yoffset=13 xadvance=29 page=0 chnl=0 84 | char id=101 x=162 y=57 width=14 height=18 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=0 85 | char id=99 x=176 y=57 width=13 height=18 xoffset=2 yoffset=13 xadvance=15 page=0 chnl=0 86 | char id=97 x=189 y=57 width=13 height=18 xoffset=2 yoffset=13 xadvance=17 page=0 chnl=0 87 | char id=43 x=202 y=57 width=17 height=17 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=0 88 | char id=62 x=219 y=57 width=15 height=17 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=0 89 | char id=60 x=234 y=57 width=15 height=17 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=0 90 | char id=42 x=249 y=57 width=16 height=15 xoffset=1 yoffset=6 xadvance=18 page=0 chnl=0 91 | char id=94 x=265 y=57 width=16 height=15 xoffset=1 yoffset=7 xadvance=17 page=0 chnl=0 92 | char id=61 x=281 y=57 width=15 height=10 xoffset=2 yoffset=14 xadvance=18 page=0 chnl=0 93 | char id=44 x=296 y=57 width=6 height=9 xoffset=1 yoffset=26 xadvance=8 page=0 chnl=0 94 | char id=39 x=302 y=57 width=5 height=9 xoffset=2 yoffset=7 xadvance=7 page=0 chnl=0 95 | char id=34 x=307 y=57 width=11 height=9 xoffset=2 yoffset=7 xadvance=13 page=0 chnl=0 96 | char id=126 x=318 y=57 width=15 height=7 xoffset=2 yoffset=16 xadvance=18 page=0 chnl=0 97 | char id=96 x=333 y=57 width=7 height=6 xoffset=6 yoffset=6 xadvance=18 page=0 chnl=0 98 | char id=46 x=340 y=57 width=5 height=5 xoffset=2 yoffset=26 xadvance=9 page=0 chnl=0 99 | char id=95 x=345 y=57 width=14 height=4 xoffset=0 yoffset=33 xadvance=13 page=0 chnl=0 100 | char id=45 x=359 y=57 width=9 height=4 xoffset=1 yoffset=20 xadvance=10 page=0 chnl=0 101 | -------------------------------------------------------------------------------- /skin/droid_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/skin/droid_32.png -------------------------------------------------------------------------------- /skin/droid_48.fnt: -------------------------------------------------------------------------------- 1 | info face="Droid Sans" size=48 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=0,0 2 | common lineHeight=57 base=45 scaleW=512 scaleH=512 pages=1 packed=0 3 | page id=0 file="droid_48.png" 4 | chars count=95 5 | char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=45 xadvance=12 page=0 chnl=0 6 | char id=124 x=0 y=0 width=5 height=49 xoffset=11 yoffset=9 xadvance=26 page=0 chnl=0 7 | char id=106 x=5 y=0 width=13 height=48 xoffset=-2 yoffset=10 xadvance=12 page=0 chnl=0 8 | char id=74 x=18 y=0 width=19 height=44 xoffset=-5 yoffset=11 xadvance=13 page=0 chnl=0 9 | char id=125 x=37 y=0 width=15 height=43 xoffset=2 yoffset=11 xadvance=17 page=0 chnl=0 10 | char id=123 x=52 y=0 width=15 height=43 xoffset=1 yoffset=11 xadvance=17 page=0 chnl=0 11 | char id=93 x=67 y=0 width=11 height=43 xoffset=1 yoffset=11 xadvance=15 page=0 chnl=0 12 | char id=91 x=78 y=0 width=11 height=43 xoffset=4 yoffset=11 xadvance=15 page=0 chnl=0 13 | char id=41 x=89 y=0 width=12 height=43 xoffset=1 yoffset=11 xadvance=14 page=0 chnl=0 14 | char id=40 x=101 y=0 width=13 height=43 xoffset=2 yoffset=11 xadvance=14 page=0 chnl=0 15 | char id=81 x=114 y=0 width=31 height=43 xoffset=3 yoffset=11 xadvance=36 page=0 chnl=0 16 | char id=36 x=145 y=0 width=21 height=40 xoffset=3 yoffset=9 xadvance=26 page=0 chnl=0 17 | char id=64 x=166 y=0 width=37 height=39 xoffset=3 yoffset=11 xadvance=42 page=0 chnl=0 18 | char id=121 x=203 y=0 width=26 height=39 xoffset=-1 yoffset=19 xadvance=23 page=0 chnl=0 19 | char id=113 x=229 y=0 width=22 height=39 xoffset=3 yoffset=19 xadvance=28 page=0 chnl=0 20 | char id=112 x=251 y=0 width=22 height=39 xoffset=4 yoffset=19 xadvance=28 page=0 chnl=0 21 | char id=103 x=273 y=0 width=25 height=39 xoffset=1 yoffset=19 xadvance=25 page=0 chnl=0 22 | char id=108 x=298 y=0 width=6 height=37 xoffset=4 yoffset=9 xadvance=12 page=0 chnl=0 23 | char id=107 x=304 y=0 width=22 height=37 xoffset=4 yoffset=9 xadvance=24 page=0 chnl=0 24 | char id=104 x=326 y=0 width=21 height=37 xoffset=4 yoffset=9 xadvance=28 page=0 chnl=0 25 | char id=102 x=347 y=0 width=19 height=37 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=0 26 | char id=100 x=366 y=0 width=22 height=37 xoffset=3 yoffset=9 xadvance=28 page=0 chnl=0 27 | char id=98 x=388 y=0 width=22 height=37 xoffset=4 yoffset=9 xadvance=28 page=0 chnl=0 28 | char id=38 x=410 y=0 width=31 height=36 xoffset=3 yoffset=10 xadvance=34 page=0 chnl=0 29 | char id=63 x=441 y=0 width=18 height=36 xoffset=1 yoffset=11 xadvance=20 page=0 chnl=0 30 | char id=33 x=459 y=0 width=7 height=36 xoffset=3 yoffset=11 xadvance=13 page=0 chnl=0 31 | char id=105 x=466 y=0 width=7 height=36 xoffset=3 yoffset=10 xadvance=12 page=0 chnl=0 32 | char id=127 x=473 y=0 width=20 height=35 xoffset=5 yoffset=11 xadvance=29 page=0 chnl=0 33 | char id=35 x=0 y=49 width=30 height=35 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=0 34 | char id=37 x=30 y=49 width=37 height=35 xoffset=2 yoffset=11 xadvance=40 page=0 chnl=0 35 | char id=92 x=67 y=49 width=19 height=35 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=0 36 | char id=47 x=86 y=49 width=20 height=35 xoffset=-1 yoffset=11 xadvance=18 page=0 chnl=0 37 | char id=48 x=106 y=49 width=23 height=35 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=0 38 | char id=57 x=129 y=49 width=23 height=35 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=0 39 | char id=56 x=152 y=49 width=23 height=35 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=0 40 | char id=55 x=175 y=49 width=23 height=35 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=0 41 | char id=54 x=198 y=49 width=22 height=35 xoffset=3 yoffset=11 xadvance=26 page=0 chnl=0 42 | char id=53 x=220 y=49 width=21 height=35 xoffset=3 yoffset=11 xadvance=26 page=0 chnl=0 43 | char id=52 x=241 y=49 width=25 height=35 xoffset=1 yoffset=11 xadvance=26 page=0 chnl=0 44 | char id=51 x=266 y=49 width=22 height=35 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=0 45 | char id=50 x=288 y=49 width=23 height=35 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=0 46 | char id=49 x=311 y=49 width=14 height=35 xoffset=5 yoffset=11 xadvance=26 page=0 chnl=0 47 | char id=90 x=325 y=49 width=21 height=35 xoffset=3 yoffset=11 xadvance=26 page=0 chnl=0 48 | char id=89 x=346 y=49 width=28 height=35 xoffset=-1 yoffset=11 xadvance=25 page=0 chnl=0 49 | char id=88 x=374 y=49 width=29 height=35 xoffset=-1 yoffset=11 xadvance=26 page=0 chnl=0 50 | char id=87 x=403 y=49 width=45 height=35 xoffset=-1 yoffset=11 xadvance=42 page=0 chnl=0 51 | char id=86 x=448 y=49 width=30 height=35 xoffset=-1 yoffset=11 xadvance=27 page=0 chnl=0 52 | char id=85 x=478 y=49 width=25 height=35 xoffset=5 yoffset=11 xadvance=34 page=0 chnl=0 53 | char id=84 x=0 y=84 width=25 height=35 xoffset=0 yoffset=11 xadvance=25 page=0 chnl=0 54 | char id=83 x=25 y=84 width=21 height=35 xoffset=2 yoffset=11 xadvance=25 page=0 chnl=0 55 | char id=82 x=46 y=84 width=24 height=35 xoffset=5 yoffset=11 xadvance=28 page=0 chnl=0 56 | char id=80 x=70 y=84 width=21 height=35 xoffset=5 yoffset=11 xadvance=28 page=0 chnl=0 57 | char id=79 x=91 y=84 width=31 height=35 xoffset=3 yoffset=11 xadvance=36 page=0 chnl=0 58 | char id=78 x=122 y=84 width=26 height=35 xoffset=5 yoffset=11 xadvance=35 page=0 chnl=0 59 | char id=77 x=148 y=84 width=33 height=35 xoffset=5 yoffset=11 xadvance=42 page=0 chnl=0 60 | char id=76 x=181 y=84 width=19 height=35 xoffset=5 yoffset=11 xadvance=24 page=0 chnl=0 61 | char id=75 x=200 y=84 width=25 height=35 xoffset=5 yoffset=11 xadvance=28 page=0 chnl=0 62 | char id=73 x=225 y=84 width=15 height=35 xoffset=1 yoffset=11 xadvance=16 page=0 chnl=0 63 | char id=72 x=240 y=84 width=25 height=35 xoffset=5 yoffset=11 xadvance=34 page=0 chnl=0 64 | char id=71 x=265 y=84 width=28 height=35 xoffset=3 yoffset=11 xadvance=33 page=0 chnl=0 65 | char id=70 x=293 y=84 width=19 height=35 xoffset=5 yoffset=11 xadvance=24 page=0 chnl=0 66 | char id=69 x=312 y=84 width=18 height=35 xoffset=5 yoffset=11 xadvance=25 page=0 chnl=0 67 | char id=68 x=330 y=84 width=26 height=35 xoffset=5 yoffset=11 xadvance=33 page=0 chnl=0 68 | char id=67 x=356 y=84 width=26 height=35 xoffset=3 yoffset=11 xadvance=29 page=0 chnl=0 69 | char id=66 x=382 y=84 width=23 height=35 xoffset=5 yoffset=11 xadvance=30 page=0 chnl=0 70 | char id=65 x=405 y=84 width=32 height=35 xoffset=-1 yoffset=11 xadvance=29 page=0 chnl=0 71 | char id=59 x=437 y=84 width=9 height=33 xoffset=1 yoffset=19 xadvance=13 page=0 chnl=0 72 | char id=116 x=446 y=84 width=16 height=33 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=0 73 | char id=58 x=462 y=84 width=7 height=28 xoffset=3 yoffset=19 xadvance=13 page=0 chnl=0 74 | char id=122 x=469 y=84 width=19 height=27 xoffset=2 yoffset=19 xadvance=21 page=0 chnl=0 75 | char id=120 x=488 y=84 width=23 height=27 xoffset=1 yoffset=19 xadvance=24 page=0 chnl=0 76 | char id=119 x=0 y=119 width=39 height=27 xoffset=-1 yoffset=19 xadvance=36 page=0 chnl=0 77 | char id=118 x=39 y=119 width=26 height=27 xoffset=-1 yoffset=19 xadvance=23 page=0 chnl=0 78 | char id=117 x=65 y=119 width=21 height=27 xoffset=4 yoffset=19 xadvance=28 page=0 chnl=0 79 | char id=115 x=86 y=119 width=18 height=27 xoffset=2 yoffset=19 xadvance=22 page=0 chnl=0 80 | char id=114 x=104 y=119 width=15 height=27 xoffset=4 yoffset=19 xadvance=19 page=0 chnl=0 81 | char id=111 x=119 y=119 width=23 height=27 xoffset=3 yoffset=19 xadvance=28 page=0 chnl=0 82 | char id=110 x=142 y=119 width=21 height=27 xoffset=4 yoffset=19 xadvance=28 page=0 chnl=0 83 | char id=109 x=163 y=119 width=36 height=27 xoffset=4 yoffset=19 xadvance=43 page=0 chnl=0 84 | char id=101 x=199 y=119 width=21 height=27 xoffset=3 yoffset=19 xadvance=26 page=0 chnl=0 85 | char id=99 x=220 y=119 width=18 height=27 xoffset=3 yoffset=19 xadvance=22 page=0 chnl=0 86 | char id=97 x=238 y=119 width=19 height=27 xoffset=3 yoffset=19 xadvance=25 page=0 chnl=0 87 | char id=62 x=257 y=119 width=23 height=25 xoffset=2 yoffset=16 xadvance=26 page=0 chnl=0 88 | char id=60 x=280 y=119 width=23 height=25 xoffset=2 yoffset=16 xadvance=26 page=0 chnl=0 89 | char id=43 x=303 y=119 width=24 height=24 xoffset=1 yoffset=16 xadvance=26 page=0 chnl=0 90 | char id=42 x=327 y=119 width=24 height=23 xoffset=2 yoffset=9 xadvance=26 page=0 chnl=0 91 | char id=94 x=351 y=119 width=25 height=23 xoffset=1 yoffset=11 xadvance=26 page=0 chnl=0 92 | char id=61 x=376 y=119 width=23 height=15 xoffset=2 yoffset=22 xadvance=26 page=0 chnl=0 93 | char id=44 x=399 y=119 width=8 height=13 xoffset=1 yoffset=39 xadvance=12 page=0 chnl=0 94 | char id=39 x=407 y=119 width=6 height=13 xoffset=3 yoffset=11 xadvance=11 page=0 chnl=0 95 | char id=34 x=413 y=119 width=14 height=13 xoffset=3 yoffset=11 xadvance=19 page=0 chnl=0 96 | char id=126 x=427 y=119 width=23 height=9 xoffset=2 yoffset=24 xadvance=26 page=0 chnl=0 97 | char id=96 x=450 y=119 width=10 height=9 xoffset=9 yoffset=8 xadvance=28 page=0 chnl=0 98 | char id=46 x=460 y=119 width=7 height=8 xoffset=3 yoffset=39 xadvance=13 page=0 chnl=0 99 | char id=95 x=467 y=119 width=21 height=5 xoffset=0 yoffset=49 xadvance=20 page=0 chnl=0 100 | char id=45 x=488 y=119 width=12 height=5 xoffset=2 yoffset=30 xadvance=15 page=0 chnl=0 101 | -------------------------------------------------------------------------------- /skin/droid_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/skin/droid_48.png -------------------------------------------------------------------------------- /skin/droid_96.fnt: -------------------------------------------------------------------------------- 1 | info face="Droid Sans" size=96 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=0,0 2 | common lineHeight=113 base=90 scaleW=512 scaleH=512 pages=2 packed=0 3 | page id=0 file="droid_961.png" 4 | page id=1 file="droid_962.png" 5 | chars count=95 6 | char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=90 xadvance=25 page=0 chnl=0 7 | char id=124 x=0 y=0 width=9 height=97 xoffset=23 yoffset=17 xadvance=53 page=0 chnl=0 8 | char id=106 x=9 y=0 width=25 height=95 xoffset=-3 yoffset=19 xadvance=25 page=0 chnl=0 9 | char id=74 x=34 y=0 width=35 height=88 xoffset=-8 yoffset=21 xadvance=26 page=0 chnl=0 10 | char id=81 x=69 y=0 width=60 height=87 xoffset=6 yoffset=20 xadvance=71 page=0 chnl=0 11 | char id=125 x=129 y=0 width=30 height=85 xoffset=2 yoffset=21 xadvance=34 page=0 chnl=0 12 | char id=123 x=159 y=0 width=30 height=85 xoffset=3 yoffset=21 xadvance=34 page=0 chnl=0 13 | char id=93 x=189 y=0 width=20 height=85 xoffset=2 yoffset=21 xadvance=29 page=0 chnl=0 14 | char id=91 x=209 y=0 width=20 height=85 xoffset=8 yoffset=21 xadvance=29 page=0 chnl=0 15 | char id=41 x=229 y=0 width=23 height=85 xoffset=3 yoffset=21 xadvance=29 page=0 chnl=0 16 | char id=40 x=252 y=0 width=24 height=85 xoffset=4 yoffset=21 xadvance=29 page=0 chnl=0 17 | char id=36 x=276 y=0 width=41 height=79 xoffset=6 yoffset=17 xadvance=53 page=0 chnl=0 18 | char id=64 x=317 y=0 width=74 height=79 xoffset=5 yoffset=21 xadvance=83 page=0 chnl=0 19 | char id=113 x=391 y=0 width=44 height=76 xoffset=5 yoffset=38 xadvance=56 page=0 chnl=0 20 | char id=112 x=435 y=0 width=44 height=76 xoffset=8 yoffset=38 xadvance=56 page=0 chnl=0 21 | char id=103 x=0 y=97 width=47 height=76 xoffset=2 yoffset=38 xadvance=50 page=0 chnl=0 22 | char id=121 x=47 y=97 width=50 height=75 xoffset=-1 yoffset=39 xadvance=47 page=0 chnl=0 23 | char id=102 x=97 y=97 width=38 height=75 xoffset=1 yoffset=16 xadvance=32 page=0 chnl=0 24 | char id=100 x=135 y=97 width=44 height=75 xoffset=5 yoffset=17 xadvance=56 page=0 chnl=0 25 | char id=98 x=179 y=97 width=44 height=75 xoffset=8 yoffset=17 xadvance=56 page=0 chnl=0 26 | char id=108 x=223 y=97 width=10 height=74 xoffset=8 yoffset=17 xadvance=25 page=0 chnl=0 27 | char id=107 x=233 y=97 width=42 height=74 xoffset=8 yoffset=17 xadvance=48 page=0 chnl=0 28 | char id=104 x=275 y=97 width=42 height=74 xoffset=8 yoffset=17 xadvance=57 page=0 chnl=0 29 | char id=38 x=317 y=97 width=61 height=72 xoffset=5 yoffset=20 xadvance=67 page=0 chnl=0 30 | char id=37 x=378 y=97 width=70 height=72 xoffset=5 yoffset=20 xadvance=79 page=0 chnl=0 31 | char id=63 x=448 y=97 width=37 height=72 xoffset=2 yoffset=20 xadvance=41 page=0 chnl=0 32 | char id=48 x=0 y=173 width=44 height=72 xoffset=5 yoffset=20 xadvance=53 page=0 chnl=0 33 | char id=56 x=44 y=173 width=44 height=72 xoffset=5 yoffset=20 xadvance=53 page=0 chnl=0 34 | char id=54 x=88 y=173 width=45 height=72 xoffset=5 yoffset=20 xadvance=53 page=0 chnl=0 35 | char id=51 x=133 y=173 width=44 height=72 xoffset=4 yoffset=20 xadvance=53 page=0 chnl=0 36 | char id=105 x=177 y=173 width=12 height=72 xoffset=7 yoffset=19 xadvance=25 page=0 chnl=0 37 | char id=83 x=189 y=173 width=40 height=72 xoffset=5 yoffset=20 xadvance=50 page=0 chnl=0 38 | char id=79 x=229 y=173 width=60 height=72 xoffset=6 yoffset=20 xadvance=71 page=0 chnl=0 39 | char id=71 x=289 y=173 width=55 height=72 xoffset=6 yoffset=20 xadvance=66 page=0 chnl=0 40 | char id=67 x=344 y=173 width=50 height=72 xoffset=6 yoffset=20 xadvance=58 page=0 chnl=0 41 | char id=33 x=394 y=173 width=13 height=71 xoffset=7 yoffset=21 xadvance=26 page=0 chnl=0 42 | char id=57 x=407 y=173 width=44 height=71 xoffset=5 yoffset=20 xadvance=53 page=0 chnl=0 43 | char id=53 x=451 y=173 width=43 height=71 xoffset=6 yoffset=21 xadvance=53 page=0 chnl=0 44 | char id=50 x=0 y=245 width=44 height=71 xoffset=5 yoffset=20 xadvance=53 page=0 chnl=0 45 | char id=85 x=44 y=245 width=50 height=71 xoffset=9 yoffset=21 xadvance=67 page=0 chnl=0 46 | char id=127 x=94 y=245 width=41 height=70 xoffset=9 yoffset=21 xadvance=58 page=0 chnl=0 47 | char id=35 x=135 y=245 width=57 height=70 xoffset=3 yoffset=21 xadvance=62 page=0 chnl=0 48 | char id=92 x=192 y=245 width=37 height=70 xoffset=0 yoffset=21 xadvance=36 page=0 chnl=0 49 | char id=47 x=229 y=245 width=37 height=70 xoffset=0 yoffset=21 xadvance=36 page=0 chnl=0 50 | char id=55 x=266 y=245 width=45 height=70 xoffset=4 yoffset=21 xadvance=53 page=0 chnl=0 51 | char id=52 x=311 y=245 width=51 height=70 xoffset=1 yoffset=21 xadvance=53 page=0 chnl=0 52 | char id=49 x=362 y=245 width=27 height=70 xoffset=8 yoffset=21 xadvance=53 page=0 chnl=0 53 | char id=90 x=389 y=245 width=44 height=70 xoffset=4 yoffset=21 xadvance=52 page=0 chnl=0 54 | char id=89 x=433 y=245 width=54 height=70 xoffset=-1 yoffset=21 xadvance=51 page=0 chnl=0 55 | char id=88 x=0 y=316 width=56 height=70 xoffset=-1 yoffset=21 xadvance=53 page=0 chnl=0 56 | char id=87 x=56 y=316 width=86 height=70 xoffset=0 yoffset=21 xadvance=85 page=0 chnl=0 57 | char id=86 x=142 y=316 width=58 height=70 xoffset=-1 yoffset=21 xadvance=55 page=0 chnl=0 58 | char id=84 x=200 y=316 width=49 height=70 xoffset=1 yoffset=21 xadvance=50 page=0 chnl=0 59 | char id=82 x=249 y=316 width=49 height=70 xoffset=9 yoffset=21 xadvance=57 page=0 chnl=0 60 | char id=80 x=298 y=316 width=41 height=70 xoffset=9 yoffset=21 xadvance=55 page=0 chnl=0 61 | char id=78 x=339 y=316 width=53 height=70 xoffset=9 yoffset=21 xadvance=70 page=0 chnl=0 62 | char id=77 x=392 y=316 width=67 height=70 xoffset=9 yoffset=21 xadvance=84 page=0 chnl=0 63 | char id=76 x=459 y=316 width=37 height=70 xoffset=9 yoffset=21 xadvance=47 page=0 chnl=0 64 | char id=75 x=0 y=386 width=49 height=70 xoffset=9 yoffset=21 xadvance=56 page=0 chnl=0 65 | char id=73 x=49 y=386 width=27 height=70 xoffset=3 yoffset=21 xadvance=33 page=0 chnl=0 66 | char id=72 x=76 y=386 width=50 height=70 xoffset=9 yoffset=21 xadvance=67 page=0 chnl=0 67 | char id=70 x=126 y=386 width=37 height=70 xoffset=9 yoffset=21 xadvance=47 page=0 chnl=0 68 | char id=69 x=163 y=386 width=37 height=70 xoffset=9 yoffset=21 xadvance=51 page=0 chnl=0 69 | char id=68 x=200 y=386 width=52 height=70 xoffset=9 yoffset=21 xadvance=66 page=0 chnl=0 70 | char id=66 x=252 y=386 width=46 height=70 xoffset=9 yoffset=21 xadvance=60 page=0 chnl=0 71 | char id=65 x=298 y=386 width=61 height=70 xoffset=-1 yoffset=21 xadvance=58 page=0 chnl=0 72 | char id=59 x=359 y=386 width=17 height=66 xoffset=3 yoffset=38 xadvance=26 page=0 chnl=0 73 | char id=116 x=376 y=386 width=30 height=65 xoffset=2 yoffset=27 xadvance=33 page=0 chnl=0 74 | char id=58 x=406 y=386 width=13 height=54 xoffset=7 yoffset=38 xadvance=26 page=0 chnl=0 75 | char id=115 x=419 y=386 width=35 height=54 xoffset=4 yoffset=38 xadvance=43 page=0 chnl=0 76 | char id=111 x=454 y=386 width=46 height=54 xoffset=5 yoffset=38 xadvance=55 page=0 chnl=0 77 | char id=101 x=0 y=456 width=42 height=54 xoffset=5 yoffset=38 xadvance=51 page=0 chnl=0 78 | char id=99 x=42 y=456 width=37 height=54 xoffset=5 yoffset=38 xadvance=44 page=0 chnl=0 79 | char id=97 x=79 y=456 width=39 height=54 xoffset=5 yoffset=38 xadvance=51 page=0 chnl=0 80 | char id=117 x=118 y=456 width=42 height=53 xoffset=8 yoffset=39 xadvance=57 page=0 chnl=0 81 | char id=114 x=160 y=456 width=29 height=53 xoffset=8 yoffset=38 xadvance=38 page=0 chnl=0 82 | char id=110 x=189 y=456 width=42 height=53 xoffset=8 yoffset=38 xadvance=57 page=0 chnl=0 83 | char id=109 x=231 y=456 width=71 height=53 xoffset=8 yoffset=38 xadvance=86 page=0 chnl=0 84 | char id=122 x=302 y=456 width=35 height=52 xoffset=4 yoffset=39 xadvance=42 page=0 chnl=0 85 | char id=120 x=337 y=456 width=45 height=52 xoffset=2 yoffset=39 xadvance=48 page=0 chnl=0 86 | char id=119 x=382 y=456 width=73 height=52 xoffset=0 yoffset=39 xadvance=72 page=0 chnl=0 87 | char id=118 x=455 y=456 width=49 height=52 xoffset=-1 yoffset=39 xadvance=46 page=0 chnl=0 88 | char id=62 x=0 y=0 width=44 height=48 xoffset=5 yoffset=32 xadvance=53 page=1 chnl=0 89 | char id=60 x=44 y=0 width=44 height=48 xoffset=5 yoffset=32 xadvance=53 page=1 chnl=0 90 | char id=43 x=88 y=0 width=46 height=46 xoffset=4 yoffset=34 xadvance=53 page=1 chnl=0 91 | char id=42 x=134 y=0 width=46 height=44 xoffset=4 yoffset=17 xadvance=53 page=1 chnl=0 92 | char id=94 x=180 y=0 width=48 height=44 xoffset=2 yoffset=21 xadvance=51 page=1 chnl=0 93 | char id=61 x=228 y=0 width=44 height=28 xoffset=5 yoffset=43 xadvance=53 page=1 chnl=0 94 | char id=39 x=272 y=0 width=11 height=26 xoffset=6 yoffset=21 xadvance=22 page=1 chnl=0 95 | char id=34 x=283 y=0 width=28 height=26 xoffset=6 yoffset=21 xadvance=39 page=1 chnl=0 96 | char id=44 x=311 y=0 width=16 height=25 xoffset=3 yoffset=79 xadvance=24 page=1 chnl=0 97 | char id=126 x=327 y=0 width=44 height=16 xoffset=5 yoffset=49 xadvance=53 page=1 chnl=0 98 | char id=96 x=371 y=0 width=19 height=16 xoffset=18 yoffset=17 xadvance=55 page=1 chnl=0 99 | char id=46 x=390 y=0 width=13 height=14 xoffset=7 yoffset=78 xadvance=26 page=1 chnl=0 100 | char id=45 x=403 y=0 width=24 height=9 xoffset=4 yoffset=60 xadvance=31 page=1 chnl=0 101 | char id=95 x=427 y=0 width=40 height=8 xoffset=0 yoffset=99 xadvance=39 page=1 chnl=0 102 | -------------------------------------------------------------------------------- /skin/droid_961.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/skin/droid_961.png -------------------------------------------------------------------------------- /skin/droid_962.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/skin/droid_962.png -------------------------------------------------------------------------------- /skin/uiskin.atlas: -------------------------------------------------------------------------------- 1 | 2 | uiskin.png 3 | format: RGBA8888 4 | filter: Nearest,Nearest 5 | repeat: none 6 | default 7 | rotate: false 8 | xy: 1, 50 9 | size: 254, 77 10 | orig: 254, 77 11 | offset: 0, 0 12 | index: -1 13 | default-window 14 | rotate: false 15 | xy: 1, 20 16 | size: 27, 29 17 | split: 4, 3, 20, 3 18 | orig: 27, 29 19 | offset: 0, 0 20 | index: -1 21 | default-select 22 | rotate: false 23 | xy: 29, 29 24 | size: 27, 20 25 | split: 4, 14, 4, 4 26 | orig: 27, 20 27 | offset: 0, 0 28 | index: -1 29 | default-round-large 30 | rotate: false 31 | xy: 57, 29 32 | size: 20, 20 33 | split: 5, 5, 5, 4 34 | orig: 20, 20 35 | offset: 0, 0 36 | index: -1 37 | default-scroll 38 | rotate: false 39 | xy: 78, 29 40 | size: 20, 20 41 | split: 2, 2, 2, 2 42 | orig: 20, 20 43 | offset: 0, 0 44 | index: -1 45 | default-slider-knob 46 | rotate: false 47 | xy: 1, 1 48 | size: 9, 18 49 | orig: 9, 18 50 | offset: 0, 0 51 | index: -1 52 | default-round-down 53 | rotate: false 54 | xy: 99, 29 55 | size: 12, 20 56 | split: 5, 5, 5, 4 57 | orig: 12, 20 58 | offset: 0, 0 59 | index: -1 60 | default-round 61 | rotate: false 62 | xy: 112, 29 63 | size: 12, 20 64 | split: 5, 5, 5, 4 65 | pad: 4, 4, 1, 1 66 | orig: 12, 20 67 | offset: 0, 0 68 | index: -1 69 | check-off 70 | rotate: false 71 | xy: 11, 5 72 | size: 14, 14 73 | orig: 14, 14 74 | offset: 0, 0 75 | index: -1 76 | textfield 77 | rotate: false 78 | xy: 11, 5 79 | size: 14, 14 80 | split: 3, 3, 3, 3 81 | orig: 14, 14 82 | offset: 0, 0 83 | index: -1 84 | check-on 85 | rotate: false 86 | xy: 125, 35 87 | size: 14, 14 88 | orig: 14, 14 89 | offset: 0, 0 90 | index: -1 91 | tree-minus 92 | rotate: false 93 | xy: 140, 35 94 | size: 14, 14 95 | orig: 14, 14 96 | offset: 0, 0 97 | index: -1 98 | tree-plus 99 | rotate: false 100 | xy: 155, 35 101 | size: 14, 14 102 | orig: 14, 14 103 | offset: 0, 0 104 | index: -1 105 | default-slider 106 | rotate: false 107 | xy: 29, 20 108 | size: 8, 8 109 | split: 2, 2, 2, 2 110 | orig: 8, 8 111 | offset: 0, 0 112 | index: -1 113 | default-pane 114 | rotate: false 115 | xy: 11, 1 116 | size: 5, 3 117 | split: 1, 1, 1, 1 118 | orig: 5, 3 119 | offset: 0, 0 120 | index: -1 121 | default-rect-pad 122 | rotate: false 123 | xy: 11, 1 124 | size: 5, 3 125 | split: 1, 1, 1, 1 126 | orig: 5, 3 127 | offset: 0, 0 128 | index: -1 129 | default-splitpane 130 | rotate: false 131 | xy: 17, 1 132 | size: 5, 3 133 | split: 0, 5, 0, 0 134 | orig: 5, 3 135 | offset: 0, 0 136 | index: -1 137 | cursor 138 | rotate: false 139 | xy: 23, 1 140 | size: 3, 3 141 | split: 1, 1, 1, 1 142 | orig: 3, 3 143 | offset: 0, 0 144 | index: -1 145 | default-splitpane-vertical 146 | rotate: false 147 | xy: 125, 29 148 | size: 3, 5 149 | split: 0, 0, 0, 5 150 | orig: 3, 5 151 | offset: 0, 0 152 | index: -1 153 | default-rect-down 154 | rotate: false 155 | xy: 170, 46 156 | size: 3, 3 157 | split: 1, 1, 1, 1 158 | orig: 3, 3 159 | offset: 0, 0 160 | index: -1 161 | default-rect 162 | rotate: false 163 | xy: 38, 25 164 | size: 3, 3 165 | split: 1, 1, 1, 1 166 | orig: 3, 3 167 | offset: 0, 0 168 | index: -1 169 | default-select-selection 170 | rotate: false 171 | xy: 26, 16 172 | size: 3, 3 173 | split: 1, 1, 1, 1 174 | orig: 3, 3 175 | offset: 0, 0 176 | index: -1 177 | default-pane-noborder 178 | rotate: false 179 | xy: 129, 33 180 | size: 1, 1 181 | split: 0, 0, 0, 0 182 | orig: 1, 1 183 | offset: 0, 0 184 | index: -1 185 | selection 186 | rotate: false 187 | xy: 170, 44 188 | size: 1, 1 189 | orig: 1, 1 190 | offset: 0, 0 191 | index: -1 192 | white 193 | rotate: false 194 | xy: 174, 48 195 | size: 1, 1 196 | orig: 1, 1 197 | offset: 0, 0 198 | index: -1 199 | -------------------------------------------------------------------------------- /skin/uiskin.json: -------------------------------------------------------------------------------- 1 | { 2 | com.badlogic.gdx.graphics.g2d.BitmapFont: { default-font: { file: droid_96.fnt }, 3 | medium-font: { file: droid_48.fnt }, 4 | small-font: { file: droid_32.fnt } }, 5 | com.badlogic.gdx.graphics.Color: { 6 | green: { a: 1, b: 0, g: 1, r: 0 }, 7 | white: { a: 1, b: 1, g: 1, r: 1 }, 8 | red: { a: 1, b: 0, g: 0, r: 1 }, 9 | black: { a: 1, b: 0, g: 0, r: 0 } 10 | }, 11 | com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { 12 | dialogDim: { name: white, color: { r: 0, g: 0, b: 0, a: 0.45 } } 13 | }, 14 | com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { 15 | default: { down: default-round-down, up: default-round }, 16 | toggle: { down: default-round-down, checked: default-round-down, up: default-round } 17 | }, 18 | com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { 19 | default: { down: default-round-down, up: default-round, font: default-font, fontColor: white }, 20 | toggle: { down: default-round-down, up: default-round, checked: default-round-down, font: default-font, fontColor: white, downFontColor: red } 21 | }, 22 | com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { 23 | default: { vScroll: default-scroll, hScrollKnob: default-round-large, hScroll: default-scroll, vScrollKnob: default-round-large } 24 | }, 25 | com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { 26 | default: { 27 | font: default-font, fontColor: white, background: default-select, 28 | scrollStyle: default, 29 | listStyle: { font: default-font, selection: default-select-selection } 30 | } 31 | }, 32 | com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { 33 | default-vertical: { handle: default-splitpane-vertical }, 34 | default-horizontal: { handle: default-splitpane } 35 | }, 36 | com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { 37 | default: { titleFont: default-font, background: default-window, titleFontColor: white }, 38 | dialog: { titleFont: default-font, background: default-window, titleFontColor: white, stageBackground: dialogDim } 39 | }, 40 | com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { 41 | default-horizontal: { background: default-slider, knob: default-slider-knob } 42 | }, 43 | com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { 44 | default: { font: default-font, fontColor: white } 45 | }, 46 | com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { 47 | default: { selection: selection, background: textfield, font: default-font, fontColor: white, cursor: cursor } 48 | }, 49 | com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { 50 | default: { checkboxOn: check-on, checkboxOff: check-off, font: default-font, fontColor: white } 51 | }, 52 | com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { 53 | default: { fontColorUnselected: white, selection: default-rect-pad, fontColorSelected: white, font: default-font } 54 | }, 55 | com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { 56 | default: { background: default-pane, knob: default-round-large } 57 | }, 58 | com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: { 59 | default: { minus: tree-minus, plus: tree-plus, selection: default-select-selection } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /skin/uiskin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oakes/clojure-conj-2014/575e8eeced02d761f8d278b95906083f03ba9565/skin/uiskin.png --------------------------------------------------------------------------------