anchor.diff:     (max-spread
       :accessor max-spread
       :initarg :max-spread
  -    :initform 2)))
  +    :initform 2)
  +   (weapon-type
  +    :accessor  weapon-type
  +    :initarg  :weapon-type
  +    :initform :radial)))
  +
  +(defclass spread-weapon (weapon)
  +  ((projectile-class :initform  'bullet)
  +   (projectile-image :initform :bullet)
  +   (projectile-n-directions :initform 16)
  +   (projectile-veloc :initform #c(0 -12))
  +   (projectile-timer :initform 120)
  +   (fire-sound
  +    :initform (make-instance 'sample :name :thopter-gun
  +                             :source (resource "sound/thoptergun.ogg")
  +                             :type :sample))
  +   (cooldown :initform 4)
  +   (firepower :initform nil)
  +   (ammo :initform 1)
  +   (ammo-refill-rate :initform 200)
  +   (ammo-deplete-rate :initform 200)))
   
   (defclass chaingun-weapon (weapon)
     ((projectile-class :initform  'bullet)
  
positive.code:     (setf (ammo weapon) (* (ammo weapon) (ammo-deplete-rate weapon)))))
  
  (defmethod shoot ((weapon weapon) event)
    (with-slots ((shooter parent) projectile-class projectile-image
                 projectile-n-directions projectile-veloc projectile-timer
                 fire-sound ammo ammo-deplete-rate angle-increment
  
negative.code: (defmethod update ((missile missile) event)
    (with-slots (parent offset size veloc accel image) missile
      (let* ((nearest-enemy (nearest-object missile 'enemy 600))
              (new-image (make-image "~a-~2,'0d" :missile (quadrant veloc 16))))
        (if nearest-enemy
          (setf veloc (* (unit veloc) (min (abs veloc) 12d0))
            accel (* 2d0 (unit (- (+ (offset nearest-enemy)
                                    (/ (size nearest-enemy) 2d0))
                                 (+ offset (/ size 2d0)))))
            offset (+ offset (/ (size image) 2d0) (/ (size new-image) -2d0))
            image new-image)
          (setf accel 0)))))
  
  (defmethod update ((missile enemy-missile) event)
    (with-slots (parent offset size veloc accel image) missile
      (let* ((nearest-enemy (nearest-object missile 'thopter 400))
              (new-image (make-image "~a-~2,'0d" :enemy-missile
                           (quadrant veloc 16))))
        (if nearest-enemy
          (setf veloc (* (unit veloc) (min (abs veloc) 12d0))
            accel (* 2d0 (unit (- (+ (offset nearest-enemy)
                                    (/ (size nearest-enemy) 2d0))
                                 (+ offset (/ size 2d0)))))
            offset (+ offset (/ (size image) 2d0) (/ (size new-image) -2d0))
            image new-image)
          (setf accel 0)))))
  
  (defmethod collide ((thopter thopter) event)
    (with-slots (parent offset depth veloc health primary-weapon
  