   ;; Always
   (.clearRect ctx 0 0 SCALE-W SCALE-H)
   (draw! (:background @state) ctx)
-  (draw! (:border @state) ctx)
   ;;
   ;; While playing and game-over
   (when (contains? #{:playing :gameover} (:mode @state))

  IControllable
  (control! [{:keys [y vy height] :as paddle} event]
    (condp = event
      :up
      (if (> (- y vy) 0) (assoc paddle :y (- y vy)) paddle)

      :down
      (if (< (+ y vy height) SCALE-H ) (assoc paddle :y (+ y vy)) paddle)

      :else
      paddle)))

;;-----------------------------------------------------------------------------
;; Game State
;;-----------------------------------------------------------------------------

(def resets
  {:background (Rect. 0 0 SCALE-W SCALE-H "black")
   :border     (Frame. 0 0 SCALE-W SCALE-H "#333" 2)
   :net        (Line. (/ SCALE-W 2) 0 (/ SCALE-W 2) SCALE-H SCORE_COLOR)
   :game-start (GameStartScreen.)
   :score-1    (Score. 0 (- (/ SCALE-W 2) 75) 60 SCORE_FONT SCORE_COLOR "right")
   :score-2    (Score. 0 (+ (/ SCALE-W 2) 75) 60 SCORE_FONT SCORE_COLOR "left")

;; Object Definitions
;;-----------------------------------------------------------------------------

(defrecord GameBackground [])
(defrecord GameNet [])
(defrecord GameStartScreen [])
(defrecord Paddle [x y width height vy color])
(defrecord Ball [x y radius vx vy fill-color oob?])
