               (int \A) {:rotation (- ship-rotation-speed)}
               (int \D) {:rotation ship-rotation-speed}
               (int \W) {:acceleration ship-acceleration}
+              (int \J) {:fire-missile true}
               (int \K) {:shoot true}
               (int \1) {:set-level 1}
               (int \2) {:set-level 2}

; Actions
; ----------------------------------------------------------------------

(defn shoot [{:keys [shooting? shots millis-since-last-shot] :as ship}]
  (let [millis-since-last-shot (+ turn-millis millis-since-last-shot)
        shoots? (and shooting? (>= millis-since-last-shot shot-millis))
        shots (if shoots? (conj shots (create-shot ship)) shots)]
    (when shoots? (play-sound "shot"))
    (assoc ship :millis-since-last-shot (if shoots? 0 millis-since-last-shot)
                :shots shots)))

(defn basic-move

         shot-pos (vec+vec position (num*vec size dir-vec))
         shot-speed (vec+vec speed (num*vec shot-speed dir-vec))]
     (create-shot shot-pos direction shot-speed))))

(defn create-missile
  ([pos dir speed]
   {:type           :missile

    :size           missile-size
    :shape          [[0.0 1.0] [0.5 -1.0] [0.5 -3.5] [1.0 -4.5] [0.5 -4.5] [0.25 -4.25]
                     [-0.25 -4.25] [-0.5 -4.5] [-1.0 -4.5] [-0.5 -3.5] [-0.5 -1.0]]
    :color          (Color. 10 50 250)
    :paint-method   fill-polygon

    :position       pos
    :speed          speed
    :acceleration   missile-acceleration

    :direction      dir
    :rotation-speed 0

    :collidable+?   true
    })
  ([{:keys [position size direction speed] :as ship}]
   (let [dir-vec (rotate-vec direction [0 1])
         missile-pos (vec+vec position (num*vec size dir-vec))
         missile-speed (vec+vec speed (num*vec missile-speed dir-vec))]
     (create-missile missile-pos direction missile-speed))))



(defn create-asteroid
  ([size pos speed]
