(local vfx {})

(fn vfx.explosion [ps x y ?opts]
  (let [opts (or ?opts {})
        color (or opts.color 208)
        force (or opts.force 200)]
    (ps:set_position x y)
    (ps:set_colors color (+ color 15))
    (ps:set_velocity (- force) force (- force) force)
    (ps:set_gravity 0 100)
    (ps:set_life 0.3 0.8)
    (ps:set_size 1 3)
    (ps:set_drag 0.98)
    (ps:set_spawn_rate 0)
    (ps:emit (or opts.count 50))))

(fn vfx.fire [ps x y ?opts]
  (let [opts (or ?opts {})
        width (or opts.width 50)
        color (or opts.color 208)]
    (ps:set_position x y)
    (ps:set_spread width 5)
    (ps:set_colors color (+ color 15))
    (ps:set_velocity -20 20 -80 -40)
    (ps:set_gravity 0 -30)
    (ps:set_life 0.5 1.5)
    (ps:set_size 1 2)
    (ps:set_turbulence 30)
    (ps:set_drag 0.95)
    (ps:set_spawn_rate (or opts.rate 50))))

(fn vfx.rain [ps width ?opts]
  (let [opts (or ?opts {})
        wind (or opts.wind 0)
        color (or opts.color 153)]
    (ps:set_position (/ width 2) -10)
    (ps:set_spread width 0)
    (ps:set_colors color (+ color 3))
    (ps:set_velocity (- wind 10) (+ wind 10) 300 400)
    (ps:set_gravity 0 200)
    (ps:set_life 1 2)
    (ps:set_size 1 1)
    (ps:set_drag 1)
    (ps:set_spawn_rate (or opts.rate 100))))

(fn vfx.smoke [ps x y ?opts]
  (let [opts (or ?opts {})
        color (or opts.color 248)]
    (ps:set_position x y)
    (ps:set_spread 10 5)
    (ps:set_colors color (+ color 7))
    (ps:set_velocity -15 15 -30 -10)
    (ps:set_gravity 0 -20)
    (ps:set_life 1 3)
    (ps:set_size 2 4)
    (ps:set_turbulence 20)
    (ps:set_drag 0.98)
    (ps:set_spawn_rate (or opts.rate 20))))

(fn vfx.snow [ps width ?opts]
  (let [opts (or ?opts {})
        wind (or opts.wind 10)
        color (or opts.color 15)]
    (ps:set_position (/ width 2) -10)
    (ps:set_spread width 0)
    (ps:set_colors color color)
    (ps:set_velocity (- wind 20) (+ wind 20) 30 60)
    (ps:set_gravity 0 10)
    (ps:set_life 3 6)
    (ps:set_size 1 2)
    (ps:set_turbulence 15)
    (ps:set_drag 0.99)
    (ps:set_spawn_rate (or opts.rate 30))))

vfx
